From 5d1ef6ad33b650f36b9a5916bfbac97d5a0d813b Mon Sep 17 00:00:00 2001 From: Sakul Budhathoki Date: Wed, 21 Feb 2024 03:47:26 +0545 Subject: [PATCH 01/17] feat: customize index.html (#979) * feat: customize index.html * chore: use expo customize instead of paste from dist Signed-off-by: Norman Meier --------- Signed-off-by: Norman Meier Co-authored-by: Norman Meier --- public/index.html | 38 +++++++++++++++ web/index.html | 118 ---------------------------------------------- 2 files changed, 38 insertions(+), 118 deletions(-) create mode 100644 public/index.html delete mode 100644 web/index.html diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000000..93dc8702b8 --- /dev/null +++ b/public/index.html @@ -0,0 +1,38 @@ + + + + + + + %WEB_TITLE% + + + + + + + + +
+ + diff --git a/web/index.html b/web/index.html deleted file mode 100644 index be5d3f6c00..0000000000 --- a/web/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - %WEB_TITLE% - - - - - - - -
- - From 1aad17cdeff592ff8f83b0e8ecf7540c7b95527f Mon Sep 17 00:00:00 2001 From: clegirar <33428384+clegirar@users.noreply.github.com> Date: Wed, 21 Feb 2024 11:36:17 +0100 Subject: [PATCH 02/17] fix: nft view overflow in my-colleciton screen (#985) Signed-off-by: clegirar --- packages/components/nfts/NFTView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/nfts/NFTView.tsx b/packages/components/nfts/NFTView.tsx index 69fa1fc29b..cc2abae775 100644 --- a/packages/components/nfts/NFTView.tsx +++ b/packages/components/nfts/NFTView.tsx @@ -105,7 +105,7 @@ export const NFTView: React.FC<{ nft={nft} mobileMode={isMobile} localSelected={localSelected} - size={width} + size={width || widthNumber} /> From 77d23b810ee26cd40c2c003cc06c563124bab079 Mon Sep 17 00:00:00 2001 From: OmniWired Date: Wed, 21 Feb 2024 20:08:23 +0900 Subject: [PATCH 03/17] feat(mini-mode): Wallet, send UI improvements (#954) * feat: Wallet: show my own accounts + the accounts in my addressBook when Sending Tokens * merge with upsteram --- .../screens/Mini/Wallet/MiniWalletScreen.tsx | 2 +- .../screens/Mini/Wallet/SendToriScreen.tsx | 18 ++-------- packages/screens/Mini/Wallet/TokenScreen.tsx | 4 +-- ...wn.tsx => MiniAddressSelectorDropdown.tsx} | 34 ++++++++++++------- 4 files changed, 26 insertions(+), 32 deletions(-) rename packages/screens/Mini/components/{MiniTextInputWithDropdown.tsx => MiniAddressSelectorDropdown.tsx} (83%) diff --git a/packages/screens/Mini/Wallet/MiniWalletScreen.tsx b/packages/screens/Mini/Wallet/MiniWalletScreen.tsx index b2f1770aa8..6de67c7525 100644 --- a/packages/screens/Mini/Wallet/MiniWalletScreen.tsx +++ b/packages/screens/Mini/Wallet/MiniWalletScreen.tsx @@ -2,7 +2,7 @@ import React, { useState } from "react"; import { useWindowDimensions, View } from "react-native"; import NFTScreen from "./NFTScreen"; -import TokenScreen from "./TokenScreen"; +import { TokenScreen } from "./TokenScreen"; import { ScreenContainer } from "@/components/ScreenContainer"; import { SpacerColumn } from "@/components/spacer"; diff --git a/packages/screens/Mini/Wallet/SendToriScreen.tsx b/packages/screens/Mini/Wallet/SendToriScreen.tsx index d3b21b8065..26b4d43661 100644 --- a/packages/screens/Mini/Wallet/SendToriScreen.tsx +++ b/packages/screens/Mini/Wallet/SendToriScreen.tsx @@ -5,8 +5,8 @@ import { View } from "react-native"; import questionSVG from "../../../../assets/icons/question-gray.svg"; import { CustomButton } from "../components/Button/CustomButton"; import CircularImgOrIcon from "../components/CircularImgOrIcon"; +import MiniAddressSelectorDropdown from "../components/MiniAddressSelectorDropdown"; import MiniTextInput from "../components/MiniTextInput"; -import MiniTextInputWithDropdown from "../components/MiniTextInputWithDropdown"; import { BlurScreenContainer } from "../layout/BlurScreenContainer"; import { BrandText } from "@/components/BrandText"; @@ -23,19 +23,6 @@ import { fontMedium13, fontMedium15, fontMedium16 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; import { getExponentByDenom } from "@/utils/wallet/chain-registry"; -const tokenOptions = [ - { - label: "Defi", - subLabel: "f1du...2d6a", - value: "f1duasdjfanjansjbasd2d6a", - }, - { - label: "Defi1", - subLabel: "f1du...2d6aasdf", - value: "f1dunasdhjfashdf2d6aasdf", - }, -]; - const SendToriScreen: ScreenFC<"MiniSendTori"> = ({ navigation, route }) => { const [address, setAddress] = useState(""); const [amount, setAmount] = useState(""); @@ -101,8 +88,7 @@ const SendToriScreen: ScreenFC<"MiniSendTori"> = ({ navigation, route }) => { - diff --git a/packages/screens/Mini/Wallet/TokenScreen.tsx b/packages/screens/Mini/Wallet/TokenScreen.tsx index f7d9c8f343..55a7e795b1 100644 --- a/packages/screens/Mini/Wallet/TokenScreen.tsx +++ b/packages/screens/Mini/Wallet/TokenScreen.tsx @@ -32,7 +32,7 @@ import { } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; -const TokenScreen: ScreenFC<"MiniWallets"> = ({ navigation }) => { +export const TokenScreen: ScreenFC<"MiniWallets"> = ({ navigation }) => { const wallets = useSelector(selectAllWallets); const dispatch = useAppDispatch(); if (wallets.length === 0) { @@ -212,5 +212,3 @@ const LastTransactions = () => { ); }; - -export default TokenScreen; diff --git a/packages/screens/Mini/components/MiniTextInputWithDropdown.tsx b/packages/screens/Mini/components/MiniAddressSelectorDropdown.tsx similarity index 83% rename from packages/screens/Mini/components/MiniTextInputWithDropdown.tsx rename to packages/screens/Mini/components/MiniAddressSelectorDropdown.tsx index faa0eae9f6..7b9f51b352 100644 --- a/packages/screens/Mini/components/MiniTextInputWithDropdown.tsx +++ b/packages/screens/Mini/components/MiniAddressSelectorDropdown.tsx @@ -10,7 +10,8 @@ import { BrandText } from "@/components/BrandText"; import { SVG } from "@/components/SVG"; import { CustomPressable } from "@/components/buttons/CustomPressable"; import { Separator } from "@/components/separators/Separator"; -import { selectAllAddressBook } from "@/store/slices/wallets"; +import useSelectedWallet from "@/hooks/useSelectedWallet"; +import { selectAllAddressBook, selectAllWallets } from "@/store/slices/wallets"; import { neutral22, neutral39, @@ -22,26 +23,35 @@ import { fontMedium16 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; import { tinyAddress } from "@/utils/text"; -type OptionType = { - label: string; - subLabel: string; - value: string; -}; - interface MiniTextInputWithDropdownProps { onChangeText?: (value: string) => void; value?: string; - options: OptionType[]; } -export default function MiniTextInputWithDropdown({ +export default function MiniAddressSelectorDropdown({ onChangeText, value, - options, }: MiniTextInputWithDropdownProps) { const [searchValue, setSearchValue] = useState(""); - const addresses = useSelector(selectAllAddressBook).filter((item) => + const addressBookEntries = useSelector(selectAllAddressBook); + const maxIndexAddressBook = + addressBookEntries.length > 0 + ? addressBookEntries[addressBookEntries.length].id + : 0; + const selectedWallet = useSelectedWallet(); + const myOtherWallets = useSelector(selectAllWallets).filter( + (item) => item.address !== selectedWallet?.address, + ); + const options = addressBookEntries.concat( + myOtherWallets.map((item) => ({ + name: `Account ${item.index}`, + address: item.address, + id: maxIndexAddressBook + item.index, + networkId: item.networkId, + })), + ); + const filteredOptions = options.filter((item) => item.name.toLowerCase().includes(searchValue.toLowerCase()), ); @@ -127,7 +137,7 @@ export default function MiniTextInputWithDropdown({ item.id.toString()} renderItem={({ item, index }) => ( From 2b017c5800dbce880b17f6941a03b72229385e58 Mon Sep 17 00:00:00 2001 From: sachin-into <154645503+sachin-into@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:54:17 +0545 Subject: [PATCH 04/17] feat(mini-mode): Emoji reactions on mini feeds (#977) --- .../Mini/Feed/components/PostActions.tsx | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/screens/Mini/Feed/components/PostActions.tsx b/packages/screens/Mini/Feed/components/PostActions.tsx index 35601cb7fd..9fcc5cf88d 100644 --- a/packages/screens/Mini/Feed/components/PostActions.tsx +++ b/packages/screens/Mini/Feed/components/PostActions.tsx @@ -2,13 +2,17 @@ import { Dispatch, SetStateAction } from "react"; import { View } from "react-native"; import { PostCommentCount } from "./PostCommentCount"; +import { PostReactions } from "./PostReactions"; import useSelectedWallet from "../../../../hooks/useSelectedWallet"; import { Post } from "@/api/feed/v1/feed"; +import { EmojiSelector } from "@/components/socialFeed/EmojiSelector"; import { TipButton } from "@/components/socialFeed/SocialActions/TipButton"; import { SpacerRow } from "@/components/spacer"; +import { useSocialReactions } from "@/hooks/feed/useSocialReactions"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; import { parseUserId } from "@/networks"; +import { layout } from "@/utils/style/layout"; type CardFooterProps = { post: Post; @@ -20,12 +24,22 @@ export function PostActions({ post, setPost }: CardFooterProps) { const authorNSInfo = useNSUserInfo(post.authorId); const [, authorAddress] = parseUserId(post.authorId); const username = authorNSInfo?.metadata?.tokenId || authorAddress; + const { handleReaction } = useSocialReactions({ + post, + setPost, + }); return ( - + + - + + + Date: Wed, 21 Feb 2024 17:17:44 +0545 Subject: [PATCH 05/17] fix(mini-mode): navigation (#960) * fix(DAppStore): Fix navigation in DAppsList component, disallow external apps Since the native wallet is only available in app and not in the web * modified Navigater component and placed normal and mini navigator on same stack fixed dapp store apps onPress navigation * fix: getNav on platform specific * removed view seed screen from normal navigation screen * feat(DAppStore): update import paths in getFromFile.ts (fix/mini-navigation) * feat(DAppStore): update DApp title in getFromFile query - Update the title of the DApp "toriwallet" to "Teritori OS Wallet" in the getFromFile query. * feat(DAppStore): hide Osmosis in Teritori OS Mobile mode * feat(DAppStore): show native wallet only on mobile. In the web show wallet manager * fix rebase conflict * fixed unused exports --------- Co-authored-by: Eng. Juan Combetto --- assets/icons/feed-gray.svg | 4 + packages/components/navigation/Navigator.tsx | 33 +++- ...deNavigator.tsx => getMiniModeScreens.tsx} | 62 +------- ...Navigator.tsx => getNormalModeScreens.tsx} | 18 +-- .../navigation/platformSpecific.web.tsx | 4 +- packages/components/navigation/util.tsx | 7 +- .../screens/DAppStore/query/getFromFile.ts | 142 ++++++++++-------- packages/screens/Mini/About/AboutScreen.tsx | 2 +- packages/screens/Mini/Chat/MiniChatScreen.tsx | 2 +- .../ConnectLedger/ConnectLedgerScreen.tsx | 3 +- .../screens/Mini/Conversation/ChatHeader.tsx | 2 +- .../Mini/DAppStore/DAppStoreScreen.tsx | 50 +++++- .../Mini/DAppStore/component/DAppsList.tsx | 33 ++-- .../screens/Mini/Wallet/SendingToriScreen.tsx | 7 +- .../Mini/components/AppBar/CustomAppBar.tsx | 2 +- .../Mini/components/SettingMenuItems.tsx | 4 +- .../screens/Wallet/Screens/NativeWallet.tsx | 2 +- .../screens/Wallet/Screens/SucessScreen.tsx | 4 +- packages/scripts/validateNetworks.ts | 7 +- packages/utils/navigation.ts | 6 +- 20 files changed, 227 insertions(+), 167 deletions(-) create mode 100644 assets/icons/feed-gray.svg rename packages/components/navigation/{MiniModeNavigator.tsx => getMiniModeScreens.tsx} (87%) rename packages/components/navigation/{NormalModeNavigator.tsx => getNormalModeScreens.tsx} (97%) diff --git a/assets/icons/feed-gray.svg b/assets/icons/feed-gray.svg new file mode 100644 index 0000000000..06a88f441f --- /dev/null +++ b/assets/icons/feed-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/components/navigation/Navigator.tsx b/packages/components/navigation/Navigator.tsx index 129e89c27b..88cea43b2b 100644 --- a/packages/components/navigation/Navigator.tsx +++ b/packages/components/navigation/Navigator.tsx @@ -1,13 +1,34 @@ -import { MiniModeNavigator } from "./MiniModeNavigator"; -import { NormalModeNavigator } from "./NormalModeNavigator"; +import { Platform } from "react-native"; + +import { Sidebar } from "./Sidebar"; +import { getMiniModeScreens } from "./getMiniModeScreens"; +import { getNormalModeScreens } from "./getNormalModeScreens"; +import { getNav } from "./util"; import { useAppMode } from "@/hooks/useAppMode"; +import { useOnboardedStatus } from "@/hooks/useOnboardStatus"; +import { AppMode } from "@/utils/types/app-mode"; -export const Navigator = () => { +export const Navigator: React.FC = () => { const [appMode] = useAppMode(); + const [isLoading] = useOnboardedStatus(); + + const { Nav, navigatorScreenOptions } = getNav(appMode as AppMode); - if (appMode === "mini") { - return ; + if (isLoading && appMode === "mini") { + return null; } - return ; + + return ( + + Platform.OS === "web" || appMode === "mini" ? null : + } + screenOptions={navigatorScreenOptions as any} // FIXME: upgrade to expo-router + > + {getNormalModeScreens({ appMode: appMode as AppMode })} + {appMode === "mini" ? getMiniModeScreens() : null} + + ); }; diff --git a/packages/components/navigation/MiniModeNavigator.tsx b/packages/components/navigation/getMiniModeScreens.tsx similarity index 87% rename from packages/components/navigation/MiniModeNavigator.tsx rename to packages/components/navigation/getMiniModeScreens.tsx index 414cdb37df..f1fa555125 100644 --- a/packages/components/navigation/MiniModeNavigator.tsx +++ b/packages/components/navigation/getMiniModeScreens.tsx @@ -10,9 +10,6 @@ import { RootStackParamList } from "../../utils/navigation"; import { neutral00, secondaryColor } from "../../utils/style/colors"; import { TabBarIcon } from "../TabBarIcon"; -import { useOnboardedStatus } from "@/hooks/useOnboardStatus"; -import { FeedPostViewScreen } from "@/screens/FeedPostView/FeedPostViewScreen"; -import { NFTDetailScreen } from "@/screens/Marketplace/NFTDetailScreen"; import AboutScreen from "@/screens/Mini/About/AboutScreen"; import AddAddressBookScreen from "@/screens/Mini/AddressBook/AddAddressBookScreen"; import AddressBookScreen from "@/screens/Mini/AddressBook/AddressBookScreen"; @@ -49,12 +46,8 @@ import SelectTokenScreen from "@/screens/Mini/Wallet/SelectTokenScreen"; import SendToriScreen from "@/screens/Mini/Wallet/SendToriScreen"; import SendingToriScreen from "@/screens/Mini/Wallet/SendingToriScreen"; import TransactionDetailScreen from "@/screens/Mini/Wallet/TransactionDetailScreen"; -import { CreatePassword } from "@/screens/Wallet/Screens/CreatePassword"; import { CreatePasswordWallet } from "@/screens/Wallet/Screens/CreatePasswordWallet"; import { CreateWalletScreen } from "@/screens/Wallet/Screens/CreateWalletScreen"; -import { ImportWallet } from "@/screens/Wallet/Screens/ImportWallet"; -import NativeWallet from "@/screens/Wallet/Screens/NativeWallet"; -import { SuccessScreen } from "@/screens/Wallet/Screens/SucessScreen"; const Stack = createNativeStackNavigator(); const Tab = createBottomTabNavigator(); @@ -94,15 +87,9 @@ const MainTab = () => { ); }; -export const MiniModeNavigator = () => { - const [isLoading, isOnboarded] = useOnboardedStatus(); - - if (isLoading) return null; - +export const getMiniModeScreens = () => { return ( - + <> { title: "", }} /> - null, title: "Wallet Create" }} - /> + null }} component={MainTab} /> - null, - title: "Import Wallet with Seed", - }} - /> + { title: "Create Password", }} /> - null, - title: "Create Password", - }} - /> + { title: "Chat", }} /> - null, - title: "All Set", - }} - /> + { title: "", }} /> - null, title: "Feed", animation: "fade" }} - /> - null, title: "NFT" }} - /> - + ); }; diff --git a/packages/components/navigation/NormalModeNavigator.tsx b/packages/components/navigation/getNormalModeScreens.tsx similarity index 97% rename from packages/components/navigation/NormalModeNavigator.tsx rename to packages/components/navigation/getNormalModeScreens.tsx index a0d68ec52d..a30b603946 100644 --- a/packages/components/navigation/NormalModeNavigator.tsx +++ b/packages/components/navigation/getNormalModeScreens.tsx @@ -1,9 +1,7 @@ import React from "react"; -import { Platform } from "react-native"; -import { Sidebar } from "./Sidebar"; import { platformScreens } from "./platformSpecific"; -import { Nav, navigatorScreenOptions, screenTitle } from "./util"; +import { getNav, screenTitle } from "./util"; import { AdministrationDashboardScreen } from "@/screens/AdministrationDashboard/AdministrationDashboardScreen"; import { AllProjectAdministrationDashScreen } from "@/screens/AllProjectAdministrationDash/AllProjectAdministrationDashScreen"; @@ -60,19 +58,19 @@ import NativeWallet from "@/screens/Wallet/Screens/NativeWallet"; import { SuccessScreen } from "@/screens/Wallet/Screens/SucessScreen"; import { WalletManagerScreen } from "@/screens/WalletManager/WalletManagerScreen"; import { WalletManagerWalletsScreen } from "@/screens/WalletManager/WalletsScreen"; +import { AppMode } from "@/utils/types/app-mode"; + +export const getNormalModeScreens = ({ appMode }: { appMode: AppMode }) => { + const { Nav } = getNav(appMode); -export const NormalModeNavigator: React.FC = () => { return ( - (Platform.OS === "web" ? null : )} - screenOptions={navigatorScreenOptions as any} // FIXME: upgrade to expo-router - > + <> null, title: screenTitle("Home") }} /> + { }} /> {platformScreens} - + ); }; diff --git a/packages/components/navigation/platformSpecific.web.tsx b/packages/components/navigation/platformSpecific.web.tsx index c0c830df9a..981380041f 100644 --- a/packages/components/navigation/platformSpecific.web.tsx +++ b/packages/components/navigation/platformSpecific.web.tsx @@ -1,9 +1,11 @@ // axelar libs imported by the bridge screen are breaking the ios CI -import { Nav, screenTitle } from "./util"; +import { getNav, screenTitle } from "./util"; import { RiotGameBridgeScreen } from "@/screens/RiotGame/RiotGameBridgeScreen"; +const { Nav } = getNav("normal"); + export const platformScreens: JSX.Element = ( <> { - if (Platform.OS === "web") { +export const getNav = (appMode: AppMode) => { + if (Platform.OS === "web" || appMode === "mini") { return { Nav: createNativeStackNavigator(), navigatorScreenOptions: {}, @@ -26,5 +27,3 @@ const getNav = () => { }; export const screenTitle = (title: string) => "Teritori - " + title; - -export const { Nav, navigatorScreenOptions } = getNav(); diff --git a/packages/screens/DAppStore/query/getFromFile.ts b/packages/screens/DAppStore/query/getFromFile.ts index f325dc3004..9b9d0a0302 100644 --- a/packages/screens/DAppStore/query/getFromFile.ts +++ b/packages/screens/DAppStore/query/getFromFile.ts @@ -1,47 +1,46 @@ import { Platform } from "react-native"; -import BookMarkIcon from "../../../../assets/icons/bookmark.svg"; -import dao from "../../../../assets/icons/dao.svg"; -import socialFeed from "../../../../assets/icons/feed.svg"; -import freelance from "../../../../assets/icons/freelanceservice.svg"; -import governance from "../../../../assets/icons/governance.svg"; -import checklogo from "../../../../assets/icons/greenCheck.svg"; -import launchpad from "../../../../assets/icons/launchpad.svg"; -import leap from "../../../../assets/icons/leap-cosmos-logo.svg"; -import marketplace from "../../../../assets/icons/marketplace.svg"; -import messages from "../../../../assets/icons/messages.svg"; -import multisig from "../../../../assets/icons/multisig.svg"; -import osmosisSVG from "../../../../assets/icons/networks/osmosis.svg"; -import teritoriSVG from "../../../../assets/icons/networks/teritori.svg"; -import pathwar from "../../../../assets/icons/pathwar.svg"; -import otherAppsIcon from "../../../../assets/icons/random-goods-icon.svg"; -import riot from "../../../../assets/icons/rioters-game.svg"; -import staking from "../../../../assets/icons/staking.svg"; -import tnsService from "../../../../assets/icons/tns-service.svg"; -import wallet from "../../../../assets/icons/wallet.svg"; -import axelarLogo from "../../../../assets/logos/Axelar-logo.svg"; -import mapOfZones from "../../../../assets/logos/MoZ-icon.svg"; -import astroportLogo from "../../../../assets/logos/astroport.svg"; -import calcfinance from "../../../../assets/logos/calc-finance.jpg"; -import coinHallLogo from "../../../../assets/logos/coinhall.svg"; -import mintscanLogo from "../../../../assets/logos/cosmostation-val.png"; -import daodao from "../../../../assets/logos/daodao.png"; -import kjnodes from "../../../../assets/logos/kjnodes-logo.svg"; -import kujirapod from "../../../../assets/logos/kujira-network.svg"; -import nodesguruLogo from "../../../../assets/logos/nodeguru-val.svg"; -import pingpubLogo from "../../../../assets/logos/pingpub-val.svg"; -import pulsarLogo from "../../../../assets/logos/pulsar-logo.svg"; -import radyium from "../../../../assets/logos/raydium.png"; -import restake from "../../../../assets/logos/restake.png"; -import skip from "../../../../assets/logos/skip.png"; -import stakemeLogo from "../../../../assets/logos/stakeme-val.svg"; -import subdao from "../../../../assets/logos/subdao.png"; -import tfm from "../../../../assets/logos/tfm-logo.png"; -import theGraph from "../../../../assets/logos/theGraph.png"; -import toripunks from "../../../../assets/logos/toniPunks.png"; -import uniswap from "../../../../assets/logos/uniswap.png"; -import yieldmos from "../../../../assets/logos/yieldmos.png"; - +import BookMarkIcon from "@/assets/icons/bookmark.svg"; +import dao from "@/assets/icons/dao.svg"; +import socialFeed from "@/assets/icons/feed.svg"; +import freelance from "@/assets/icons/freelanceservice.svg"; +import governance from "@/assets/icons/governance.svg"; +import checklogo from "@/assets/icons/greenCheck.svg"; +import launchpad from "@/assets/icons/launchpad.svg"; +import leap from "@/assets/icons/leap-cosmos-logo.svg"; +import marketplace from "@/assets/icons/marketplace.svg"; +import messages from "@/assets/icons/messages.svg"; +import multisig from "@/assets/icons/multisig.svg"; +import osmosisSVG from "@/assets/icons/networks/osmosis.svg"; +import teritoriSVG from "@/assets/icons/networks/teritori.svg"; +import pathwar from "@/assets/icons/pathwar.svg"; +import otherAppsIcon from "@/assets/icons/random-goods-icon.svg"; +import riot from "@/assets/icons/rioters-game.svg"; +import staking from "@/assets/icons/staking.svg"; +import tnsService from "@/assets/icons/tns-service.svg"; +import wallet from "@/assets/icons/wallet.svg"; +import axelarLogo from "@/assets/logos/Axelar-logo.svg"; +import mapOfZones from "@/assets/logos/MoZ-icon.svg"; +import astroportLogo from "@/assets/logos/astroport.svg"; +import calcfinance from "@/assets/logos/calc-finance.jpg"; +import coinHallLogo from "@/assets/logos/coinhall.svg"; +import mintscanLogo from "@/assets/logos/cosmostation-val.png"; +import daodao from "@/assets/logos/daodao.png"; +import kjnodes from "@/assets/logos/kjnodes-logo.svg"; +import kujirapod from "@/assets/logos/kujira-network.svg"; +import nodesguruLogo from "@/assets/logos/nodeguru-val.svg"; +import pingpubLogo from "@/assets/logos/pingpub-val.svg"; +import pulsarLogo from "@/assets/logos/pulsar-logo.svg"; +import radyium from "@/assets/logos/raydium.png"; +import restake from "@/assets/logos/restake.png"; +import skip from "@/assets/logos/skip.png"; +import stakemeLogo from "@/assets/logos/stakeme-val.svg"; +import subdao from "@/assets/logos/subdao.png"; +import tfm from "@/assets/logos/tfm-logo.png"; +import theGraph from "@/assets/logos/theGraph.png"; +import toripunks from "@/assets/logos/toniPunks.png"; +import uniswap from "@/assets/logos/uniswap.png"; +import yieldmos from "@/assets/logos/yieldmos.png"; import { isElectron } from "@/utils/isElectron"; import { dAppGroup } from "@/utils/types/dapp-store"; @@ -83,16 +82,31 @@ export function getAvailableApps(): dAppGroup { selectedByDefault: true, alwaysOn: true, }, - wallet: { - id: "wallet", - title: "My Wallet", - description: "Wallet", - icon: wallet, - route: "WalletManager", - groupKey: "teritori-core-apps", - selectedByDefault: true, - alwaysOn: true, - }, + ...(Platform.OS !== "web" + ? { + toriwallet: { + id: "toriwallet", + title: "Teritori OS Wallet", + description: "Wallet", + icon: wallet, + route: "NativeWallet", + groupKey: "teritori-core-apps", + selectedByDefault: true, + alwaysOn: false, + }, + } + : { + wallet: { + id: "wallet", + title: "My Wallet", + description: "Wallet", + icon: wallet, + route: "WalletManager", + groupKey: "teritori-core-apps", + selectedByDefault: true, + alwaysOn: true, + }, + }), governance: { id: "governance", title: "Governance", @@ -145,16 +159,20 @@ export function getAvailableApps(): dAppGroup { icon: checklogo, active: true, options: { - osmosis: { - id: "osmosis", - title: "Osmosis Dex", - description: "Advanced automated market maker (AMM)", - icon: osmosisSVG, - route: "Swap", - groupKey: "top-apps", - selectedByDefault: true, - alwaysOn: false, - }, + ...(Platform.OS !== "web" + ? { + osmosis: { + id: "osmosis", + title: "Osmosis Dex", + description: "Advanced automated market maker (AMM)", + icon: osmosisSVG, + route: "Swap", + groupKey: "top-apps", + selectedByDefault: true, + alwaysOn: false, + }, + } + : {}), "social-feed": { id: "social-feed", title: "Social Feed", diff --git a/packages/screens/Mini/About/AboutScreen.tsx b/packages/screens/Mini/About/AboutScreen.tsx index 89e3582529..bea997a289 100644 --- a/packages/screens/Mini/About/AboutScreen.tsx +++ b/packages/screens/Mini/About/AboutScreen.tsx @@ -50,7 +50,7 @@ export default function AboutScreen({ navigation }: AboutScreenProps) { const onClose = () => navigation.canGoBack() ? navigation.goBack() - : navigation.replace("MiniTabs"); + : navigation.replace("MiniTabs", { screen: "MiniChats" }); return ( diff --git a/packages/screens/Mini/Chat/MiniChatScreen.tsx b/packages/screens/Mini/Chat/MiniChatScreen.tsx index fb1adfd803..9d79aa8b71 100644 --- a/packages/screens/Mini/Chat/MiniChatScreen.tsx +++ b/packages/screens/Mini/Chat/MiniChatScreen.tsx @@ -19,7 +19,7 @@ import { BrandText } from "@/components/BrandText"; import { SVG } from "@/components/SVG"; import { ScreenContainer } from "@/components/ScreenContainer"; import { CustomPressable } from "@/components/buttons/CustomPressable"; -import { MiniTabScreenFC } from "@/components/navigation/MiniModeNavigator"; +import { MiniTabScreenFC } from "@/components/navigation/getMiniModeScreens"; import { SpacerColumn } from "@/components/spacer"; import { RoundedTabs } from "@/components/tabs/RoundedTabs"; import { ToastInfo } from "@/components/toasts/ToastInfo"; diff --git a/packages/screens/Mini/ConnectLedger/ConnectLedgerScreen.tsx b/packages/screens/Mini/ConnectLedger/ConnectLedgerScreen.tsx index 8e70e716eb..049b1ed52a 100644 --- a/packages/screens/Mini/ConnectLedger/ConnectLedgerScreen.tsx +++ b/packages/screens/Mini/ConnectLedger/ConnectLedgerScreen.tsx @@ -34,7 +34,8 @@ export const ConnectLedgerScreen: ScreenFC<"ConnectLedger"> = ({ setActiveStep(step); }; - const onComplete = () => navigation.navigate("MiniTabs"); + const onComplete = () => + navigation.navigate("MiniTabs", { screen: "MiniChats" }); const activeScreenPosition = +activeStep.split("_")[1]; const screenPercentage = diff --git a/packages/screens/Mini/Conversation/ChatHeader.tsx b/packages/screens/Mini/Conversation/ChatHeader.tsx index 83854044b7..c56b8a030d 100644 --- a/packages/screens/Mini/Conversation/ChatHeader.tsx +++ b/packages/screens/Mini/Conversation/ChatHeader.tsx @@ -29,7 +29,7 @@ export const ChatHeader = ({ navigation, conversation }: HeaderProps) => { const navigateBack = () => navigation.canGoBack() ? navigation.goBack() - : navigation.replace("MiniTabs"); + : navigation.replace("MiniTabs", { screen: "MiniChats" }); const handlePhoneCellPress = () => { alert("Phone cell"); diff --git a/packages/screens/Mini/DAppStore/DAppStoreScreen.tsx b/packages/screens/Mini/DAppStore/DAppStoreScreen.tsx index 56140ae5eb..7984940e4b 100644 --- a/packages/screens/Mini/DAppStore/DAppStoreScreen.tsx +++ b/packages/screens/Mini/DAppStore/DAppStoreScreen.tsx @@ -3,15 +3,19 @@ import { FlatList, useWindowDimensions, View } from "react-native"; import { DAppStoreMenuItem } from "./component/DAppStoreMenuItems"; import { DAppsList } from "./component/DAppsList"; +import chatSVG from "../../../../assets/icons/chat-gray.svg"; +import feedSVG from "../../../../assets/icons/feed-gray.svg"; import penSVG from "../../../../assets/icons/pen-solid.svg"; +import walletSVG from "../../../../assets/icons/wallet-grey.svg"; import { BlurScreenContainer } from "../layout/BlurScreenContainer"; import { BrandText } from "@/components/BrandText"; +import { SVG } from "@/components/SVG"; import { CustomPressable } from "@/components/buttons/CustomPressable"; import { Separator } from "@/components/separators/Separator"; import { ScreenFC } from "@/utils/navigation"; import { blueDefault } from "@/utils/style/colors"; -import { fontSemibold15 } from "@/utils/style/fonts"; +import { fontMedium14, fontSemibold15 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; export const DAppStoreScreen: ScreenFC<"MiniDAppStore"> = ({ navigation }) => { @@ -64,6 +68,50 @@ export const DAppStoreScreen: ScreenFC<"MiniDAppStore"> = ({ navigation }) => { )} + {!enableEditingDApps && ( + + + navigation.navigate("MiniTabs", { + screen: "MiniChats", + }) + } + style={{ alignItems: "center", gap: layout.spacing_x1 }} + > + + Chat + + + navigation.navigate("MiniTabs", { + screen: "MiniFeeds", + }) + } + style={{ alignItems: "center", gap: layout.spacing_x1 }} + > + + Feeds + + + navigation.navigate("MiniTabs", { + screen: "MiniWallets", + }) + } + style={{ alignItems: "center", gap: layout.spacing_x1 }} + > + + Wallets + + + )} ); }; diff --git a/packages/screens/Mini/DAppStore/component/DAppsList.tsx b/packages/screens/Mini/DAppStore/component/DAppsList.tsx index f1cb8b5b2d..faef60fab6 100644 --- a/packages/screens/Mini/DAppStore/component/DAppsList.tsx +++ b/packages/screens/Mini/DAppStore/component/DAppsList.tsx @@ -7,6 +7,7 @@ import { DAppStoreMenuItem } from "./DAppStoreMenuItems"; import { BrandText } from "@/components/BrandText"; import { Separator } from "@/components/separators/Separator"; +import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; import { selectAvailableApps, selectCheckedApps, @@ -15,6 +16,7 @@ import { } from "@/store/slices/dapps-store"; import { useAppDispatch } from "@/store/store"; import { getValuesFromId, SEPARATOR } from "@/utils/dapp-store"; +import { RouteName } from "@/utils/navigation"; import { layout } from "@/utils/style/layout"; import { dAppType } from "@/utils/types/dapp-store"; @@ -24,7 +26,7 @@ type Props = { export const DAppsList = ({ isEditing }: Props) => { const dispatch = useAppDispatch(); - + const navigation = useAppNavigation(); const { width: windowsWidth } = useWindowDimensions(); const availableApps = useSelector(selectAvailableApps); const selectedApps = useSelector(selectCheckedApps); @@ -95,12 +97,9 @@ export const DAppsList = ({ isEditing }: Props) => { } }, [topApps, staking, externalApps, selectedApps, getOptions]); - const alwaysOnApps = useMemo(() => { - return [ - ...Object.values(coreDApps.options).filter((x) => x.alwaysOn), - ...Object.values(topApps.options).filter((x) => x.alwaysOn), - ]; - }, [coreDApps, topApps]); + const alwaysOnApps = Object.values(coreDApps.options) + .concat(Object.values(topApps.options)) + .filter((x: dAppType) => x.alwaysOn); const handleClick = (groupKey: string, id: string) => { const draggableId = `${groupKey}${SEPARATOR}${id}`; @@ -127,7 +126,11 @@ export const DAppsList = ({ isEditing }: Props) => { icon={item.icon} title={item.title} isAdded - onPress={() => alert(item.title)} + onPress={() => { + if (!["External", "ComingSoon"].includes(item.route)) { + navigation.replace(item.route as RouteName); + } + }} /> ); }} @@ -135,7 +138,9 @@ export const DAppsList = ({ isEditing }: Props) => { /> item.route !== "External", + )} onItemReorder={({ fromIndex, toIndex }) => { const newData = selectedApps.slice(); newData.splice(toIndex, 0, newData.splice(fromIndex, 1)[0]); @@ -149,7 +154,11 @@ export const DAppsList = ({ isEditing }: Props) => { title={item?.title || ""} subTitle={item?.description} isEditing={isEditing} - onPress={() => alert(item?.title)} + onPress={() => { + if (!["External", "ComingSoon"].includes(item.route)) { + navigation.replace(item.route as RouteName); + } + }} isAdded onActionPress={() => item && handleClick(item.groupKey, item.id) @@ -164,7 +173,9 @@ export const DAppsList = ({ isEditing }: Props) => { {isEditing && ( item.route !== "External", + )} renderItem={({ item, index }) => { return ( navigation.navigate("MiniTabs")} + onPress={() => + navigation.navigate("MiniTabs", { screen: "MiniWallets" }) + } style={{ flex: 1 }} /> { const navigation = useAppNavigation(); const onMenuItemPress = () => { - navigation.replace(navigateTo, { back: "MiniSettings" }); + if (navigation.replace) { + navigation.replace(navigateTo, { back: "MiniSettings" }); + } }; return ( <> diff --git a/packages/screens/Wallet/Screens/NativeWallet.tsx b/packages/screens/Wallet/Screens/NativeWallet.tsx index 5765ea12f9..dfb3101472 100644 --- a/packages/screens/Wallet/Screens/NativeWallet.tsx +++ b/packages/screens/Wallet/Screens/NativeWallet.tsx @@ -69,7 +69,7 @@ const NativeWallet: ScreenFC<"NativeWallet"> = () => { marginVertical: layout.spacing_x2, }} onPress={(_, navigation) => { - navigation.navigate("MiniTabs"); + navigation.navigate("MiniTabs", { screen: "MiniChats" }); }} /> )} diff --git a/packages/screens/Wallet/Screens/SucessScreen.tsx b/packages/screens/Wallet/Screens/SucessScreen.tsx index dc8c681bdf..d5e6cc5a78 100644 --- a/packages/screens/Wallet/Screens/SucessScreen.tsx +++ b/packages/screens/Wallet/Screens/SucessScreen.tsx @@ -9,7 +9,9 @@ export const SuccessScreen: ScreenFC<"SuccessScreen"> = ({ navigation }) => { return ( navigation.navigate("MiniTabs")} + onComplete={() => + navigation.navigate("MiniTabs", { screen: "MiniChats" }) + } description="Click on the Start button to launch Teritori." /> diff --git a/packages/scripts/validateNetworks.ts b/packages/scripts/validateNetworks.ts index 5c760fc9d6..13d81ed592 100644 --- a/packages/scripts/validateNetworks.ts +++ b/packages/scripts/validateNetworks.ts @@ -1,9 +1,4 @@ -import { - allNetworks, - getNativeCurrency, - NetworkFeature, - NetworkKind, -} from "../networks"; +import { allNetworks, getNativeCurrency, NetworkKind } from "../networks"; const ids: { [key: string]: boolean } = {}; const idPrefixes: { [key: string]: boolean } = {}; diff --git a/packages/utils/navigation.ts b/packages/utils/navigation.ts index b8449fe405..c48e805fb7 100644 --- a/packages/utils/navigation.ts +++ b/packages/utils/navigation.ts @@ -10,6 +10,10 @@ import { uppTabItems } from "./upp"; export type RouteName = keyof RootStackParamList; +type MiniTabsScreen = { + screen?: "MiniChats" | "MiniWallets" | "MiniFeeds"; +}; + export type RootStackParamList = { Home?: { network?: string }; MyCollection: undefined; @@ -97,7 +101,7 @@ export type RootStackParamList = { SuccessScreen: undefined; //Mini Screens - MiniTabs: undefined; + MiniTabs: MiniTabsScreen; Conversation: { conversationId: string }; MiniChats: { back?: RouteName }; MiniWallets: undefined; From 241315b59b6115f98ca420bedd1f8089288fed9f Mon Sep 17 00:00:00 2001 From: n0izn0iz Date: Wed, 21 Feb 2024 13:04:59 +0100 Subject: [PATCH 06/17] fix: pass margin and other styles to OptimizedImage background-based fallback (#982) Signed-off-by: Norman Meier --- packages/components/OptimizedImage.tsx | 31 +++++++++----------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/packages/components/OptimizedImage.tsx b/packages/components/OptimizedImage.tsx index 48d61b45e4..2e4a6dce25 100644 --- a/packages/components/OptimizedImage.tsx +++ b/packages/components/OptimizedImage.tsx @@ -1,6 +1,6 @@ import { CID } from "multiformats"; import React, { memo, useEffect } from "react"; -import { Image, ImageProps, View, StyleSheet, PixelRatio } from "react-native"; +import { Image, ImageProps, View, PixelRatio } from "react-native"; import { neutral33 } from "../utils/style/colors"; @@ -16,14 +16,19 @@ export const OptimizedImage: React.FC< fallbackURI?: string | null; } > = memo( - ({ sourceURI: baseSourceURI, width, height, fallbackURI, ...other }) => { + ({ + sourceURI: baseSourceURI, + width, + height, + fallbackURI, + ...passthrough + }) => { const [isError, setIsError] = React.useState(false); const [isFallbackError, setIsFallbackError] = React.useState(false); const shouldUseFallback = !baseSourceURI || isError; const sourceURI = shouldUseFallback ? fallbackURI : baseSourceURI; const sourceWidth = PixelRatio.getPixelSizeForLayoutSize(width); const sourceHeight = PixelRatio.getPixelSizeForLayoutSize(height); - const otherStyle = StyleSheet.flatten(other.style); useEffect(() => { setIsError(false); @@ -35,23 +40,7 @@ export const OptimizedImage: React.FC< if ((shouldUseFallback && !fallbackURI) || isFallbackError) { return ( - + ); } @@ -71,7 +60,7 @@ export const OptimizedImage: React.FC< setIsError(true); }} source={source} - {...other} + {...passthrough} /> ); }, From a7947ac50489dada8ac0fb64b25a0d06830e77e2 Mon Sep 17 00:00:00 2001 From: Sakul Budhathoki Date: Wed, 21 Feb 2024 17:54:37 +0545 Subject: [PATCH 07/17] feat: weshnet import and export account (#928) * feat: weshnet import and export account * fix: go mod issues * fix: use layout * chore: cleanup unnecessary tools from github ci --- .github/workflows/mobile-build-android.yml | 10 + Makefile | 19 +- app.config.js | 10 +- assets/icons/download.svg | 4 + .../message-empty-logo-illustration.svg} | 0 assets/illustrations/message-onboarding.svg | 85 + electron/go.mod | 286 --- electron/go.sum | 2095 ----------------- electron/prod.go | 270 --- go.mod | 2 - go/cmd/weshd/go.mod | 285 --- go/cmd/weshd/go.sum | 2070 ---------------- go/cmd/weshd/main.go | 182 -- package.json | 1 + packages/modules/FileSystem/index.native.ts | 4 +- packages/screens/Message/MessageScreen.tsx | 75 +- .../screens/Message/components/ChatItem.tsx | 11 +- .../Message/components/ChatSection.tsx | 52 +- .../Message/components/CheckboxGroup.tsx | 40 +- .../Message/components/CreateConversation.tsx | 238 +- .../Message/components/CreateGroup.tsx | 4 +- .../Message/components/EditProfile.tsx | 114 + .../screens/Message/components/Friends.tsx | 3 +- .../components/GroupInvitationAction.tsx | 4 +- .../Message/components/MessageBlankFiller.tsx | 2 +- .../Message/components/MessageOnboarding.tsx | 142 ++ .../screens/Message/components/Profile.tsx | 147 ++ .../screens/Message/components/Request.tsx | 25 +- .../screens/Message/components/Requests.tsx | 9 +- .../Message/components/SideBarChats.tsx | 6 +- packages/screens/Mini/Chat/MiniChatScreen.tsx | 4 +- .../screens/Mini/Chat/components/ChatList.tsx | 4 +- .../milldeware/afterRehydrateMiddleware.ts | 11 + packages/store/slices/message.ts | 108 +- packages/store/store.ts | 19 +- packages/utils/file.ts | 36 + packages/utils/navigation.ts | 4 +- packages/utils/style/layout.ts | 4 + packages/utils/types/message.ts | 34 +- packages/weshnet/client.ts | 26 +- packages/weshnet/message/subscriber.ts | 37 +- packages/weshnet/metadata/subscriber.ts | 39 +- packages/weshnet/services.ts | 197 +- weshd/go.mod | 17 +- weshd/go.sum | 31 +- weshd/go/app/wesh.go | 17 + weshd/go/electron/prod.go | 53 + weshd/go/shared/shared.go | 398 ++++ weshd/go/web/main.go | 17 + weshd/go/wesh.go | 147 -- yarn.lock | 10 + 51 files changed, 1660 insertions(+), 5748 deletions(-) create mode 100644 assets/icons/download.svg rename assets/{icons/illustration.svg => illustrations/message-empty-logo-illustration.svg} (100%) create mode 100644 assets/illustrations/message-onboarding.svg delete mode 100644 electron/go.mod delete mode 100644 electron/go.sum delete mode 100644 electron/prod.go delete mode 100644 go/cmd/weshd/go.mod delete mode 100644 go/cmd/weshd/go.sum delete mode 100644 go/cmd/weshd/main.go create mode 100644 packages/screens/Message/components/EditProfile.tsx create mode 100644 packages/screens/Message/components/MessageOnboarding.tsx create mode 100644 packages/screens/Message/components/Profile.tsx create mode 100644 packages/store/milldeware/afterRehydrateMiddleware.ts create mode 100644 packages/utils/file.ts create mode 100644 weshd/go/app/wesh.go create mode 100644 weshd/go/electron/prod.go create mode 100644 weshd/go/shared/shared.go create mode 100644 weshd/go/web/main.go delete mode 100644 weshd/go/wesh.go diff --git a/.github/workflows/mobile-build-android.yml b/.github/workflows/mobile-build-android.yml index 8bcd41f6fe..36b41b69dc 100644 --- a/.github/workflows/mobile-build-android.yml +++ b/.github/workflows/mobile-build-android.yml @@ -14,6 +14,16 @@ jobs: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@0.12.1 + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + android: false + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true + - uses: actions/setup-go@v3 with: go-version: "1.19" diff --git a/Makefile b/Makefile index 868751a4fe..eba4ac86f5 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ node_modules: package.json yarn.lock .PHONY: go-mod-tidy go-mod-tidy: go mod tidy - cd electron && go mod tidy + cd ./weshd && go mod tidy .PHONY: generate generate: generate.protobuf generate.graphql generate.contracts-clients generate.go-networks networks.json @@ -326,7 +326,7 @@ build-electron-macos-amd64: rm -fr ./electron/dist rm -fr ./electron/build cd ./electron && npm i - cd ./electron && GOOS=darwin GOARCH=amd64 $(GO) build -tags noNativeLogger -o ./build/mac ./prod.go + cd ./weshd && GOOS=darwin GOARCH=amd64 $(GO) build -tags noNativeLogger -o ../electron/build/mac ./go/electron/prod.go cd ./electron && node ./builder/mac.js amd64 # requires prepare-electron @@ -335,7 +335,7 @@ build-electron-macos-arm64: rm -fr ./electron/dist rm -fr ./electron/build cd ./electron && npm i - cd ./electron && GOOS=darwin GOARCH=arm64 $(GO) build -tags noNativeLogger -o ./build/mac ./prod.go + cd ./weshd && GOOS=darwin GOARCH=arm64 $(GO) build -tags noNativeLogger -o ../electron/build/mac ./go/electron/prod.go cd ./electron && node ./builder/mac.js arm64 # requires prepare-electron @@ -344,7 +344,7 @@ build-electron-windows-amd64: rm -fr ./electron/dist rm -fr ./electron/build cd ./electron && npm i - cd ./electron && GOOS=windows GOARCH=amd64 $(GO) build -tags noNativeLogger -o ./build/win.exe ./prod.go + cd ./weshd && GOOS=windows GOARCH=amd64 $(GO) build -tags noNativeLogger -o ../electron/build/win.exe ./go/electron/prod.go cd ./electron && node ./builder/win.js # requires prepare-electron @@ -353,7 +353,7 @@ build-electron-linux-amd64: rm -fr ./electron/dist rm -fr ./electron/build cd ./electron && npm i - cd ./electron && GOOS=linux GOARCH=amd64 $(GO) build -tags noNativeLogger -o ./build/linux ./prod.go + cd ./weshd && GOOS=linux GOARCH=amd64 $(GO) build -tags noNativeLogger -o ../electron/build/linux ./go/electron/prod.go cd ./electron && node ./builder/linux.js .PHONY: check-ios-weshframework @@ -366,11 +366,10 @@ check-ios-weshframework: .PHONY: build-ios-weshframework build-ios-weshframework: $(MAKE) init-weshd-go - CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -DHAVE_GETHOSTUUID=0" - cd ./weshd && gomobile bind \ + cd ./weshd && gomobile bind -v \ -o ./ios/Frameworks/WeshFramework.xcframework \ - -tags "fts5 sqlite sqlite_unlock_notify" -tags 'nowatchdog' -target ios -iosversion 13.0 \ - ./go/ + -tags 'nowatchdog' -target ios \ + ./go/app .PHONY: check-android-weshframework check-android-weshframework: @@ -388,7 +387,7 @@ build-android-weshframework: -javapkg=com.weshnet \ -o ./android/libs/WeshFramework.aar \ -tags "fts5 sqlite sqlite_unlock_notify" -tags 'nowatchdog' -target android -androidapi 21 \ - ./go/ + ./go/app .PHONY: init-weshd-go init-weshd-go: diff --git a/app.config.js b/app.config.js index 3aab6cd8b9..010c27295e 100644 --- a/app.config.js +++ b/app.config.js @@ -47,7 +47,15 @@ const config = { projectId: "9ce165de-0199-478c-b3bd-8688e5ce03eb", }, }, - plugins: ["expo-font"], + plugins: [ + "expo-font", + [ + "expo-document-picker", + { + iCloudContainerEnvironment: "Production", + }, + ], + ], }, }; diff --git a/assets/icons/download.svg b/assets/icons/download.svg new file mode 100644 index 0000000000..736c162c1b --- /dev/null +++ b/assets/icons/download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/illustration.svg b/assets/illustrations/message-empty-logo-illustration.svg similarity index 100% rename from assets/icons/illustration.svg rename to assets/illustrations/message-empty-logo-illustration.svg diff --git a/assets/illustrations/message-onboarding.svg b/assets/illustrations/message-onboarding.svg new file mode 100644 index 0000000000..9c7757820e --- /dev/null +++ b/assets/illustrations/message-onboarding.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/electron/go.mod b/electron/go.mod deleted file mode 100644 index 42da74eac2..0000000000 --- a/electron/go.mod +++ /dev/null @@ -1,286 +0,0 @@ -module github.com/TERITORI/teritori-dapp/electron - -go 1.18 - -require ( - berty.tech/weshnet v1.14.0 - github.com/dgraph-io/badger v1.6.2 - github.com/improbable-eng/grpc-web v0.15.0 - github.com/ipfs/go-ds-badger v0.3.0 - github.com/mitchellh/go-homedir v1.1.0 - github.com/peterbourgon/ff/v3 v3.4.0 - github.com/pkg/errors v0.9.1 - go.uber.org/zap v1.26.0 - google.golang.org/grpc v1.60.1 - moul.io/srand v1.6.1 -) - -require ( - bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect - berty.tech/go-ipfs-log v1.10.0 // indirect - berty.tech/go-ipfs-repo-encrypted v1.3.0 // indirect - berty.tech/go-orbit-db v1.22.0 // indirect - contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect - filippo.io/edwards25519 v1.0.0 // indirect - github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect - github.com/DataDog/zstd v1.4.1 // indirect - github.com/VictoriaMetrics/fastcache v1.5.7 // indirect - github.com/aead/ecdh v0.2.0 // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622 // indirect - github.com/berty/go-libp2p-mock v1.0.1 // indirect - github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8 // indirect - github.com/berty/go-libp2p-rendezvous v0.5.0 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect - github.com/ceramicnetwork/go-dag-jose v0.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/cgroups v1.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect - github.com/cskr/pubsub v1.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.3 // indirect - github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect - github.com/elastic/gosigar v0.14.2 // indirect - github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 // indirect - github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/flynn/noise v1.0.0 // indirect - github.com/francoispqt/gojay v1.2.13 // indirect - github.com/gabriel-vasile/mimetype v1.4.1 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gofrs/uuid v4.3.1+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b // indirect - github.com/google/tink/go v1.7.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect - github.com/huin/goupnp v1.1.0 // indirect - github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3 // indirect - github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e // indirect - github.com/hyperledger/ursa-wrapper-go v0.3.1 // indirect - github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/go-bitfield v1.1.0 // indirect - github.com/ipfs/go-block-format v0.1.1 // indirect - github.com/ipfs/go-blockservice v0.5.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-cidutil v0.1.0 // indirect - github.com/ipfs/go-datastore v0.6.0 // indirect - github.com/ipfs/go-delegated-routing v0.7.0 // indirect - github.com/ipfs/go-ds-badger2 v0.1.3 // indirect - github.com/ipfs/go-ds-flatfs v0.5.1 // indirect - github.com/ipfs/go-ds-leveldb v0.5.0 // indirect - github.com/ipfs/go-ds-measure v0.2.0 // indirect - github.com/ipfs/go-ds-sql v0.3.0 // indirect - github.com/ipfs/go-fetcher v1.6.1 // indirect - github.com/ipfs/go-filestore v1.2.0 // indirect - github.com/ipfs/go-fs-lock v0.0.7 // indirect - github.com/ipfs/go-graphsync v0.14.1 // indirect - github.com/ipfs/go-ipfs-blockstore v1.2.0 // indirect - github.com/ipfs/go-ipfs-chunker v0.0.5 // indirect - github.com/ipfs/go-ipfs-cmds v0.8.2 // indirect - github.com/ipfs/go-ipfs-delay v0.0.1 // indirect - github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect - github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect - github.com/ipfs/go-ipfs-exchange-offline v0.3.0 // indirect - github.com/ipfs/go-ipfs-keystore v0.1.0 // indirect - github.com/ipfs/go-ipfs-pinner v0.3.0 // indirect - github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect - github.com/ipfs/go-ipfs-pq v0.0.3 // indirect - github.com/ipfs/go-ipfs-provider v0.8.1 // indirect - github.com/ipfs/go-ipfs-redirects-file v0.1.1 // indirect - github.com/ipfs/go-ipfs-routing v0.3.0 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect - github.com/ipfs/go-ipld-cbor v0.0.6 // indirect - github.com/ipfs/go-ipld-format v0.4.0 // indirect - github.com/ipfs/go-ipld-git v0.1.1 // indirect - github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-ipns v0.3.0 // indirect - github.com/ipfs/go-libipfs v0.6.2 // indirect - github.com/ipfs/go-log v1.0.5 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/ipfs/go-merkledag v0.10.0 // indirect - github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-mfs v0.2.1 // indirect - github.com/ipfs/go-namesys v0.7.0 // indirect - github.com/ipfs/go-path v0.3.1 // indirect - github.com/ipfs/go-peertaskqueue v0.8.1 // indirect - github.com/ipfs/go-pinning-service-http-client v0.1.2 // indirect - github.com/ipfs/go-unixfs v0.4.4 // indirect - github.com/ipfs/go-unixfsnode v1.5.2 // indirect - github.com/ipfs/go-verifcid v0.0.2 // indirect - github.com/ipfs/interface-go-ipfs-core v0.11.1 // indirect - github.com/ipfs/kubo v0.19.0 // indirect - github.com/ipld/edelweiss v0.2.0 // indirect - github.com/ipld/go-car v0.5.0 // indirect - github.com/ipld/go-car/v2 v2.5.1 // indirect - github.com/ipld/go-codec-dagpb v1.6.0 // indirect - github.com/ipld/go-ipld-prime v0.20.0 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/jbenet/goprocess v0.1.4 // indirect - github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 // indirect - github.com/klauspost/compress v1.16.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-doh-resolver v0.4.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.27.6 // indirect - github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect - github.com/libp2p/go-libp2p-gostream v0.5.0 // indirect - github.com/libp2p/go-libp2p-http v0.4.0 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.21.1 // indirect - github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect - github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect - github.com/libp2p/go-libp2p-record v0.2.0 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.6.1 // indirect - github.com/libp2p/go-libp2p-xor v0.1.0 // indirect - github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.1.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect - github.com/libp2p/zeroconf/v2 v2.2.0 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect - github.com/mattn/go-runewidth v0.0.8 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect - github.com/miekg/dns v1.1.53 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect - github.com/minio/sha256-simd v1.0.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.9.0 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.8.1 // indirect - github.com/multiformats/go-multihash v0.2.1 // indirect - github.com/multiformats/go-multistream v0.4.1 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect - github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect - github.com/onsi/ginkgo/v2 v2.9.2 // indirect - github.com/opencontainers/runtime-spec v1.0.2 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/openzipkin/zipkin-go v0.4.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/piprate/json-gold v0.4.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polydawn/refmt v0.89.0 // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/prometheus/statsd_exporter v0.21.0 // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect - github.com/quic-go/quic-go v0.33.0 // indirect - github.com/quic-go/webtransport-go v0.5.2 // indirect - github.com/raulk/go-watchdog v1.3.0 // indirect - github.com/rs/cors v1.8.3 // indirect - github.com/samber/lo v1.36.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 // indirect - github.com/stretchr/testify v1.8.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 // indirect - github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect - github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect - github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect - github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect - github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect - github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 // indirect - github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect - go.opentelemetry.io/otel v1.11.1 // indirect - go.opentelemetry.io/otel/exporters/jaeger v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/zipkin v1.7.0 // indirect - go.opentelemetry.io/otel/metric v0.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.11.1 // indirect - go.opentelemetry.io/otel/trace v1.11.1 // indirect - go.opentelemetry.io/proto/otlp v0.16.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.16.1 // indirect - go.uber.org/fx v1.19.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.16.0 // indirect - golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.7.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/square/go-jose.v2 v2.6.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.7 // indirect - moul.io/openfiles v1.2.0 // indirect - moul.io/u v1.27.0 // indirect - moul.io/zapfilter v1.7.0 // indirect - moul.io/zapring v1.3.3 // indirect - nhooyr.io/websocket v1.8.7 // indirect -) diff --git a/electron/go.sum b/electron/go.sum deleted file mode 100644 index bfe10408f7..0000000000 --- a/electron/go.sum +++ /dev/null @@ -1,2095 +0,0 @@ -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc h1:utDghgcjE8u+EBjHOgYT+dJPcnDF05KqWMBcjuJy510= -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= -berty.tech/go-ipfs-log v1.10.0 h1:IqCCIuo/gw+N4akdx1zDfXlwi8B4JtljF+xxY9zodUg= -berty.tech/go-ipfs-log v1.10.0/go.mod h1:TBEa6g2nkn21VtkVd6Gkk3xR9c8BfH/E8eH7tjjwhec= -berty.tech/go-ipfs-repo-encrypted v1.3.0 h1:k7whfA58pFaFF1AGtqCmT878QpvQXkLSAlZQPvqoeo8= -berty.tech/go-ipfs-repo-encrypted v1.3.0/go.mod h1:lbWggsc67nM48IPP5K9vDLNPT3yYELP7Q6Sni9cufQs= -berty.tech/go-orbit-db v1.22.0 h1:BiUGk9ukOKJMQ2YlQV/e9gjR9TOedIa9LUDfjp9CVHA= -berty.tech/go-orbit-db v1.22.0/go.mod h1:RC3/C/igfM7b2RuT7WIloOHbFz9zZTJxB3jOEqC6UWA= -berty.tech/weshnet v1.14.0 h1:IIBZ4bQABwwHDSTPgPWBMS0PTBMaBAm4uUs/jJxzEdo= -berty.tech/weshnet v1.14.0/go.mod h1:BNV2f0xxLFIPwNJNf8KprEAGfIqvzGh8uu7QGhRxe7w= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= -contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= -github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= -github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= -github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aead/ecdh v0.2.0 h1:pYop54xVaq/CEREFEcukHRZfTdjiWvYIsZDXXrBapQQ= -github.com/aead/ecdh v0.2.0/go.mod h1:a9HHtXuSo8J1Js1MwLQx2mBhkXMT6YwUmVVEY4tTB8U= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622 h1:kJqfCXKR5EJdh9HYh4rjYL3QvxjP5cnCssIU141m79c= -github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622/go.mod h1:G66sIy+q6BKIoKoKNqFU7sxSnrS5d8Z8meQ3Iu0ZJ4o= -github.com/berty/go-libp2p-mock v1.0.1 h1:2lsXlZOQvELcvrkHTlK2t2965sg7pkr1sWrucH6S2zg= -github.com/berty/go-libp2p-mock v1.0.1/go.mod h1:PsUBOq6zSAjXKLlSKRzhkIpjm7ZxGgjLn/FZY+3CoKs= -github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8 h1:04xF+6wtZhEIHv+1ghqd7hhCePdKmPykJWSjEyy0uT4= -github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8/go.mod h1:d/76O2W9ZLphGN2Q7Q1QSolJGV3zaO8D+da3Bdpk5d0= -github.com/berty/go-libp2p-rendezvous v0.5.0 h1:eT8fBh+OewfTB6uAA47rzdgAVo/aevW4TA7PvZq75T4= -github.com/berty/go-libp2p-rendezvous v0.5.0/go.mod h1:gkDEobp0lV+DHfNzO7+kCJxApO0vmpOEV+Z5uttZYGM= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/ceramicnetwork/go-dag-jose v0.1.0 h1:yJ/HVlfKpnD3LdYP03AHyTvbm3BpPiz2oZiOeReJRdU= -github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= -github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= -github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= -github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4= -github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 h1:QV0ZrfBLpFc2KDk+a4LJefDczXnonRwrYrQJY/9L4dA= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= -github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b h1:Qcx5LM0fSiks9uCyFZwDBUasd3lxd1RM0GYpL+Li5o4= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= -github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= -github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.1.0 h1:gEe0Dp/lZmPZiDFzJJaOfUpOvv2MKUkoBX8lDrn9vKU= -github.com/huin/goupnp v1.1.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3 h1:r/jf1DTXG72uO5xK1VgZGywcjBlXh1E8kKnAt67bXJA= -github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3/go.mod h1:5lp5+NPjRngsjFLYYGg5mtkvw6I4Mr7CKz+wHYxROk0= -github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e h1:SxbXlF39661T9w/L9PhVdtbJfJ51Pm4JYEEW6XfZHEQ= -github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e/go.mod h1:oryUyWb23l/a3tAP9KW+GBbfcfqp9tZD4y5hSkFrkqI= -github.com/hyperledger/ursa-wrapper-go v0.3.1 h1:Do+QrVNniY77YK2jTIcyWqj9rm/Yb5SScN0bqCjiibA= -github.com/hyperledger/ursa-wrapper-go v0.3.1/go.mod h1:nPSAuMasIzSVciQo22PedBk4Opph6bJ6ia3ms7BH/mk= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= -github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= -github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= -github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= -github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= -github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= -github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= -github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= -github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-block-format v0.1.1 h1:129vSO3zwbsYADcyQWcOYiuCpAqt462SFfqFHdFJhhI= -github.com/ipfs/go-block-format v0.1.1/go.mod h1:+McEIT+g52p+zz5xGAABGSOKrzmrdX97bc0USBdWPUs= -github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= -github.com/ipfs/go-blockservice v0.5.0 h1:B2mwhhhVQl2ntW2EIpaWPwSCxSuqr5fFA93Ms4bYLEY= -github.com/ipfs/go-blockservice v0.5.0/go.mod h1:W6brZ5k20AehbmERplmERn8o2Ni3ZZubvAxaIUeaT6w= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= -github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= -github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= -github.com/ipfs/go-delegated-routing v0.7.0 h1:43FyMnKA+8XnyX68Fwg6aoGkqrf8NS5aG7p644s26PU= -github.com/ipfs/go-delegated-routing v0.7.0/go.mod h1:u4zxjUWIe7APUW5ds9CfD0tJX3vM9JhIeNqA8kE4vHE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= -github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= -github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= -github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= -github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= -github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= -github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-ds-sql v0.3.0 h1:PLBbl0Rt0tBwWhQ0b3GCQbH+Bgd6aj2srKG6vJ7nYl4= -github.com/ipfs/go-ds-sql v0.3.0/go.mod h1:jE3bhmuUnMPXFftc4NEAiPUfgiwiv7fIdjozuX+m1/E= -github.com/ipfs/go-fetcher v1.6.1 h1:UFuRVYX5AIllTiRhi5uK/iZkfhSpBCGX7L70nSZEmK8= -github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= -github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= -github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= -github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.14.1 h1:tvFpBY9LcehIB7zi5SZIa+7aoxBOrGbdekhOXdnlT70= -github.com/ipfs/go-graphsync v0.14.1/go.mod h1:S6O/c5iXOXqDgrQgiZSgOTRUSiVvpKEhrzqFHKnLVcs= -github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= -github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= -github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= -github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= -github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.8.2 h1:WmehvYWkxch8dTw0bdF51R8lqbyl+3H8e6pIACzT/ds= -github.com/ipfs/go-ipfs-cmds v0.8.2/go.mod h1:/b17Davff0E0Wh/hhXsN1Pgxxbkm26k3PV+G4EDiC/s= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= -github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= -github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= -github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= -github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= -github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY= -github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= -github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= -github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-keystore v0.1.0 h1:gfuQUO/cyGZgZIHE6OrJas4OnwuxXCqJG7tI0lrB5Qc= -github.com/ipfs/go-ipfs-keystore v0.1.0/go.mod h1:LvLw7Qhnb0RlMOfCzK6OmyWxICip6lQ06CCmdbee75U= -github.com/ipfs/go-ipfs-pinner v0.3.0 h1:jwe5ViX3BON3KgOAYrrhav2+1ONB0QzFAWQd7HUlbuM= -github.com/ipfs/go-ipfs-pinner v0.3.0/go.mod h1:oX0I0nC6zlNIh0LslSrUnjfNKPq8ufoFtqV1/wcJvyo= -github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= -github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= -github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= -github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= -github.com/ipfs/go-ipfs-provider v0.8.1 h1:qt670pYmcNH3BCjyXDgg07o2WsTRsOdMwYc25ukCdjQ= -github.com/ipfs/go-ipfs-provider v0.8.1/go.mod h1:qCpwpoohIRVXvNzkygzsM3qdqP/sXlrogtA5I45tClc= -github.com/ipfs/go-ipfs-redirects-file v0.1.1 h1:Io++k0Vf/wK+tfnhEh63Yte1oQK5VGT2hIEYpD0Rzx8= -github.com/ipfs/go-ipfs-redirects-file v0.1.1/go.mod h1:tAwRjCV0RjLTjH8DR/AU7VYvfQECg+lpUy2Mdzv7gyk= -github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= -github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= -github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= -github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= -github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= -github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y= -github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= -github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= -github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= -github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= -github.com/ipfs/go-libipfs v0.6.2 h1:QUf3kS3RrCjgtE0QW2d18PFFfOLeEt24Ft892ipLzRI= -github.com/ipfs/go-libipfs v0.6.2/go.mod h1:FmhKgxMOQA572TK5DA3MZ5GL44ZqsMHIrkgK4gLn4A8= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= -github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= -github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= -github.com/ipfs/go-merkledag v0.10.0 h1:IUQhj/kzTZfam4e+LnaEpoiZ9vZF6ldimVlby+6OXL4= -github.com/ipfs/go-merkledag v0.10.0/go.mod h1:zkVav8KiYlmbzUzNM6kENzkdP5+qR7+2mCwxkQ6GIj8= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= -github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-mfs v0.2.1 h1:5jz8+ukAg/z6jTkollzxGzhkl3yxm022Za9f2nL5ab8= -github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.7.0 h1:xqosk71GIVRkFDtF2UNRcXn4LdNeo7tzuy8feHD6NbU= -github.com/ipfs/go-namesys v0.7.0/go.mod h1:KYSZBVZG3VJC34EfqqJPG7T48aWgxseoMPAPA5gLyyQ= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= -github.com/ipfs/go-path v0.3.1 h1:wkeaCWE/NTuuPGlEkLTsED5UkzfKYZpxaFFPgk8ZVLE= -github.com/ipfs/go-path v0.3.1/go.mod h1:eNLsxJEEMxn/CDzUJ6wuNl+6No6tEUhOZcPKsZsYX0E= -github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= -github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= -github.com/ipfs/go-pinning-service-http-client v0.1.2 h1:jdr7KelhL9gNHTU8jbqPMwIexSZXgZzxNGkycCwmbXI= -github.com/ipfs/go-pinning-service-http-client v0.1.2/go.mod h1:6wd5mjYhXJTiWU8b4RSWPpWdlzE5/csoXV0dWWMjun4= -github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= -github.com/ipfs/go-unixfs v0.4.4 h1:D/dLBOJgny5ZLIur2vIXVQVW0EyDHdOMBDEhgHrt6rY= -github.com/ipfs/go-unixfs v0.4.4/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM= -github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.5.2 h1:CvsiTt58W2uR5dD8bqQv+aAY0c1qolmXmSyNbPHYiew= -github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE0LvBqHY+ks= -github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= -github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= -github.com/ipfs/interface-go-ipfs-core v0.11.1 h1:xVW8DKzd230h8bPv+oC2fBjW4PtDGqGtvpX64/aBe48= -github.com/ipfs/interface-go-ipfs-core v0.11.1/go.mod h1:xmnoccUXY7N/Q8AIx0vFqgW926/FAZ8+do/1NTEHKsU= -github.com/ipfs/kubo v0.19.0 h1:5B58RXikTqs9six7FweQSzo6WvBKiP2MVwYCvJomV7k= -github.com/ipfs/kubo v0.19.0/go.mod h1:OqX4B1YWKWCvi9T/sKDfTBMAKbVi6yVIXAii6/nr1Dc= -github.com/ipld/edelweiss v0.2.0 h1:KfAZBP8eeJtrLxLhi7r3N0cBCo7JmwSRhOJp3WSpNjk= -github.com/ipld/edelweiss v0.2.0/go.mod h1:FJAzJRCep4iI8FOFlRriN9n0b7OuX3T/S9++NpBDmA4= -github.com/ipld/go-car v0.5.0 h1:kcCEa3CvYMs0iE5BzD5sV7O2EwMiCIp3uF8tA6APQT8= -github.com/ipld/go-car v0.5.0/go.mod h1:ppiN5GWpjOZU9PgpAZ9HbZd9ZgSpwPMr48fGRJOWmvE= -github.com/ipld/go-car/v2 v2.5.1 h1:U2ux9JS23upEgrJScW8VQuxmE94560kYxj9CQUpcfmk= -github.com/ipld/go-car/v2 v2.5.1/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E= -github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= -github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= -github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= -github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= -github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 h1:kMJlf8z8wUcpyI+FQJIdGjAhfTww1y0AbQEv86bpVQI= -github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69/go.mod h1:tlkavyke+Ac7h8R3gZIjI5LKBcvMlSWnXNMgT3vZXo8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= -github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= -github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= -github.com/libp2p/go-doh-resolver v0.4.0 h1:gUBa1f1XsPwtpE1du0O+nnZCUqtG7oYi7Bb+0S7FQqw= -github.com/libp2p/go-doh-resolver v0.4.0/go.mod h1:v1/jwsFusgsWIGX/c6vCRrnJ60x7bhTiq/fs2qt0cAg= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= -github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.27.6 h1:KmGU5kskCaaerm53heqzfGOlrW2z8icZ+fnyqgrZs38= -github.com/libp2p/go-libp2p v0.27.6/go.mod h1:oMfQGTb9CHnrOuSM6yMmyK2lXz3qIhnkn2+oK3B1Y2g= -github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= -github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= -github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= -github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-gostream v0.5.0 h1:niNGTUrFoUDP/8jxMgu97zngMO+UGYBpVpbCKwIJBls= -github.com/libp2p/go-libp2p-gostream v0.5.0/go.mod h1:rXrb0CqfcRRxa7m3RSKORQiKiWgk3IPeXWda66ZXKsA= -github.com/libp2p/go-libp2p-http v0.4.0 h1:V+f9Rhe/8GkColmXoyJyA0NVsN9F3TCLZgW2hwjoX5w= -github.com/libp2p/go-libp2p-http v0.4.0/go.mod h1:92tmLGrlBliQFDlZRpBXT3BJM7rGFONy0vsNrG/bMPg= -github.com/libp2p/go-libp2p-kad-dht v0.21.1 h1:xpfp8/t9+X2ip1l8Umap1/UGNnJ3RHJgKGAEsnRAlTo= -github.com/libp2p/go-libp2p-kad-dht v0.21.1/go.mod h1:Oy8wvbdjpB70eS5AaFaI68tOtrdo3KylTvXDjikxqFo= -github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= -github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA= -github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= -github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= -github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s= -github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE= -github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= -github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing-helpers v0.6.1 h1:tI3rHOf/FDQsxC2pHBaOZiqPJ0MZYyzGAf4V45xla4U= -github.com/libp2p/go-libp2p-routing-helpers v0.6.1/go.mod h1:R289GUxUMzRXIbWGSuUUTPrlVJZ3Y/pPz495+qgXJX8= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= -github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= -github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= -github.com/libp2p/go-libp2p-xor v0.1.0 h1:hhQwT4uGrBcuAkUGXADuPltalOdpf9aag9kaYNT2tLA= -github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= -github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= -github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9 h1:d8OcZrg9dmqfBsHRDGP2QarJlj/1p0YI/NylTf2LYqo= -github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9/go.mod h1:AEsb24YMiJiSqh8Cs8kRGJxDDXKEkveJ7nxYUeYibEc= -github.com/maruel/ut v1.0.2 h1:mQTlQk3jubTbdTcza+hwoZQWhzcvE4L6K6RTtAFlA1k= -github.com/maruel/ut v1.0.2/go.mod h1:RV8PwPD9dd2KFlnlCc/DB2JVvkXmyaalfc5xvmSrRSs= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= -github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= -github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8= -github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= -github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= -github.com/mutecomm/go-sqlcipher/v4 v4.4.2 h1:eM10bFtI4UvibIsKr10/QT7Yfz+NADfjZYh0GKrXUNc= -github.com/mutecomm/go-sqlcipher/v4 v4.4.2/go.mod h1:mF2UmIpBnzFeBdu/ypTDb/LdbS0nk0dfSN1WUsWTjMA= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw= -github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= -github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= -github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/piprate/json-gold v0.4.2 h1:Rq8V+637HOFcj20KdTqW/g/llCwX2qtau0g5d1pD79o= -github.com/piprate/json-gold v0.4.2/go.mod h1:OK1z7UgtBZk06n2cDE2OSq1kffmjFFp5/2yhLLCz9UM= -github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= -github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= -github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= -github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= -github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk= -github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= -github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samber/lo v1.36.0 h1:4LaOxH1mHnbDGhTVE0i1z8v/lWaQW8AIfOD3HU4mSaw= -github.com/samber/lo v1.36.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= -github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 h1:wD1IWQwAhdWclCwaf6DdzgCAe9Bfz1M+4AHRd7N786Y= -github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 h1:RBkacARv7qY5laaXGlF4wFB/tk5rnthhPb8oIBGoagY= -github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8/go.mod h1:9PdLyPiZIiW3UopXyRnPYyjUXSpiQNHRLu8fOsR3o8M= -github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ= -github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= -github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 h1:ctS9Anw/KozviCCtK6VWMz5kPL9nbQzbQY4yfqlIV4M= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4= -go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= -go.opentelemetry.io/otel/exporters/jaeger v1.7.0 h1:wXgjiRldljksZkZrldGVe6XrG9u3kYDyQmkZwmm5dI0= -go.opentelemetry.io/otel/exporters/jaeger v1.7.0/go.mod h1:PwQAOqBgqbLQRKlj466DuD2qyMjbtcPpfPfj+AqbSBs= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/exporters/zipkin v1.7.0 h1:X0FZj+kaIdLi29UiyrEGDhRTYsEXj9GdEW5Y39UQFEE= -go.opentelemetry.io/otel/exporters/zipkin v1.7.0/go.mod h1:9YBXeOMFLQGwNEjsxMRiWPGoJX83usGMhbCmxUbNe5I= -go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= -go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= -go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= -go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ= -go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E= -go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.16.1 h1:+alNIBsl0qfY0j6epRubp/9obgtrObRAc5aD+6jbWY8= -go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= -go.uber.org/fx v1.19.2 h1:SyFgYQFr1Wl0AYstE8vyYIzP4bFz2URrScjwC4cwUvY= -go.uber.org/fx v1.19.2/go.mod h1:43G1VcqSzbIv77y00p1DRAsyZS8WdzuYdhZXmEUkMyQ= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= -go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= -google.golang.org/grpc/examples v0.0.0-20200922230038-4e932bbcb079 h1:unzgkDPNegIn/czOcgxzQaTzEzOiBH1V1j55rsEzVEg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -moul.io/openfiles v1.2.0 h1:oAmBX0ChBBsKERFfTRyLi9JkjOvEv9E474BEL/wVq44= -moul.io/openfiles v1.2.0/go.mod h1:FR9BZ1mw7VE0uZN6HVJcA16Ee2nTDG/YZUyiGM/T2Rw= -moul.io/srand v1.6.1 h1:SJ335F+54ivLdlH7wH52Rtyv0Ffos6DpsF5wu3ZVMXU= -moul.io/srand v1.6.1/go.mod h1:P2uaZB+GFstFNo8sEj6/U8FRV1n25kD0LLckFpJ+qvc= -moul.io/u v1.27.0 h1:rF0p184mludn2DzL0unA8Gf/mFWMBerdqOh8cyuQYzQ= -moul.io/u v1.27.0/go.mod h1:ggYDXxUjoHpfDsMPD3STqkUZTyA741PZiQhSd+7kRnA= -moul.io/zapfilter v1.7.0 h1:7aFrG4N72bDH9a2BtYUuUaDS981Dxu3qybWfeqaeBDU= -moul.io/zapfilter v1.7.0/go.mod h1:M+N2s+qZiA+bzRoyKMVRxyuERijS2ovi2pnMyiOGMvc= -moul.io/zapring v1.3.3 h1:N2QPn6qTMBWjh842UPxdjj2UW+uH/foXohgGCPZDlM8= -moul.io/zapring v1.3.3/go.mod h1:UvlTrdjeHtSqdjkGXwAxIfpaQ/ai4I+ccRASFxflcJE= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/electron/prod.go b/electron/prod.go deleted file mode 100644 index 2d91ed366d..0000000000 --- a/electron/prod.go +++ /dev/null @@ -1,270 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "net/http" - "os" - "os/signal" - "path/filepath" - "strconv" - "sync" - "syscall" - - mrand "math/rand" - - "github.com/dgraph-io/badger/options" - badger "github.com/ipfs/go-ds-badger" - "github.com/mitchellh/go-homedir" - "moul.io/srand" - - "berty.tech/weshnet" - "berty.tech/weshnet/pkg/ipfsutil" - ipfs_mobile "berty.tech/weshnet/pkg/ipfsutil/mobile" - "berty.tech/weshnet/pkg/protocoltypes" - "berty.tech/weshnet/pkg/tinder" - "github.com/peterbourgon/ff/v3" - "go.uber.org/zap" - "google.golang.org/grpc" - - - "github.com/improbable-eng/grpc-web/go/grpcweb" - "github.com/pkg/errors" -) - -// Application Vars - -var ( - fs = flag.NewFlagSet(os.Args[0], flag.ContinueOnError) - debug = fs.Bool("d", false, "enables the debug mode") - weshDir = "" - ds *badger.Datastore - tinderDriver *tinder.Service - mnode *ipfs_mobile.IpfsMobile - mrepo *ipfs_mobile.RepoMobile - localdisc *tinder.LocalDiscovery - ipfsCoreAPI ipfsutil.ExtendedCoreAPI -) - - -func handleExit() { - fmt.Println("Handle exit") - // Close the Badger datastore - if ds != nil { - err := ds.Close() - if err != nil { - fmt.Println("Error while closing Badger datastore:", err) - } - } - - // Close the Tinder discovery service - if tinderDriver != nil { - err := tinderDriver.Close() - if err != nil { - fmt.Println("Error while closing Tinder discovery service:", err) - } - } - - // Close the IPFS node - if mnode != nil { - err := mnode.Close() - if err != nil { - fmt.Println("Error while closing IPFS node:", err) - } - } - - // Close the IPFS repo - if mrepo != nil { - err := mrepo.Close() - if err != nil { - fmt.Println("Error while closing IPFS repo:", err) - } - } - - // Close the local discovery service - if localdisc != nil { - err := localdisc.Close() - if err != nil { - fmt.Println("Error while closing local discovery service:", err) - } - } - - // Close the local discovery service - if ipfsCoreAPI != nil { - err := ipfsCoreAPI.Close() - if err != nil { - fmt.Println("Error while ipfsCoreAPI:", err) - } - } - -} - -func checkAndCreateDir() { - - homeDir, err := homedir.Dir() - if err != nil { - fmt.Println("Error:", err) - return - } - - dir := "teritori-electron-wesh" - - weshDir = filepath.Join(homeDir, dir) - - // Check if the directory already exists - _, err = os.Stat(weshDir) - if err == nil { - fmt.Printf("Directory '%s' already exists.\n", weshDir) - } else if os.IsNotExist(err) { - // Create the new directory - err = os.Mkdir(weshDir, 0755) - if err != nil { - fmt.Println("Error:", err) - return - } - fmt.Printf("Created directory '%s'.\n", weshDir) - } else { - fmt.Println("Error:", err) - } -} - -func wesh() { - var port int - args := os.Args[1:] - - if len(args) != 0 { - // Attempt to parse the first argument as an integer - parsedPort, err := strconv.Atoi(args[0]) - if err != nil { - fmt.Println("Invalid port number:", args[0]) - return - } - port = parsedPort - } - fmt.Printf("golang port: '%d'.\n", port) - checkAndCreateDir() - - fs := flag.NewFlagSet("weshd", flag.ContinueOnError) - - if err := ff.Parse(fs, os.Args[1:]); err != nil { - panic(errors.Wrap(err, "failed to parse flags")) - } - - logger, err := zap.NewDevelopment() - if err != nil { - panic(errors.Wrap(err, "failed to create logger")) - } - - grpcServer := grpc.NewServer() - - rng := mrand.New(mrand.NewSource(srand.MustSecure())) // nolint:gosec // we need to use math/rand here, but it is seeded from crypto/rand - drivers := []tinder.IDriver{} - - // setup ipfs node - bopts := badger.DefaultOptions - bopts.ValueLogLoadingMode = options.FileIO - ds, err = badger.NewDatastore(weshDir, &bopts) - if err != nil { - panic(errors.Wrap(err, "unable to init badger datastore")) - } - - defer ds.Close() - - repo, err := ipfsutil.LoadRepoFromPath(weshDir) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs repo")) - } - - mrepo = ipfs_mobile.NewRepoMobile(weshDir, repo) - mnode, err = ipfsutil.NewIPFSMobile(context.Background(), mrepo, &ipfsutil.MobileOptions{}) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs node")) - } - - ipfsCoreAPI, err = ipfsutil.NewExtendedCoreAPIFromNode(mnode.IpfsNode) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs core api")) - } - - host := mnode.PeerHost() - - // setup loac disc - localdisc, err = tinder.NewLocalDiscovery(logger, host, rng) - if err != nil { - panic(errors.Wrap(err, "failed to create local discovery")) - } - drivers = append(drivers, localdisc) - - if mnode != nil { - dhtdisc := tinder.NewRoutingDiscoveryDriver("dht", mnode.DHT) - drivers = append(drivers, dhtdisc) - - } - tinderDriver, err := tinder.NewService(host, logger, drivers...) - if err != nil { - panic(errors.Wrap(err, "failed to create tinder driver")) - } - - svc, err := weshnet.NewService(weshnet.Opts{ - Logger: logger, - TinderService: tinderDriver, - IpfsCoreAPI: ipfsCoreAPI, - RootDatastore: ds, - }) - if err != nil { - panic(errors.Wrap(err, "failed to create weshnet server")) - } - defer svc.Close() - - protocoltypes.RegisterProtocolServiceServer(grpcServer, svc) - wrappedServer := grpcweb.WrapServer(grpcServer, - grpcweb.WithOriginFunc(func(string) bool { return true }), // @FIXME: this is very insecure - grpcweb.WithWebsockets(true), - ) - handler := func(resp http.ResponseWriter, req *http.Request) { - resp.Header().Set("Access-Control-Allow-Origin", "*") - resp.Header().Set("Access-Control-Allow-Headers", "*") - logger.Debug(fmt.Sprintf("Request: %v", req)) - wrappedServer.ServeHTTP(resp, req) - } - - httpServer := http.Server{ - Addr: fmt.Sprintf(":%d", port), - Handler: http.HandlerFunc(handler), - } - - if err := httpServer.ListenAndServe(); err != nil { - panic(errors.Wrap(err, "failed to start http server")) - } -} - -func main() { - - // Create a channel to receive the interrupt signal. - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - - // Create a WaitGroup to manage goroutines. - var wg sync.WaitGroup - - // Function to handle cleanup. - cleanup := func() { - fmt.Println("Cleanup code here...") - handleExit() - // You can add any cleanup operations you need here. - } - - // Start a goroutine to wait for the interrupt signal. - go func() { - <-interrupt - fmt.Println("Received interrupt signal. Cleaning up...") - cleanup() - os.Exit(1) - }() - - wg.Add(1) - go wesh() - wg.Wait() - -} diff --git a/go.mod b/go.mod index 17f914e06e..88df3c6115 100644 --- a/go.mod +++ b/go.mod @@ -290,5 +290,3 @@ require ( pgregory.net/rapid v0.5.5 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) - -replace berty.tech/weshnet => github.com/TERITORI/weshnet v0.0.0-20231127151743-abee97f5abd4 diff --git a/go/cmd/weshd/go.mod b/go/cmd/weshd/go.mod deleted file mode 100644 index 3a847535f8..0000000000 --- a/go/cmd/weshd/go.mod +++ /dev/null @@ -1,285 +0,0 @@ -module github.com/TERITORI/teritori-dapp/go/cmd/weshd - -go 1.18 - -require ( - berty.tech/weshnet v1.14.0 - github.com/dgraph-io/badger v1.6.2 - github.com/improbable-eng/grpc-web v0.15.0 - github.com/ipfs/go-ds-badger v0.3.0 - github.com/peterbourgon/ff/v3 v3.4.0 - github.com/pkg/errors v0.9.1 - go.uber.org/zap v1.26.0 - google.golang.org/grpc v1.59.0 - moul.io/srand v1.6.1 -) - -require ( - bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect - berty.tech/go-ipfs-log v1.10.0 // indirect - berty.tech/go-ipfs-repo-encrypted v1.3.0 // indirect - berty.tech/go-orbit-db v1.22.0 // indirect - contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect - filippo.io/edwards25519 v1.0.0 // indirect - github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect - github.com/DataDog/zstd v1.4.1 // indirect - github.com/VictoriaMetrics/fastcache v1.5.7 // indirect - github.com/aead/ecdh v0.2.0 // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622 // indirect - github.com/berty/go-libp2p-mock v1.0.1 // indirect - github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8 // indirect - github.com/berty/go-libp2p-rendezvous v0.5.0 // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/ceramicnetwork/go-dag-jose v0.1.0 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/cgroups v1.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect - github.com/cskr/pubsub v1.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v2 v2.2007.3 // indirect - github.com/dgraph-io/ristretto v0.0.3 // indirect - github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/eclipse/paho.mqtt.golang v1.4.2 // indirect - github.com/elastic/gosigar v0.14.2 // indirect - github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 // indirect - github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/flynn/noise v1.0.0 // indirect - github.com/francoispqt/gojay v1.2.13 // indirect - github.com/gabriel-vasile/mimetype v1.4.1 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.3.0 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gofrs/uuid v4.3.1+incompatible // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b // indirect - github.com/google/tink/go v1.7.0 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect - github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect - github.com/huin/goupnp v1.1.0 // indirect - github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3 // indirect - github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e // indirect - github.com/hyperledger/ursa-wrapper-go v0.3.1 // indirect - github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/go-bitfield v1.1.0 // indirect - github.com/ipfs/go-block-format v0.1.1 // indirect - github.com/ipfs/go-blockservice v0.5.0 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-cidutil v0.1.0 // indirect - github.com/ipfs/go-datastore v0.6.0 // indirect - github.com/ipfs/go-delegated-routing v0.7.0 // indirect - github.com/ipfs/go-ds-badger2 v0.1.3 // indirect - github.com/ipfs/go-ds-flatfs v0.5.1 // indirect - github.com/ipfs/go-ds-leveldb v0.5.0 // indirect - github.com/ipfs/go-ds-measure v0.2.0 // indirect - github.com/ipfs/go-ds-sql v0.3.0 // indirect - github.com/ipfs/go-fetcher v1.6.1 // indirect - github.com/ipfs/go-filestore v1.2.0 // indirect - github.com/ipfs/go-fs-lock v0.0.7 // indirect - github.com/ipfs/go-graphsync v0.14.1 // indirect - github.com/ipfs/go-ipfs-blockstore v1.2.0 // indirect - github.com/ipfs/go-ipfs-chunker v0.0.5 // indirect - github.com/ipfs/go-ipfs-cmds v0.8.2 // indirect - github.com/ipfs/go-ipfs-delay v0.0.1 // indirect - github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect - github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect - github.com/ipfs/go-ipfs-exchange-offline v0.3.0 // indirect - github.com/ipfs/go-ipfs-keystore v0.1.0 // indirect - github.com/ipfs/go-ipfs-pinner v0.3.0 // indirect - github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect - github.com/ipfs/go-ipfs-pq v0.0.3 // indirect - github.com/ipfs/go-ipfs-provider v0.8.1 // indirect - github.com/ipfs/go-ipfs-redirects-file v0.1.1 // indirect - github.com/ipfs/go-ipfs-routing v0.3.0 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect - github.com/ipfs/go-ipld-cbor v0.0.6 // indirect - github.com/ipfs/go-ipld-format v0.4.0 // indirect - github.com/ipfs/go-ipld-git v0.1.1 // indirect - github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-ipns v0.3.0 // indirect - github.com/ipfs/go-libipfs v0.6.2 // indirect - github.com/ipfs/go-log v1.0.5 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/ipfs/go-merkledag v0.10.0 // indirect - github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/ipfs/go-mfs v0.2.1 // indirect - github.com/ipfs/go-namesys v0.7.0 // indirect - github.com/ipfs/go-path v0.3.1 // indirect - github.com/ipfs/go-peertaskqueue v0.8.1 // indirect - github.com/ipfs/go-pinning-service-http-client v0.1.2 // indirect - github.com/ipfs/go-unixfs v0.4.4 // indirect - github.com/ipfs/go-unixfsnode v1.5.2 // indirect - github.com/ipfs/go-verifcid v0.0.2 // indirect - github.com/ipfs/interface-go-ipfs-core v0.11.1 // indirect - github.com/ipfs/kubo v0.19.0 // indirect - github.com/ipld/edelweiss v0.2.0 // indirect - github.com/ipld/go-car v0.5.0 // indirect - github.com/ipld/go-car/v2 v2.5.1 // indirect - github.com/ipld/go-codec-dagpb v1.6.0 // indirect - github.com/ipld/go-ipld-prime v0.20.0 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/jbenet/goprocess v0.1.4 // indirect - github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 // indirect - github.com/klauspost/compress v1.16.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-doh-resolver v0.4.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.27.6 // indirect - github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect - github.com/libp2p/go-libp2p-gostream v0.5.0 // indirect - github.com/libp2p/go-libp2p-http v0.4.0 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.21.1 // indirect - github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect - github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect - github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect - github.com/libp2p/go-libp2p-record v0.2.0 // indirect - github.com/libp2p/go-libp2p-routing-helpers v0.6.1 // indirect - github.com/libp2p/go-libp2p-xor v0.1.0 // indirect - github.com/libp2p/go-mplex v0.7.0 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-nat v0.1.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect - github.com/libp2p/zeroconf/v2 v2.2.0 // indirect - github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect - github.com/mattn/go-runewidth v0.0.8 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect - github.com/miekg/dns v1.1.53 // indirect - github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect - github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect - github.com/minio/sha256-simd v1.0.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.9.0 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect - github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.8.1 // indirect - github.com/multiformats/go-multihash v0.2.1 // indirect - github.com/multiformats/go-multistream v0.4.1 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect - github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect - github.com/onsi/ginkgo/v2 v2.9.2 // indirect - github.com/opencontainers/runtime-spec v1.0.2 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/openzipkin/zipkin-go v0.4.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/piprate/json-gold v0.4.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polydawn/refmt v0.89.0 // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/prometheus/statsd_exporter v0.21.0 // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect - github.com/quic-go/quic-go v0.33.0 // indirect - github.com/quic-go/webtransport-go v0.5.2 // indirect - github.com/raulk/go-watchdog v1.3.0 // indirect - github.com/rs/cors v1.8.3 // indirect - github.com/samber/lo v1.36.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 // indirect - github.com/stretchr/testify v1.8.4 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 // indirect - github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect - github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect - github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect - github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect - github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect - github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 // indirect - github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/jaeger v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 // indirect - go.opentelemetry.io/otel/exporters/zipkin v1.7.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/sdk v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.16.1 // indirect - go.uber.org/fx v1.19.2 // indirect - go.uber.org/multierr v1.11.0 // indirect - go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/tools v0.7.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/square/go-jose.v2 v2.6.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.7 // indirect - moul.io/openfiles v1.2.0 // indirect - moul.io/u v1.27.0 // indirect - moul.io/zapfilter v1.7.0 // indirect - moul.io/zapring v1.3.3 // indirect - nhooyr.io/websocket v1.8.7 // indirect -) diff --git a/go/cmd/weshd/go.sum b/go/cmd/weshd/go.sum deleted file mode 100644 index 39dbf498b2..0000000000 --- a/go/cmd/weshd/go.sum +++ /dev/null @@ -1,2070 +0,0 @@ -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc h1:utDghgcjE8u+EBjHOgYT+dJPcnDF05KqWMBcjuJy510= -bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= -berty.tech/go-ipfs-log v1.10.0 h1:IqCCIuo/gw+N4akdx1zDfXlwi8B4JtljF+xxY9zodUg= -berty.tech/go-ipfs-log v1.10.0/go.mod h1:TBEa6g2nkn21VtkVd6Gkk3xR9c8BfH/E8eH7tjjwhec= -berty.tech/go-ipfs-repo-encrypted v1.3.0 h1:k7whfA58pFaFF1AGtqCmT878QpvQXkLSAlZQPvqoeo8= -berty.tech/go-ipfs-repo-encrypted v1.3.0/go.mod h1:lbWggsc67nM48IPP5K9vDLNPT3yYELP7Q6Sni9cufQs= -berty.tech/go-orbit-db v1.22.0 h1:BiUGk9ukOKJMQ2YlQV/e9gjR9TOedIa9LUDfjp9CVHA= -berty.tech/go-orbit-db v1.22.0/go.mod h1:RC3/C/igfM7b2RuT7WIloOHbFz9zZTJxB3jOEqC6UWA= -berty.tech/weshnet v1.14.0 h1:IIBZ4bQABwwHDSTPgPWBMS0PTBMaBAm4uUs/jJxzEdo= -berty.tech/weshnet v1.14.0/go.mod h1:BNV2f0xxLFIPwNJNf8KprEAGfIqvzGh8uu7QGhRxe7w= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= -contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= -github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= -github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= -github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= -github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aead/ecdh v0.2.0 h1:pYop54xVaq/CEREFEcukHRZfTdjiWvYIsZDXXrBapQQ= -github.com/aead/ecdh v0.2.0/go.mod h1:a9HHtXuSo8J1Js1MwLQx2mBhkXMT6YwUmVVEY4tTB8U= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= -github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622 h1:kJqfCXKR5EJdh9HYh4rjYL3QvxjP5cnCssIU141m79c= -github.com/berty/emitter-go v0.0.0-20221031144724-5dae963c3622/go.mod h1:G66sIy+q6BKIoKoKNqFU7sxSnrS5d8Z8meQ3Iu0ZJ4o= -github.com/berty/go-libp2p-mock v1.0.1 h1:2lsXlZOQvELcvrkHTlK2t2965sg7pkr1sWrucH6S2zg= -github.com/berty/go-libp2p-mock v1.0.1/go.mod h1:PsUBOq6zSAjXKLlSKRzhkIpjm7ZxGgjLn/FZY+3CoKs= -github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8 h1:04xF+6wtZhEIHv+1ghqd7hhCePdKmPykJWSjEyy0uT4= -github.com/berty/go-libp2p-pubsub v0.9.4-0.20230706070911-6e35c0f470b8/go.mod h1:d/76O2W9ZLphGN2Q7Q1QSolJGV3zaO8D+da3Bdpk5d0= -github.com/berty/go-libp2p-rendezvous v0.5.0 h1:eT8fBh+OewfTB6uAA47rzdgAVo/aevW4TA7PvZq75T4= -github.com/berty/go-libp2p-rendezvous v0.5.0/go.mod h1:gkDEobp0lV+DHfNzO7+kCJxApO0vmpOEV+Z5uttZYGM= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/ceramicnetwork/go-dag-jose v0.1.0 h1:yJ/HVlfKpnD3LdYP03AHyTvbm3BpPiz2oZiOeReJRdU= -github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= -github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= -github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= -github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= -github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= -github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= -github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.0.3 h1:jh22xisGBjrEVnRZ1DVTpBVQm0Xndu8sMl0CWDzSIBI= -github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4= -github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302 h1:QV0ZrfBLpFc2KDk+a4LJefDczXnonRwrYrQJY/9L4dA= -github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A= -github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= -github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b h1:Qcx5LM0fSiks9uCyFZwDBUasd3lxd1RM0GYpL+Li5o4= -github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= -github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190812055157-5d271430af9f h1:KMlcu9X58lhTA/KrfX8Bi1LQSO4pzoVjTiL3h4Jk+Zk= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e h1:3YKHER4nmd7b5qy5t0GWDTwSn4OyRgfAXSmo6VnryBY= -github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e/go.mod h1:I8h3MITA53gN9OnWGCgaMa0JWVRdXthWw4M3CPM54OY= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= -github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.1.0 h1:gEe0Dp/lZmPZiDFzJJaOfUpOvv2MKUkoBX8lDrn9vKU= -github.com/huin/goupnp v1.1.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3 h1:r/jf1DTXG72uO5xK1VgZGywcjBlXh1E8kKnAt67bXJA= -github.com/hyperledger/aries-framework-go v0.1.9-0.20221202141134-083803ecf0a3/go.mod h1:5lp5+NPjRngsjFLYYGg5mtkvw6I4Mr7CKz+wHYxROk0= -github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e h1:SxbXlF39661T9w/L9PhVdtbJfJ51Pm4JYEEW6XfZHEQ= -github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e/go.mod h1:oryUyWb23l/a3tAP9KW+GBbfcfqp9tZD4y5hSkFrkqI= -github.com/hyperledger/ursa-wrapper-go v0.3.1 h1:Do+QrVNniY77YK2jTIcyWqj9rm/Yb5SScN0bqCjiibA= -github.com/hyperledger/ursa-wrapper-go v0.3.1/go.mod h1:nPSAuMasIzSVciQo22PedBk4Opph6bJ6ia3ms7BH/mk= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= -github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= -github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= -github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= -github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= -github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= -github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= -github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= -github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= -github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= -github.com/ipfs/go-block-format v0.1.1 h1:129vSO3zwbsYADcyQWcOYiuCpAqt462SFfqFHdFJhhI= -github.com/ipfs/go-block-format v0.1.1/go.mod h1:+McEIT+g52p+zz5xGAABGSOKrzmrdX97bc0USBdWPUs= -github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= -github.com/ipfs/go-blockservice v0.3.0/go.mod h1:P5ppi8IHDC7O+pA0AlGTF09jruB2h+oP3wVVaZl8sfk= -github.com/ipfs/go-blockservice v0.5.0 h1:B2mwhhhVQl2ntW2EIpaWPwSCxSuqr5fFA93Ms4bYLEY= -github.com/ipfs/go-blockservice v0.5.0/go.mod h1:W6brZ5k20AehbmERplmERn8o2Ni3ZZubvAxaIUeaT6w= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= -github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= -github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= -github.com/ipfs/go-delegated-routing v0.7.0 h1:43FyMnKA+8XnyX68Fwg6aoGkqrf8NS5aG7p644s26PU= -github.com/ipfs/go-delegated-routing v0.7.0/go.mod h1:u4zxjUWIe7APUW5ds9CfD0tJX3vM9JhIeNqA8kE4vHE= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= -github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= -github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg= -github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w= -github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= -github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= -github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= -github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= -github.com/ipfs/go-ds-sql v0.3.0 h1:PLBbl0Rt0tBwWhQ0b3GCQbH+Bgd6aj2srKG6vJ7nYl4= -github.com/ipfs/go-ds-sql v0.3.0/go.mod h1:jE3bhmuUnMPXFftc4NEAiPUfgiwiv7fIdjozuX+m1/E= -github.com/ipfs/go-fetcher v1.6.1 h1:UFuRVYX5AIllTiRhi5uK/iZkfhSpBCGX7L70nSZEmK8= -github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v1.2.0 h1:O2wg7wdibwxkEDcl7xkuQsPvJFRBVgVSsOJ/GP6z3yU= -github.com/ipfs/go-filestore v1.2.0/go.mod h1:HLJrCxRXquTeEEpde4lTLMaE/MYJZD7WHLkp9z6+FF8= -github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= -github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.14.1 h1:tvFpBY9LcehIB7zi5SZIa+7aoxBOrGbdekhOXdnlT70= -github.com/ipfs/go-graphsync v0.14.1/go.mod h1:S6O/c5iXOXqDgrQgiZSgOTRUSiVvpKEhrzqFHKnLVcs= -github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= -github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= -github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.2.0 h1:n3WTeJ4LdICWs/0VSfjHrlqpPpl6MZ+ySd3j8qz0ykw= -github.com/ipfs/go-ipfs-blockstore v1.2.0/go.mod h1:eh8eTFLiINYNSNawfZOC7HOxNTxpB1PFuA5E1m/7exE= -github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= -github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= -github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= -github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= -github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.8.2 h1:WmehvYWkxch8dTw0bdF51R8lqbyl+3H8e6pIACzT/ds= -github.com/ipfs/go-ipfs-cmds v0.8.2/go.mod h1:/b17Davff0E0Wh/hhXsN1Pgxxbkm26k3PV+G4EDiC/s= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= -github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= -github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= -github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= -github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= -github.com/ipfs/go-ipfs-exchange-interface v0.1.0/go.mod h1:ych7WPlyHqFvCi/uQI48zLZuAWVP5iTQPXEfVaw5WEI= -github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= -github.com/ipfs/go-ipfs-exchange-interface v0.2.0/go.mod h1:z6+RhJuDQbqKguVyslSOuVDhqF9JtTrO3eptSAiW2/Y= -github.com/ipfs/go-ipfs-exchange-offline v0.0.1/go.mod h1:WhHSFCVYX36H/anEKQboAzpUws3x7UeEGkzQc3iNkM0= -github.com/ipfs/go-ipfs-exchange-offline v0.1.1/go.mod h1:vTiBRIbzSwDD0OWm+i3xeT0mO7jG2cbJYatp3HPk5XY= -github.com/ipfs/go-ipfs-exchange-offline v0.2.0/go.mod h1:HjwBeW0dvZvfOMwDP0TSKXIHf2s+ksdP4E3MLDRtLKY= -github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= -github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= -github.com/ipfs/go-ipfs-files v0.0.3/go.mod h1:INEFm0LL2LWXBhNJ2PMIIb2w45hpXgPjNoE7yA8Y1d4= -github.com/ipfs/go-ipfs-keystore v0.1.0 h1:gfuQUO/cyGZgZIHE6OrJas4OnwuxXCqJG7tI0lrB5Qc= -github.com/ipfs/go-ipfs-keystore v0.1.0/go.mod h1:LvLw7Qhnb0RlMOfCzK6OmyWxICip6lQ06CCmdbee75U= -github.com/ipfs/go-ipfs-pinner v0.3.0 h1:jwe5ViX3BON3KgOAYrrhav2+1ONB0QzFAWQd7HUlbuM= -github.com/ipfs/go-ipfs-pinner v0.3.0/go.mod h1:oX0I0nC6zlNIh0LslSrUnjfNKPq8ufoFtqV1/wcJvyo= -github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= -github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= -github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= -github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= -github.com/ipfs/go-ipfs-provider v0.8.1 h1:qt670pYmcNH3BCjyXDgg07o2WsTRsOdMwYc25ukCdjQ= -github.com/ipfs/go-ipfs-provider v0.8.1/go.mod h1:qCpwpoohIRVXvNzkygzsM3qdqP/sXlrogtA5I45tClc= -github.com/ipfs/go-ipfs-redirects-file v0.1.1 h1:Io++k0Vf/wK+tfnhEh63Yte1oQK5VGT2hIEYpD0Rzx8= -github.com/ipfs/go-ipfs-redirects-file v0.1.1/go.mod h1:tAwRjCV0RjLTjH8DR/AU7VYvfQECg+lpUy2Mdzv7gyk= -github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= -github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= -github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= -github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0= -github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA= -github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= -github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= -github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= -github.com/ipfs/go-ipld-format v0.3.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-format v0.4.0 h1:yqJSaJftjmjc9jEOFYlpkwOLVKv68OD27jFLlSghBlQ= -github.com/ipfs/go-ipld-format v0.4.0/go.mod h1:co/SdBE8h99968X0hViiw1MNlh6fvxxnHpvVLnH7jSM= -github.com/ipfs/go-ipld-git v0.1.1 h1:TWGnZjS0htmEmlMFEkA3ogrNCqWjIxwr16x1OsdhG+Y= -github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= -github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= -github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= -github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= -github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= -github.com/ipfs/go-libipfs v0.6.2 h1:QUf3kS3RrCjgtE0QW2d18PFFfOLeEt24Ft892ipLzRI= -github.com/ipfs/go-libipfs v0.6.2/go.mod h1:FmhKgxMOQA572TK5DA3MZ5GL44ZqsMHIrkgK4gLn4A8= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= -github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= -github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= -github.com/ipfs/go-merkledag v0.6.0/go.mod h1:9HSEwRd5sV+lbykiYP+2NC/3o6MZbKNaa4hfNcH5iH0= -github.com/ipfs/go-merkledag v0.10.0 h1:IUQhj/kzTZfam4e+LnaEpoiZ9vZF6ldimVlby+6OXL4= -github.com/ipfs/go-merkledag v0.10.0/go.mod h1:zkVav8KiYlmbzUzNM6kENzkdP5+qR7+2mCwxkQ6GIj8= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= -github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/ipfs/go-mfs v0.2.1 h1:5jz8+ukAg/z6jTkollzxGzhkl3yxm022Za9f2nL5ab8= -github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.7.0 h1:xqosk71GIVRkFDtF2UNRcXn4LdNeo7tzuy8feHD6NbU= -github.com/ipfs/go-namesys v0.7.0/go.mod h1:KYSZBVZG3VJC34EfqqJPG7T48aWgxseoMPAPA5gLyyQ= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= -github.com/ipfs/go-path v0.3.1 h1:wkeaCWE/NTuuPGlEkLTsED5UkzfKYZpxaFFPgk8ZVLE= -github.com/ipfs/go-path v0.3.1/go.mod h1:eNLsxJEEMxn/CDzUJ6wuNl+6No6tEUhOZcPKsZsYX0E= -github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= -github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= -github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= -github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= -github.com/ipfs/go-pinning-service-http-client v0.1.2 h1:jdr7KelhL9gNHTU8jbqPMwIexSZXgZzxNGkycCwmbXI= -github.com/ipfs/go-pinning-service-http-client v0.1.2/go.mod h1:6wd5mjYhXJTiWU8b4RSWPpWdlzE5/csoXV0dWWMjun4= -github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= -github.com/ipfs/go-unixfs v0.4.4 h1:D/dLBOJgny5ZLIur2vIXVQVW0EyDHdOMBDEhgHrt6rY= -github.com/ipfs/go-unixfs v0.4.4/go.mod h1:TSG7G1UuT+l4pNj91raXAPkX0BhJi3jST1FDTfQ5QyM= -github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= -github.com/ipfs/go-unixfsnode v1.5.2 h1:CvsiTt58W2uR5dD8bqQv+aAY0c1qolmXmSyNbPHYiew= -github.com/ipfs/go-unixfsnode v1.5.2/go.mod h1:NlOebRwYx8lMCNMdhAhEspYPBD3obp7TE0LvBqHY+ks= -github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= -github.com/ipfs/go-verifcid v0.0.2/go.mod h1:40cD9x1y4OWnFXbLNJYRe7MpNvWlMn3LZAG5Wb4xnPU= -github.com/ipfs/interface-go-ipfs-core v0.11.1 h1:xVW8DKzd230h8bPv+oC2fBjW4PtDGqGtvpX64/aBe48= -github.com/ipfs/interface-go-ipfs-core v0.11.1/go.mod h1:xmnoccUXY7N/Q8AIx0vFqgW926/FAZ8+do/1NTEHKsU= -github.com/ipfs/kubo v0.19.0 h1:5B58RXikTqs9six7FweQSzo6WvBKiP2MVwYCvJomV7k= -github.com/ipfs/kubo v0.19.0/go.mod h1:OqX4B1YWKWCvi9T/sKDfTBMAKbVi6yVIXAii6/nr1Dc= -github.com/ipld/edelweiss v0.2.0 h1:KfAZBP8eeJtrLxLhi7r3N0cBCo7JmwSRhOJp3WSpNjk= -github.com/ipld/edelweiss v0.2.0/go.mod h1:FJAzJRCep4iI8FOFlRriN9n0b7OuX3T/S9++NpBDmA4= -github.com/ipld/go-car v0.5.0 h1:kcCEa3CvYMs0iE5BzD5sV7O2EwMiCIp3uF8tA6APQT8= -github.com/ipld/go-car v0.5.0/go.mod h1:ppiN5GWpjOZU9PgpAZ9HbZd9ZgSpwPMr48fGRJOWmvE= -github.com/ipld/go-car/v2 v2.5.1 h1:U2ux9JS23upEgrJScW8VQuxmE94560kYxj9CQUpcfmk= -github.com/ipld/go-car/v2 v2.5.1/go.mod h1:jKjGOqoCj5zn6KjnabD6JbnCsMntqU2hLiU6baZVO3E= -github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= -github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= -github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= -github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= -github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= -github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 h1:kMJlf8z8wUcpyI+FQJIdGjAhfTww1y0AbQEv86bpVQI= -github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69/go.mod h1:tlkavyke+Ac7h8R3gZIjI5LKBcvMlSWnXNMgT3vZXo8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU= -github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= -github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= -github.com/libp2p/go-doh-resolver v0.4.0 h1:gUBa1f1XsPwtpE1du0O+nnZCUqtG7oYi7Bb+0S7FQqw= -github.com/libp2p/go-doh-resolver v0.4.0/go.mod h1:v1/jwsFusgsWIGX/c6vCRrnJ60x7bhTiq/fs2qt0cAg= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= -github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= -github.com/libp2p/go-libp2p v0.27.6 h1:KmGU5kskCaaerm53heqzfGOlrW2z8icZ+fnyqgrZs38= -github.com/libp2p/go-libp2p v0.27.6/go.mod h1:oMfQGTb9CHnrOuSM6yMmyK2lXz3qIhnkn2+oK3B1Y2g= -github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= -github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= -github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-circuit v0.1.0/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFkZeIRmfunbA7pmFh8= -github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.2/go.mod h1:9dAcntw/n46XycV4RnlBq3BpgrmyUi9LuoTNdPrbUco= -github.com/libp2p/go-libp2p-core v0.0.3/go.mod h1:j+YQMNz9WNSkNezXOsahp9kwZBKBvxLpKD316QWSJXE= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFTGElt8HnoDzwkFZm29g= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-gostream v0.5.0 h1:niNGTUrFoUDP/8jxMgu97zngMO+UGYBpVpbCKwIJBls= -github.com/libp2p/go-libp2p-gostream v0.5.0/go.mod h1:rXrb0CqfcRRxa7m3RSKORQiKiWgk3IPeXWda66ZXKsA= -github.com/libp2p/go-libp2p-http v0.4.0 h1:V+f9Rhe/8GkColmXoyJyA0NVsN9F3TCLZgW2hwjoX5w= -github.com/libp2p/go-libp2p-http v0.4.0/go.mod h1:92tmLGrlBliQFDlZRpBXT3BJM7rGFONy0vsNrG/bMPg= -github.com/libp2p/go-libp2p-kad-dht v0.21.1 h1:xpfp8/t9+X2ip1l8Umap1/UGNnJ3RHJgKGAEsnRAlTo= -github.com/libp2p/go-libp2p-kad-dht v0.21.1/go.mod h1:Oy8wvbdjpB70eS5AaFaI68tOtrdo3KylTvXDjikxqFo= -github.com/libp2p/go-libp2p-kbucket v0.3.1/go.mod h1:oyjT5O7tS9CQurok++ERgc46YLwEpuGoFq9ubvoUOio= -github.com/libp2p/go-libp2p-kbucket v0.5.0 h1:g/7tVm8ACHDxH29BGrpsQlnNeu+6OF1A9bno/4/U1oA= -github.com/libp2p/go-libp2p-kbucket v0.5.0/go.mod h1:zGzGCpQd78b5BNTDGHNDLaTt9aDK/A02xeZp9QeFC4U= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.7/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= -github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= -github.com/libp2p/go-libp2p-pubsub-router v0.6.0 h1:D30iKdlqDt5ZmLEYhHELCMRj8b4sFAqrUcshIUvVP/s= -github.com/libp2p/go-libp2p-pubsub-router v0.6.0/go.mod h1:FY/q0/RBTKsLA7l4vqC2cbRbOvyDotg8PJQ7j8FDudE= -github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= -github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= -github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= -github.com/libp2p/go-libp2p-routing-helpers v0.6.1 h1:tI3rHOf/FDQsxC2pHBaOZiqPJ0MZYyzGAf4V45xla4U= -github.com/libp2p/go-libp2p-routing-helpers v0.6.1/go.mod h1:R289GUxUMzRXIbWGSuUUTPrlVJZ3Y/pPz495+qgXJX8= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= -github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= -github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= -github.com/libp2p/go-libp2p-xor v0.1.0 h1:hhQwT4uGrBcuAkUGXADuPltalOdpf9aag9kaYNT2tLA= -github.com/libp2p/go-libp2p-xor v0.1.0/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.1/go.mod h1:1FBXiHDk1VyRM1C0aez2bCfHQ4vMZKkAQzZbkSQt5fI= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= -github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= -github.com/libp2p/go-mplex v0.7.0/go.mod h1:rW8ThnRcYWft/Jb2jeORBmPd6xuG3dGxWN/W168L9EU= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= -github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= -github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw7yT74kj3raBFuo= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= -github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9 h1:d8OcZrg9dmqfBsHRDGP2QarJlj/1p0YI/NylTf2LYqo= -github.com/maruel/circular v0.0.0-20200815005550-36e533b830e9/go.mod h1:AEsb24YMiJiSqh8Cs8kRGJxDDXKEkveJ7nxYUeYibEc= -github.com/maruel/ut v1.0.2 h1:mQTlQk3jubTbdTcza+hwoZQWhzcvE4L6K6RTtAFlA1k= -github.com/maruel/ut v1.0.2/go.mod h1:RV8PwPD9dd2KFlnlCc/DB2JVvkXmyaalfc5xvmSrRSs= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= -github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= -github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= -github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= -github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8= -github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= -github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= -github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= -github.com/mutecomm/go-sqlcipher/v4 v4.4.2 h1:eM10bFtI4UvibIsKr10/QT7Yfz+NADfjZYh0GKrXUNc= -github.com/mutecomm/go-sqlcipher/v4 v4.4.2/go.mod h1:mF2UmIpBnzFeBdu/ypTDb/LdbS0nk0dfSN1WUsWTjMA= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw= -github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= -github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= -github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/piprate/json-gold v0.4.2 h1:Rq8V+637HOFcj20KdTqW/g/llCwX2qtau0g5d1pD79o= -github.com/piprate/json-gold v0.4.2/go.mod h1:OK1z7UgtBZk06n2cDE2OSq1kffmjFFp5/2yhLLCz9UM= -github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190408063855-01bf1e26dd14/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= -github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= -github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= -github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= -github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= -github.com/quic-go/webtransport-go v0.5.2 h1:GA6Bl6oZY+g/flt00Pnu0XtivSD8vukOu3lYhJjnGEk= -github.com/quic-go/webtransport-go v0.5.2/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= -github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samber/lo v1.36.0 h1:4LaOxH1mHnbDGhTVE0i1z8v/lWaQW8AIfOD3HU4mSaw= -github.com/samber/lo v1.36.0/go.mod h1:HLeWcJRRyLKp3+/XBJvOrerCQn9mhdKMHyd7IRlgeQ8= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= -github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 h1:wD1IWQwAhdWclCwaf6DdzgCAe9Bfz1M+4AHRd7N786Y= -github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+8= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8 h1:RBkacARv7qY5laaXGlF4wFB/tk5rnthhPb8oIBGoagY= -github.com/teserakt-io/golang-ed25519 v0.0.0-20210104091850-3888c087a4c8/go.mod h1:9PdLyPiZIiW3UopXyRnPYyjUXSpiQNHRLu8fOsR3o8M= -github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb h1:Ywfo8sUltxogBpFuMOFRrrSifO788kAFxmvVw31PtQQ= -github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= -github.com/warpfork/go-testmark v0.11.0 h1:J6LnV8KpceDvo7spaNU4+DauH2n1x+6RaO2rJrmpQ9U= -github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= -github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= -github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= -github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= -github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= -github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= -github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1 h1:ctS9Anw/KozviCCtK6VWMz5kPL9nbQzbQY4yfqlIV4M= -github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/exporters/jaeger v1.7.0 h1:wXgjiRldljksZkZrldGVe6XrG9u3kYDyQmkZwmm5dI0= -go.opentelemetry.io/otel/exporters/jaeger v1.7.0/go.mod h1:PwQAOqBgqbLQRKlj466DuD2qyMjbtcPpfPfj+AqbSBs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM= -go.opentelemetry.io/otel/exporters/zipkin v1.7.0 h1:X0FZj+kaIdLi29UiyrEGDhRTYsEXj9GdEW5Y39UQFEE= -go.opentelemetry.io/otel/exporters/zipkin v1.7.0/go.mod h1:9YBXeOMFLQGwNEjsxMRiWPGoJX83usGMhbCmxUbNe5I= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.16.1 h1:+alNIBsl0qfY0j6epRubp/9obgtrObRAc5aD+6jbWY8= -go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= -go.uber.org/fx v1.19.2 h1:SyFgYQFr1Wl0AYstE8vyYIzP4bFz2URrScjwC4cwUvY= -go.uber.org/fx v1.19.2/go.mod h1:43G1VcqSzbIv77y00p1DRAsyZS8WdzuYdhZXmEUkMyQ= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20200411211856-f5505b9728dd h1:BNJlw5kRTzdmyfh5U8F93HA2OwkP7ZGwA51eJ/0wKOU= -go4.org v0.0.0-20200411211856-f5505b9728dd/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190524122548-abf6ff778158/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181130052023-1c3d964395ce/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/grpc/examples v0.0.0-20200922230038-4e932bbcb079 h1:unzgkDPNegIn/czOcgxzQaTzEzOiBH1V1j55rsEzVEg= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= -moul.io/openfiles v1.2.0 h1:oAmBX0ChBBsKERFfTRyLi9JkjOvEv9E474BEL/wVq44= -moul.io/openfiles v1.2.0/go.mod h1:FR9BZ1mw7VE0uZN6HVJcA16Ee2nTDG/YZUyiGM/T2Rw= -moul.io/srand v1.6.1 h1:SJ335F+54ivLdlH7wH52Rtyv0Ffos6DpsF5wu3ZVMXU= -moul.io/srand v1.6.1/go.mod h1:P2uaZB+GFstFNo8sEj6/U8FRV1n25kD0LLckFpJ+qvc= -moul.io/u v1.27.0 h1:rF0p184mludn2DzL0unA8Gf/mFWMBerdqOh8cyuQYzQ= -moul.io/u v1.27.0/go.mod h1:ggYDXxUjoHpfDsMPD3STqkUZTyA741PZiQhSd+7kRnA= -moul.io/zapfilter v1.7.0 h1:7aFrG4N72bDH9a2BtYUuUaDS981Dxu3qybWfeqaeBDU= -moul.io/zapfilter v1.7.0/go.mod h1:M+N2s+qZiA+bzRoyKMVRxyuERijS2ovi2pnMyiOGMvc= -moul.io/zapring v1.3.3 h1:N2QPn6qTMBWjh842UPxdjj2UW+uH/foXohgGCPZDlM8= -moul.io/zapring v1.3.3/go.mod h1:UvlTrdjeHtSqdjkGXwAxIfpaQ/ai4I+ccRASFxflcJE= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/go/cmd/weshd/main.go b/go/cmd/weshd/main.go deleted file mode 100644 index a5bcd9ae49..0000000000 --- a/go/cmd/weshd/main.go +++ /dev/null @@ -1,182 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "os/signal" - "strconv" - "syscall" - - mrand "math/rand" - "net/http" - "os" - - "berty.tech/weshnet" - "berty.tech/weshnet/pkg/ipfsutil" - ipfs_mobile "berty.tech/weshnet/pkg/ipfsutil/mobile" - "berty.tech/weshnet/pkg/protocoltypes" - "berty.tech/weshnet/pkg/tinder" - "moul.io/srand" - - "github.com/dgraph-io/badger/options" - badger "github.com/ipfs/go-ds-badger" - "github.com/peterbourgon/ff/v3" - "go.uber.org/zap" - "google.golang.org/grpc" - - "github.com/improbable-eng/grpc-web/go/grpcweb" - "github.com/pkg/errors" -) - -var port = 4242 -var weshDir = "./temp/wesh-dir/4242" - -func checkAndUpdatePortFromArgs() { - args := os.Args[1:] - - if len(args) != 0 { - parsedPort, err := strconv.Atoi(args[0]) - if err != nil { - fmt.Println("Invalid port number:", args[0]) - return - } - port = parsedPort - } -} - -func checkAndProcessDir() { - - basePath := "./temp/wesh-dir" - weshDir = basePath + "/" + strconv.Itoa(port) - - err := os.MkdirAll(weshDir, 0755) - - if err != nil { - fmt.Println("Error creating directory:", err) - return - } - - fmt.Printf("Directory '%s' and its parent directories have been created.\n", weshDir) -} - -func startHTTPServer() { - - fmt.Printf("Using port: %d\n", port) - - fs := flag.NewFlagSet("weshd", flag.ContinueOnError) - - if err := ff.Parse(fs, os.Args[1:]); err != nil { - panic(errors.Wrap(err, "failed to parse flags")) - } - - logger, err := zap.NewDevelopment() - if err != nil { - panic(errors.Wrap(err, "failed to create logger")) - } - - logger.Info("weshd", zap.Int("port", port)) - - grpcServer := grpc.NewServer() - - rng := mrand.New(mrand.NewSource(srand.MustSecure())) - drivers := []tinder.IDriver{} - - bopts := badger.DefaultOptions - bopts.ValueLogLoadingMode = options.FileIO - ds, err := badger.NewDatastore(weshDir, &bopts) - if err != nil { - panic(errors.Wrap(err, "unable to init badger datastore")) - } - - repo, err := ipfsutil.LoadRepoFromPath(weshDir) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs repo")) - } - - mrepo := ipfs_mobile.NewRepoMobile(weshDir, repo) - mnode, err := ipfsutil.NewIPFSMobile(context.Background(), mrepo, &ipfsutil.MobileOptions{}) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs node")) - } - - ipfsCoreAPI, err := ipfsutil.NewExtendedCoreAPIFromNode(mnode.IpfsNode) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs core api")) - } - - host := mnode.PeerHost() - - localdisc, err := tinder.NewLocalDiscovery(logger, host, rng) - if err != nil { - panic(errors.Wrap(err, "failed to create local discovery")) - } - drivers = append(drivers, localdisc) - - if mnode != nil { - dhtdisc := tinder.NewRoutingDiscoveryDriver("dht", mnode.DHT) - drivers = append(drivers, dhtdisc) - - } - tinderDriver, err := tinder.NewService(host, logger, drivers...) - if err != nil { - panic(errors.Wrap(err, "failed to create tinder driver")) - } - - svc, err := weshnet.NewService(weshnet.Opts{ - Logger: logger, - TinderService: tinderDriver, - IpfsCoreAPI: ipfsCoreAPI, - RootDatastore: ds, - }) - if err != nil { - panic(errors.Wrap(err, "failed to create weshnet server")) - } - defer svc.Close() - - protocoltypes.RegisterProtocolServiceServer(grpcServer, svc) - wrappedServer := grpcweb.WrapServer(grpcServer, - grpcweb.WithOriginFunc(func(string) bool { return true }), // @FIXME: this is very insecure - grpcweb.WithWebsockets(true), - ) - handler := func(resp http.ResponseWriter, req *http.Request) { - resp.Header().Set("Access-Control-Allow-Origin", "*") - resp.Header().Set("Access-Control-Allow-Headers", "*") - logger.Debug(fmt.Sprintf("Request: %v", req)) - wrappedServer.ServeHTTP(resp, req) - } - - httpServer := http.Server{ - Addr: fmt.Sprintf(":%d", port), - Handler: http.HandlerFunc(handler), - } - - if err := httpServer.ListenAndServe(); err != nil { - panic(errors.Wrap(err, "failed to start http server")) - } - -} - -func main() { - - checkAndUpdatePortFromArgs() - checkAndProcessDir() - - stopHTTPServer := make(chan struct{}) - - go func() { - startHTTPServer() - close(stopHTTPServer) - }() - - interruptChannel := make(chan os.Signal, 1) - signal.Notify(interruptChannel, os.Interrupt, syscall.SIGTERM) - - <-interruptChannel - - fmt.Println("Ctrl+C received. Stopping the program.") - - close(stopHTTPServer) - - fmt.Println("Program has exited.") -} diff --git a/package.json b/package.json index 0cc5781629..ce3bd8f58c 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "expo-linear-gradient": "~12.7.2", "expo-optimize": "^0.2.20", "expo-secure-store": "~12.8.1", + "expo-sharing": "~11.10.0", "expo-splash-screen": "~0.26.4", "expo-status-bar": "~1.11.1", "google-protobuf": "^3.21.2", diff --git a/packages/modules/FileSystem/index.native.ts b/packages/modules/FileSystem/index.native.ts index 17db92bb27..6d9fe8d8ae 100644 --- a/packages/modules/FileSystem/index.native.ts +++ b/packages/modules/FileSystem/index.native.ts @@ -14,9 +14,11 @@ if (isRunningInExpoGo) { FileSystem = { ...ExpoFileSystem, readAsStringAsync: async (uri, options) => { - console.log("here test"); return await RNFS.readFile(uri, options?.encoding); }, + writeAsStringAsync: async (uri, content, options) => { + return await RNFS.writeFile(uri, content, options?.encoding); + }, }; } diff --git a/packages/screens/Message/MessageScreen.tsx b/packages/screens/Message/MessageScreen.tsx index f03c6bb207..8173bc12a3 100644 --- a/packages/screens/Message/MessageScreen.tsx +++ b/packages/screens/Message/MessageScreen.tsx @@ -9,6 +9,7 @@ import { } from "react-native"; import { useSelector } from "react-redux"; +import { Avatar } from "./components/Avatar"; import { ChatSection } from "./components/ChatSection"; import { CreateConversation } from "./components/CreateConversation"; import { CreateGroup } from "./components/CreateGroup"; @@ -17,6 +18,8 @@ import { JoinGroup } from "./components/JoinGroup"; import { MessageBlankFiller } from "./components/MessageBlankFiller"; import MessageCard from "./components/MessageCard"; import { MessageHeader } from "./components/MessageHeader"; +import { MessageOnboarding } from "./components/MessageOnboarding"; +import { Profile } from "./components/Profile"; import { SideBarChats } from "./components/SideBarChats"; import chat from "../../../assets/icons/add-chat.svg"; import friend from "../../../assets/icons/friend.svg"; @@ -29,16 +32,31 @@ import { Separator } from "@/components/separators/Separator"; import { SpacerColumn, SpacerRow } from "@/components/spacer"; import { useMessage } from "@/context/MessageProvider"; import { useIsMobile } from "@/hooks/useIsMobile"; -import { selectIsWeshConnected } from "@/store/slices/message"; -import { ScreenFC, useAppNavigation } from "@/utils/navigation"; -import { fontSemibold14 } from "@/utils/style/fonts"; +import { + selectIsWeshConnected, + selectIsOnboardingCompleted, + selectContactInfo, +} from "@/store/slices/message"; +import { useAppNavigation, ScreenFC } from "@/utils/navigation"; +import { + neutral00, + neutral33, + neutralA3, + secondaryColor, +} from "@/utils/style/colors"; +import { + fontSemibold14, + fontMedium10, + fontSemibold13, +} from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { const activeView = route?.params?.view; const activeTab = route?.params?.tab; const isWeshConnected = useSelector(selectIsWeshConnected); - + const isOnboardingCompleted = useSelector(selectIsOnboardingCompleted); + const contactInfo = useSelector(selectContactInfo); const { activeConversation, setActiveConversation } = useMessage(); const navigation = useAppNavigation(); @@ -132,6 +150,11 @@ export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { ); } + + if (!isOnboardingCompleted) { + return ; + } + return ( } @@ -150,8 +173,46 @@ export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { ? layout.spacing_x0_5 : layout.spacing_x1_5, maxWidth: width, + maxHeight: 78, + }} + contentContainerStyle={{ + paddingBottom: layout.spacing_x2, }} > + + navigation.navigate("Message", { view: "MyProfile" }) + } + activeOpacity={0.9} + style={{ + paddingHorizontal: layout.spacing_x1, + borderRadius: layout.spacing_x1_5, + backgroundColor: neutral00, + borderColor: neutral33, + borderWidth: 1, + height: 56, + width: 140, + display: "flex", + flexDirection: "row", + alignItems: "center", + }} + > + + + + + {contactInfo?.name} + + + + My Profile + + + + {HEADER_CONFIG.map((item) => ( @@ -166,7 +227,6 @@ export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { ))} - )} @@ -191,7 +251,7 @@ export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { ) : ( <> {activeConversation ? ( - + ) : ( )} @@ -209,6 +269,9 @@ export const MessageScreen: ScreenFC<"Message"> = ({ route }) => { {activeView === "JoinGroup" && ( navigation.navigate("Message")} /> )} + {activeView === "MyProfile" && ( + navigation.navigate("Message")} /> + )} ); }; diff --git a/packages/screens/Message/components/ChatItem.tsx b/packages/screens/Message/components/ChatItem.tsx index f0f812a54e..945f1aefa7 100644 --- a/packages/screens/Message/components/ChatItem.tsx +++ b/packages/screens/Message/components/ChatItem.tsx @@ -63,12 +63,13 @@ export const ChatItem = ({ @@ -81,8 +82,8 @@ export const ChatItem = ({ left: 0, top: 20, bottom: 20, - borderTopRightRadius: 10, - borderBottomRightRadius: 10, + borderTopRightRadius: layout.spacing_x1_25, + borderBottomRightRadius: layout.spacing_x1_25, }} /> )} diff --git a/packages/screens/Message/components/ChatSection.tsx b/packages/screens/Message/components/ChatSection.tsx index 33380643d3..19315faef1 100644 --- a/packages/screens/Message/components/ChatSection.tsx +++ b/packages/screens/Message/components/ChatSection.tsx @@ -14,11 +14,7 @@ import { Conversation } from "./Conversation"; import { SearchConversation } from "./SearchConversation"; import closeSVG from "../../../../assets/icons/close.svg"; import sent from "../../../../assets/icons/sent.svg"; -import { - Conversation as IConversation, - Message, - ReplyTo, -} from "../../../utils/types/message"; +import { Message, ReplyTo } from "../../../utils/types/message"; import { BrandText } from "@/components/BrandText"; import { KeyboardAvoidingView } from "@/components/KeyboardAvoidingView"; @@ -29,7 +25,6 @@ import { Separator } from "@/components/separators/Separator"; import { SpacerColumn, SpacerRow } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { useMessage } from "@/context/MessageProvider"; -import { useAppRoute } from "@/hooks/navigation/useAppRoute"; import { useIsMobile } from "@/hooks/useIsMobile"; import { selectConversationById, @@ -57,32 +52,31 @@ import { sendMessage } from "@/weshnet/services"; import { bytesFromString, stringFromBytes } from "@/weshnet/utils"; interface ChatSectionProps { - conversation: IConversation; + conversationId: string; } -export const ChatSection = ({ conversation }: ChatSectionProps) => { +export const ChatSection = ({ conversationId }: ChatSectionProps) => { const [message, setMessage] = useState(""); const [inputHeight, setInputHeight] = useState(40); const [replyTo, setReplyTo] = useState(); const [inputRef, setInputRef] = useState | null>(null); const dispatch = useDispatch(); const isMobile = useIsMobile(); + const { setActiveConversation } = useMessage(); const [lastReadProcessedId, setLastReadProcessedId] = useState(""); - const conversationItem = useSelector((state: RootState) => - selectConversationById(state, conversation.id), + const conversation = useSelector((state: RootState) => + selectConversationById(state, conversationId), ); const [lastReadMessage, setLastReadMessage] = useState(); - const { setActiveConversation } = useMessage(); - const [searchInput, setSearchInput] = useState(""); const flatListRef = useRef(null); const { setToastError } = useFeedbacks(); const messages = useSelector((state: RootState) => - selectMessageList(state, conversation.id), + selectMessageList(state, conversationId), ); const contactMessages = useMemo( @@ -96,7 +90,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { const lastContactReadMessageIndex = useMemo(() => { const message = messages.find( - (item) => item.id === conversationItem?.lastReadIdByContact, + (item) => item.id === conversation?.lastReadIdByContact, ); if (!message) { return null; @@ -107,7 +101,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { return null; } return index; - }, [conversationItem, messages]); + }, [conversation, messages]); const searchResults = useMemo(() => { if (!searchInput) { @@ -127,7 +121,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { try { await sendMessage({ - groupPk: bytesFromString(conversation.id), + groupPk: bytesFromString(conversationId), message: { type: "message", parentId: replyTo?.id || "", @@ -160,7 +154,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { if (!lastMessageId) { return; } - if (conversation.type === "group") { + if (conversation?.type === "group") { dispatch( updateConversationById({ id: conversation.id, @@ -169,7 +163,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { ); } else { await sendMessage({ - groupPk: bytesFromString(conversation.id), + groupPk: bytesFromString(conversation?.id), message: { type: "read", payload: { @@ -204,7 +198,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { if ( nextMessage && - nextMessage.id !== conversation.lastReadIdByMe && + nextMessage?.id !== conversation?.lastReadIdByMe && lastReadMessage?.id !== nextMessage.id ) { setLastReadMessage(nextMessage); @@ -214,16 +208,19 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { }, [conversation, messages]); useEffect(() => { - if (!conversationItem?.id || !contactMessages?.length) { + if (!conversation?.id || !contactMessages?.length) { return; } - if (contactMessages?.[0]?.id !== conversationItem.lastReadIdByMe) { + if (contactMessages?.[0]?.id !== conversation.lastReadIdByMe) { handleRead(contactMessages?.[0]?.id); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [conversationItem, contactMessages]); + }, [conversation, contactMessages]); + if (!conversation) { + return null; + } return ( @@ -285,7 +282,7 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { }} conversation={conversation} message={item} - groupPk={bytesFromString(conversation.id)} + groupPk={bytesFromString(conversationId)} /> ); @@ -529,8 +526,11 @@ export const ChatSection = ({ conversation }: ChatSectionProps) => { ); }; -export const ChatSectionScreen: ScreenFC<"ChatSection"> = () => { - const { params } = useAppRoute(); +export const ChatSectionScreen: ScreenFC<"ChatSection"> = ({ + route: { + params: { id }, + }, +}) => { const { navigate } = useAppNavigation(); return ( = () => { onBackPress={() => navigate("Message")} footerChildren={<>} > - + ); }; diff --git a/packages/screens/Message/components/CheckboxGroup.tsx b/packages/screens/Message/components/CheckboxGroup.tsx index 5abb80a742..289d1fd1f0 100644 --- a/packages/screens/Message/components/CheckboxGroup.tsx +++ b/packages/screens/Message/components/CheckboxGroup.tsx @@ -55,19 +55,19 @@ export const CheckboxGroup: React.FC = ({ searchText, }) => { const [checkboxItems, setCheckboxItems] = useState(items); - const handleCheckboxPress = (index: number) => { - const newItems = [...checkboxItems]; - newItems[index].checked = !newItems[index].checked; + const handleCheckboxPress = (id: string) => { + const newItems = checkboxItems; + const itemIndex = newItems.findIndex((item) => item.id === id); + + newItems[itemIndex].checked = !newItems[itemIndex].checked; setCheckboxItems(newItems); onChange(newItems); }; const searchItems = useMemo(() => { - return checkboxItems - .filter((item) => - item.name.toLowerCase().includes(searchText.toLowerCase()), - ) - .filter((item) => !item.checked); + return checkboxItems.filter((item) => + item.name.toLowerCase().includes(searchText.toLowerCase()), + ); }, [searchText, checkboxItems]); return ( @@ -84,22 +84,22 @@ export const CheckboxGroup: React.FC = ({ )} - {checkboxItems - .filter((item) => item.checked) - .map((item, index) => ( + {!searchText.length && + checkboxItems.map((item, index) => ( + handleCheckboxPress(item.id)} + /> + ))} + {!!searchText.length && + searchItems.map((item, index) => ( handleCheckboxPress(index)} + onPress={() => handleCheckboxPress(item.id)} /> ))} - {searchItems.map((item, index) => ( - handleCheckboxPress(index)} - /> - ))} ); }; diff --git a/packages/screens/Message/components/CreateConversation.tsx b/packages/screens/Message/components/CreateConversation.tsx index 533b28df2b..73de32ca50 100644 --- a/packages/screens/Message/components/CreateConversation.tsx +++ b/packages/screens/Message/components/CreateConversation.tsx @@ -1,33 +1,28 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { Platform, View } from "react-native"; -import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scrollview"; -import QRCode from "react-native-qrcode-svg"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; -import logoHexagonPNG from "../../../../assets/logos/logo-hexagon.png"; import ModalBase from "../../../components/modals/ModalBase"; import { weshServices } from "../../../weshnet"; import { BrandText } from "@/components/BrandText"; -import { CopyToClipboard } from "@/components/CopyToClipboard"; import { ErrorText } from "@/components/ErrorText"; import { PrimaryButton } from "@/components/buttons/PrimaryButton"; import { SecondaryButton } from "@/components/buttons/SecondaryButton"; import { TextInputCustom } from "@/components/inputs/TextInputCustom"; import { QRCodeScannerModal } from "@/components/modals/QRCodeScannerModal"; -import { Separator } from "@/components/separators/Separator"; import { SpacerColumn, SpacerRow } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { useIsMobile } from "@/hooks/useIsMobile"; +import { selectContactInfo } from "@/store/slices/message"; import { - MessageState, - selectContactInfo, - setContactInfo, -} from "@/store/slices/message"; -import { neutral00, secondaryColor } from "@/utils/style/colors"; -import { fontSemibold16 } from "@/utils/style/fonts"; + neutral00, + neutral22, + neutralA3, + secondaryColor, +} from "@/utils/style/colors"; +import { fontSemibold13, fontSemibold16 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; -import { createSharableLink } from "@/weshnet/services"; interface CreateConversationProps { onClose: () => void; @@ -42,8 +37,6 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { const [isScan, setIsScan] = useState(false); const isMobile = useIsMobile(); - const dispatch = useDispatch(); - const handleAddContact = async (link = contactLink) => { setAddContactLoading(true); setError(""); @@ -66,30 +59,6 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { setAddContactLoading(false); }; - const handleContactInfoChange = ( - key: keyof MessageState["contactInfo"], - value: string, - ) => { - dispatch( - setContactInfo({ - [key]: value, - }), - ); - }; - - useEffect(() => { - const shareLink = createSharableLink({ - ...contactInfo, - }); - dispatch( - setContactInfo({ - shareLink, - }), - ); - - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dispatch]); - const handleScan = async (link?: string) => { if (link) { await handleAddContact(link); @@ -109,139 +78,96 @@ export const CreateConversation = ({ onClose }: CreateConversationProps) => { onClose={onClose} visible width={590} - scrollable > - + + + + Add contact + - - {!!contactInfo.shareLink && ( - + - )} - - - {Platform.OS !== "web" && ( - + + {isMobile && } + setIsScan(true)} - /> - )} - - - Name - - - handleContactInfoChange("name", text)} - value={contactInfo.name} - containerStyle={{ - flex: 1, - }} - placeholderTextColor={secondaryColor} - squaresBackgroundColor={neutral00} - /> - - - - Avatar - - - handleContactInfoChange("avatar", text)} - value={contactInfo.avatar} - containerStyle={{ - flex: 1, - }} - placeholderTextColor={secondaryColor} - squaresBackgroundColor={neutral00} + text="Add" + onPress={handleAddContact} + fullWidth={isMobile} /> - - - - Share my contact - - - - - - - - - Add contact - - - - + + + OR + + - - {isMobile && } - setIsScan(true)} + touchableStyle={{ + alignSelf: "center", + }} /> - {!!error && ( - <> - - {error} - - )} - - - + )} + + {!!error && ( + <> + + {error} + + )} + + ); }; diff --git a/packages/screens/Message/components/CreateGroup.tsx b/packages/screens/Message/components/CreateGroup.tsx index 393d702cf4..021bf1252e 100644 --- a/packages/screens/Message/components/CreateGroup.tsx +++ b/packages/screens/Message/components/CreateGroup.tsx @@ -42,7 +42,7 @@ export const CreateGroup = ({ onClose }: CreateGroupProps) => { const handleChange = (items: CheckboxItem[]) => { setCheckedContacts( - items.filter((item) => item.checked).map((item) => item.id), + items.filter((item) => !item.checked).map((item) => item.id), ); }; @@ -156,7 +156,7 @@ export const CreateGroup = ({ onClose }: CreateGroupProps) => { - + void; + buttonTitle?: string; +} + +export const EditProfile = ({ onClose, buttonTitle }: EditProfileProps) => { + const contactInfo = useSelector(selectContactInfo); + const [values, setValues] = useState({ + name: contactInfo.name, + avatar: contactInfo.avatar, + }); + const dispatch = useDispatch(); + + const handleChange = ( + key: keyof MessageState["contactInfo"], + value: string, + ) => { + setValues((prev) => ({ + ...prev, + [key]: value, + })); + }; + + const handleSave = () => { + const shareLink = createSharableLink({ + ...contactInfo, + ...values, + }); + dispatch( + setContactInfo({ + shareLink, + ...values, + }), + ); + onClose(); + }; + + return ( + + + + Name + + + handleChange("name", text)} + value={values.name} + containerStyle={{ + flex: 1, + }} + placeholderTextColor={secondaryColor} + squaresBackgroundColor={neutral00} + /> + + + + Avatar + + + handleChange("avatar", text)} + value={values.avatar} + containerStyle={{ + flex: 1, + }} + placeholderTextColor={secondaryColor} + squaresBackgroundColor={neutral00} + /> + + + + + ); +}; diff --git a/packages/screens/Message/components/Friends.tsx b/packages/screens/Message/components/Friends.tsx index 168c267b62..037741a617 100644 --- a/packages/screens/Message/components/Friends.tsx +++ b/packages/screens/Message/components/Friends.tsx @@ -41,11 +41,10 @@ export const Friends = ({ items, setActiveConversation }: FriendsProps) => { handleChatPress={() => { setActiveConversation?.(item); if (Platform.OS !== "web") { - navigate("ChatSection", item); + navigate("ChatSection", { id: item.id }); } else { navigate("Message"); } - setActiveConversation?.(item); }} /> )) diff --git a/packages/screens/Message/components/GroupInvitationAction.tsx b/packages/screens/Message/components/GroupInvitationAction.tsx index d08b82d2fd..e0b14f5c35 100644 --- a/packages/screens/Message/components/GroupInvitationAction.tsx +++ b/packages/screens/Message/components/GroupInvitationAction.tsx @@ -10,7 +10,7 @@ import { SpacerColumn, SpacerRow } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { selectContactInfo, - selectConversationList, + selectFilteredConversationList, } from "@/store/slices/message"; import { RootState } from "@/store/store"; import { successColor } from "@/utils/style/colors"; @@ -32,7 +32,7 @@ export const GroupInvitationAction = ({ const contactInfo = useSelector(selectContactInfo); const conversations = useSelector((state: RootState) => - selectConversationList(state, CONVERSATION_TYPES.ALL), + selectFilteredConversationList(state, CONVERSATION_TYPES.ALL, ""), ); const [isAccepted, setIsAccepted] = useState(false); diff --git a/packages/screens/Message/components/MessageBlankFiller.tsx b/packages/screens/Message/components/MessageBlankFiller.tsx index a1d7156bad..ed78e8af42 100644 --- a/packages/screens/Message/components/MessageBlankFiller.tsx +++ b/packages/screens/Message/components/MessageBlankFiller.tsx @@ -1,7 +1,7 @@ import React from "react"; import { View } from "react-native"; -import illustrationSVG from "../../../../assets/icons/illustration.svg"; +import illustrationSVG from "../../../../assets/illustrations/message-empty-logo-illustration.svg"; import { SVG } from "@/components/SVG"; import { neutral00 } from "@/utils/style/colors"; diff --git a/packages/screens/Message/components/MessageOnboarding.tsx b/packages/screens/Message/components/MessageOnboarding.tsx new file mode 100644 index 0000000000..72d8956178 --- /dev/null +++ b/packages/screens/Message/components/MessageOnboarding.tsx @@ -0,0 +1,142 @@ +import React, { useState } from "react"; +import { View } from "react-native"; + +import { EditProfile } from "./EditProfile"; +import addSVG from "../../../../assets/icons/add.svg"; +import downloadSVG from "../../../../assets/icons/download.svg"; +import illustrationSVG from "../../../../assets/illustrations/message-onboarding.svg"; +import { BrandText } from "../../../components/BrandText"; +import { ScreenContainer } from "../../../components/ScreenContainer"; +import { neutral77 } from "../../../utils/style/colors"; +import { fontSemibold14, fontSemibold20 } from "../../../utils/style/fonts"; +import { layout } from "../../../utils/style/layout"; +import { + handleRestoreAccount, + setMessageOnboardingComplete, +} from "../../../weshnet/services"; + +import { SVG } from "@/components/SVG"; +import { PrimaryButton } from "@/components/buttons/PrimaryButton"; +import { PrimaryButtonOutline } from "@/components/buttons/PrimaryButtonOutline"; +import ModalBase from "@/components/modals/ModalBase"; +import { useFeedbacks } from "@/context/FeedbacksProvider"; +import { useIsMobile } from "@/hooks/useIsMobile"; +import { useMaxResolution } from "@/hooks/useMaxResolution"; + +export const MessageOnboarding = () => { + const [isCreateAccount, setIsCreateAccount] = useState(false); + const { height, width } = useMaxResolution(); + const isMobile = useIsMobile(); + const { setToastError, setToastSuccess } = useFeedbacks(); + const [isImportAccountLoading, setIsImportAccountLoading] = useState(false); + + const handleAccountCreation = async () => { + await setMessageOnboardingComplete(); + }; + const handleImportAccount = async () => { + setIsImportAccountLoading(true); + try { + await handleRestoreAccount(); + setToastSuccess({ + title: "Your account has been imported.", + message: "It will take few short minutes to load the account.", + }); + } catch { + setToastError({ + title: "Import account failed.", + message: "Failed to import account. Try again later.", + }); + } + setIsImportAccountLoading(false); + }; + + return ( + } noMargin noScroll> + + {!isMobile && ( + + )} + + + + Welcome to Teritori messenger + + + + + + + or + + setIsCreateAccount(true)} + width={200} + /> + + + + {isCreateAccount && ( + setIsCreateAccount(false)} + label="Create Account" + > + + + + + )} + + ); +}; diff --git a/packages/screens/Message/components/Profile.tsx b/packages/screens/Message/components/Profile.tsx new file mode 100644 index 0000000000..f6cb31f07e --- /dev/null +++ b/packages/screens/Message/components/Profile.tsx @@ -0,0 +1,147 @@ +import * as Sharing from "expo-sharing"; +import React, { useState } from "react"; +import { Platform, View } from "react-native"; +import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scrollview"; +import QRCode from "react-native-qrcode-svg"; +import { useSelector } from "react-redux"; + +import { Avatar } from "./Avatar"; +import { EditProfile } from "./EditProfile"; +import logoHexagonPNG from "../../../../assets/logos/logo-hexagon.png"; +import { BrandText } from "../../../components/BrandText"; +import { SecondaryButton } from "../../../components/buttons/SecondaryButton"; +import ModalBase from "../../../components/modals/ModalBase"; +import { SpacerColumn, SpacerRow } from "../../../components/spacer"; +import { useFeedbacks } from "../../../context/FeedbacksProvider"; +import { useIsMobile } from "../../../hooks/useIsMobile"; +import { selectContactInfo } from "../../../store/slices/message"; +import { fontSemibold20 } from "../../../utils/style/fonts"; +import { layout } from "../../../utils/style/layout"; + +import Clipboard from "@/modules/Clipboard"; +import { exportAccount } from "@/weshnet/services"; + +interface ProfileProps { + onClose: () => void; +} + +export const Profile = ({ onClose }: ProfileProps) => { + const contactInfo = useSelector(selectContactInfo); + const [isEditProfile, setIsEditProfile] = useState(false); + const isMobile = useIsMobile(); + const [isExportLoading, setIsExportLoading] = useState(false); + const { setToastError, setToastSuccess } = useFeedbacks(); + + const handleCopy = async () => { + try { + await Clipboard.setStringAsync(contactInfo.shareLink); + + setToastSuccess({ + title: "Contact link copied.", + message: "", + }); + } catch (err) { + console.error("couldn't copy", err); + } + }; + const handleExport = async () => { + setIsExportLoading(true); + try { + await exportAccount(); + if (Platform.OS === "web") { + setToastSuccess({ + title: "Account backup has completed!", + message: "Backup file has been downloaded on your device. ", + }); + } + } catch (err) { + console.error("Account backup failed", err); + setToastError({ + title: "Account backup failed!", + message: "", + }); + } + setIsExportLoading(false); + }; + + const handleShare = () => { + Sharing.shareAsync(contactInfo.shareLink); + }; + + return ( + + + + + {contactInfo?.name} + + + {isEditProfile ? ( + setIsEditProfile(false)} /> + ) : ( + <> + {!!contactInfo.shareLink && ( + + )} + + + setIsEditProfile(true)} + text="Edit Profile" + size="SM" + /> + {isMobile ? : } + + + {Platform.OS !== "web" && ( + <> + + + + )} + {isMobile ? : } + + + + )} + + + + ); +}; diff --git a/packages/screens/Message/components/Request.tsx b/packages/screens/Message/components/Request.tsx index 6bc56e87af..3768d810df 100644 --- a/packages/screens/Message/components/Request.tsx +++ b/packages/screens/Message/components/Request.tsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { View } from "react-native"; -import { Avatar, Badge } from "react-native-paper"; +import { MessageAvatar } from "./MessageAvatar"; import { BrandText } from "../../../components/BrandText"; import FlexRow from "../../../components/FlexRow"; import { PrimaryButton } from "../../../components/buttons/PrimaryButton"; @@ -22,17 +22,15 @@ import { bytesFromString } from "../../../weshnet/utils"; type Props = { name: string; - isOnline: boolean; + avatar: any; data: ContactRequest; }; -const RequestList = ({ isOnline, data }: Props) => { +export const Request = ({ data }: Props) => { const { setToastError } = useFeedbacks(); const [addLoading, setAddLoading] = useState(false); - const onlineStatusBadgeColor = isOnline ? "green" : "yellow"; - const handleAddFriend = async () => { setAddLoading(true); try { @@ -60,8 +58,7 @@ const RequestList = ({ isOnline, data }: Props) => { await weshClient.client.ContactRequestDiscard({ contactPk: bytesFromString(data?.contactId), }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (e) { + } catch { setToastError({ title: "Failed", message: "Failed to reject contact. Please try again later.", @@ -73,17 +70,7 @@ const RequestList = ({ isOnline, data }: Props) => { - - + @@ -116,5 +103,3 @@ const RequestList = ({ isOnline, data }: Props) => { ); }; - -export default RequestList; diff --git a/packages/screens/Message/components/Requests.tsx b/packages/screens/Message/components/Requests.tsx index bdd5af62a9..02996e7ff2 100644 --- a/packages/screens/Message/components/Requests.tsx +++ b/packages/screens/Message/components/Requests.tsx @@ -3,7 +3,7 @@ import { ScrollView, View } from "react-native"; import { useSelector } from "react-redux"; import { MessageBlankFiller } from "./MessageBlankFiller"; -import RequestList from "./Request"; +import { Request } from "./Request"; import { TextInputCustomBorder } from "@/components/inputs/TextInputCustomBorder"; import { SpacerColumn } from "@/components/spacer"; @@ -33,12 +33,7 @@ export const Requests = ({ items }: RequestProps) => { contactRequestList?.map((item) => ( - + )) diff --git a/packages/screens/Message/components/SideBarChats.tsx b/packages/screens/Message/components/SideBarChats.tsx index d9dada8843..595bec3139 100644 --- a/packages/screens/Message/components/SideBarChats.tsx +++ b/packages/screens/Message/components/SideBarChats.tsx @@ -23,7 +23,7 @@ import { SpacerColumn, SpacerRow } from "@/components/spacer"; import { useMessage } from "@/context/MessageProvider"; import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; import { useIsMobile } from "@/hooks/useIsMobile"; -import { selectConversationList } from "@/store/slices/message"; +import { selectFilteredConversationList } from "@/store/slices/message"; import { setSearchText } from "@/store/slices/search"; import { RootState } from "@/store/store"; import { @@ -40,7 +40,7 @@ export const SideBarChats = () => { const { activeConversationType, activeConversation, setActiveConversation } = useMessage(); const conversationList = useSelector((state: RootState) => - selectConversationList(state, activeConversationType), + selectFilteredConversationList(state, activeConversationType, "asc"), ); const { navigate } = useAppNavigation(); @@ -146,7 +146,7 @@ export const SideBarChats = () => { onPress={() => { setActiveConversation?.(item); if (Platform.OS !== "web") { - navigate("ChatSection", item); + navigate("ChatSection", { id: item.id }); } else { navigate("Message"); } diff --git a/packages/screens/Mini/Chat/MiniChatScreen.tsx b/packages/screens/Mini/Chat/MiniChatScreen.tsx index 9d79aa8b71..171b9481d4 100644 --- a/packages/screens/Mini/Chat/MiniChatScreen.tsx +++ b/packages/screens/Mini/Chat/MiniChatScreen.tsx @@ -25,7 +25,7 @@ import { RoundedTabs } from "@/components/tabs/RoundedTabs"; import { ToastInfo } from "@/components/toasts/ToastInfo"; import { useMessage } from "@/context/MessageProvider"; import { - selectConversationList, + selectFilteredConversationList, selectIsWeshConnected, } from "@/store/slices/message"; import { RootState } from "@/store/store"; @@ -156,7 +156,7 @@ export const MiniChatScreen: MiniTabScreenFC<"MiniChats"> = ({ const { activeConversationType } = useMessage(); const conversationList = useSelector((state: RootState) => - selectConversationList(state, activeConversationType), + selectFilteredConversationList(state, activeConversationType, ""), ); const isWeshConnected = useSelector(selectIsWeshConnected); diff --git a/packages/screens/Mini/Chat/components/ChatList.tsx b/packages/screens/Mini/Chat/components/ChatList.tsx index 966c53c77b..b8d949b1ae 100644 --- a/packages/screens/Mini/Chat/components/ChatList.tsx +++ b/packages/screens/Mini/Chat/components/ChatList.tsx @@ -18,7 +18,7 @@ import { useMessage } from "@/context/MessageProvider"; import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; import { selectConversationById, - selectConversationList, + selectFilteredConversationList, selectLastContactMessageByGroupPk, selectLastMessageByGroupPk, selectPeerById, @@ -37,7 +37,7 @@ export const ChatList = () => { const navigation = useAppNavigation(); const { activeConversationType, setActiveConversation } = useMessage(); const conversationList = useSelector((state: RootState) => - selectConversationList(state, activeConversationType), + selectFilteredConversationList(state, activeConversationType, ""), ); const [searchInput, setSearchInput] = useState(""); diff --git a/packages/store/milldeware/afterRehydrateMiddleware.ts b/packages/store/milldeware/afterRehydrateMiddleware.ts new file mode 100644 index 0000000000..3a0a205764 --- /dev/null +++ b/packages/store/milldeware/afterRehydrateMiddleware.ts @@ -0,0 +1,11 @@ +import { Middleware } from "@reduxjs/toolkit"; +import { REHYDRATE } from "redux-persist"; + +import { checkAndBootWeshModule } from "@/weshnet/services"; +export const afterRehydrateMiddleware: Middleware = + () => (next) => async (action) => { + if (action.type === REHYDRATE) { + checkAndBootWeshModule(); + } + return next(action); + }; diff --git a/packages/store/slices/message.ts b/packages/store/slices/message.ts index 3716f43d2a..c81973d557 100644 --- a/packages/store/slices/message.ts +++ b/packages/store/slices/message.ts @@ -3,6 +3,7 @@ import { createSlice, EntityState, PayloadAction, + createSelector, } from "@reduxjs/toolkit"; import { uniqBy } from "lodash"; import moment from "moment"; @@ -45,6 +46,7 @@ const groupSelectors = groupEntityAdapter.getSelectors(); export interface MessageState { isWeshConnected: boolean; + isOnboardingCompleted: boolean; peers: EntityState; contactInfo: { name: string; @@ -60,6 +62,7 @@ export interface MessageState { const initialState: MessageState = { isWeshConnected: false, + isOnboardingCompleted: false, contactInfo: { name: "Anon", avatar: "", @@ -76,6 +79,9 @@ const initialState: MessageState = { export const selectIsWeshConnected = (state: RootState) => state.message.isWeshConnected; +export const selectIsOnboardingCompleted = (state: RootState) => + state.message.isOnboardingCompleted; + export const selectContactInfo = (state: RootState) => state.message.contactInfo; @@ -88,11 +94,6 @@ export const selectMessageList = (state: RootState, groupPk: string) => { return messageSelectors.selectAll(group); }; -/* -export const selectPeerList = (state: RootState) => - peerSelectors.selectAll(state.message.peers); -*/ - export const selectPeerById = (state: RootState, id: string) => peerSelectors.selectById(state.message.peers, id); @@ -124,25 +125,55 @@ export const selectLastContactMessageByGroupPk = ( export const selectContactRequestList = (state: RootState) => contactRequestSelectors.selectAll(state.message.contactRequests); -export const selectConversationList = ( - state: RootState, - conversationType: CONVERSATION_TYPES = CONVERSATION_TYPES.ACTIVE, -) => { - const conversations = conversationSelectors.selectAll( - state.message.conversations, - ); - switch (conversationType) { - case CONVERSATION_TYPES.ALL: { - return conversations; +export const selectConversationList = (state: RootState) => + conversationSelectors.selectAll(state.message.conversations); + +export const selectFilteredConversationList = createSelector( + [ + (state) => conversationSelectors.selectAll(state.message.conversations), + (_state, conversationType: CONVERSATION_TYPES) => conversationType, + (_state, _conversationType, sort) => sort, + ], + ( + conversations, + conversationType = CONVERSATION_TYPES.ACTIVE, + sort?: "asc" | "desc", + ) => { + let filteredConversation: Conversation[]; + + switch (conversationType) { + case CONVERSATION_TYPES.ALL: { + filteredConversation = conversations; + break; + } + case CONVERSATION_TYPES.ARCHIVED: { + filteredConversation = conversations.filter( + (conv) => conv.status === "archived", + ); + break; + } + case CONVERSATION_TYPES.ACTIVE: + default: + filteredConversation = conversations.filter( + (conv) => conv.status === "active", + ); } - case CONVERSATION_TYPES.ARCHIVED: { - return conversations.filter((conv) => conv.status === "archived"); + + if (sort) { + filteredConversation = [...filteredConversation]; + filteredConversation.sort((a, b) => { + const timestampA = a.recentMessage?.timestamp || moment(); + const timestampB = b.recentMessage?.timestamp || moment(); + if (sort === "asc") { + return moment(timestampB).diff(moment(timestampA)); + } + return moment(timestampA).diff(moment(timestampB)); + }); } - case CONVERSATION_TYPES.ACTIVE: - default: - return conversations.filter((conv) => conv.status === "active"); - } -}; + + return filteredConversation; + }, +); export const selectConversationById = (state: RootState, id: string) => conversationSelectors.selectById(state.message.conversations, id); @@ -154,6 +185,9 @@ const messageSlice = createSlice({ setIsWeshConnected: (state, action: PayloadAction) => { state.isWeshConnected = action.payload; }, + setIsOnboardingCompleted: (state, action: PayloadAction) => { + state.isOnboardingCompleted = action.payload; + }, setMessage: ( state, action: PayloadAction<{ groupPk: string; data: Message }>, @@ -183,6 +217,13 @@ const messageSlice = createSlice({ }, }); } + + conversationEntityAdapter.updateOne(state.conversations, { + id: action.payload.groupPk, + changes: { + recentMessage: action.payload.data, + }, + }); }, setPeerList: (state, action: PayloadAction) => { peerEntityAdapter.setAll(state.peers, action.payload); @@ -202,13 +243,19 @@ const messageSlice = createSlice({ action.payload.data.parentId, ); if (!message) return; - messageEntityAdapter.updateOne(group.value, { - id: action.payload.data?.parentId, + + groupEntityAdapter.updateOne(state.messages, { + id: action.payload.groupPk, changes: { - reactions: uniqBy( - [...(message.reactions || []), action.payload.data], // TODO: normalize - "id", - ), + value: messageEntityAdapter.updateOne(group.value, { + id: action.payload.data.parentId, + changes: { + reactions: uniqBy( + [...(message.reactions || []), action.payload.data], // TODO: normalize + "id", + ), + }, + }), }, }); } @@ -243,6 +290,9 @@ const messageSlice = createSlice({ ) => { state.contactInfo = { ...state.contactInfo, ...action.payload }; }, + resetMessageSlice: (state) => { + state = initialState; + }, }, }); @@ -257,6 +307,8 @@ export const { updateConversationById, setPeerList, setIsWeshConnected, + setIsOnboardingCompleted, + resetMessageSlice, } = messageSlice.actions; export const messageReducer = messageSlice.reducer; diff --git a/packages/store/store.ts b/packages/store/store.ts index a716c11ca9..e1d86c0a0e 100644 --- a/packages/store/store.ts +++ b/packages/store/store.ts @@ -1,13 +1,9 @@ -import { combineReducers, configureStore, Middleware } from "@reduxjs/toolkit"; +import { combineReducers, configureStore } from "@reduxjs/toolkit"; import { Platform } from "react-native"; import { useDispatch } from "react-redux"; -import { - persistStore, - persistReducer, - createMigrate, - REHYDRATE, -} from "redux-persist"; +import { persistStore, persistReducer, createMigrate } from "redux-persist"; +import { afterRehydrateMiddleware } from "./milldeware/afterRehydrateMiddleware"; import { dAppsReducer, dAppsReducerPersisted } from "./slices/dapps-store"; import { marketplaceCartItems, @@ -32,7 +28,6 @@ import { } from "./slices/wallets"; import { storage } from "./storage"; import { defaultEnabledNetworks } from "../networks"; -import { bootWeshModule } from "../weshnet/services"; const migrations = { 0: (state: any) => { @@ -108,6 +103,7 @@ const persistConfig = { "marketplaceCartItemsUI", "marketplaceFilters", "marketplaceFilterUI", + "message", ], blacklist: ["dAppsStore, marketplaceFilterUI"], }; @@ -130,13 +126,6 @@ const rootReducer = combineReducers({ const persistedReducer = persistReducer(persistConfig, rootReducer); -const afterRehydrateMiddleware: Middleware = () => (next) => (action) => { - if (action.type === REHYDRATE) { - bootWeshModule(); - } - return next(action); -}; - export const store = configureStore({ reducer: persistedReducer, middleware: (getDefaultMiddleware) => [ diff --git a/packages/utils/file.ts b/packages/utils/file.ts new file mode 100644 index 0000000000..c38da95a54 --- /dev/null +++ b/packages/utils/file.ts @@ -0,0 +1,36 @@ +export const readFileAsBase64 = (file?: File): Promise | string => { + if (!file) { + return ""; + } + return new Promise((resolve, reject) => { + const reader = new FileReader(); + + reader.onload = () => { + if (typeof reader?.result === "string") { + const base64String = reader?.result?.split?.(",")[1]; + resolve(base64String); + } + reject(new Error("readFileAsBase64 is not string")); + }; + + reader.onerror = (error) => { + reject(error); + }; + + reader.readAsDataURL(file); + }); +}; + +export const blobToDataURI = (blob: Blob): Promise => { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + if (typeof reader?.result === "string") { + resolve(reader.result); + } + reject(new Error("blobToDataURI is not string")); + }; + reader.onerror = reject; + reader.readAsDataURL(blob); + }); +}; diff --git a/packages/utils/navigation.ts b/packages/utils/navigation.ts index c48e805fb7..c915e7c80e 100644 --- a/packages/utils/navigation.ts +++ b/packages/utils/navigation.ts @@ -5,7 +5,7 @@ import React from "react"; import { feedsTabItems } from "./social-feed"; import { AppMode } from "./types/app-mode"; import { NewPostFormValues } from "./types/feed"; -import { Conversation, MessageFriendsTabItem } from "./types/message"; +import { MessageFriendsTabItem } from "./types/message"; import { uppTabItems } from "./upp"; export type RouteName = keyof RootStackParamList; @@ -89,7 +89,7 @@ export type RootStackParamList = { Metrics: undefined; Message: { view: string; tab?: string } | undefined; - ChatSection: Conversation; + ChatSection: { id: string }; FriendshipManager: { tab?: MessageFriendsTabItem } | undefined; // native wallet screens diff --git a/packages/utils/style/layout.ts b/packages/utils/style/layout.ts index 745aba1fc3..43ac47f75f 100644 --- a/packages/utils/style/layout.ts +++ b/packages/utils/style/layout.ts @@ -54,6 +54,10 @@ export const layout = Object.freeze({ get spacing_x1() { return this.base; }, + // 10 + get spacing_x1_25() { + return this.base * 1.25; + }, // 12 get spacing_x1_5() { return this.base * 1.5; diff --git a/packages/utils/types/message.ts b/packages/utils/types/message.ts index a37821e97e..33a0b013e4 100644 --- a/packages/utils/types/message.ts +++ b/packages/utils/types/message.ts @@ -1,29 +1,22 @@ import { z } from "zod"; -/* -type MessageType = - | "message" - | "accept-contact" - | "reject-contact" - | "group-invite" - | "group-join" - | "group-leave" - | "group-create" - | "reaction" - | "contact-request" - | "read"; -*/ +const MessageType = z.enum([ + "message", + "accept-contact", + "reject-contact", + "group-invite", + "group-join", + "group-leave", + "group-create", + "reaction", + "contact-request", + "read", +]); export type MessageFriendsTabItem = "friends" | "request" | "addFriend"; type ConversationType = "contact" | "group"; -/* -interface MessageFileData extends RemoteFileData { - type: string; -} -*/ - const ZodMessagePayload = z.object({ files: z.array(z.any()), message: z.string(), @@ -42,7 +35,7 @@ export const ZodMessage = z.object({ id: z.string(), senderId: z.string(), groupId: z.string(), - type: z.string(), + type: MessageType, payload: ZodMessagePayload.optional(), timestamp: z.string(), parentId: z.string().optional(), @@ -72,6 +65,7 @@ export interface Conversation { status: "active" | "archived" | "deleted" | "blocked"; lastReadIdByMe?: string; lastReadIdByContact?: string; + recentMessage?: Message; } export interface ContactRequest { diff --git a/packages/weshnet/client.ts b/packages/weshnet/client.ts index 128f05d26b..813efb541d 100644 --- a/packages/weshnet/client.ts +++ b/packages/weshnet/client.ts @@ -1,3 +1,4 @@ +import { grpc } from "@improbable-eng/grpc-web"; import { Platform } from "react-native"; import { @@ -5,16 +6,19 @@ import { ProtocolServiceClientImpl, } from "./../api/weshnet/protocoltypes"; import { weshConfig } from "./config"; -import { fixWeshPortURLParams } from "./devWeshPortFix"; -import { bootWeshnet } from "./services"; +import { afterWeshnetConnectionAction } from "./services"; const createWeshClient = (url: string) => { - const rpc = new GrpcWebImpl(url, { debug: false }); + const rpc = new GrpcWebImpl(url, { + debug: false, + transport: grpc.WebsocketTransport(), + }); + const client = new ProtocolServiceClientImpl(rpc); return client; }; -const getWeshnetAddress = (port: number) => { +export const getWeshnetAddress = (port: number) => { switch (Platform.OS) { case "android": return `10.0.2.2:${port}`; @@ -48,13 +52,14 @@ class WeshClient { if (port === 0) { return false; } + this.port = port; const address = getWeshnetAddress(port); const client = createWeshClient(address); const config = await client.ServiceGetConfiguration({}); weshConfig.config = config; this._client = client; - await bootWeshnet(); + await afterWeshnetConnectionAction(); } catch (err) { console.error("create Client err", err); } @@ -80,15 +85,4 @@ class WeshClient { const weshClient = new WeshClient(); -if (Platform.OS === "web") { - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const port = urlParams.get("weshPort"); - - if (port) { - fixWeshPortURLParams(); - weshClient.createClient(Number(port) || 4242); - } -} - export { weshClient }; diff --git a/packages/weshnet/message/subscriber.ts b/packages/weshnet/message/subscriber.ts index 11714c3362..89e30ff906 100644 --- a/packages/weshnet/message/subscriber.ts +++ b/packages/weshnet/message/subscriber.ts @@ -1,4 +1,4 @@ -import { Platform } from "react-native"; +import { Subscription } from "rxjs"; import { processMessage } from "./processEvent"; import { @@ -10,6 +10,9 @@ import { store } from "../../store/store"; import { weshClient } from "../client"; import { bytesFromString, stringFromBytes } from "../utils"; +const messageSubscriptions: Subscription[] = []; +const subscribers: { [key: string]: boolean } = {}; + export const subscribeMessages = async (groupPk: string) => { try { const lastId = selectLastIdByKey(store.getState(), groupPk); @@ -17,14 +20,25 @@ export const subscribeMessages = async (groupPk: string) => { const config: Partial = { groupPk: bytesFromString(groupPk), }; + let uniqKey = groupPk; if (lastId) { config.sinceId = bytesFromString(lastId); + uniqKey += "sinceId"; } else { config.untilNow = true; config.reverseOrder = true; + uniqKey += "untilNow"; + } + + if (subscribers[uniqKey]) { + return; } + subscribers[uniqKey] = true; + + let newLastId: string | undefined; + try { await weshClient.client.ActivateGroup({ groupPk: bytesFromString(groupPk), @@ -49,6 +63,7 @@ export const subscribeMessages = async (groupPk: string) => { value: id, }), ); + newLastId = id; isLastIdSet = true; } @@ -59,6 +74,7 @@ export const subscribeMessages = async (groupPk: string) => { value: id, }), ); + newLastId = id; } processMessage(data, groupPk); @@ -70,15 +86,22 @@ export const subscribeMessages = async (groupPk: string) => { console.error("get message err", e); }, complete: async () => { - const lastId = selectLastIdByKey(store.getState(), groupPk); - if (Platform.OS === "web" && lastId) { + messageSubscriptions.splice( + messageSubscriptions.indexOf(subscription), + 1, + ); + + if (newLastId) { subscribeMessages(groupPk); } else { setTimeout(() => subscribeMessages(groupPk), 3500); } }, }; - return messages.subscribe(observer); + + const subscription = messages.subscribe(observer); + + messageSubscriptions.push(subscription); } catch (err) { console.error("get messages err", err); } @@ -86,3 +109,9 @@ export const subscribeMessages = async (groupPk: string) => { console.error("subscribe message", err); } }; + +export const unsubscribeMessageSubscriptions = () => { + messageSubscriptions.forEach((subscriber) => { + subscriber?.unsubscribe?.(); + }); +}; diff --git a/packages/weshnet/metadata/subscriber.ts b/packages/weshnet/metadata/subscriber.ts index ab8a851043..f1f2e001cc 100644 --- a/packages/weshnet/metadata/subscriber.ts +++ b/packages/weshnet/metadata/subscriber.ts @@ -1,3 +1,5 @@ +import { Subscription } from "rxjs"; + import { processMetadata } from "./processEvent"; import { GroupMetadataEvent, @@ -8,6 +10,9 @@ import { store } from "../../store/store"; import { weshClient } from "../client"; import { bytesFromString, stringFromBytes } from "../utils"; +const metadataSubscriptions: Subscription[] = []; +const subscribers: { [key: string]: boolean } = {}; + export const subscribeMetadata = async ( groupPk: Uint8Array | undefined, ignoreLastId = false, @@ -19,17 +24,29 @@ export const subscribeMetadata = async ( const config: Partial = { groupPk, }; + let uniqKey = stringFromBytes(groupPk); + if (ignoreLastId) { lastId = undefined; } if (lastId) { config.sinceId = bytesFromString(lastId); + uniqKey += "sinceId"; } else { config.untilNow = true; config.reverseOrder = true; + uniqKey += "untilNow"; + } + + if (subscribers[uniqKey]) { + return; } + subscribers[uniqKey] = true; + + let newLastId: string | undefined; + try { const metadata = weshClient.client.GroupMetadataList(config); let isLastIdSet = false; @@ -48,6 +65,7 @@ export const subscribeMetadata = async ( }), ); isLastIdSet = true; + newLastId = id; } if (lastId) { @@ -57,6 +75,7 @@ export const subscribeMetadata = async ( value: id, }), ); + newLastId = id; } processMetadata(data); @@ -67,11 +86,27 @@ export const subscribeMetadata = async ( } }, complete: () => { - subscribeMetadata(groupPk); + metadataSubscriptions.splice( + metadataSubscriptions.indexOf(subscription), + 1, + ); + if (newLastId) { + subscribeMetadata(groupPk); + } else { + setTimeout(() => subscribeMetadata(groupPk), 3500); + } }, }; - metadata.subscribe(myObserver); + const subscription = metadata.subscribe(myObserver); + + metadataSubscriptions.push(subscription); } catch (err) { console.error("get metadata err", err); } }; + +export const unsubscribeMetadataSubscriptions = () => { + metadataSubscriptions.forEach((subscription) => { + subscription?.unsubscribe?.(); + }); +}; diff --git a/packages/weshnet/services.ts b/packages/weshnet/services.ts index 96feeff8f6..8282329351 100644 --- a/packages/weshnet/services.ts +++ b/packages/weshnet/services.ts @@ -1,29 +1,48 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; +import axios from "axios"; import Constants from "expo-constants"; +import * as DocumentPicker from "expo-document-picker"; +import * as Sharing from "expo-sharing"; +import moment from "moment"; import { Platform } from "react-native"; -import { weshClient } from "./client"; +import { getWeshnetAddress, weshClient } from "./client"; import { weshConfig } from "./config"; -import { subscribeMessages } from "./message/subscriber"; -import { subscribeMetadata } from "./metadata/subscriber"; +import { fixWeshPortURLParams } from "./devWeshPortFix"; +import { + subscribeMessages, + unsubscribeMessageSubscriptions, +} from "./message/subscriber"; +import { + subscribeMetadata, + unsubscribeMetadataSubscriptions, +} from "./metadata/subscriber"; import { bytesFromString, encodeJSON, stringFromBytes } from "./utils"; import { Group, GroupInfo_Request, GroupType, + ServiceExportData_Reply, } from "../api/weshnet/protocoltypes"; import { MessageState, - selectConversationList, setIsWeshConnected, setContactInfo, setPeerList, + selectContactInfo, + resetMessageSlice, + setIsOnboardingCompleted, + selectFilteredConversationList, } from "../store/slices/message"; import { store } from "../store/store"; import { isElectron } from "../utils/isElectron"; import { CONVERSATION_TYPES, Message } from "../utils/types/message"; +import FileSystem from "@/modules/FileSystem"; +import { blobToDataURI, readFileAsBase64 } from "@/utils/file"; + const isRunningInExpoGo = Constants.appOwnership === "expo"; +const DEV_WESHPORT_STORAGE_KEY = "__DEV__WeshPort"; let getPeerListIntervalId: ReturnType; @@ -40,39 +59,44 @@ export const getAndUpdatePeerList = async () => { ); }; -export const bootWeshModule = async () => { +const bootWeshModule = async () => { + const WeshnetModule = require("../../weshd"); + const port = await WeshnetModule.getPort(); + await AsyncStorage.setItem(DEV_WESHPORT_STORAGE_KEY, String(port)); + WeshnetModule.boot(); + setTimeout(() => { + weshClient.createClient(port); + }, 15 * 1000); +}; + +export const checkAndBootWeshModule = async () => { try { if (Platform.OS === "web" && !isElectron()) { - return; - } + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const port = urlParams.get("weshPort"); - if (isElectron()) { + if (port) { + fixWeshPortURLParams(); + await weshClient.createClient(Number(port) || 4242); + } + } else if (isElectron()) { weshClient.watchPort(); - } else if (!isRunningInExpoGo) { - let port: number; - if (__DEV__) { - const refPort = await AsyncStorage.getItem("__DEV__WeshPort"); - + } else if (isRunningInExpoGo) { + // Connects to local wesh; go run ./weshd/go/web + await weshClient.createClient(4242); + } else { + const refPort = await AsyncStorage.getItem(DEV_WESHPORT_STORAGE_KEY); + if (refPort) { try { - port = Number(refPort); + const port = Number(refPort); await weshClient.createClient(port); await weshClient.client.ServiceGetConfiguration({}); } catch { - const WeshnetModule = require("../../weshd"); - port = await WeshnetModule.getPort(); - await AsyncStorage.setItem("__DEV__WeshPort", String(port)); - WeshnetModule.boot(); - setTimeout(() => { - weshClient.createClient(port); - }, 15 * 1000); + await bootWeshModule(); } } else { - const WeshnetModule = require("../../weshd"); - port = await WeshnetModule.getPort(); - WeshnetModule.boot(); - setTimeout(() => { - weshClient.createClient(port); - }, 15 * 1000); + await bootWeshModule(); } } } catch (err) { @@ -80,7 +104,7 @@ export const bootWeshModule = async () => { } }; -export const bootWeshnet = async () => { +export const afterWeshnetConnectionAction = async () => { try { store.dispatch(setIsWeshConnected(true)); await weshClient.client.ContactRequestEnable({}); @@ -91,9 +115,19 @@ export const bootWeshnet = async () => { contactRef.publicRendezvousSeed = resetRef.publicRendezvousSeed; } + const publicRendezvousSeed = stringFromBytes( + contactRef.publicRendezvousSeed, + ); + const contactInfo = selectContactInfo(store.getState()); + const shareLink = createSharableLink({ + ...contactInfo, + publicRendezvousSeed, + }); + store.dispatch( setContactInfo({ - publicRendezvousSeed: stringFromBytes(contactRef.publicRendezvousSeed), + shareLink, + publicRendezvousSeed, }), ); @@ -113,9 +147,10 @@ export const bootWeshnet = async () => { }; const bootSubscribeMessages = () => { - const conversations = selectConversationList( + const conversations = selectFilteredConversationList( store.getState(), CONVERSATION_TYPES.ACTIVE, + "", ); conversations.forEach((item) => { @@ -314,3 +349,105 @@ export const sendMessage = async ({ console.error("send message err", err); } }; + +export const exportAccount = async () => { + const data = await weshClient.client.ServiceExportData({}); + + let acc = new Uint8Array(0); + + const promise = new Promise(async (resolve, reject) => { + const observer = { + next: (data: ServiceExportData_Reply) => { + const combinedArray = new Uint8Array( + acc.length + data.exportedData.length, + ); + combinedArray.set(acc); + combinedArray.set(data.exportedData, acc.length); + acc = combinedArray; + }, + error: reject, + complete: async () => { + try { + const blob = new Blob([acc], { type: "application/x-tar" }); + const fileName = `teritori-message-account-backup-${moment().format("YYYY-MM-DD hh:mm:ss")}.tar`; + + if (Platform.OS === "web") { + const downloadLink = document.createElement("a"); + downloadLink.href = window.URL.createObjectURL(blob); + downloadLink.download = fileName; + + document.body.appendChild(downloadLink); + downloadLink.click(); + + document.body.removeChild(downloadLink); + } else { + const uri = await blobToDataURI(blob); + const localFileURI = FileSystem.documentDirectory + fileName; + await FileSystem.writeAsStringAsync( + localFileURI, + uri.split(",")[1], + { + encoding: FileSystem.EncodingType.Base64, + }, + ); + + await Sharing.shareAsync(localFileURI, { + UTI: "application/x-tar", + mimeType: "application/x-tar", + }); + } + resolve(""); + } catch (err) { + reject(err); + } + }, + }; + data.subscribe(observer); + }); + + await promise; +}; + +export const setMessageOnboardingComplete = () => { + store.dispatch(setIsOnboardingCompleted(true)); +}; + +export const handleRestoreAccount = async () => { + const result = await DocumentPicker.getDocumentAsync({ + type: "application/x-tar", + }); + + if (!result.canceled && result.assets[0]) { + let base64String: string; + + if (Platform.OS === "web") { + base64String = await readFileAsBase64(result.assets[0].file); + } else { + base64String = await FileSystem.readAsStringAsync(result.assets[0].uri, { + encoding: FileSystem?.EncodingType?.Base64, + }); + } + + const response = await axios.post( + `${getWeshnetAddress(weshClient.port)}/restore-account`, + base64String, + ); + if (response.status < 200 || response.status > 300) { + throw response.data; + } + await AsyncStorage.removeItem(DEV_WESHPORT_STORAGE_KEY); + store.dispatch(resetMessageSlice()); + unsubscribeMessageSubscriptions(); + unsubscribeMetadataSubscriptions(); + store.dispatch(setIsWeshConnected(false)); + setMessageOnboardingComplete(); + if (Platform.OS === "web") { + setTimeout(() => { + checkAndBootWeshModule(); + }, 15 * 1000); + } else { + await checkAndBootWeshModule(); + } + } + throw new Error("Couldn't load the file"); +}; diff --git a/weshd/go.mod b/weshd/go.mod index f07ca0719b..4c2959c1e3 100644 --- a/weshd/go.mod +++ b/weshd/go.mod @@ -1,4 +1,4 @@ -module teritori-dapp/weshd +module weshd go 1.19 @@ -7,6 +7,7 @@ require ( github.com/dgraph-io/badger v1.6.2 github.com/improbable-eng/grpc-web v0.15.0 github.com/ipfs/go-ds-badger v0.3.0 + github.com/mitchellh/go-homedir v1.1.0 github.com/peterbourgon/ff/v3 v3.4.0 github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 github.com/pkg/errors v0.9.1 @@ -191,7 +192,6 @@ require ( github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/sha256-simd v1.0.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect @@ -260,16 +260,15 @@ require ( go.uber.org/fx v1.19.2 // indirect go.uber.org/multierr v1.11.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.18.0 // indirect + golang.org/x/crypto v0.19.0 // indirect golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.18.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect @@ -287,4 +286,4 @@ require ( nhooyr.io/websocket v1.8.7 // indirect ) -replace berty.tech/weshnet => github.com/TERITORI/weshnet v0.0.0-20231127151743-abee97f5abd4 +replace berty.tech/weshnet => github.com/TERITORI/weshnet v0.0.0-20240115113859-64c2bc3a8307 diff --git a/weshd/go.sum b/weshd/go.sum index 0de6a69291..76d2158294 100644 --- a/weshd/go.sum +++ b/weshd/go.sum @@ -67,8 +67,8 @@ github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fT github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= -github.com/TERITORI/weshnet v0.0.0-20231127151743-abee97f5abd4 h1:fXiSQE2fILFPa54c9fEOc9TdfL3QTNYrHxrmPsDKzzE= -github.com/TERITORI/weshnet v0.0.0-20231127151743-abee97f5abd4/go.mod h1:BNV2f0xxLFIPwNJNf8KprEAGfIqvzGh8uu7QGhRxe7w= +github.com/TERITORI/weshnet v0.0.0-20240115113859-64c2bc3a8307 h1:E/g6kRf+4DRPHPhMLZrZBaoCZam88oyMaXRAHgUDyOs= +github.com/TERITORI/weshnet v0.0.0-20240115113859-64c2bc3a8307/go.mod h1:BNV2f0xxLFIPwNJNf8KprEAGfIqvzGh8uu7QGhRxe7w= github.com/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -719,7 +719,6 @@ github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704n github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= -github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -756,7 +755,6 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -1100,7 +1098,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -1236,7 +1233,6 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= -github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= @@ -1454,7 +1450,6 @@ github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvS github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc h1:BCPnHtcboadS0DvysUuJXZ4lWVv5Bh5i7+tbIyi+ck4= github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc/go.mod h1:r45hJU7yEoA81k6MWNhpMj/kms0n14dkzkxYHoB96UM= github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 h1:5HZfQkwe0mIfyDmc1Em5GqlNRzcdtlv4HTNmdpt7XH0= -github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11/go.mod h1:Wlo/SzPmxVp6vXpGt/zaXhHH0fn4IxgqZc82aKg6bpQ= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o= github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= @@ -1607,8 +1602,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1637,8 +1632,6 @@ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b h1:kfWLZgb8iUBHdE9WydD5V5dHIS/F6HjlBZNyJfn2bs4= -golang.org/x/mobile v0.0.0-20240112133503-c713f31d574b/go.mod h1:4efzQnuA1nICq6h4kmZRMGzbPiP06lZvgADUu1VpJCE= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= @@ -1648,8 +1641,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1710,8 +1703,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1825,8 +1818,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1904,8 +1897,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/weshd/go/app/wesh.go b/weshd/go/app/wesh.go new file mode 100644 index 0000000000..3e80314eda --- /dev/null +++ b/weshd/go/app/wesh.go @@ -0,0 +1,17 @@ +package wesh + +import ( + "weshd/go/shared" +) + +func Boot(path string) { + shared.BootWesh(path) +} + +func GetPort() int { + return shared.CheckAndUpdateFreePort() +} + +func Shutdown() { + shared.Shutdown() +} diff --git a/weshd/go/electron/prod.go b/weshd/go/electron/prod.go new file mode 100644 index 0000000000..daf8fc9411 --- /dev/null +++ b/weshd/go/electron/prod.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "path/filepath" + "sync" + "syscall" + "weshd/go/shared" + + "github.com/mitchellh/go-homedir" +) + +func main() { + + shared.CheckAndUpdatePortFromArgs() + homeDir, err := homedir.Dir() + if err != nil { + fmt.Println("Error:", err) + return + } + + dir := "teritori-electron-wesh" + + path := filepath.Join(homeDir, dir) + + // Create a channel to receive the interrupt signal. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) + + // Create a WaitGroup to manage goroutines. + var wg sync.WaitGroup + + // Function to handle cleanup. + cleanup := func() { + fmt.Println("Cleanup code here...") + shared.Shutdown() + // You can add any cleanup operations you need here. + } + + // Start a goroutine to wait for the interrupt signal. + go func() { + <-interrupt + fmt.Println("Received interrupt signal. Cleaning up...") + cleanup() + os.Exit(1) + }() + + wg.Add(1) + go shared.BootWesh(path) + wg.Wait() +} diff --git a/weshd/go/shared/shared.go b/weshd/go/shared/shared.go new file mode 100644 index 0000000000..5284c523bc --- /dev/null +++ b/weshd/go/shared/shared.go @@ -0,0 +1,398 @@ +package shared + +import ( + "bytes" + "context" + "encoding/base64" + "flag" + "fmt" + "io" + mrand "math/rand" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + + "berty.tech/weshnet" + "berty.tech/weshnet/pkg/ipfsutil" + ipfs_mobile "berty.tech/weshnet/pkg/ipfsutil/mobile" + "berty.tech/weshnet/pkg/protocoltypes" + "berty.tech/weshnet/pkg/tinder" + "google.golang.org/grpc" + "moul.io/srand" + + "github.com/dgraph-io/badger/options" + badger "github.com/ipfs/go-ds-badger" + "github.com/peterbourgon/ff/v3" + "github.com/phayes/freeport" + "go.uber.org/zap" + + "github.com/improbable-eng/grpc-web/go/grpcweb" + "github.com/pkg/errors" +) + +var ( + port = 0 + weshDir = "./temp/wesh-dir/4242" + opts weshnet.Opts + httpServer http.Server + stopHTTPServer chan struct{} + wrappedServer *grpcweb.WrappedGrpcServer + ds *badger.Datastore + tinderDriver *tinder.Service + mnode *ipfs_mobile.IpfsMobile + mrepo *ipfs_mobile.RepoMobile + localdisc *tinder.LocalDiscovery + ipfsCoreAPI ipfsutil.ExtendedCoreAPI +) + +func RestoreAccountHandler(resp http.ResponseWriter, req *http.Request) { + resp.Header().Set("Access-Control-Allow-Origin", "*") + resp.Header().Set("Access-Control-Allow-Headers", "*") + fmt.Println("Import account handler") + + // Define the temporary directory for account restoration + weshDirTemp := weshDir + "temp" + + // Ensure the temporary directory exists + err := CheckAndProcessDir(weshDirTemp) + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + fmt.Printf("Error creating temporary directory: %s\n", err) + return + } + + // Generate options for the server using the temporary directory + tempOpts := GenerateOptsForServer(weshDirTemp) + + // Ensure the request method is POST + if req.Method != http.MethodPost { + http.Error(resp, "Method Not Allowed", http.StatusMethodNotAllowed) + return + } + + // Read the base64 encoded string from the request body + base64String, err := io.ReadAll(req.Body) + if err != nil { + http.Error(resp, "Bad Request", http.StatusBadRequest) + fmt.Printf("Error reading request body: %s\n", err) + return + } + + // Decode the base64 string + reader := base64.NewDecoder(base64.StdEncoding, bytes.NewReader(base64String)) + + // Restore the account + err = weshnet.RestoreAccountExport(context.Background(), reader, tempOpts.IpfsCoreAPI, tempOpts.OrbitDB, tempOpts.Logger) + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + fmt.Printf("Error restoring account: %s\n", err) + return + } + + // Clean up temporary directory and rename + err = HandleExit() + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + fmt.Printf("Error handling exit: %s\n", err) + return + } + + // Remove temporary directory + err = os.RemoveAll(weshDir) + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + fmt.Println("Error restoring: deleting folder:", err) + return + } + fmt.Println("Folder deleted successfully:", weshDir) + + // Rename temporary directory to original directory + err = os.Rename(weshDirTemp, weshDir) + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + fmt.Println("Error restoring: renaming folder:", err) + return + } + fmt.Println("Folder renamed successfully:", weshDir) + + // Create a wrapped server in a separate goroutine + go CreateWrappedServer() + + fmt.Println("Restore account completed") + resp.WriteHeader(http.StatusCreated) +} + +func CheckAndProcessDir(weshDir string) error { + _, err := os.Stat(weshDir) + if err == nil { + fmt.Printf("Directory '%s' already exists.\n", weshDir) + return nil + } else if os.IsNotExist(err) { + err = os.MkdirAll(weshDir, 0755) + if err != nil { + fmt.Println("Error:", err) + return err + } + fmt.Printf("Created directory '%s'.\n", weshDir) + return nil + } else { + fmt.Println("Error:", err) + return err + } +} + +func StartHTTPServer() { + + mux := http.NewServeMux() + mux.HandleFunc("/restore-account", RestoreAccountHandler) + + mux.Handle("/", http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { + + resp.Header().Set("Access-Control-Allow-Origin", "*") + resp.Header().Set("Access-Control-Allow-Headers", "*") + + fmt.Printf("Request: %v\n", req) + + wrappedServer.ServeHTTP(resp, req) + })) + httpServer = http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", port), + Handler: mux, + } + + if err := httpServer.ListenAndServe(); err != nil { + panic(errors.Wrap(err, "failed to start http server")) + } + +} + +func CreateWrappedServer() { + fmt.Printf("Using port: %d\n", port) + grpcServer := grpc.NewServer() + opts = GenerateOptsForServer(weshDir) + + svc, err := weshnet.NewService(opts) + if err != nil { + panic(errors.Wrap(err, "failed to create weshnet server")) + } + // defer svc.Close() + + protocoltypes.RegisterProtocolServiceServer(grpcServer, svc) + wrappedServer = grpcweb.WrapServer(grpcServer, + grpcweb.WithOriginFunc(func(string) bool { return true }), // @FIXME: this is very insecure + grpcweb.WithWebsockets(true), + ) +} + +func GenerateOptsForServer(projectDir string) weshnet.Opts { + + fs := flag.NewFlagSet("weshd", flag.ContinueOnError) + + if err := ff.Parse(fs, os.Args[1:]); err != nil { + panic(errors.Wrap(err, "failed to parse flags")) + } + + logger, err := zap.NewProduction() + if err != nil { + panic(errors.Wrap(err, "failed to create logger")) + } + + logger.Info("weshd", zap.Int("port", port)) + + rng := mrand.New(mrand.NewSource(srand.MustSecure())) + drivers := []tinder.IDriver{} + + bopts := badger.DefaultOptions + bopts.ValueLogLoadingMode = options.FileIO + + ds, err = badger.NewDatastore(projectDir, &bopts) + if err != nil { + panic(errors.Wrap(err, "unable to init badger datastore")) + } + + repo, err := ipfsutil.LoadRepoFromPath(projectDir) + if err != nil { + panic(errors.Wrap(err, "failed to create ipfs repo")) + } + + mrepo = ipfs_mobile.NewRepoMobile(projectDir, repo) + mnode, err = ipfsutil.NewIPFSMobile(context.Background(), mrepo, &ipfsutil.MobileOptions{}) + if err != nil { + panic(errors.Wrap(err, "failed to create ipfs node")) + } + + ipfsCoreAPI, err = ipfsutil.NewExtendedCoreAPIFromNode(mnode.IpfsNode) + if err != nil { + panic(errors.Wrap(err, "failed to create ipfs core api")) + } + + host := mnode.PeerHost() + + localdisc, err = tinder.NewLocalDiscovery(logger, host, rng) + if err != nil { + panic(errors.Wrap(err, "failed to create local discovery")) + } + drivers = append(drivers, localdisc) + + if mnode != nil { + dhtdisc := tinder.NewRoutingDiscoveryDriver("dht", mnode.DHT) + drivers = append(drivers, dhtdisc) + + } + tinderDriver, err := tinder.NewService(host, logger, drivers...) + if err != nil { + panic(errors.Wrap(err, "failed to create tinder driver")) + } + + opts = weshnet.Opts{ + Logger: logger, + TinderService: tinderDriver, + IpfsCoreAPI: ipfsCoreAPI, + RootDatastore: ds, + } + + opts.ServiceOptsApplyDefaults(context.Background()) + + return opts + +} + +func CheckAndUpdatePortFromArgs() int { + args := os.Args[1:] + + if len(args) != 0 { + parsedPort, err := strconv.Atoi(args[0]) + if err != nil { + fmt.Println("Invalid port number:", args[0]) + + } else { + port = parsedPort + return port + } + } + port = 4242 + return port +} + +func CheckAndUpdateFreePort() int { + if port != 0 { + return port + } + + firstPort, err := freeport.GetFreePort() + if err == nil { + port = firstPort + } else { + secondPort, err := freeport.GetFreePort() + + if err == nil { + port = secondPort + } + } + return port +} + +func BootWesh(path string) { + + weshDir = path + CreateWrappedServer() + + stopHTTPServer = make(chan struct{}) + + go func() { + StartHTTPServer() + close(stopHTTPServer) + }() + + interruptChannel := make(chan os.Signal, 1) + signal.Notify(interruptChannel, os.Interrupt, syscall.SIGTERM) + + <-interruptChannel + + fmt.Println("Ctrl+C received. Stopping the program.") + + close(stopHTTPServer) + + fmt.Println("Program has exited.") +} + +func HandleExit() error { + fmt.Println("Handle exit") + var finalErr error + + // Close the Badger datastore + if ds != nil { + err := ds.Close() + if err != nil { + fmt.Println("Error while closing Badger datastore:", err) + finalErr = err + } + } + fmt.Println("Closed ds") + + // Close the Tinder discovery service + if tinderDriver != nil { + err := tinderDriver.Close() + if err != nil { + fmt.Println("Error while closing Tinder discovery service:", err) + finalErr = err + } + } + + fmt.Println("Closed tinderDriver") + + // Close the IPFS node + if mnode != nil { + err := mnode.Close() + if err != nil { + fmt.Println("Error while closing IPFS node:", err) + finalErr = err + } + } + + fmt.Println("Closed mnode") + + // Close the IPFS repo + if mrepo != nil { + err := mrepo.Close() + if err != nil { + fmt.Println("Error while closing IPFS repo:", err) + finalErr = err + } + } + + fmt.Println("Closed mrepo") + + // Close the local discovery service + if localdisc != nil { + err := localdisc.Close() + if err != nil { + fmt.Println("Error while closing local discovery service:", err) + finalErr = err + } + } + + fmt.Println("Closed localdisc") + + // Close the IPFS core API + if ipfsCoreAPI != nil { + err := ipfsCoreAPI.Close() + if err != nil { + fmt.Println("Error while closing IPFS core API:", err) + finalErr = err + } + } + + fmt.Println("Closed ipfsCoreAPI") + + fmt.Println("Handle exit completed") + + return finalErr +} + +func Shutdown() { + HandleExit() + httpServer.Close() +} diff --git a/weshd/go/web/main.go b/weshd/go/web/main.go new file mode 100644 index 0000000000..467b411bee --- /dev/null +++ b/weshd/go/web/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "strconv" + + "weshd/go/shared" +) + +var ( + basePath = "./temp/wesh-dir" +) + +func main() { + port := shared.CheckAndUpdatePortFromArgs() + path := basePath + "/" + strconv.Itoa(port) + shared.BootWesh(path) +} diff --git a/weshd/go/wesh.go b/weshd/go/wesh.go deleted file mode 100644 index 04cbb026ab..0000000000 --- a/weshd/go/wesh.go +++ /dev/null @@ -1,147 +0,0 @@ -package wesh - -import ( - "context" - "flag" - "fmt" - "net/http" - - mrand "math/rand" - - "os" - - "berty.tech/weshnet" - "berty.tech/weshnet/pkg/ipfsutil" - ipfs_mobile "berty.tech/weshnet/pkg/ipfsutil/mobile" - "berty.tech/weshnet/pkg/protocoltypes" - "berty.tech/weshnet/pkg/tinder" - "moul.io/srand" - - // "github.com/cskr/pubsub" - - "github.com/dgraph-io/badger/options" - "github.com/improbable-eng/grpc-web/go/grpcweb" - badger "github.com/ipfs/go-ds-badger" - "github.com/peterbourgon/ff/v3" - "github.com/phayes/freeport" - "go.uber.org/zap" - "google.golang.org/grpc" - - // "moul.io/srand" - - "github.com/pkg/errors" -) - -var port int = 0 - -func checkFreePort() { - if port != 0 { - return - } - - firstPort, err := freeport.GetFreePort() - if err == nil { - port = firstPort - } -} - -func Boot(path string) { - checkFreePort() - fs := flag.NewFlagSet("weshd", flag.ContinueOnError) - if err := ff.Parse(fs, os.Args[1:]); err != nil { - panic(errors.Wrap(err, "failed to parse flags")) - } - - logger, err := zap.NewDevelopment() - if err != nil { - panic(errors.Wrap(err, "failed to create logger")) - } - - logger.Info("weshd", zap.Int("port", port)) - - grpcServer := grpc.NewServer() - - rng := mrand.New(mrand.NewSource(srand.MustSecure())) // nolint:gosec // we need to use math/rand here, but it is seeded from crypto/rand - drivers := []tinder.IDriver{} - - // setup ipfs node - bopts := badger.DefaultOptions - bopts.ValueLogLoadingMode = options.FileIO - ds, err := badger.NewDatastore(path, &bopts) - if err != nil { - panic(errors.Wrap(err, "unable to init badger datastore")) - } - - repo, err := ipfsutil.LoadRepoFromPath(path) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs repo")) - } - - mrepo := ipfs_mobile.NewRepoMobile(path, repo) - mnode, err := ipfsutil.NewIPFSMobile(context.Background(), mrepo, &ipfsutil.MobileOptions{}) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs node")) - } - - ipfsCoreAPI, err := ipfsutil.NewExtendedCoreAPIFromNode(mnode.IpfsNode) - if err != nil { - panic(errors.Wrap(err, "failed to create ipfs core api")) - } - - host := mnode.PeerHost() - - // setup loac disc - localdisc, err := tinder.NewLocalDiscovery(logger, host, rng) - if err != nil { - panic(errors.Wrap(err, "failed to create local discovery")) - } - drivers = append(drivers, localdisc) - - if mnode != nil { - dhtdisc := tinder.NewRoutingDiscoveryDriver("dht", mnode.DHT) - drivers = append(drivers, dhtdisc) - - } - tinderDriver, err := tinder.NewService(host, logger, drivers...) - if err != nil { - panic(errors.Wrap(err, "failed to create tinder driver")) - } - - svc, err := weshnet.NewService(weshnet.Opts{ - Logger: logger, - TinderService: tinderDriver, - IpfsCoreAPI: ipfsCoreAPI, - RootDatastore: ds, - }) - if err != nil { - panic(errors.Wrap(err, "failed to create weshnet server")) - } - defer svc.Close() - - protocoltypes.RegisterProtocolServiceServer(grpcServer, svc) - wrappedServer := grpcweb.WrapServer(grpcServer, - grpcweb.WithOriginFunc(func(string) bool { return true }), // @FIXME: this is very insecure - grpcweb.WithWebsockets(true), - ) - handler := func(resp http.ResponseWriter, req *http.Request) { - resp.Header().Set("Access-Control-Allow-Origin", "*") - resp.Header().Set("Access-Control-Allow-Headers", "*") - logger.Debug(fmt.Sprintf("Request: %v", req)) - wrappedServer.ServeHTTP(resp, req) - } - - httpServer := http.Server{ - Addr: fmt.Sprintf("127.0.0.1:%d", port), - Handler: http.HandlerFunc(handler), - } - - if err := httpServer.ListenAndServe(); err != nil { - logger.Debug(fmt.Sprintf("Request: %v", err)) - panic(errors.Wrap(err, "failed to start http server")) - } -} - -func GetPort() int { - checkFreePort() - return port -} diff --git a/yarn.lock b/yarn.lock index 3d9871b459..f5c1cff51a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11118,6 +11118,15 @@ __metadata: languageName: node linkType: hard +"expo-sharing@npm:~11.10.0": + version: 11.10.0 + resolution: "expo-sharing@npm:11.10.0" + peerDependencies: + expo: "*" + checksum: de17af11fcfd07886da654d8fbad73d4dbe4917bb134d462edb5b5d08162c650e5d37fa4c539d40affc6c9733d68de4950ee202a462539c7c4fc757702f91bfa + languageName: node + linkType: hard + "expo-splash-screen@npm:~0.26.4": version: 0.26.4 resolution: "expo-splash-screen@npm:0.26.4" @@ -19074,6 +19083,7 @@ __metadata: expo-linear-gradient: ~12.7.2 expo-optimize: ^0.2.20 expo-secure-store: ~12.8.1 + expo-sharing: ~11.10.0 expo-splash-screen: ~0.26.4 expo-status-bar: ~1.11.1 google-protobuf: ^3.21.2 From 711191c80de3b7dca8700df4b23cfe378f454f08 Mon Sep 17 00:00:00 2001 From: clegirar <33428384+clegirar@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:22:31 +0100 Subject: [PATCH 08/17] chore: replace some legacy boxes (#975) * fix: first replace of legacy boxes * fix: remove LegacySecondaryBox component Signed-off-by: clegirar * fix: update imports and delete unused exports code Signed-off-by: clegirar * fix: passed zIndex style props to his parent instead of add it in possible style props of Box component Signed-off-by: clegirar * fix: regression on SocialButtonSecondary component Signed-off-by: clegirar * fix: regression on SocialButton component Signed-off-by: clegirar * fix: regression on DAppStore Dropdown component Signed-off-by: clegirar --------- Signed-off-by: clegirar Co-authored-by: thomarnauld --- packages/components/Dropdown.tsx | 2 +- packages/components/Menu.tsx | 22 +- packages/components/Pagination.tsx | 24 +- packages/components/boxes/Box.tsx | 2 +- .../components/boxes/LegacySecondaryBox.tsx | 126 ------- packages/components/buttons/IconButton.tsx | 39 +-- packages/components/buttons/SocialButton.tsx | 44 +-- .../buttons/SocialButtonSecondary.tsx | 41 +-- .../components/buttons/ToggleableButton.tsx | 57 ++-- .../riotersFooter/NftAdjustments.tsx | 1 - .../socialFeed/NewsFeed/NewsFeedInput.tsx | 313 +++++++++--------- .../screens/DAppStore/components/Dropdown.tsx | 15 +- packages/utils/style/buttons.ts | 18 - 13 files changed, 271 insertions(+), 433 deletions(-) delete mode 100644 packages/components/boxes/LegacySecondaryBox.tsx diff --git a/packages/components/Dropdown.tsx b/packages/components/Dropdown.tsx index 94dfb527d3..24112d2402 100644 --- a/packages/components/Dropdown.tsx +++ b/packages/components/Dropdown.tsx @@ -6,7 +6,7 @@ import { ViewStyle, } from "react-native"; -import { useDropdowns } from "../hooks/useDropdowns"; +import { useDropdowns } from "@/hooks/useDropdowns"; interface DropdownProps { children: diff --git a/packages/components/Menu.tsx b/packages/components/Menu.tsx index 1e8a8f84d1..5b4b85e7c4 100644 --- a/packages/components/Menu.tsx +++ b/packages/components/Menu.tsx @@ -2,11 +2,12 @@ import React from "react"; import { View, TouchableOpacity } from "react-native"; import { BrandText } from "./BrandText"; -import { LegacyPrimaryBox } from "./boxes/LegacyPrimaryBox"; -import { useDropdowns } from "../hooks/useDropdowns"; -import { neutral33 } from "../utils/style/colors"; -import { fontSemibold13 } from "../utils/style/fonts"; -import { layout } from "../utils/style/layout"; +import { PrimaryBox } from "./boxes/PrimaryBox"; + +import { useDropdowns } from "@/hooks/useDropdowns"; +import { neutral33 } from "@/utils/style/colors"; +import { fontSemibold13 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; const DEFAULT_WIDTH = 164; @@ -34,11 +35,12 @@ export const Menu: React.FC = ({ {isDropdownOpen && ( - @@ -66,7 +68,7 @@ export const Menu: React.FC = ({ ))} - + )} diff --git a/packages/components/Pagination.tsx b/packages/components/Pagination.tsx index 8164e87917..ea930344ea 100644 --- a/packages/components/Pagination.tsx +++ b/packages/components/Pagination.tsx @@ -3,8 +3,8 @@ import { StyleSheet, TouchableOpacity, View } from "react-native"; import { BrandText } from "./BrandText"; import { SVG } from "./SVG"; -import { LegacySecondaryBox } from "./boxes/LegacySecondaryBox"; import { LegacyTertiaryBox } from "./boxes/LegacyTertiaryBox"; +import { SecondaryBox } from "./boxes/SecondaryBox"; import { SpacerRow } from "./spacer"; import chevronDownSVG from "../../assets/icons/chevron-down.svg"; import chevronLeftDoubleSVG from "../../assets/icons/chevron-left-double.svg"; @@ -12,15 +12,16 @@ import chevronLeftSVG from "../../assets/icons/chevron-left.svg"; import chevronRightDoubleSVG from "../../assets/icons/chevron-right-double.svg"; import chevronRightSVG from "../../assets/icons/chevron-right.svg"; import chevronUpSVG from "../../assets/icons/chevron-up.svg"; -import { useDropdowns } from "../hooks/useDropdowns"; + +import { useDropdowns } from "@/hooks/useDropdowns"; import { neutral33, neutral77, neutralA3, secondaryColor, -} from "../utils/style/colors"; -import { fontSemibold13, fontSemibold14 } from "../utils/style/fonts"; -import { layout } from "../utils/style/layout"; +} from "@/utils/style/colors"; +import { fontSemibold13, fontSemibold14 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; interface PaginationProps { currentPage: number; @@ -114,11 +115,12 @@ export const Pagination = ({ {isDropdownOpen && ( - ))} - + )} diff --git a/packages/components/boxes/Box.tsx b/packages/components/boxes/Box.tsx index 08f8cddea3..5178b491b6 100644 --- a/packages/components/boxes/Box.tsx +++ b/packages/components/boxes/Box.tsx @@ -8,7 +8,7 @@ import { ViewProps, } from "react-native"; -import { useTheme } from "../../hooks/useTheme"; +import { useTheme } from "@/hooks/useTheme"; // Be very careful while editing this, try to refrain from adding new props diff --git a/packages/components/boxes/LegacySecondaryBox.tsx b/packages/components/boxes/LegacySecondaryBox.tsx deleted file mode 100644 index 00737bb1b9..0000000000 --- a/packages/components/boxes/LegacySecondaryBox.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import React, { ReactNode } from "react"; -import { View, ViewStyle, StyleProp, StyleSheet } from "react-native"; - -import { neutral11 } from "../../utils/style/colors"; - -/** - * @deprecated use SecondaryBox or Box instead - */ -export const LegacySecondaryBox: React.FC<{ - width?: number; - height?: number; - fullWidth?: boolean; - cornerWidth?: number; - squaresBackgroundColor?: string; - disabled?: boolean; - style?: StyleProp; - mainContainerStyle?: StyleProp; - noBrokenCorners?: boolean; - squaresBorderColor?: string; - children: ReactNode; -}> = ({ - width, - height, - fullWidth = false, - // Less or more big "broken" corner (Example on SocialButton) - cornerWidth = 8, - // We need that to correctly set the color under the card - squaresBackgroundColor = "#000000", - disabled = false, - style, - mainContainerStyle, - noBrokenCorners, - squaresBorderColor, - children, -}) => { - const flatMainContainerStyle = mainContainerStyle - ? StyleSheet.flatten(mainContainerStyle) - : {}; - const borderRadius = flatMainContainerStyle.borderRadius || 8; - const backgroundColor = disabled - ? neutral11 - : flatMainContainerStyle.backgroundColor || "#000000"; - - return ( - // ---- Main container, flex row to fit the horizontal content - - {/* ---- Sub main container, flex column to fit the vertical content*/} - - {/*---- Content wrapper*/} - - {/* ---- Content container */} - - <>{children} - - - {!noBrokenCorners && ( - <> - {/* Left top broken corner */} - - - {/* Right bottom broken corner */} - - - )} - - - - ); -}; diff --git a/packages/components/buttons/IconButton.tsx b/packages/components/buttons/IconButton.tsx index 5b111e3070..e900b86c77 100644 --- a/packages/components/buttons/IconButton.tsx +++ b/packages/components/buttons/IconButton.tsx @@ -1,22 +1,24 @@ import React from "react"; -import { StyleProp, TouchableOpacity, ViewStyle } from "react-native"; +import { StyleProp, TouchableOpacity } from "react-native"; import { SvgProps } from "react-native-svg"; +import { SVG } from "../SVG"; +import { BoxStyle } from "../boxes/Box"; +import { SecondaryBox } from "../boxes/SecondaryBox"; + import { borderRadiusButton, ButtonsSize, heightButton, -} from "../../utils/style/buttons"; -import { primaryColor } from "../../utils/style/colors"; -import { SVG } from "../SVG"; -import { LegacySecondaryBox } from "../boxes/LegacySecondaryBox"; +} from "@/utils/style/buttons"; +import { primaryColor } from "@/utils/style/colors"; export const IconButton: React.FC<{ width?: number; size: ButtonsSize; onPress?: (() => Promise) | (() => void); squaresBackgroundColor?: string; - style?: StyleProp; + style?: StyleProp; iconSVG: React.FC; disabled?: boolean; fullWidth?: boolean; @@ -24,7 +26,6 @@ export const IconButton: React.FC<{ iconColor?: string; backgroundColor?: string; borderColor?: string; - squaresBorderColor?: string; noBrokenCorners?: boolean; }> = ({ // If no width, the buttons will fit the content including paddingHorizontal 20 @@ -33,41 +34,29 @@ export const IconButton: React.FC<{ onPress, style, iconSVG, - disabled = false, fullWidth = false, iconSize = 16, iconColor = "black", backgroundColor = primaryColor, borderColor, - squaresBorderColor, - noBrokenCorners, }) => { - const boxProps = { - style, - disabled, - width, - fullWidth, - noBrokenCorners, - }; - return ( - - + ); }; diff --git a/packages/components/buttons/SocialButton.tsx b/packages/components/buttons/SocialButton.tsx index 141c360ffb..3cdf97249e 100644 --- a/packages/components/buttons/SocialButton.tsx +++ b/packages/components/buttons/SocialButton.tsx @@ -2,44 +2,48 @@ import React from "react"; import { ViewStyle, View, StyleProp, TouchableOpacity } from "react-native"; import { SvgProps } from "react-native-svg"; -import { neutral22, neutral33, withAlpha } from "../../utils/style/colors"; -import { fontMedium14 } from "../../utils/style/fonts"; import { BrandText } from "../BrandText"; import { SVG } from "../SVG"; -import { LegacySecondaryBox } from "../boxes/LegacySecondaryBox"; +import { Box } from "../boxes/Box"; +import { neutral22, neutral33, withAlpha } from "@/utils/style/colors"; +import { fontMedium14 } from "@/utils/style/fonts"; + +// TODO: remove uses of Box component directly in other components export const SocialButton: React.FC<{ text: string; iconSvg: React.FC; onPress?: () => void; style?: StyleProp; - noBrokenCorners?: boolean; -}> = ({ text, onPress, iconSvg, style, noBrokenCorners = true }) => { +}> = ({ text, onPress, iconSvg, style }) => { return ( - - - + {text} - + ); }; diff --git a/packages/components/buttons/SocialButtonSecondary.tsx b/packages/components/buttons/SocialButtonSecondary.tsx index 0858834dff..b4ca178d4f 100644 --- a/packages/components/buttons/SocialButtonSecondary.tsx +++ b/packages/components/buttons/SocialButtonSecondary.tsx @@ -2,17 +2,19 @@ import React from "react"; import { ViewStyle, View, StyleProp, TouchableOpacity } from "react-native"; import { SvgProps } from "react-native-svg"; +import { BrandText } from "../BrandText"; +import { SVG } from "../SVG"; +import { Box } from "../boxes/Box"; + import { neutral1A, primaryColor, primaryTextColor, withAlpha, -} from "../../utils/style/colors"; -import { fontMedium14 } from "../../utils/style/fonts"; -import { BrandText } from "../BrandText"; -import { SVG } from "../SVG"; -import { LegacySecondaryBox } from "../boxes/LegacySecondaryBox"; +} from "@/utils/style/colors"; +import { fontMedium14 } from "@/utils/style/fonts"; +// TODO: remove uses of Box component directly in other components export const SocialButtonSecondary: React.FC<{ text: string; iconSvg: React.FC; @@ -21,23 +23,24 @@ export const SocialButtonSecondary: React.FC<{ }> = ({ text, onPress, iconSvg, style }) => { return ( - - - + - + ); }; diff --git a/packages/components/buttons/ToggleableButton.tsx b/packages/components/buttons/ToggleableButton.tsx index caa0d07aa5..eae5411cf8 100644 --- a/packages/components/buttons/ToggleableButton.tsx +++ b/packages/components/buttons/ToggleableButton.tsx @@ -1,60 +1,51 @@ import React from "react"; -import { StyleProp, TouchableOpacity, ViewStyle } from "react-native"; +import { StyleProp, TouchableOpacity } from "react-native"; import chevronDownSVG from "../../../assets/icons/chevron-down.svg"; import chevronUpSVG from "../../../assets/icons/chevron-up.svg"; -import { - ButtonsSize, - cornerWidthDropdownButton, - heightDropdownButton, -} from "../../utils/style/buttons"; -import { neutral33, secondaryColor } from "../../utils/style/colors"; -import { fontSemibold12 } from "../../utils/style/fonts"; import { BrandText } from "../BrandText"; import { SVG } from "../SVG"; -import { LegacySecondaryBox } from "../boxes/LegacySecondaryBox"; +import { BoxStyle } from "../boxes/Box"; +import { SecondaryBox } from "../boxes/SecondaryBox"; + +import { ButtonsSize } from "@/utils/style/buttons"; +import { neutral33, secondaryColor } from "@/utils/style/colors"; +import { fontSemibold12 } from "@/utils/style/fonts"; // Same as _PrimaryButtonTest but with customizable color and backgroundColor export const ToggleableButton: React.FC<{ - size?: ButtonsSize; textExpanded: string; textCompressed: string; + size?: ButtonsSize; width?: number; onPress?: () => void; squaresBackgroundColor?: string; isExpanded?: boolean; color?: string; - style?: StyleProp; + style?: StyleProp; }> = ({ - // If no width, the buttons will fit the content including paddingHorizontal 20 - width, - size = "XS", textExpanded, textCompressed, + // If no width, the buttons will fit the content including paddingHorizontal 20 + width, onPress, - squaresBackgroundColor, isExpanded = false, style, }) => { - const boxProps = { - style, - squaresBackgroundColor, - width, - }; - return ( - - + ); }; diff --git a/packages/components/riotersFooter/NftAdjustments.tsx b/packages/components/riotersFooter/NftAdjustments.tsx index 144c865acb..6e8623cc18 100644 --- a/packages/components/riotersFooter/NftAdjustments.tsx +++ b/packages/components/riotersFooter/NftAdjustments.tsx @@ -146,7 +146,6 @@ const NftAdjustments: React.FC<{ backgroundColor="#F46F761A" style={{ borderWidth: 1, borderRadius: 6 }} borderColor={errorColor} - squaresBorderColor={errorColor} /> setViewWidth(e.nativeEvent.layout.width)} > - - + - - - - - setSelection(event.nativeEvent.selection) - } - placeholder={`Hey yo! ${ - type === "post" ? "Post something" : "Write your comment" - } ${ - windowWidth < RESPONSIVE_BREAKPOINT_S ? "" : "here! _____" - }`} - placeholderTextColor={neutral77} - onChangeText={handleTextChange} - multiline - onContentSizeChange={(e) => { - // TODO: onContentSizeChange is not fired when deleting lines. We can only grow the input, but not shrink - if (e.nativeEvent.contentSize.height < inputMaxHeight) { - inputHeight.value = e.nativeEvent.contentSize.height; - } + + + - - - {/* Changing this text's color depending on the message length */} - - SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT * - CHARS_LIMIT_WARNING_MULTIPLIER && - formValues?.message?.length < - SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT - ? yellowDefault - : formValues?.message?.length >= - SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT - ? errorColor - : primaryColor, - marginTop: layout.spacing_x0_5, - alignSelf: "flex-end", - }, - ]} - > - {formValues?.message?.length} - - /{SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT} + + + setSelection(event.nativeEvent.selection) + } + placeholder={`Hey yo! ${ + type === "post" ? "Post something" : "Write your comment" + } ${ + windowWidth < RESPONSIVE_BREAKPOINT_S ? "" : "here! _____" + }`} + placeholderTextColor={neutral77} + onChangeText={handleTextChange} + multiline + onContentSizeChange={(e) => { + // TODO: onContentSizeChange is not fired when deleting lines. We can only grow the input, but not shrink + if (e.nativeEvent.contentSize.height < inputMaxHeight) { + inputHeight.value = e.nativeEvent.contentSize.height; + } + }} + style={[ + fontSemibold16, + { + height: formValues.message + ? inputHeight.value || inputMinHeight + : inputMinHeight, + width: "100%", + color: secondaryColor, + // @ts-expect-error: description todo + outlineStyle: "none", + outlineWidth: 0, + }, + ]} + /> + + + {/* Changing this text's color depending on the message length */} + + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT * + CHARS_LIMIT_WARNING_MULTIPLIER && + formValues?.message?.length < + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT + ? yellowDefault + : formValues?.message?.length >= + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT + ? errorColor + : primaryColor, + marginTop: layout.spacing_x0_5, + alignSelf: "flex-end", + }, + ]} + > + {formValues?.message?.length} + + /{SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT} + - - - - { - setValue( - "files", - removeFileFromArray( - formValues?.files || [], - file as LocalFileData, - ), - ); - }} - onDeleteGIF={(url) => - setValue( - "gifs", - (formValues?.gifs || [])?.filter((gif) => gif !== url), - ) - } - onAudioUpdate={(updatedFile) => { - if (formValues?.files?.length) { + + + { setValue( "files", - replaceFileInArray(formValues?.files, updatedFile), + removeFileFromArray( + formValues?.files || [], + file as LocalFileData, + ), ); + }} + onDeleteGIF={(url) => + setValue( + "gifs", + (formValues?.gifs || [])?.filter((gif) => gif !== url), + ) } - }} - /> - + onAudioUpdate={(updatedFile) => { + if (formValues?.files?.length) { + setValue( + "files", + replaceFileInArray(formValues?.files, updatedFile), + ); + } + }} + /> + + { {isDropdownOpen && ( - { id={option.id} /> ))} - + )} ); diff --git a/packages/utils/style/buttons.ts b/packages/utils/style/buttons.ts index 2ab529ec83..9173028543 100644 --- a/packages/utils/style/buttons.ts +++ b/packages/utils/style/buttons.ts @@ -24,24 +24,6 @@ export const borderRadiusButton = (format: ButtonsSize) => { } }; -export const heightDropdownButton = (format: ButtonsSize) => { - switch (format) { - case "SM": - return 40; - case "XS": - return 24; - } -}; - -export const cornerWidthDropdownButton = (format: ButtonsSize) => { - switch (format) { - case "XS": - return 5; - default: - return 8; - } -}; - export const horizontalPaddingButton = (format: ButtonsSize) => { switch (format) { case "XXS": From 514142bc323d7616712dd58b6f1f1253c7f51d60 Mon Sep 17 00:00:00 2001 From: sachin-into <154645503+sachin-into@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:23:26 +0545 Subject: [PATCH 09/17] feat(mini-mode): comments input (#971) * WIP: mini comment input component * replaced NewsFeedInput with MiniCommentInout * added select image and video * added style props to comment wrapper component * added form data for mini mode in useIpfs hooks, created MiniCommentInput (similar to NewsfeedInput but for comment only); has different file browsing packages supporting mobile for image/video/audio selection * fix mini mode check on useIpfs * added description after ts-expect-error * merge with upsteram * splitted MiniCommentInput into smaller components of CommentTextInput, SelectAudioVideo and SelectPicture * fixed forward ref type * fix: replaced appmode check with Platform.OS check in useIPFS hooks --------- Co-authored-by: Eng. Juan Combetto --- assets/icons/audio-white.svg | 3 + package.json | 1 + packages/hooks/useIpfs.ts | 13 +- .../detailView/MiniArticlePostDetails.tsx | 148 +++---- .../detailView/MiniDefaultPostDetails.tsx | 79 ++-- .../detailView/MiniVideoPostDetails.tsx | 197 ++++----- .../MiniCommentInput/CommentTextInput.tsx | 186 +++++++++ .../MiniCommentInput/SelectAudioVideo.tsx | 94 +++++ .../MiniCommentInput/SelectPicture.tsx | 71 ++++ .../components/MiniCommentInput/index.tsx | 389 ++++++++++++++++++ .../screens/Mini/components/MiniToast.tsx | 8 +- packages/utils/mime.ts | 1 + yarn.lock | 12 + 13 files changed, 990 insertions(+), 212 deletions(-) create mode 100644 assets/icons/audio-white.svg create mode 100644 packages/screens/Mini/components/MiniCommentInput/CommentTextInput.tsx create mode 100644 packages/screens/Mini/components/MiniCommentInput/SelectAudioVideo.tsx create mode 100644 packages/screens/Mini/components/MiniCommentInput/SelectPicture.tsx create mode 100644 packages/screens/Mini/components/MiniCommentInput/index.tsx diff --git a/assets/icons/audio-white.svg b/assets/icons/audio-white.svg new file mode 100644 index 0000000000..b1e3138cad --- /dev/null +++ b/assets/icons/audio-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/package.json b/package.json index ce3bd8f58c..87a48c5933 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "expo-document-picker": "~11.10.1", "expo-file-system": "~16.0.6", "expo-font": "~11.10.3", + "expo-image-picker": "^14.7.1", "expo-linear-gradient": "~12.7.2", "expo-optimize": "^0.2.20", "expo-secure-store": "~12.8.1", diff --git a/packages/hooks/useIpfs.ts b/packages/hooks/useIpfs.ts index 20b4d3059c..4f05faa5a1 100644 --- a/packages/hooks/useIpfs.ts +++ b/packages/hooks/useIpfs.ts @@ -2,6 +2,7 @@ import axios from "axios"; import { omit } from "lodash"; import { CID } from "multiformats"; import { useCallback, useMemo, useState } from "react"; +import { Platform } from "react-native"; import { useSelector } from "react-redux"; import { parseUserId } from "@/networks"; @@ -36,7 +37,16 @@ export const useIpfs = () => { }: PinataFileProps): Promise => { try { const formData = new FormData(); - formData.append("file", file.file); + if (Platform.OS !== "web") { + //@ts-expect-error: description - instead of converting selected file to File type as of WEB just using url to prepare formdata upload to pinata + formData.append("file", { + uri: file.url, + name: file.fileName, + type: file.mimeType, + }); + } else { + formData.append("file", file.file); + } const responseFile = await axios({ onUploadProgress: (progressEvent) => { @@ -84,6 +94,7 @@ export const useIpfs = () => { file, pinataJWTKey, }); + const url = !fileIpfsHash ? "" : "ipfs://" + fileIpfsHash; if (file.thumbnailFileData) { diff --git a/packages/screens/Mini/Feed/components/detailView/MiniArticlePostDetails.tsx b/packages/screens/Mini/Feed/components/detailView/MiniArticlePostDetails.tsx index 6250767c2b..a5fb4cc62d 100644 --- a/packages/screens/Mini/Feed/components/detailView/MiniArticlePostDetails.tsx +++ b/packages/screens/Mini/Feed/components/detailView/MiniArticlePostDetails.tsx @@ -11,13 +11,11 @@ import CustomAppBar from "../../../components/AppBar/CustomAppBar"; import { Post } from "@/api/feed/v1/feed"; import { BrandText } from "@/components/BrandText"; +import { KeyboardAvoidingView } from "@/components/KeyboardAvoidingView"; import { OptimizedImage } from "@/components/OptimizedImage"; import { ScreenContainer } from "@/components/ScreenContainer"; import { CommentsContainer } from "@/components/cards/CommentsContainer"; -import { - NewsFeedInput, - NewsFeedInputHandle, -} from "@/components/socialFeed/NewsFeed/NewsFeedInput"; +import { NewsFeedInputHandle } from "@/components/socialFeed/NewsFeed/NewsFeedInput"; import { RichText } from "@/components/socialFeed/RichText"; import { SocialCardHeader } from "@/components/socialFeed/SocialCard/SocialCardHeader"; import { SocialCardWrapper } from "@/components/socialFeed/SocialCard/SocialCardWrapper"; @@ -28,6 +26,7 @@ import { } from "@/hooks/feed/useFetchComments"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; import { parseUserId } from "@/networks"; +import { MiniCommentInput } from "@/screens/Mini/components/MiniCommentInput"; import { zodTryParseJSON } from "@/utils/sanitize"; import { DEFAULT_USERNAME } from "@/utils/social-feed"; import { fontSemibold16 } from "@/utils/style/fonts"; @@ -144,80 +143,83 @@ export const MiniArticlePostDetails = ({ noScroll headerMini={} > - - - - {!!coverImage && ( - <> - + + + + {!!coverImage && ( + <> + + + + )} + {!!metadataToUse?.title && ( + <> + + {metadataToUse.title} + + + + )} + + + + {/*========== Article content */} + + - - - )} - {!!metadataToUse?.title && ( - <> - - {metadataToUse.title} - - - - )} - - - - {/*========== Article content */} + + + - + { + setReplyTo(undefined); + refetchComments(); + }} + /> + + {}} /> - - - - { - setReplyTo(undefined); - refetchComments(); - }} - /> - {}} - /> - - + + ); }; diff --git a/packages/screens/Mini/Feed/components/detailView/MiniDefaultPostDetails.tsx b/packages/screens/Mini/Feed/components/detailView/MiniDefaultPostDetails.tsx index 3c142af98b..8c13807c06 100644 --- a/packages/screens/Mini/Feed/components/detailView/MiniDefaultPostDetails.tsx +++ b/packages/screens/Mini/Feed/components/detailView/MiniDefaultPostDetails.tsx @@ -9,13 +9,12 @@ import Animated, { import CustomAppBar from "../../../components/AppBar/CustomAppBar"; import { Post } from "@/api/feed/v1/feed"; +import { KeyboardAvoidingView } from "@/components/KeyboardAvoidingView"; import { ScreenContainer } from "@/components/ScreenContainer"; import { CommentsContainer } from "@/components/cards/CommentsContainer"; -import { - NewsFeedInput, - NewsFeedInputHandle, -} from "@/components/socialFeed/NewsFeed/NewsFeedInput"; +import { NewsFeedInputHandle } from "@/components/socialFeed/NewsFeed/NewsFeedInput"; import { SocialThreadCard } from "@/components/socialFeed/SocialCard/cards/SocialThreadCard"; +import { SpacerColumn } from "@/components/spacer"; import { combineFetchCommentPages, useFetchComments, @@ -23,6 +22,7 @@ import { import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; import { parseUserId } from "@/networks"; +import { MiniCommentInput } from "@/screens/Mini/components/MiniCommentInput"; import { DEFAULT_USERNAME } from "@/utils/social-feed"; import { tinyAddress } from "@/utils/text"; import { @@ -149,40 +149,43 @@ const MiniDefaultPostDetails = ({ onScroll={scrollHandler} scrollEventThrottle={1} > - - {!!post && ( - - - - )} - - { - setReplyTo(undefined); - refetchComments(); - }} - /> - + + + {!!post && ( + + + + )} + + + { + setReplyTo(undefined); + refetchComments(); + }} + /> + + + ); diff --git a/packages/screens/Mini/Feed/components/detailView/MiniVideoPostDetails.tsx b/packages/screens/Mini/Feed/components/detailView/MiniVideoPostDetails.tsx index 0d26aec46c..e761baf046 100644 --- a/packages/screens/Mini/Feed/components/detailView/MiniVideoPostDetails.tsx +++ b/packages/screens/Mini/Feed/components/detailView/MiniVideoPostDetails.tsx @@ -13,6 +13,7 @@ import { VideoCommentInput } from "../VideoCommentInput"; import { Post, PostsRequest } from "@/api/feed/v1/feed"; import { BrandText } from "@/components/BrandText"; +import { KeyboardAvoidingView } from "@/components/KeyboardAvoidingView"; import { ScreenContainer } from "@/components/ScreenContainer"; import { MediaPlayerVideo } from "@/components/mediaPlayer/MediaPlayerVideo"; import { DislikeButton } from "@/components/socialFeed/SocialActions/DislikeButton"; @@ -143,109 +144,111 @@ export const MiniVideoPostDetails = ({ noScroll headerMini={} > - - - {/*====== Video player ======*/} - - {/*====== Video info ======*/} - - - {video.title?.trim()} - - + + - - - - - - - - - + + {video.title?.trim()} + + + + - - - - - {network?.kind === NetworkKind.Gno && ( - <> - - - - )} + + + + + + + + + + + + + {network?.kind === NetworkKind.Gno && ( + <> + + + + )} + + {video.description && ( + <> + + + {video.description?.trim()} + + + )} + + {comments.map((comment, index) => ( + + + + + ))} + - {video.description && ( - <> - - - {video.description?.trim()} - - - )} - - {comments.map((comment, index) => ( - - - - - ))} - - - + + ); }; diff --git a/packages/screens/Mini/components/MiniCommentInput/CommentTextInput.tsx b/packages/screens/Mini/components/MiniCommentInput/CommentTextInput.tsx new file mode 100644 index 0000000000..018902d0af --- /dev/null +++ b/packages/screens/Mini/components/MiniCommentInput/CommentTextInput.tsx @@ -0,0 +1,186 @@ +import React, { useImperativeHandle, useRef } from "react"; +import { TextInput, View } from "react-native"; +import Animated, { useSharedValue } from "react-native-reanimated"; + +import penSVG from "../../../../../assets/icons/pen.svg"; + +import { BrandText } from "@/components/BrandText"; +import { FilesPreviewsContainer } from "@/components/FilePreview/FilesPreviewsContainer"; +import FlexRow from "@/components/FlexRow"; +import { SVG } from "@/components/SVG"; +import { CustomPressable } from "@/components/buttons/CustomPressable"; +import { SpacerColumn } from "@/components/spacer"; +import { + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT, + removeFileFromArray, + replaceFileInArray, +} from "@/utils/social-feed"; +import { + errorColor, + neutral77, + neutralA3, + primaryColor, + secondaryColor, + yellowDefault, +} from "@/utils/style/colors"; +import { fontSemibold12, fontSemibold16 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; +import { NewPostFormValues } from "@/utils/types/feed"; +import { LocalFileData } from "@/utils/types/files"; + +type Props = { + formValues: NewPostFormValues; + setValue: (index: keyof NewPostFormValues, data: any) => void; + setSelection: (data: { start: number; end: number }) => void; +}; +export interface MiniCommentInputHandle { + setValue: (text: string) => void; + focusInput: () => void; +} + +const CHARS_LIMIT_WARNING_MULTIPLIER = 0.92; + +export const CommentTextInput = React.forwardRef( + ({ formValues, setValue, setSelection }, forwardRef) => { + const inputMaxHeight = 400; + const inputMinHeight = 30; + const inputHeight = useSharedValue(30); + const inputRef = useRef(null); + + const focusInput = () => inputRef.current?.focus(); + + const handleTextChange = (text: string) => { + // Comments are blocked at 2500 + if (text.length > SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT) return; + setValue("message", text); + }; + useImperativeHandle(forwardRef, () => ({ + focusInput, + setValue: handleTextChange, + })); + + return ( + + + + + + + setSelection(event.nativeEvent.selection) + } + placeholder="Hey yo! Write your comment" + placeholderTextColor={neutral77} + onChangeText={handleTextChange} + multiline + onContentSizeChange={(e) => { + if (e.nativeEvent.contentSize.height < inputMaxHeight) { + inputHeight.value = e.nativeEvent.contentSize.height; + } + }} + style={[ + fontSemibold16, + { + height: formValues.message + ? inputHeight.value || inputMinHeight + : inputMinHeight, + width: "100%", + color: secondaryColor, + }, + ]} + /> + + + + + + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT * + CHARS_LIMIT_WARNING_MULTIPLIER && + formValues?.message?.length < + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT + ? yellowDefault + : formValues?.message?.length >= + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT - 10 + ? errorColor + : primaryColor, + marginTop: layout.spacing_x0_5, + alignSelf: "flex-end", + }, + ]} + > + {formValues?.message?.length} + + /{SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT} + + + {formValues.files && formValues.files.length > 0 ? ( + <> + + { + setValue( + "files", + removeFileFromArray( + formValues?.files || [], + file as LocalFileData, + ), + ); + }} + onDeleteGIF={(url) => { + setValue( + "gifs", + (formValues?.gifs || [])?.filter((gif) => gif !== url), + ); + const gifFile = formValues?.files?.find((x) => x.url === url); + if (gifFile) { + setValue( + "files", + removeFileFromArray( + formValues?.files || [], + gifFile as LocalFileData, + ), + ); + } + }} + onAudioUpdate={(updatedFile) => { + if (formValues?.files?.length) { + setValue( + "files", + replaceFileInArray(formValues?.files, updatedFile), + ); + } + }} + /> + + ) : null} + + ); + }, +); diff --git a/packages/screens/Mini/components/MiniCommentInput/SelectAudioVideo.tsx b/packages/screens/Mini/components/MiniCommentInput/SelectAudioVideo.tsx new file mode 100644 index 0000000000..6e74c0e275 --- /dev/null +++ b/packages/screens/Mini/components/MiniCommentInput/SelectAudioVideo.tsx @@ -0,0 +1,94 @@ +import * as DocumentPicker from "expo-document-picker"; +import React from "react"; + +import micSVG from "../../../../../assets/icons/mic-white.svg"; +import videoSVG from "../../../../../assets/icons/video.svg"; + +import { SVG } from "@/components/SVG"; +import { CustomPressable } from "@/components/buttons/CustomPressable"; +import { getAudioData } from "@/utils/audio"; +import { AUDIO_MIME_TYPES, VIDEO_MIME_TYPES } from "@/utils/mime"; +import { LocalFileData } from "@/utils/types/files"; +import { getVideoData } from "@/utils/video"; + +type FileType = "audio" | "video"; + +type Props = { + files?: LocalFileData[]; + onSelectFile: (data: LocalFileData[]) => void; + type: FileType; +}; + +export const SelectAudioVideo = ({ onSelectFile, type, files }: Props) => { + const onChooseFilePress = async (fileType: FileType) => { + try { + const acceptableMimeTypes = + fileType === "audio" ? AUDIO_MIME_TYPES : VIDEO_MIME_TYPES; + const result = await DocumentPicker.getDocumentAsync({ + multiple: false, + type: acceptableMimeTypes, + }); + + if ( + result.assets && + result.assets.length > 0 && + result.assets[0].mimeType && + acceptableMimeTypes.includes(result?.assets?.[0]?.mimeType) + ) { + const choseFile = result.assets[0]; + + if (files?.find((file) => file.fileName === choseFile.name)) return; + const filePath = choseFile?.uri; + const mimeType = `${choseFile.mimeType}`; + if (filePath) { + const fileName = `${choseFile.name}`; + const file = new File([], ""); + + const metaData: Pick< + LocalFileData, + "videoMetadata" | "audioMetadata" + > = { + videoMetadata: undefined, + audioMetadata: undefined, + }; + if (fileType === "video") { + metaData.videoMetadata = await getVideoData(file); + } + if (fileType === "audio") { + metaData.audioMetadata = await getAudioData(file); + } + + onSelectFile([ + { + file, + fileName, + fileType, + mimeType, + size: choseFile?.size || 0, + url: choseFile?.uri || "", + ...metaData, + }, + ]); + } + } + } catch (error) { + console.log(error); + } + }; + + return ( + onChooseFilePress(type)} + disabled={Array.isArray(files) && files?.length > 0} + > + 0 ? 0.7 : 1, + }} + /> + + ); +}; diff --git a/packages/screens/Mini/components/MiniCommentInput/SelectPicture.tsx b/packages/screens/Mini/components/MiniCommentInput/SelectPicture.tsx new file mode 100644 index 0000000000..1d9d53a91d --- /dev/null +++ b/packages/screens/Mini/components/MiniCommentInput/SelectPicture.tsx @@ -0,0 +1,71 @@ +import { MediaTypeOptions, launchImageLibraryAsync } from "expo-image-picker"; +import React from "react"; + +import cameraSVG from "../../../../../assets/icons/camera-white.svg"; + +import { SVG } from "@/components/SVG"; +import { CustomPressable } from "@/components/buttons/CustomPressable"; +import { IMAGE_MIME_TYPES } from "@/utils/mime"; +import { LocalFileData } from "@/utils/types/files"; + +type Props = { + files?: LocalFileData[]; + onSelectFile: (data: LocalFileData[]) => void; +}; + +export const SelectPicture = ({ files, onSelectFile }: Props) => { + const onCameraPress = async () => { + try { + const result = await launchImageLibraryAsync({ + mediaTypes: MediaTypeOptions.Images, + selectionLimit: 1, + }); + + if ( + result.assets && + result.assets.length > 0 && + result.assets[0].mimeType && + IMAGE_MIME_TYPES.includes(result?.assets?.[0]?.mimeType?.toLowerCase()) + ) { + const choseFile = result.assets[0]; + + if (files?.find((file) => file.fileName === choseFile.fileName)) return; + + const imagePath = choseFile?.uri; + const imageMime = `${choseFile.mimeType}`; + if (imagePath) { + const fileName = `${choseFile.fileName}`; + + onSelectFile([ + ...(files || []), + { + file: new File([], ""), + fileName, + fileType: "image", + mimeType: imageMime, + size: choseFile.fileSize || 0, + url: choseFile?.uri || "", + }, + ]); + } + } + } catch (error) { + console.log(error); + } + }; + return ( + 0} + > + 0 ? 0.7 : 1, + }} + /> + + ); +}; diff --git a/packages/screens/Mini/components/MiniCommentInput/index.tsx b/packages/screens/Mini/components/MiniCommentInput/index.tsx new file mode 100644 index 0000000000..a8bcc4acd9 --- /dev/null +++ b/packages/screens/Mini/components/MiniCommentInput/index.tsx @@ -0,0 +1,389 @@ +import React, { useImperativeHandle, useRef, useState } from "react"; +import { useForm } from "react-hook-form"; +import { View, ViewStyle } from "react-native"; +import { useSelector } from "react-redux"; + +import { CommentTextInput, MiniCommentInputHandle } from "./CommentTextInput"; +import { SelectAudioVideo } from "./SelectAudioVideo"; +import { SelectPicture } from "./SelectPicture"; +import priceSVG from "../../../../../assets/icons/price.svg"; +import { CustomButton } from "../Button/CustomButton"; +import MiniToast from "../MiniToast"; + +import { BrandText } from "@/components/BrandText"; +import FlexRow from "@/components/FlexRow"; +import { SVG } from "@/components/SVG"; +import { FeedPostingProgressBar } from "@/components/loaders/FeedPostingProgressBar"; +import { EmojiSelector } from "@/components/socialFeed/EmojiSelector"; +import { GIFSelector } from "@/components/socialFeed/GIFSelector"; +import { SpacerColumn } from "@/components/spacer"; +import { useWalletControl } from "@/context/WalletControlProvider"; +import { useFeedPosting } from "@/hooks/feed/useFeedPosting"; +import { useIpfs } from "@/hooks/useIpfs"; +import { useSelectedNetworkInfo } from "@/hooks/useSelectedNetwork"; +import useSelectedWallet from "@/hooks/useSelectedWallet"; +import { NetworkFeature, getUserId } from "@/networks"; +import { selectNFTStorageAPI } from "@/store/slices/settings"; +import { FeedPostingStepId, feedPostingStep } from "@/utils/feed/posting"; +import { generatePostMetadata, getPostCategory } from "@/utils/feed/queries"; +import { generateIpfsKey } from "@/utils/ipfs"; +import { + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT, + hashtagMatch, + mentionMatch, +} from "@/utils/social-feed"; +import { neutral77, secondaryColor } from "@/utils/style/colors"; +import { fontSemibold13 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; +import { replaceBetweenString } from "@/utils/text"; +import { NewPostFormValues, ReplyToType } from "@/utils/types/feed"; +import { RemoteFileData } from "@/utils/types/files"; + +interface MiniCommentInputProps { + parentId?: string; + style?: ViewStyle; + onSubmitSuccess?: () => void; + onSubmitInProgress?: () => void; + replyTo?: ReplyToType; + // Receive this if the post is created from HashFeedScreen + additionalHashtag?: string; + // Receive this if the post is created from UserPublicProfileScreen (If the user doesn't own the UPP) + additionalMention?: string; +} + +interface MiniCommentInputInputHandle { + resetForm: () => void; + setValue: (text: string) => void; + focusInput: () => void; +} +const MAX_IMAGES = 4; + +export const MiniCommentInput = React.forwardRef< + MiniCommentInputInputHandle, + MiniCommentInputProps +>( + ( + { + parentId, + replyTo, + style, + onSubmitSuccess, + onSubmitInProgress, + additionalHashtag, + additionalMention, + }, + forwardRef, + ) => { + const selectedNetwork = useSelectedNetworkInfo(); + const selectedNetworkId = selectedNetwork?.id || "teritori"; + const selectedWallet = useSelectedWallet(); + const userId = getUserId(selectedNetworkId, selectedWallet?.address); + const inputRef = useRef(null); + const [toastErrors, setToastErrors] = useState<{ + title: string; + message: string; + } | null>(null); + const [isUploadLoading, setIsUploadLoading] = useState(false); + const [isProgressBarShown, setIsProgressBarShown] = useState(false); + + const { showNotEnoughFundsModal, showConnectWalletModal } = + useWalletControl(); + const { setValue, handleSubmit, reset, watch } = useForm( + { + defaultValues: { + title: "", + message: "", + files: [], + gifs: [], + }, + }, + ); + const formValues = watch(); + const postCategory = getPostCategory(formValues); + const onPostCreationSuccess = () => { + // Timeout here to let a few time to see the progress bar "100% Done" + setTimeout(() => { + reset(); + onSubmitSuccess?.(); + setIsUploadLoading(false); + setIsProgressBarShown(false); + }, 1000); + }; + const { + makePost, + canPayForPost, + isProcessing, + prettyPublishingFee, + freePostCount, + publishingFee, + setStep, + step, + } = useFeedPosting( + selectedNetwork?.id, + userId, + postCategory, + onPostCreationSuccess, + ); + const isLoading = isUploadLoading || isProcessing; + const { uploadFilesToPinata, ipfsUploadProgress } = useIpfs(); + const userIPFSKey = useSelector(selectNFTStorageAPI); + + const [selection, setSelection] = useState<{ start: number; end: number }>({ + start: 10, + end: 10, + }); + const handleTextChange = (text: string) => { + if (inputRef?.current?.setValue) { + inputRef?.current?.setValue(text); + } + }; + const onEmojiSelected = (emoji: string | null) => { + if (emoji) { + let copiedValue = `${formValues.message}`; + copiedValue = replaceBetweenString( + copiedValue, + selection.start, + selection.end, + emoji, + ); + setValue("message", copiedValue); + } + }; + + const focusInput = () => inputRef?.current?.focusInput(); + + useImperativeHandle(forwardRef, () => ({ + resetForm: reset, + focusInput, + setValue: handleTextChange, + })); + + const processSubmit = async () => { + const action = "Comment"; + if (!selectedWallet?.address || !selectedWallet.connected) { + showConnectWalletModal({ + forceNetworkFeature: NetworkFeature.SocialFeed, + action, + }); + return; + } + if (!canPayForPost) { + showNotEnoughFundsModal({ + action, + cost: { + amount: publishingFee.toString(), + denom: publishingFee.denom || "", + }, + }); + return; + } + setIsUploadLoading(true); + setIsProgressBarShown(true); + onSubmitInProgress && onSubmitInProgress(); + try { + const isReplyToValid = + replyTo && + replyTo.parentId && + formValues.message.includes(`@${replyTo.username}`); + + // ---- Adding hashtag texts or mentioned texts to the metadata + const mentions: string[] = []; + mentionMatch(formValues.message)?.map((item) => { + //TODO: Check NS token id before sending mentioned text ? + + mentions.push(item); + }); + + const hashtags: string[] = []; + hashtagMatch(formValues.message)?.map((item) => { + hashtags.push(item); + }); + + // ---- Adding hashtag or mentioned user at the end of the message and to the metadata + let finalMessage = formValues.message || ""; + if (additionalMention) { + finalMessage += `\n@${additionalMention}`; + mentions.push(`@${additionalMention}`); + } + if (additionalHashtag) { + finalMessage += `\n#${additionalHashtag}`; + hashtags.push(`#${additionalHashtag}`); + } + + let remoteFiles: RemoteFileData[] = []; + + if (formValues.files?.length) { + setStep(feedPostingStep(FeedPostingStepId.GENERATING_KEY)); + + const pinataJWTKey = + userIPFSKey || (await generateIpfsKey(selectedNetworkId, userId)); + + if (pinataJWTKey) { + setStep(feedPostingStep(FeedPostingStepId.UPLOADING_FILES)); + + remoteFiles = await uploadFilesToPinata({ + files: formValues.files, + pinataJWTKey, + }); + } + } + if (formValues.files?.length && !remoteFiles.find((file) => file.url)) { + console.error("upload file err : Fail to pin to IPFS"); + setToastErrors({ + title: "File upload failed", + message: "Fail to pin to IPFS, please try to Publish again", + }); + setIsUploadLoading(false); + return; + } + + const metadata = generatePostMetadata({ + premium: false, + title: formValues.title || "", + message: finalMessage, + files: remoteFiles, + gifs: formValues?.gifs || [], + hashtags: [], + mentions: [], + }); + + await makePost( + JSON.stringify(metadata), + isReplyToValid ? replyTo.parentId : parentId, + ); + } catch (err) { + console.error("post submit err", err); + setIsUploadLoading(false); + setIsProgressBarShown(false); + setToastErrors({ + title: "Post creation failed", + message: err instanceof Error ? err.message : `${err}`, + }); + setTimeout(() => { + setToastErrors(null); + }, 3000); + } + }; + + return ( + + {toastErrors && toastErrors.message && ( + + )} + + + + + + {freePostCount + ? `You have ${freePostCount} free comment left` + : `The cost for this comment is ${prettyPublishingFee}`} + + + {step.id !== "UNDEFINED" && isProgressBarShown && ( + <> + + + + + )} + + + + + { + // Don't add if already added + if (formValues.gifs?.find((gif) => gif === url)) return; + url && setValue("gifs", [...(formValues.gifs || []), url]); + }} + disabled={ + (formValues.files?.[0] && + formValues.files[0].fileType !== "image") || + (formValues.files || []).length + + (formValues.gifs || [])?.length >= + MAX_IMAGES + } + /> + { + setValue("files", selectedFiles); + }} + /> + { + setValue("files", selectedFiles); + }} + /> + { + setValue("files", data); + }} + /> + + + SOCIAL_FEED_ARTICLE_MIN_CHARS_LIMIT || + !selectedWallet || + isLoading + } + /> + + + ); + }, +); diff --git a/packages/screens/Mini/components/MiniToast.tsx b/packages/screens/Mini/components/MiniToast.tsx index 17f6bdf1c5..b08e7da487 100644 --- a/packages/screens/Mini/components/MiniToast.tsx +++ b/packages/screens/Mini/components/MiniToast.tsx @@ -76,9 +76,11 @@ export default function MiniToast({ {message} - - - + {onClose && ( + + + + )} ); } diff --git a/packages/utils/mime.ts b/packages/utils/mime.ts index 9c63ad2439..ac4c0fcffc 100644 --- a/packages/utils/mime.ts +++ b/packages/utils/mime.ts @@ -6,4 +6,5 @@ export const IMAGE_MIME_TYPES = [ "image/jpeg", "image/x-png", "image/png", + "image/jpg", ]; diff --git a/yarn.lock b/yarn.lock index f5c1cff51a..d1ac532048 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11038,6 +11038,17 @@ __metadata: languageName: node linkType: hard +"expo-image-picker@npm:^14.7.1": + version: 14.7.1 + resolution: "expo-image-picker@npm:14.7.1" + dependencies: + expo-image-loader: ~4.6.0 + peerDependencies: + expo: "*" + checksum: f9022cc9162365471b8e979df2c7a2156f43819b4717fb6ba376aedb6b55352a7b60b3a50a279dd58cf2551fbdd8a0719c5c903dcde4703436029e0fdca9c035 + languageName: node + linkType: hard + "expo-json-utils@npm:~0.12.0": version: 0.12.3 resolution: "expo-json-utils@npm:0.12.3" @@ -19080,6 +19091,7 @@ __metadata: expo-document-picker: ~11.10.1 expo-file-system: ~16.0.6 expo-font: ~11.10.3 + expo-image-picker: ^14.7.1 expo-linear-gradient: ~12.7.2 expo-optimize: ^0.2.20 expo-secure-store: ~12.8.1 From f05460c584b723743ab7f9420261af528d05913c Mon Sep 17 00:00:00 2001 From: n0izn0iz Date: Wed, 21 Feb 2024 14:33:06 +0100 Subject: [PATCH 10/17] feat: indexer stats (#620) Signed-off-by: Norman Meier --- go/cmd/teritori-indexer/main.go | 50 ++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/go/cmd/teritori-indexer/main.go b/go/cmd/teritori-indexer/main.go index bb9fdcda28..b6de0691e1 100644 --- a/go/cmd/teritori-indexer/main.go +++ b/go/cmd/teritori-indexer/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "math" "os" "strconv" "strings" @@ -180,6 +181,11 @@ func main() { if err := db.Where(indexerdb.App{IndexerMode: indexerMode, NetworkID: network.ID}).FirstOrCreate(&dbApp).Error; err != nil { panic(errors.Wrap(err, "failed to get or create db app")) } + initialHeight := dbApp.Height + startTime := time.Now() + lastSnapshotHeight := initialHeight + lastSnapshotTime := time.Now() + bpsContinuous := float64(0) lastProcessedHeight := dbApp.Height lastProcessedHash := dbApp.TxHash @@ -198,6 +204,34 @@ func main() { }) } + // stats + statIntervalSeconds := 10 + statContinuousSamples := 60 + nextStatsPrint := time.Now().Add(time.Duration(statIntervalSeconds) * time.Second) + tryPrintStats := func(chainHeight int64, lastProcessedBlock int64) { + now := time.Now() + if nextStatsPrint.Before(now) { + + totalProcessedBlocks := lastProcessedBlock - initialHeight + elapsedTime := now.Sub(startTime).Seconds() + bpsTotal := float64(totalProcessedBlocks) / elapsedTime + + processedBlocks := lastProcessedBlock - lastSnapshotHeight + bpsInstant := float64(processedBlocks) / float64(now.Sub(lastSnapshotTime).Seconds()) + + bpsContinuous = (bpsContinuous * (float64(statContinuousSamples - 1)) / float64(statContinuousSamples)) + (bpsInstant / float64(statContinuousSamples)) + + remainingBlocks := chainHeight - lastProcessedBlock + eta := time.Duration((float64(remainingBlocks) / bpsContinuous) * 1000000000) + + logger.Info("sync stats", zap.Duration("eta", eta), zap.Int64("remaining-blocks", remainingBlocks), zap.Float64("bps-instant", math.Round(bpsInstant*100)/100), zap.Float64("bps-continuous", math.Round(bpsContinuous*100)/100), zap.Float64("bps-session", math.Round(bpsTotal*100)/100)) + + nextStatsPrint = now.Add(time.Duration(statIntervalSeconds) * time.Second) + lastSnapshotHeight = lastProcessedBlock + lastSnapshotTime = now + } + } + // find replay info to use var runReplayInfos []ReplayInfo for i, replayInfo := range replayInfos { @@ -227,15 +261,14 @@ func main() { chunkElems := int64(0) page := 1 + res, err := client.Status() + if err != nil { + panic(errors.Wrap(err, "failed to query status")) + } + lbh := res.SyncInfo.LatestBlockHeight + // Find batch end and strategy if replayInfo.FinalHeight == -1 { - res, err := client.Status() - if err != nil { - panic(errors.Wrap(err, "failed to query status")) - } - - lbh := res.SyncInfo.LatestBlockHeight - if chunkedHeight+*chunkSize > lbh-*tailSize { strategy = "tail" } @@ -305,6 +338,8 @@ func main() { } } + tryPrintStats(lbh, tx.Height-1) + if err := handler.HandleTendermintResultTx(tx); err != nil { return errors.Wrap(err, fmt.Sprintf(`failed to handle tx "%s"`, tx.Hash)) } @@ -325,6 +360,7 @@ func main() { chunkedHeight = lastProcessedHeight + 1 } else { // chunk strategy chunkedHeight = batchEnd + tryPrintStats(lbh, chunkedHeight) } if err := dbtx.Model(&indexerdb.App{}).Where("id = ?", dbApp.ID).UpdateColumns(map[string]interface{}{ From 16357b696bcae7411356ea963f6ef87b195189ac Mon Sep 17 00:00:00 2001 From: n0izn0iz Date: Thu, 22 Feb 2024 16:11:52 +0100 Subject: [PATCH 11/17] feat: bring cosmwasm nft marketplace contract in monorepo (#986) history of previously called teritori-vault repo: commit 75a692533b9188587ebfa909c5576376b8d65999 Author: yieldoption <100329165+yieldoption@users.noreply.github.com> Date: Thu Nov 3 23:26:23 2022 -0400 gas optimization for nft vault contract (#6) commit 0794cc77e08e1bc72c7d914ea391208dba25b9ca Author: yieldoption <100329165+yieldoption@users.noreply.github.com> Date: Thu Nov 3 12:16:51 2022 -0400 fix royalty query (#5) commit f48c7fe8869f2d83dc61308ceb37c64d3bb7e4c6 Merge: 6d528f0 b11d308 Author: n0izn0iz Date: Thu Oct 6 18:14:13 2022 +0200 Merge pull request #4 from TERITORI/feature/royalty feature / royalty commit b11d3082666d4a4df3dcef08a4e69d327ebf3be9 Author: yieldoption Date: Wed Oct 5 22:02:29 2022 -0400 cargo fmt commit 6f284d07f205e3256d0a7db0c6da458f20aa38f3 Author: yieldoption Date: Wed Oct 5 22:00:09 2022 -0400 add cosmwasm binary commit 01e4bbdef8968af5c94d3708202ea372bf2bb424 Author: yieldoption Date: Wed Oct 5 21:58:16 2022 -0400 update schema commit 6ada5b2346d12f27a7680a69fc93df016898e0cc Author: yieldoption Date: Wed Oct 5 21:58:06 2022 -0400 implement royalty feature commit 6d528f06ee0d0a98daa5301578e495cf5386a62e Merge: e3a2d0e 68b85a8 Author: n0izn0iz Date: Tue Oct 4 16:24:19 2022 +0200 Merge pull request #3 from TERITORI/ci chore: add ci checks commit 68b85a80fdd602c22296eb6d8fe6703e7df6e943 Author: Norman Meier Date: Tue Oct 4 16:20:25 2022 +0200 chore: add ci checks Signed-off-by: Norman Meier commit e3a2d0e8f943445a44b085d1bbbac8f65d7e0d76 Author: yieldoption Date: Mon Sep 26 22:37:32 2022 -0400 add tests for nft vault contract commit a04e44fe54ed798d96659098914af72a0c36d8f5 Merge: 8aad97c 48f7ba2 Author: n0izn0iz Date: Tue Sep 13 01:00:08 2022 +0200 Merge pull request #2 from TERITORI/schema-and-deploy chore: generate schema and deploy commit 48f7ba2b07f6dcf220ff79b4ee9088e24b4b2c63 Author: Norman Meier Date: Mon Sep 12 22:13:25 2022 +0200 chore: generate schema and deploy Signed-off-by: Norman Meier commit 8aad97ceb33e93f5c605e930074019a80ed5abb1 Author: sarawut Date: Wed Jun 8 19:24:19 2022 +0700 upgrade cosmwasm version commit aef4da7c70376056cef6e2dc9f2a6a758a9012c7 Merge: c610270 c80a675 Author: Yannis Date: Thu Mar 10 18:04:51 2022 +0100 Merge pull request #1 from POPSmartContract/fixed fix receivenft hook, save process commit c80a675f2c92b2dea0f82e7a1ca050908ccfff26 Author: unknown Date: Thu Mar 10 12:01:30 2022 -0500 fix receivenft hook, save process commit c6102700dd3a51706bd2f2a1ba1a1b2be5ca2cdf Author: devstar Date: Wed Mar 2 00:15:54 2022 +0700 set initial price for deposit, transfer nft when buy commit 20f335c01e44779ce8781d83d2a62bdad3272d42 Author: devstar Date: Thu Feb 24 21:20:28 2022 +0700 add fee withdraw function, query_all_nft_list in vault commit 9963a9d7f413aed5942ee873283be6d0762ec533 Author: devstar Date: Tue Feb 22 01:00:06 2022 +0700 complete buy function, add more queries commit 2fbcdcf01d2b335baff30783d444e6df2098d016 Author: devstar Date: Thu Feb 10 20:08:30 2022 +0700 initial vault contract --- .gitattributes | 14 +- .github/workflows/gen.yml | 3 +- .github/workflows/rust.yml | 3 + Makefile | 72 +- .../nft-marketplace/.cargo/config | 6 + .../nft-marketplace/.editorconfig | 11 + cosmwasm-contracts/nft-marketplace/.gitignore | 15 + cosmwasm-contracts/nft-marketplace/Cargo.lock | 799 +++++++++++++++ cosmwasm-contracts/nft-marketplace/Cargo.toml | 26 + .../nft-marketplace/examples/schema.rs | 38 + .../nft-marketplace/rustfmt.toml | 15 + .../schema/all_nfts_in_vault_response.json | 33 + .../schema/config_response.json | 23 + .../nft-marketplace/schema/execute_msg.json | 170 ++++ .../schema/instantiate_msg.json | 19 + .../schema/nft_info_response.json | 27 + .../schema/nft_list_response.json | 33 + .../schema/nft_owner_info_response.json | 5 + .../nft-marketplace/schema/nft_query_msg.json | 366 +++++++ .../nft-marketplace/schema/query_msg.json | 42 + .../schema/royalties_info_response.json | 23 + .../nft-marketplace/src/contract.rs | 914 ++++++++++++++++++ cosmwasm-contracts/nft-marketplace/src/lib.rs | 3 + .../nft-marketplace/src/state.rs | 24 + .../nft-marketplace/src/vault.rs | 89 ++ .../nftDetails/components/NFTSellInfo.tsx | 4 +- .../NftMarketplace.client.ts} | 10 +- .../NftMarketplace.types.ts} | 0 .../nft-marketplace/index.ts | 2 + packages/hooks/useCancelNFTListing.ts | 4 +- packages/hooks/useNFTInfo.ts | 10 +- packages/hooks/useVaultNFTInfo.ts | 4 +- packages/hooks/vault/useVaultConfig.ts | 4 +- packages/screens/CoreDAO/CoreDAOScreen.tsx | 4 +- .../screens/Marketplace/NFTDetailScreen.tsx | 6 +- packages/scripts/network-setup/deployLib.ts | 2 +- packages/scripts/vaultInfo.ts | 4 +- 37 files changed, 2760 insertions(+), 67 deletions(-) create mode 100644 cosmwasm-contracts/nft-marketplace/.cargo/config create mode 100644 cosmwasm-contracts/nft-marketplace/.editorconfig create mode 100644 cosmwasm-contracts/nft-marketplace/.gitignore create mode 100644 cosmwasm-contracts/nft-marketplace/Cargo.lock create mode 100644 cosmwasm-contracts/nft-marketplace/Cargo.toml create mode 100644 cosmwasm-contracts/nft-marketplace/examples/schema.rs create mode 100644 cosmwasm-contracts/nft-marketplace/rustfmt.toml create mode 100644 cosmwasm-contracts/nft-marketplace/schema/all_nfts_in_vault_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/config_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/execute_msg.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/instantiate_msg.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/nft_info_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/nft_list_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/nft_owner_info_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/query_msg.json create mode 100644 cosmwasm-contracts/nft-marketplace/schema/royalties_info_response.json create mode 100644 cosmwasm-contracts/nft-marketplace/src/contract.rs create mode 100644 cosmwasm-contracts/nft-marketplace/src/lib.rs create mode 100644 cosmwasm-contracts/nft-marketplace/src/state.rs create mode 100644 cosmwasm-contracts/nft-marketplace/src/vault.rs rename packages/contracts-clients/{teritori-nft-vault/TeritoriNftVault.client.ts => nft-marketplace/NftMarketplace.client.ts} (93%) rename packages/contracts-clients/{teritori-nft-vault/TeritoriNftVault.types.ts => nft-marketplace/NftMarketplace.types.ts} (100%) create mode 100644 packages/contracts-clients/nft-marketplace/index.ts diff --git a/.gitattributes b/.gitattributes index af3ad12812..f00b56d027 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,10 @@ -/.yarn/** linguist-vendored -/.yarn/releases/* binary -/.yarn/plugins/**/* binary -/.pnp.* binary linguist-generated +/.yarn/** linguist-vendored +/.yarn/releases/* binary +/.yarn/plugins/**/* binary +/.pnp.* binary linguist-generated +/cosmwasm-contracts/*/schema/**/* linguist-generated +/packages/contracts-clients/**/* linguist-generated +/packages/api/**/* linguist-generated +/go/pkg/*pb/**/* linguist-generated +/packages/evm-contracts-clients/**/*.ts linguist-generated +/.expo-shared/assets.json linguist-generated diff --git a/.github/workflows/gen.yml b/.github/workflows/gen.yml index fd7ba553a9..5ce66170fc 100644 --- a/.github/workflows/gen.yml +++ b/.github/workflows/gen.yml @@ -21,6 +21,8 @@ jobs: with: go-version: "1.19" + - uses: dtolnay/rust-toolchain@stable + - uses: bufbuild/buf-setup-action@v1.28.0 with: version: 1.28.0 @@ -33,7 +35,6 @@ jobs: with: ssh-private-key: | ${{ secrets.NFTS_DEPLOY_KEY }} - ${{ secrets.VAULT_DEPLOY_KEY }} ${{ secrets.FOOTER_DEPLOY_KEY }} ${{ secrets.TNS_DEPLOY_KEY }} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b10ce77b26..98d491bc62 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -14,6 +14,9 @@ jobs: - uses: dtolnay/rust-toolchain@stable + - name: Build + run: make build.rust + - name: Test run: make test.rust diff --git a/Makefile b/Makefile index eba4ac86f5..b71a3dcd45 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ BUNKER_MINTER_PACKAGE=teritori-bunker-minter GO?=go GOFMT?=$(shell $(GO) env GOROOT)/bin/gofmt +COSMWASM_CONTRACTS_DIR=cosmwasm-contracts +INTERNAL_COSMWASM_CONTRACTS=$(wildcard $(COSMWASM_CONTRACTS_DIR)/*) + TOKEN_REPO=teritori-nfts TOKEN_PACKAGE=teritori-nft SQUAD_STAKING_PACKAGE=teritori-squad-staking @@ -15,9 +18,6 @@ NAME_SERVICE_PACKAGE=teritori-name-service RIOTER_FOOTER_REPO=rioters-footer-nft RIOTER_FOOTER_PACKAGE=rioter-footer-nft -VAULT_REPO=teritori-vault -VAULT_PACKAGE=teritori-nft-vault - ADDR_LIST_REPO=cw_addr_list ADDR_LIST_PACKAGE=cw-address-list @@ -89,26 +89,13 @@ docker.backend: docker build . -f go/cmd/teritori-dapp-backend/Dockerfile -t teritori/teritori-dapp-backend:$(shell git rev-parse --short HEAD) .PHONY: generate.contracts-clients -generate.contracts-clients: $(CONTRACTS_CLIENTS_DIR)/$(BUNKER_MINTER_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(NAME_SERVICE_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(RIOTER_FOOTER_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(TOKEN_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(VAULT_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/cw721-membership +generate.contracts-clients: generate.internal-contracts-clients $(CONTRACTS_CLIENTS_DIR)/$(BUNKER_MINTER_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(NAME_SERVICE_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(RIOTER_FOOTER_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(TOKEN_PACKAGE) .PHONY: generate.go-networks generate.go-networks: node_modules validate-networks npx tsx packages/scripts/generateGoNetworks.ts | $(GOFMT) > go/pkg/networks/networks.gen.go npx tsx packages/scripts/codegen/generateGoNetworkFeatures.ts | $(GOFMT) > go/pkg/networks/features.gen.go -.PHONY/: $(CONTRACTS_CLIENTS_DIR)/cw721-membership -$(CONTRACTS_CLIENTS_DIR)/cw721-membership: node_modules - rm -fr $@ - cd cosmwasm-contracts/cw721-membership && cargo schema - npx cosmwasm-ts-codegen generate \ - --plugin client \ - --schema cosmwasm-contracts/cw721-membership/schema \ - --out $@ \ - --name cw721-membership \ - --no-bundle - npx tsx packages/scripts/makeTypescriptIndex $@ - touch $@ - .PHONY: $(CONTRACTS_CLIENTS_DIR)/$(BUNKER_MINTER_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(BUNKER_MINTER_PACKAGE): node_modules rm -fr $(CANDYMACHINE_REPO) @@ -216,23 +203,6 @@ $(CONTRACTS_CLIENTS_DIR)/$(BREEDING_PACKAGE): node_modules go fmt ./go/pkg/contracts/breeding_minter_types rm -fr $(CANDYMACHINE_REPO) -.PHONY: $(CONTRACTS_CLIENTS_DIR)/$(VAULT_PACKAGE) -$(CONTRACTS_CLIENTS_DIR)/$(VAULT_PACKAGE): node_modules - rm -fr $(VAULT_REPO) - git clone git@github.com:TERITORI/$(VAULT_REPO).git - cd $(VAULT_REPO) && git checkout 75a692533b9188587ebfa909c5576376b8d65999 - rm -fr $@ - npx cosmwasm-ts-codegen generate \ - --plugin client \ - --schema $(VAULT_REPO)/contracts/nft-vault/schema \ - --out $@ \ - --name $(VAULT_PACKAGE) \ - --no-bundle - mkdir -p go/pkg/contracts/vault_types - go run github.com/a-h/generate/cmd/schema-generate@v0.0.0-20220105161013-96c14dfdfb60 -i $(VAULT_REPO)/contracts/nft-vault/schema/execute_msg.json -o go/pkg/contracts/vault_types/execute_msg.go -p vault_types - go fmt ./go/pkg/contracts/vault_types - rm -fr $(VAULT_REPO) - .PHONY: $(CONTRACTS_CLIENTS_DIR)/$(ADDR_LIST_PACKAGE) $(CONTRACTS_CLIENTS_DIR)/$(ADDR_LIST_PACKAGE): node_modules rm -fr $(ADDR_LIST_REPO) @@ -404,8 +374,38 @@ bump-app-build-number: .PHONY: test.rust test.rust: - cd cosmwasm-contracts/cw721-membership && cargo test + for file in $(INTERNAL_COSMWASM_CONTRACTS); do \ + echo "> Testing $${file}" ; \ + cd $${file} ; \ + cargo test ; \ + cd - ; \ + done .PHONY: build.rust build.rust: - cd cosmwasm-contracts/cw721-membership && cargo wasm + for file in $(INTERNAL_COSMWASM_CONTRACTS); do \ + echo "> Building $${file}" ; \ + cd $${file} ; \ + cargo wasm ; \ + cd - ; \ + done + +.PHONY: generate.internal-contracts-clients +generate.internal-contracts-clients: node_modules + for indir in $(INTERNAL_COSMWASM_CONTRACTS) ; do \ + echo "> Generating client for $${indir}" ; \ + rm -fr $${indir}/schema ; \ + (cd $${indir} && cargo schema && cd -) || exit 1 ; \ + pkgname="$$(basename $${indir})" ; \ + outdir="$(CONTRACTS_CLIENTS_DIR)/$${pkgname}" ; \ + rm -fr $${outdir} ; \ + npx cosmwasm-ts-codegen generate \ + --plugin client \ + --schema $${indir}/schema \ + --out $${outdir} \ + --name $${pkgname} \ + --no-bundle \ + || exit 1 ;\ + npx tsx packages/scripts/makeTypescriptIndex $${outdir} || exit 1 ; \ + done + diff --git a/cosmwasm-contracts/nft-marketplace/.cargo/config b/cosmwasm-contracts/nft-marketplace/.cargo/config new file mode 100644 index 0000000000..8d4bc738b1 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/.cargo/config @@ -0,0 +1,6 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +wasm-debug = "build --target wasm32-unknown-unknown" +unit-test = "test --lib" +integration-test = "test --test integration" +schema = "run --example schema" diff --git a/cosmwasm-contracts/nft-marketplace/.editorconfig b/cosmwasm-contracts/nft-marketplace/.editorconfig new file mode 100644 index 0000000000..3d36f20b19 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.rs] +indent_size = 4 diff --git a/cosmwasm-contracts/nft-marketplace/.gitignore b/cosmwasm-contracts/nft-marketplace/.gitignore new file mode 100644 index 0000000000..dfdaaa6bcd --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/.gitignore @@ -0,0 +1,15 @@ +# Build results +/target + +# Cargo+Git helper file (https://github.com/rust-lang/cargo/blob/0.44.1/src/cargo/sources/git/utils.rs#L320-L327) +.cargo-ok + +# Text file backups +**/*.rs.bk + +# macOS +.DS_Store + +# IDEs +*.iml +.idea diff --git a/cosmwasm-contracts/nft-marketplace/Cargo.lock b/cosmwasm-contracts/nft-marketplace/Cargo.lock new file mode 100644 index 0000000000..082d759199 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/Cargo.lock @@ -0,0 +1,799 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bnum" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cosmwasm-crypto" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9934c79e58d9676edfd592557dee765d2a6ef54c09d5aa2edb06156b00148966" +dependencies = [ + "digest 0.10.7", + "ecdsa", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8666e572a3a2519010dde88c04d16e9339ae751b56b2bb35081fe3f7d6be74" +dependencies = [ + "base64", + "bech32", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "static_assertions", + "thiserror", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "cw-storage-plus" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648b1507290bbc03a8d88463d7cd9b04b1fa0155e5eef366c4fa052b9caaac7a" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6cf70ef7686e2da9ad7b067c5942cd3e88dd9453f7af42f54557f8af300fb0" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-utils" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbaecb78c8e8abfd6b4258c7f4fbeb5c49a5e45ee4d910d3240ee8e1d714e1b" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae0b69fa7679de78825b4edeeec045066aa2b2c4b6e063d80042e565bb4da5c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw2" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abb8ecea72e09afff830252963cb60faf945ce6cef2c20a43814516082653da" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035818368a74c07dd9ed5c5a93340199ba251530162010b9f34c3809e3b97df1" +dependencies = [ + "cosmwasm-std", + "cw-utils 0.13.4", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20dfe04f86e5327956b559ffcc86d9a43167391f37402afd8bf40b0be16bee4d" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.15.1", + "schemars", + "serde", +] + +[[package]] +name = "cw721-base" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c3ee3b669fc2a8094301a73fd7be97a7454d4df2650c33599f737e8f254d24" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.15.1", + "cw-utils 0.15.1", + "cw2", + "cw721 0.15.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dyn-clone" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8", + "signature", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "nft-marketplace" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.13.4", + "cw721 0.13.4", + "cw721-base", + "schemars", + "serde", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-wasm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/cosmwasm-contracts/nft-marketplace/Cargo.toml b/cosmwasm-contracts/nft-marketplace/Cargo.toml new file mode 100644 index 0000000000..7f3871069f --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "nft-marketplace" +version = "0.1.0" +edition = "2018" +license = "MIT" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# for quicker tests, cargo testing --lib +# for more explicit tests, cargo testing --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] + +[dependencies] +cw721 = { version = "0.13.2" } +cw721-base = { version = "0.15.0", features = ["library"] } +cosmwasm-std = { version = "1.0.0" } +cw-storage-plus = { version = "0.13.4" } +schemars = "0.8.10" +serde = { version = "1.0.137", default-features = false, features = ["derive"] } + +[dev-dependencies] +cosmwasm-schema = { version = "1.1.0" } diff --git a/cosmwasm-contracts/nft-marketplace/examples/schema.rs b/cosmwasm-contracts/nft-marketplace/examples/schema.rs new file mode 100644 index 0000000000..772ae7b5b8 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/examples/schema.rs @@ -0,0 +1,38 @@ +use std::env::current_dir; +use std::fs::create_dir_all; + +use cosmwasm_schema::{export_schema, export_schema_with_title, remove_schemas, schema_for}; +use nft_marketplace::{ + state::NFTInfo, + vault::{ + ConfigResponse, ExecuteMsg, InstantiateMsg, NftQueryMsg, QueryMsg, RoyaltiesInfoResponse, + }, +}; + +fn main() { + let mut out_dir = current_dir().unwrap(); + out_dir.push("schema"); + create_dir_all(&out_dir).unwrap(); + remove_schemas(&out_dir).unwrap(); + + export_schema(&schema_for!(InstantiateMsg), &out_dir); + export_schema(&schema_for!(ExecuteMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); + + // Query responses + export_schema(&schema_for!(ConfigResponse), &out_dir); + export_schema_with_title(&schema_for!(Vec), &out_dir, "NftListResponse"); + export_schema_with_title( + &schema_for!(Vec), + &out_dir, + "AllNftsInVaultResponse", + ); + export_schema_with_title(&schema_for!(NFTInfo), &out_dir, "NftInfoResponse"); + export_schema_with_title(&schema_for!(String), &out_dir, "NftOwnerInfoResponse"); + export_schema_with_title(&schema_for!(NftQueryMsg), &out_dir, "NftQueryMsg"); + export_schema_with_title( + &schema_for!(RoyaltiesInfoResponse), + &out_dir, + "RoyaltiesInfoResponse", + ); +} diff --git a/cosmwasm-contracts/nft-marketplace/rustfmt.toml b/cosmwasm-contracts/nft-marketplace/rustfmt.toml new file mode 100644 index 0000000000..11a85e6a9c --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/rustfmt.toml @@ -0,0 +1,15 @@ +# stable +newline_style = "unix" +hard_tabs = false +tab_spaces = 4 + +# unstable... should we require `rustup run nightly cargo fmt` ? +# or just update the style guide when they are stable? +#fn_single_line = true +#format_code_in_doc_comments = true +#overflow_delimited_expr = true +#reorder_impl_items = true +#struct_field_align_threshold = 20 +#struct_lit_single_line = true +#report_todo = "Always" + diff --git a/cosmwasm-contracts/nft-marketplace/schema/all_nfts_in_vault_response.json b/cosmwasm-contracts/nft-marketplace/schema/all_nfts_in_vault_response.json new file mode 100644 index 0000000000..335ba0ae27 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/all_nfts_in_vault_response.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AllNftsInVaultResponse", + "type": "array", + "items": { + "$ref": "#/definitions/NFTInfo" + }, + "definitions": { + "NFTInfo": { + "type": "object", + "required": [ + "amount", + "denom", + "owner" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + }, + "owner": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/config_response.json b/cosmwasm-contracts/nft-marketplace/schema/config_response.json new file mode 100644 index 0000000000..a5e1f68252 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/config_response.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ConfigResponse", + "type": "object", + "required": [ + "fee_bp", + "owner" + ], + "properties": { + "fee_bp": { + "$ref": "#/definitions/Uint128" + }, + "owner": { + "type": "string" + } + }, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/execute_msg.json b/cosmwasm-contracts/nft-marketplace/schema/execute_msg.json new file mode 100644 index 0000000000..1936fa27d5 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/execute_msg.json @@ -0,0 +1,170 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "ExecuteMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "update_config" + ], + "properties": { + "update_config": { + "type": "object", + "properties": { + "fee_bp": { + "anyOf": [ + { + "$ref": "#/definitions/Uint128" + }, + { + "type": "null" + } + ] + }, + "owner": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "receive_nft" + ], + "properties": { + "receive_nft": { + "$ref": "#/definitions/Cw721ReceiveMsg" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw" + ], + "properties": { + "withdraw": { + "type": "object", + "required": [ + "nft_contract_addr", + "nft_token_id" + ], + "properties": { + "nft_contract_addr": { + "type": "string" + }, + "nft_token_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "update_price" + ], + "properties": { + "update_price": { + "type": "object", + "required": [ + "amount", + "denom", + "nft_contract_addr", + "nft_token_id" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + }, + "nft_contract_addr": { + "type": "string" + }, + "nft_token_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "buy" + ], + "properties": { + "buy": { + "type": "object", + "required": [ + "nft_contract_addr", + "nft_token_id" + ], + "properties": { + "nft_contract_addr": { + "type": "string" + }, + "nft_token_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "withdraw_fee" + ], + "properties": { + "withdraw_fee": { + "type": "object" + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Binary": { + "description": "Binary is a wrapper around Vec to add base64 de/serialization with serde. It also adds some helper methods to help encode inline.\n\nThis is only needed as serde-json-{core,wasm} has a horrible encoding for Vec. See also .", + "type": "string" + }, + "Cw721ReceiveMsg": { + "description": "Cw721ReceiveMsg should be de/serialized under `Receive()` variant in a ExecuteMsg", + "type": "object", + "required": [ + "msg", + "sender", + "token_id" + ], + "properties": { + "msg": { + "$ref": "#/definitions/Binary" + }, + "sender": { + "type": "string" + }, + "token_id": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/instantiate_msg.json b/cosmwasm-contracts/nft-marketplace/schema/instantiate_msg.json new file mode 100644 index 0000000000..f2ba4b0bbc --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/instantiate_msg.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "InstantiateMsg", + "type": "object", + "required": [ + "fee_bp" + ], + "properties": { + "fee_bp": { + "$ref": "#/definitions/Uint128" + } + }, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/nft_info_response.json b/cosmwasm-contracts/nft-marketplace/schema/nft_info_response.json new file mode 100644 index 0000000000..1bae17b264 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/nft_info_response.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NftInfoResponse", + "type": "object", + "required": [ + "amount", + "denom", + "owner" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + }, + "owner": { + "type": "string" + } + }, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/nft_list_response.json b/cosmwasm-contracts/nft-marketplace/schema/nft_list_response.json new file mode 100644 index 0000000000..e7c1ea58fa --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/nft_list_response.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NftListResponse", + "type": "array", + "items": { + "$ref": "#/definitions/NFTInfo" + }, + "definitions": { + "NFTInfo": { + "type": "object", + "required": [ + "amount", + "denom", + "owner" + ], + "properties": { + "amount": { + "$ref": "#/definitions/Uint128" + }, + "denom": { + "type": "string" + }, + "owner": { + "type": "string" + } + } + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/nft_owner_info_response.json b/cosmwasm-contracts/nft-marketplace/schema/nft_owner_info_response.json new file mode 100644 index 0000000000..05c5152367 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/nft_owner_info_response.json @@ -0,0 +1,5 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NftOwnerInfoResponse", + "type": "string" +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json b/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json new file mode 100644 index 0000000000..1fe7b95fd7 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json @@ -0,0 +1,366 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "NftQueryMsg", + "oneOf": [ + { + "description": "Return the owner of the given token, error if token does not exist Return type: OwnerOfResponse", + "type": "object", + "required": [ + "owner_of" + ], + "properties": { + "owner_of": { + "type": "object", + "required": [ + "token_id" + ], + "properties": { + "include_expired": { + "description": "unset or false will filter out expired approvals, you must set to true to see them", + "type": [ + "boolean", + "null" + ] + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Return operator that can access all of the owner's tokens. Return type: `ApprovalResponse`", + "type": "object", + "required": [ + "approval" + ], + "properties": { + "approval": { + "type": "object", + "required": [ + "spender", + "token_id" + ], + "properties": { + "include_expired": { + "type": [ + "boolean", + "null" + ] + }, + "spender": { + "type": "string" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Return approvals that a token has Return type: `ApprovalsResponse`", + "type": "object", + "required": [ + "approvals" + ], + "properties": { + "approvals": { + "type": "object", + "required": [ + "token_id" + ], + "properties": { + "include_expired": { + "type": [ + "boolean", + "null" + ] + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "List all operators that can access all of the owner's tokens Return type: `OperatorsResponse`", + "type": "object", + "required": [ + "all_operators" + ], + "properties": { + "all_operators": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "include_expired": { + "description": "unset or false will filter out expired items, you must set to true to see them", + "type": [ + "boolean", + "null" + ] + }, + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Total number of tokens issued", + "type": "object", + "required": [ + "num_tokens" + ], + "properties": { + "num_tokens": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "With MetaData Extension. Returns top-level metadata about the contract: `ContractInfoResponse`", + "type": "object", + "required": [ + "contract_info" + ], + "properties": { + "contract_info": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "With MetaData Extension. Returns metadata about one particular token, based on *ERC721 Metadata JSON Schema* but directly from the contract: `NftInfoResponse`", + "type": "object", + "required": [ + "nft_info" + ], + "properties": { + "nft_info": { + "type": "object", + "required": [ + "token_id" + ], + "properties": { + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "With MetaData Extension. Returns the result of both `NftInfo` and `OwnerOf` as one query as an optimization for clients: `AllNftInfo`", + "type": "object", + "required": [ + "all_nft_info" + ], + "properties": { + "all_nft_info": { + "type": "object", + "required": [ + "token_id" + ], + "properties": { + "include_expired": { + "description": "unset or false will filter out expired approvals, you must set to true to see them", + "type": [ + "boolean", + "null" + ] + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "With Enumerable extension. Returns all tokens owned by the given address, [] if unset. Return type: TokensResponse.", + "type": "object", + "required": [ + "tokens" + ], + "properties": { + "tokens": { + "type": "object", + "required": [ + "owner" + ], + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "owner": { + "type": "string" + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "With Enumerable extension. Requires pagination. Lists all token_ids controlled by the contract. Return type: TokensResponse.", + "type": "object", + "required": [ + "all_tokens" + ], + "properties": { + "all_tokens": { + "type": "object", + "properties": { + "limit": { + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "start_after": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "minter" + ], + "properties": { + "minter": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Extension query", + "type": "object", + "required": [ + "extension" + ], + "properties": { + "extension": { + "type": "object", + "required": [ + "msg" + ], + "properties": { + "msg": { + "$ref": "#/definitions/Cw2981QueryMsg" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ], + "definitions": { + "Cw2981QueryMsg": { + "oneOf": [ + { + "description": "Should be called on sale to see if royalties are owed by the marketplace selling the NFT, if CheckRoyalties returns true See https://eips.ethereum.org/EIPS/eip-2981", + "type": "object", + "required": [ + "RoyaltyInfo" + ], + "properties": { + "RoyaltyInfo": { + "type": "object", + "required": [ + "sale_price", + "token_id" + ], + "properties": { + "sale_price": { + "$ref": "#/definitions/Uint128" + }, + "token_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + { + "description": "Called against contract to determine if this NFT implements royalties. Should return a boolean as part of CheckRoyaltiesResponse - default can simply be true if royalties are implemented at token level (i.e. always check on sale)", + "type": "object", + "required": [ + "CheckRoyalties" + ], + "properties": { + "CheckRoyalties": { + "type": "object" + } + }, + "additionalProperties": false + } + ] + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/query_msg.json b/cosmwasm-contracts/nft-marketplace/schema/query_msg.json new file mode 100644 index 0000000000..45c8fcf7c2 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/query_msg.json @@ -0,0 +1,42 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "QueryMsg", + "oneOf": [ + { + "type": "object", + "required": [ + "config" + ], + "properties": { + "config": { + "type": "object" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "nft_info" + ], + "properties": { + "nft_info": { + "type": "object", + "required": [ + "nft_contract_addr", + "nft_token_id" + ], + "properties": { + "nft_contract_addr": { + "type": "string" + }, + "nft_token_id": { + "type": "string" + } + } + } + }, + "additionalProperties": false + } + ] +} diff --git a/cosmwasm-contracts/nft-marketplace/schema/royalties_info_response.json b/cosmwasm-contracts/nft-marketplace/schema/royalties_info_response.json new file mode 100644 index 0000000000..fc2c7bd93d --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/schema/royalties_info_response.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "RoyaltiesInfoResponse", + "type": "object", + "required": [ + "address", + "royalty_amount" + ], + "properties": { + "address": { + "type": "string" + }, + "royalty_amount": { + "$ref": "#/definitions/Uint128" + } + }, + "definitions": { + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/nft-marketplace/src/contract.rs b/cosmwasm-contracts/nft-marketplace/src/contract.rs new file mode 100644 index 0000000000..4c43178ca3 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/src/contract.rs @@ -0,0 +1,914 @@ +use crate::state::{Config, NFTInfo, CONFIG, NFT_LIST}; + +use crate::vault::{ + ConfigResponse, Cw2981QueryMsg, Cw721HookMsg, ExecuteMsg, InstantiateMsg, NftQueryMsg, + QueryMsg, RoyaltiesInfoResponse, +}; +#[cfg(not(feature = "library"))] +use cosmwasm_std::entry_point; +use cosmwasm_std::{ + attr, from_binary, to_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, DepsMut, Env, + MessageInfo, QueryRequest, Response, StdError, StdResult, Uint128, WasmMsg, WasmQuery, +}; +use cw721::{Cw721ExecuteMsg, Cw721ReceiveMsg}; + +//Initialize the contract. +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> StdResult { + let config = Config { + owner: info.sender, + fee_bp: msg.fee_bp, + }; + + CONFIG.save(deps.storage, &config)?; + + Ok(Response::new()) +} + +//Execute the handle messages. +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> StdResult { + match msg { + ExecuteMsg::UpdateConfig { owner, fee_bp } => { + execute_update_config(deps, env, info, owner, fee_bp) + } + ExecuteMsg::ReceiveNft(msg) => receive_cw721(deps, env, info, msg), + ExecuteMsg::Withdraw { + nft_contract_addr, + nft_token_id, + } => execute_withdraw(deps, env, info, nft_contract_addr, nft_token_id), + ExecuteMsg::UpdatePrice { + nft_contract_addr, + nft_token_id, + denom, + amount, + } => execute_update_price( + deps, + env, + info, + nft_contract_addr, + nft_token_id, + denom, + amount, + ), + ExecuteMsg::Buy { + nft_contract_addr, + nft_token_id, + } => execute_buy(deps, env, info, nft_contract_addr, nft_token_id), + ExecuteMsg::WithdrawFee {} => execute_withdraw_fee(deps, env, info), + } +} + +pub fn receive_cw721( + deps: DepsMut, + env: Env, + info: MessageInfo, + cw721_msg: Cw721ReceiveMsg, +) -> StdResult { + let nft_contract_addr = info.sender; + + match from_binary(&cw721_msg.msg)? { + Cw721HookMsg::Deposit { denom, amount } => execute_deposit( + deps, + env, + Addr::unchecked(cw721_msg.sender), + nft_contract_addr, + cw721_msg.token_id, + denom, + amount, + ), + } +} + +// Only owner can execute it. +pub fn execute_update_config( + deps: DepsMut, + _env: Env, + info: MessageInfo, + owner: Option, + fee_bp: Option, +) -> StdResult { + let mut config: Config = CONFIG.load(deps.storage)?; + let mut attributes = vec![attr("action", "update_config")]; + + // permission check + if info.sender != config.owner { + return Err(StdError::generic_err("unauthorized")); + } + + if let Some(owner) = owner { + config.owner = deps.api.addr_validate(&owner)?; + attributes.push(attr("new_owner", owner.as_str())) + } + + if let Some(fee_bp) = fee_bp { + config.fee_bp = fee_bp; + attributes.push(attr("new_fee_bp", fee_bp)) + } + + CONFIG.save(deps.storage, &config)?; + + Ok(Response::new().add_attributes(attributes)) +} + +pub fn execute_deposit( + deps: DepsMut, + _env: Env, + sender: Addr, + nft_contract_addr: Addr, + nft_token_id: String, + denom: String, + amount: Uint128, +) -> StdResult { + let key = query_nft_info_key(nft_contract_addr.to_string(), nft_token_id.to_string()); + + if None != NFT_LIST.may_load(deps.storage, key.to_string())? { + return Err(StdError::generic_err("NFT already listed!")); + } + + NFT_LIST.save( + deps.storage, + key, + &NFTInfo { + owner: sender.to_string(), + denom, + amount, + }, + )?; + + Ok( + Response::new() + .add_attributes(vec![("action", "deposit"), ("sender", &sender.to_string())]), + ) +} + +pub fn execute_withdraw( + deps: DepsMut, + _env: Env, + info: MessageInfo, + nft_contract_addr: String, + nft_token_id: String, +) -> StdResult { + let mut messages: Vec = vec![]; + + let key = query_nft_info_key(nft_contract_addr.to_string(), nft_token_id.to_string()); + if let Some(nft_info) = NFT_LIST.may_load(deps.storage, key.to_string())? { + if nft_info.owner != info.sender { + return Err(StdError::generic_err("This NFT is not owned to the user!")); + } + + NFT_LIST.remove(deps.storage, key); + + messages.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: nft_contract_addr, + msg: to_binary(&Cw721ExecuteMsg::TransferNft { + recipient: info.sender.to_string(), + token_id: nft_token_id, + })?, + funds: vec![], + })); + } else { + return Err(StdError::generic_err("NFT is not listed!")); + } + + Ok(Response::new() + .add_messages(messages) + .add_attribute("action", "withdraw")) +} + +pub fn execute_update_price( + deps: DepsMut, + _env: Env, + info: MessageInfo, + nft_contract_addr: String, + nft_token_id: String, + denom: String, + amount: Uint128, +) -> StdResult { + let key = query_nft_info_key(nft_contract_addr, nft_token_id); + if let Some(nft_info) = NFT_LIST.may_load(deps.storage, key.to_string())? { + if nft_info.owner != info.sender.to_string() { + return Err(StdError::generic_err("This NFT is not owned to the user!")); + } + + NFT_LIST.save( + deps.storage, + key, + &NFTInfo { + owner: nft_info.owner, + denom, + amount, + }, + )?; + } else { + return Err(StdError::generic_err("NFT is not listed!")); + } + + Ok(Response::new().add_attribute("action", "update_price")) +} + +pub fn execute_buy( + deps: DepsMut, + _env: Env, + info: MessageInfo, + nft_contract_addr: String, + nft_token_id: String, +) -> StdResult { + let mut messages: Vec = vec![]; + let config: Config = CONFIG.load(deps.storage)?; + + let key = query_nft_info_key(nft_contract_addr.to_string(), nft_token_id.to_string()); + if let Some(nft_info) = NFT_LIST.may_load(deps.storage, key.to_string())? { + let mut fund = info.funds[0].clone(); + if nft_info.denom != fund.denom || nft_info.amount != fund.amount { + return Err(StdError::generic_err( + "The payment is not matched with the selling price!", + )); + } + + messages.push(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: nft_contract_addr.clone(), + msg: to_binary(&Cw721ExecuteMsg::TransferNft { + recipient: info.sender.to_string(), + token_id: nft_token_id.clone(), + })?, + funds: vec![], + })); + + let fee_amount = fund + .amount + .checked_mul(config.fee_bp)? + .checked_div(Uint128::from(10000u128))?; + fund.amount = fund.amount.checked_sub(fee_amount)?; + + // check royalty + if let Ok(royalty_info) = query_royalties_info( + deps.as_ref(), + nft_contract_addr, + nft_token_id, + nft_info.amount, + ) { + fund.amount = fund.amount.checked_sub(royalty_info.royalty_amount)?; + + messages.push(CosmosMsg::Bank(BankMsg::Send { + to_address: royalty_info.address, + amount: vec![Coin { + amount: royalty_info.royalty_amount, + denom: fund.denom.clone(), + }], + })); + } + + messages.push(CosmosMsg::Bank(BankMsg::Send { + to_address: nft_info.owner.to_string(), + amount: vec![fund], + })); + + NFT_LIST.remove(deps.storage, key); + } else { + return Err(StdError::generic_err("NFT is not listed!")); + } + + Ok(Response::new() + .add_messages(messages) + .add_attribute("action", "buy")) +} + +// Only owner can execute it. +pub fn execute_withdraw_fee(deps: DepsMut, env: Env, info: MessageInfo) -> StdResult { + let config: Config = CONFIG.load(deps.storage)?; + // permission check + if info.sender != config.owner { + return Err(StdError::generic_err("unauthorized")); + } + + let coins = deps.querier.query_all_balances(env.contract.address)?; + + Ok(Response::new() + .add_message(CosmosMsg::Bank(BankMsg::Send { + to_address: info.sender.to_string(), + amount: coins, + })) + .add_attributes(vec![attr("action", "withdraw_fee")])) +} + +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Config {} => to_binary(&query_config(deps)?), + QueryMsg::NftInfo { + nft_contract_addr, + nft_token_id, + } => to_binary(&query_nft_info(deps, nft_contract_addr, nft_token_id)?), + } +} + +pub fn query_config(deps: Deps) -> StdResult { + let config = CONFIG.load(deps.storage)?; + + Ok(ConfigResponse { + owner: config.owner.to_string(), + fee_bp: config.fee_bp, + }) +} + +pub fn query_nft_info( + deps: Deps, + nft_contract_addr: String, + nft_token_id: String, +) -> StdResult> { + Ok(NFT_LIST.may_load( + deps.storage, + query_nft_info_key(nft_contract_addr, nft_token_id), + )?) +} + +pub fn query_nft_info_key(nft_contract_addr: String, nft_token_id: String) -> String { + nft_contract_addr.to_string() + &nft_token_id +} + +pub fn query_royalties_info( + deps: Deps, + contract_addr: String, + token_id: String, + sale_price: Uint128, +) -> StdResult { + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr, + msg: to_binary(&NftQueryMsg::Extension { + msg: Cw2981QueryMsg::RoyaltyInfo { + token_id, + sale_price, + }, + })?, + })) +} + +#[cfg(test)] +mod tests { + use crate::{contract::query_nft_info, state::NFTInfo}; + + use super::{ + execute, instantiate, query_config, Cw721ExecuteMsg, Cw721ReceiveMsg, ExecuteMsg, + InstantiateMsg, + }; + use crate::vault::Cw721HookMsg; + use cosmwasm_std::{ + testing::{mock_dependencies, mock_dependencies_with_balance, mock_env, mock_info}, + to_binary, BankMsg, Coin, CosmosMsg, Uint128, WasmMsg, + }; + + fn mock_instantiate_msg(fee_bp: Uint128) -> InstantiateMsg { + InstantiateMsg { fee_bp: fee_bp } + } + + #[test] + fn test_instantiate() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + // check config + let config = query_config(deps.as_ref()).unwrap(); + assert_eq!(config.owner, owner_address); + assert_eq!(config.fee_bp, Uint128::new(100)); + } + + #[test] + fn test_update_config() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let user_info = mock_info(&user_address, &[]); + + // 1. only owner can update config + let err = execute( + deps.as_mut(), + mock_env(), + user_info.clone(), + ExecuteMsg::UpdateConfig { + owner: None, + fee_bp: Some(Uint128::new(200)), // 2% + }, + ) + .unwrap_err(); + assert_eq!(err.to_string(), "Generic error: unauthorized"); + + // 2. owner field can be none and it will only update fee_bp + execute( + deps.as_mut(), + mock_env(), + owner_info.clone(), + ExecuteMsg::UpdateConfig { + owner: None, + fee_bp: Some(Uint128::new(200)), // 2% + }, + ) + .unwrap(); + let config = query_config(deps.as_ref()).unwrap(); + assert_eq!(config.owner, owner_address); + assert_eq!(config.fee_bp, Uint128::new(200)); + + // 3. owner can transfer ownership + execute( + deps.as_mut(), + mock_env(), + owner_info.clone(), + ExecuteMsg::UpdateConfig { + owner: Some(user_address.clone()), + fee_bp: Some(Uint128::new(200)), // 2% + }, + ) + .unwrap(); + let config = query_config(deps.as_ref()).unwrap(); + assert_eq!(config.owner, user_address); + assert_eq!(config.fee_bp, Uint128::new(200)); + } + + #[test] + fn test_nft_list() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let contract_address = "contract-addr".to_string(); + let token_id = "1".to_string(); + let denom = "utori".to_string(); + let amount = Uint128::new(100000000); // 100 TORI + + execute( + deps.as_mut(), + mock_env(), + mock_info(&contract_address, &[]), + ExecuteMsg::ReceiveNft(Cw721ReceiveMsg { + sender: user_address.clone(), + token_id: token_id.clone(), + msg: to_binary(&Cw721HookMsg::Deposit { + denom: denom.clone(), + amount, + }) + .unwrap(), + }), + ) + .unwrap(); + + let nft_info = query_nft_info(deps.as_ref(), contract_address, token_id).unwrap(); + assert_eq!( + nft_info, + Some(NFTInfo { + owner: user_address, + denom, + amount, + }) + ); + } + + #[test] + fn test_nft_withdraw() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let contract_address = "contract-addr".to_string(); + let token_id = "1".to_string(); + let denom = "utori".to_string(); + let amount = Uint128::new(100000000); // 100 TORI + + execute( + deps.as_mut(), + mock_env(), + mock_info(&contract_address, &[]), + ExecuteMsg::ReceiveNft(Cw721ReceiveMsg { + sender: user_address.clone(), + token_id: token_id.clone(), + msg: to_binary(&Cw721HookMsg::Deposit { + denom: denom.clone(), + amount, + }) + .unwrap(), + }), + ) + .unwrap(); + + // 1. only nft owner can withdraw + let err = execute( + deps.as_mut(), + mock_env(), + mock_info(&owner_address, &[]), + ExecuteMsg::Withdraw { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap_err(); + assert_eq!( + err.to_string(), + "Generic error: This NFT is not owned to the user!" + ); + + // 2. withdarw nft and it will be unlisted from marketplace + execute( + deps.as_mut(), + mock_env(), + mock_info(&user_address, &[]), + ExecuteMsg::Withdraw { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap(); + + let nft_info = query_nft_info(deps.as_ref(), contract_address, token_id).unwrap(); + assert_eq!(nft_info, None); + } + + #[test] + fn test_update_price() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let contract_address = "contract-addr".to_string(); + let token_id = "1".to_string(); + let denom = "utori".to_string(); + let amount = Uint128::new(100000000); // 100 TORI + + execute( + deps.as_mut(), + mock_env(), + mock_info(&contract_address, &[]), + ExecuteMsg::ReceiveNft(Cw721ReceiveMsg { + sender: user_address.clone(), + token_id: token_id.clone(), + msg: to_binary(&Cw721HookMsg::Deposit { + denom: denom.clone(), + amount, + }) + .unwrap(), + }), + ) + .unwrap(); + + let new_denom = "new-denom".to_string(); + let new_amount = Uint128::new(1000000000); // 1000 + + // 1. only nft owner can update price + let err = execute( + deps.as_mut(), + mock_env(), + mock_info(&owner_address, &[]), + ExecuteMsg::UpdatePrice { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + denom: new_denom.clone(), + amount: new_amount, + }, + ) + .unwrap_err(); + assert_eq!( + err.to_string(), + "Generic error: This NFT is not owned to the user!" + ); + + // 2. withdarw nft and it will be unlisted from marketplace + execute( + deps.as_mut(), + mock_env(), + mock_info(&user_address, &[]), + ExecuteMsg::UpdatePrice { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + denom: new_denom.clone(), + amount: new_amount, + }, + ) + .unwrap(); + + let nft_info = query_nft_info(deps.as_ref(), contract_address, token_id).unwrap(); + assert_eq!( + nft_info, + Some(NFTInfo { + owner: user_address, + denom: new_denom, + amount: new_amount, + }) + ); + } + + #[test] + fn test_nft_buy() { + let mut deps = mock_dependencies(); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let contract_address = "contract-addr".to_string(); + let token_id = "1".to_string(); + let denom = "utori".to_string(); + let amount = Uint128::new(100000000); // 100 TORI + + execute( + deps.as_mut(), + mock_env(), + mock_info(&contract_address, &[]), + ExecuteMsg::ReceiveNft(Cw721ReceiveMsg { + sender: user_address.clone(), + token_id: token_id.clone(), + msg: to_binary(&Cw721HookMsg::Deposit { + denom: denom.clone(), + amount, + }) + .unwrap(), + }), + ) + .unwrap(); + + let buyer_address = "buyer-addr".to_string(); + // 1. can buy only listed asset + let invalid_token_id = "2".to_string(); + let err = execute( + deps.as_mut(), + mock_env(), + mock_info(&buyer_address, &[]), + ExecuteMsg::Buy { + nft_contract_addr: contract_address.clone(), + nft_token_id: invalid_token_id.clone(), + }, + ) + .unwrap_err(); + assert_eq!(err.to_string(), "Generic error: NFT is not listed!"); + + // 2. check correct fund denom + let invalid_denom = "invalid-denom".to_string(); + let err = execute( + deps.as_mut(), + mock_env(), + mock_info( + &buyer_address, + &[{ + Coin { + denom: invalid_denom, + amount: Uint128::new(0), + } + }], + ), + ExecuteMsg::Buy { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap_err(); + assert_eq!( + err.to_string(), + "Generic error: The payment is not matched with the selling price!" + ); + + // 3. check correct fund amount + let err = execute( + deps.as_mut(), + mock_env(), + mock_info( + &buyer_address, + &[{ + Coin { + denom: denom.to_string(), + amount: Uint128::new(0), + } + }], + ), + ExecuteMsg::Buy { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap_err(); + assert_eq!( + err.to_string(), + "Generic error: The payment is not matched with the selling price!" + ); + + // 4. can buy nft & it's unlsited + let resp = execute( + deps.as_mut(), + mock_env(), + mock_info( + &buyer_address, + &[{ + Coin { + denom: denom.to_string(), + amount: amount, + } + }], + ), + ExecuteMsg::Buy { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap(); + assert_eq!( + resp.messages[0].msg, + CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: contract_address.clone(), + msg: to_binary(&Cw721ExecuteMsg::TransferNft { + recipient: buyer_address.clone(), + token_id: token_id.clone(), + }) + .unwrap(), + funds: vec![], + }) + ); + assert_eq!( + resp.messages[1].msg, + CosmosMsg::Bank(BankMsg::Send { + to_address: user_address, + amount: vec![{ + Coin { + amount: Uint128::new(100000000) * Uint128::new(99) / Uint128::new(100), // fee is removed + denom: denom.clone(), + } + }], + }) + ); + + let nft_info = query_nft_info(deps.as_ref(), contract_address, token_id).unwrap(); + assert_eq!(nft_info, None); + } + + #[test] + fn test_withdraw_fee() { + let denom = "utori".to_string(); + let amount = Uint128::new(100000000); // 100 TORI + let mut deps = mock_dependencies_with_balance(&[Coin { + denom: denom.clone(), + amount: amount / Uint128::new(100), + }]); + + // create owner + let owner_address = "owner-addr".to_string(); + let owner_info = mock_info(&owner_address, &[]); + + // instantiate minter + let init_msg = mock_instantiate_msg(Uint128::new(100)); // 1% fee_bp + instantiate( + deps.as_mut(), + mock_env(), + owner_info.clone(), + init_msg.clone(), + ) + .unwrap(); + + let user_address = "user-addr".to_string(); + let contract_address = "contract-addr".to_string(); + let token_id = "1".to_string(); + + execute( + deps.as_mut(), + mock_env(), + mock_info(&contract_address, &[]), + ExecuteMsg::ReceiveNft(Cw721ReceiveMsg { + sender: user_address.clone(), + token_id: token_id.clone(), + msg: to_binary(&Cw721HookMsg::Deposit { + denom: denom.clone(), + amount, + }) + .unwrap(), + }), + ) + .unwrap(); + + let buyer_address = "buyer-addr".to_string(); + execute( + deps.as_mut(), + mock_env(), + mock_info( + &buyer_address, + &[{ + Coin { + denom: denom.to_string(), + amount: amount, + } + }], + ), + ExecuteMsg::Buy { + nft_contract_addr: contract_address.clone(), + nft_token_id: token_id.clone(), + }, + ) + .unwrap(); + + // 1. only owner can update config + let err = execute( + deps.as_mut(), + mock_env(), + mock_info(&user_address, &[]), + ExecuteMsg::WithdrawFee {}, + ) + .unwrap_err(); + assert_eq!(err.to_string(), "Generic error: unauthorized"); + + // 2. can withdraw fees from contract + let resp = execute( + deps.as_mut(), + mock_env(), + mock_info(&owner_address, &[]), + ExecuteMsg::WithdrawFee {}, + ) + .unwrap(); + assert_eq!( + resp.messages[0].msg, + CosmosMsg::Bank(BankMsg::Send { + to_address: owner_address, + amount: vec![{ + Coin { + amount: Uint128::new(100000000) / Uint128::new(100), // fee is removed + denom: denom.clone(), + } + }], + }) + ); + } +} diff --git a/cosmwasm-contracts/nft-marketplace/src/lib.rs b/cosmwasm-contracts/nft-marketplace/src/lib.rs new file mode 100644 index 0000000000..4e7b0cd947 --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contract; +pub mod state; +pub mod vault; diff --git a/cosmwasm-contracts/nft-marketplace/src/state.rs b/cosmwasm-contracts/nft-marketplace/src/state.rs new file mode 100644 index 0000000000..4261ff65ac --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/src/state.rs @@ -0,0 +1,24 @@ +use cosmwasm_std::{Addr, Uint128}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use cw_storage_plus::{Item, Map}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct Config { + pub owner: Addr, + pub fee_bp: Uint128, // based on 10000 +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct NFTInfo { + pub owner: String, + pub denom: String, + pub amount: Uint128, +} + +// put the length bytes at the first for compatibility with legacy singleton store +pub const CONFIG: Item = Item::new("config"); + +// nft_contract_addr + nft_token_id => nft list info +pub const NFT_LIST: Map = Map::new("nft_list"); diff --git a/cosmwasm-contracts/nft-marketplace/src/vault.rs b/cosmwasm-contracts/nft-marketplace/src/vault.rs new file mode 100644 index 0000000000..16edc48bdf --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/src/vault.rs @@ -0,0 +1,89 @@ +use cosmwasm_std::Uint128; +use cw721::Cw721ReceiveMsg; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct InstantiateMsg { + pub fee_bp: Uint128, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + UpdateConfig { + owner: Option, + fee_bp: Option, + }, + ReceiveNft(Cw721ReceiveMsg), + Withdraw { + nft_contract_addr: String, + nft_token_id: String, + }, + UpdatePrice { + nft_contract_addr: String, + nft_token_id: String, + denom: String, + amount: Uint128, + }, + Buy { + nft_contract_addr: String, + nft_token_id: String, + }, + WithdrawFee {}, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum Cw721HookMsg { + Deposit { denom: String, amount: Uint128 }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg { + Config {}, + NftInfo { + nft_contract_addr: String, + nft_token_id: String, + }, +} + +// We define a custom struct for each query response +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct ConfigResponse { + pub owner: String, + pub fee_bp: Uint128, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct RoyaltiesInfoResponse { + pub address: String, + // Note that this must be the same denom as that passed in to RoyaltyInfo + // rounding up or down is at the discretion of the implementer + pub royalty_amount: Uint128, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub enum Cw2981QueryMsg { + /// Should be called on sale to see if royalties are owed + /// by the marketplace selling the NFT, if CheckRoyalties + /// returns true + /// See https://eips.ethereum.org/EIPS/eip-2981 + RoyaltyInfo { + token_id: String, + // the denom of this sale must also be the denom returned by RoyaltiesInfoResponse + // this was originally implemented as a Coin + // however that would mean you couldn't buy using CW20s + // as CW20 is just mapping of addr -> balance + sale_price: Uint128, + }, + /// Called against contract to determine if this NFT + /// implements royalties. Should return a boolean as part of + /// CheckRoyaltiesResponse - default can simply be true + /// if royalties are implemented at token level + /// (i.e. always check on sale) + CheckRoyalties {}, +} + +pub type NftQueryMsg = cw721_base::QueryMsg; diff --git a/packages/components/nftDetails/components/NFTSellInfo.tsx b/packages/components/nftDetails/components/NFTSellInfo.tsx index 768447e91c..ab88237b0d 100644 --- a/packages/components/nftDetails/components/NFTSellInfo.tsx +++ b/packages/components/nftDetails/components/NFTSellInfo.tsx @@ -1,7 +1,7 @@ import { Decimal } from "@cosmjs/math"; import { useQuery } from "@tanstack/react-query"; -import { TeritoriNftVaultQueryClient } from "../../../contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceQueryClient } from "../../../contracts-clients/nft-marketplace/NftMarketplace.client"; import { getNativeCurrency, getNetwork, @@ -78,7 +78,7 @@ const useVaultConfig = (networkId: string | undefined) => { } const cosmwasmClient = await mustGetNonSigningCosmWasmClient(network.id); - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); diff --git a/packages/contracts-clients/teritori-nft-vault/TeritoriNftVault.client.ts b/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts similarity index 93% rename from packages/contracts-clients/teritori-nft-vault/TeritoriNftVault.client.ts rename to packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts index 52b82eba5e..2fd67b2785 100644 --- a/packages/contracts-clients/teritori-nft-vault/TeritoriNftVault.client.ts +++ b/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts @@ -6,8 +6,8 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { Coin, StdFee } from "@cosmjs/amino"; -import { Uint128, AllNftsInVaultResponse, NFTInfo, ConfigResponse, ExecuteMsg, Binary, Cw721ReceiveMsg, InstantiateMsg, NftInfoResponse, NftListResponse, NftOwnerInfoResponse, NftQueryMsg, Cw2981QueryMsg, QueryMsg, RoyaltiesInfoResponse } from "./TeritoriNftVault.types"; -export interface TeritoriNftVaultReadOnlyInterface { +import { Uint128, AllNftsInVaultResponse, NFTInfo, ConfigResponse, ExecuteMsg, Binary, Cw721ReceiveMsg, InstantiateMsg, NftInfoResponse, NftListResponse, NftOwnerInfoResponse, NftQueryMsg, Cw2981QueryMsg, QueryMsg, RoyaltiesInfoResponse } from "./NftMarketplace.types"; +export interface NftMarketplaceReadOnlyInterface { contractAddress: string; config: () => Promise; nftInfo: ({ @@ -18,7 +18,7 @@ export interface TeritoriNftVaultReadOnlyInterface { nftTokenId: string; }) => Promise; } -export class TeritoriNftVaultQueryClient implements TeritoriNftVaultReadOnlyInterface { +export class NftMarketplaceQueryClient implements NftMarketplaceReadOnlyInterface { client: CosmWasmClient; contractAddress: string; @@ -49,7 +49,7 @@ export class TeritoriNftVaultQueryClient implements TeritoriNftVaultReadOnlyInte }); }; } -export interface TeritoriNftVaultInterface extends TeritoriNftVaultReadOnlyInterface { +export interface NftMarketplaceInterface extends NftMarketplaceReadOnlyInterface { contractAddress: string; sender: string; updateConfig: ({ @@ -95,7 +95,7 @@ export interface TeritoriNftVaultInterface extends TeritoriNftVaultReadOnlyInter }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; withdrawFee: (fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; } -export class TeritoriNftVaultClient extends TeritoriNftVaultQueryClient implements TeritoriNftVaultInterface { +export class NftMarketplaceClient extends NftMarketplaceQueryClient implements NftMarketplaceInterface { client: SigningCosmWasmClient; sender: string; contractAddress: string; diff --git a/packages/contracts-clients/teritori-nft-vault/TeritoriNftVault.types.ts b/packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts similarity index 100% rename from packages/contracts-clients/teritori-nft-vault/TeritoriNftVault.types.ts rename to packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts diff --git a/packages/contracts-clients/nft-marketplace/index.ts b/packages/contracts-clients/nft-marketplace/index.ts new file mode 100644 index 0000000000..107d66df4a --- /dev/null +++ b/packages/contracts-clients/nft-marketplace/index.ts @@ -0,0 +1,2 @@ +export * from "./NftMarketplace.client"; +export * from "./NftMarketplace.types"; \ No newline at end of file diff --git a/packages/hooks/useCancelNFTListing.ts b/packages/hooks/useCancelNFTListing.ts index d6af19d416..c68fb12a16 100644 --- a/packages/hooks/useCancelNFTListing.ts +++ b/packages/hooks/useCancelNFTListing.ts @@ -2,7 +2,7 @@ import { useCallback } from "react"; import useSelectedWallet from "./useSelectedWallet"; -import { TeritoriNftVaultClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { NFTVault__factory } from "@/evm-contracts-clients/teritori-nft-vault/NFTVault__factory"; import { getKeplrSigningCosmWasmClient, @@ -24,7 +24,7 @@ const teritoriCancelNFTListing = async ( throw new Error("network not supported"); } const cosmwasmClient = await getKeplrSigningCosmWasmClient(networkId); - const vaultClient = new TeritoriNftVaultClient( + const vaultClient = new NftMarketplaceClient( cosmwasmClient, sender, network.vaultContractAddress, diff --git a/packages/hooks/useNFTInfo.ts b/packages/hooks/useNFTInfo.ts index ab05936a34..4233b0f287 100644 --- a/packages/hooks/useNFTInfo.ts +++ b/packages/hooks/useNFTInfo.ts @@ -5,11 +5,11 @@ import { useBreedingConfig } from "./useBreedingConfig"; import { ConfigResponse as BreedingConfigResponse } from "../contracts-clients/teritori-breeding/TeritoriBreeding.types"; import { Metadata as Cw721MembershipMetadata } from "@/contracts-clients/cw721-membership"; +import { NftMarketplaceQueryClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { TeritoriBreedingQueryClient } from "@/contracts-clients/teritori-breeding/TeritoriBreeding.client"; import { TeritoriBunkerMinterQueryClient } from "@/contracts-clients/teritori-bunker-minter/TeritoriBunkerMinter.client"; import { TeritoriNameServiceQueryClient } from "@/contracts-clients/teritori-name-service/TeritoriNameService.client"; import { TeritoriNftQueryClient } from "@/contracts-clients/teritori-nft/TeritoriNft.client"; -import { TeritoriNftVaultQueryClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; import { TeritoriMinter__factory } from "@/evm-contracts-clients/teritori-bunker-minter/TeritoriMinter__factory"; import { TeritoriNft__factory } from "@/evm-contracts-clients/teritori-nft/TeritoriNft__factory"; import { NFTVault__factory } from "@/evm-contracts-clients/teritori-nft-vault/NFTVault__factory"; @@ -130,7 +130,7 @@ const getTNSNFTInfo = async ( // ======== Getting NFT owner const { owner } = await tnsClient.ownerOf({ tokenId }); // ======== Getting vault stuff (For selling) - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); @@ -362,7 +362,7 @@ const getTeritoriBunkerNFTInfo = async ( // ======== Getting NFT metadata // ======== Getting vault stuff (For selling) - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); @@ -472,7 +472,7 @@ const getTeritoriRiotBreedingNFTInfo = async ( // ======== Getting NFT metadata // ======== Getting vault stuff (For selling) - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); @@ -600,7 +600,7 @@ const getNFTVaultInfo = async ( throw new Error("network not supported"); } const cosmwasmClient = await mustGetNonSigningCosmWasmClient(network.id); - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); diff --git a/packages/hooks/useVaultNFTInfo.ts b/packages/hooks/useVaultNFTInfo.ts index 21af2a7fe7..7eecf9dea8 100644 --- a/packages/hooks/useVaultNFTInfo.ts +++ b/packages/hooks/useVaultNFTInfo.ts @@ -1,6 +1,6 @@ import { useQuery } from "@tanstack/react-query"; -import { TeritoriNftVaultQueryClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceQueryClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { getCosmosNetwork, mustGetNonSigningCosmWasmClient, @@ -28,7 +28,7 @@ export const useVaultNFTInfo = (nftId: string | undefined) => { console.log("network nft info", network); const client = await mustGetNonSigningCosmWasmClient(network.id); - const vaultClient = new TeritoriNftVaultQueryClient( + const vaultClient = new NftMarketplaceQueryClient( client, network?.vaultContractAddress, ); diff --git a/packages/hooks/vault/useVaultConfig.ts b/packages/hooks/vault/useVaultConfig.ts index 342dc4685c..726478823d 100644 --- a/packages/hooks/vault/useVaultConfig.ts +++ b/packages/hooks/vault/useVaultConfig.ts @@ -1,6 +1,6 @@ import { useQuery } from "@tanstack/react-query"; -import { TeritoriNftVaultQueryClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceQueryClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { getCosmosNetwork, mustGetNonSigningCosmWasmClient } from "@/networks"; export const useVaultConfig = (networkId: string) => { @@ -12,7 +12,7 @@ export const useVaultConfig = (networkId: string) => { return undefined; } const cosmwasmClient = await mustGetNonSigningCosmWasmClient(networkId); - const client = new TeritoriNftVaultQueryClient( + const client = new NftMarketplaceQueryClient( cosmwasmClient, network.vaultContractAddress, ); diff --git a/packages/screens/CoreDAO/CoreDAOScreen.tsx b/packages/screens/CoreDAO/CoreDAOScreen.tsx index 9874854910..4a934c5b35 100644 --- a/packages/screens/CoreDAO/CoreDAOScreen.tsx +++ b/packages/screens/CoreDAO/CoreDAOScreen.tsx @@ -12,8 +12,8 @@ import { ScreenContainer } from "@/components/ScreenContainer"; import { PrimaryButton } from "@/components/buttons/PrimaryButton"; import { SpacerColumn } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; +import { NftMarketplaceClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { TeritoriNameServiceQueryClient } from "@/contracts-clients/teritori-name-service/TeritoriNameService.client"; -import { TeritoriNftVaultClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; import { useDAOMakeProposal } from "@/hooks/dao/useDAOMakeProposal"; import { useFeedConfig } from "@/hooks/feed/useFeedConfig"; import { useBalances } from "@/hooks/useBalances"; @@ -177,7 +177,7 @@ const VaultManager: React.FC<{ networkId: string }> = ({ networkId }) => { const cosmWasmClient = await getKeplrSigningCosmWasmClient( selectedWallet.networkId, ); - const vaultClient = new TeritoriNftVaultClient( + const vaultClient = new NftMarketplaceClient( cosmWasmClient, selectedWallet.address, network.vaultContractAddress, diff --git a/packages/screens/Marketplace/NFTDetailScreen.tsx b/packages/screens/Marketplace/NFTDetailScreen.tsx index 173a5023a5..c81ad5734b 100644 --- a/packages/screens/Marketplace/NFTDetailScreen.tsx +++ b/packages/screens/Marketplace/NFTDetailScreen.tsx @@ -11,7 +11,7 @@ import { SpacerColumn } from "@/components/spacer"; import { Tabs } from "@/components/tabs/Tabs"; import { initialToastError, useFeedbacks } from "@/context/FeedbacksProvider"; import { Wallet } from "@/context/WalletsProvider"; -import { TeritoriNftVaultClient } from "@/contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { NFTVault__factory } from "@/evm-contracts-clients/teritori-nft-vault/NFTVault__factory"; import { useMintEnded } from "@/hooks/collection/useMintEnded"; import { useCancelNFTListing } from "@/hooks/useCancelNFTListing"; @@ -163,7 +163,7 @@ const Content: React.FC<{ if (!cosmosNetwork.vaultContractAddress) { throw new Error("network not supported"); } - const vaultClient = new TeritoriNftVaultClient( + const vaultClient = new NftMarketplaceClient( client, sender, cosmosNetwork.vaultContractAddress, @@ -295,7 +295,7 @@ const teritoriBuy = async (wallet: Wallet, info: NFTInfo) => { throw new Error("network not supported"); } const signingCosmwasmClient = await getKeplrSigningCosmWasmClient(network.id); - const signingVaultClient = new TeritoriNftVaultClient( + const signingVaultClient = new NftMarketplaceClient( signingCosmwasmClient, wallet.address, network.vaultContractAddress, diff --git a/packages/scripts/network-setup/deployLib.ts b/packages/scripts/network-setup/deployLib.ts index 8eec9f1e62..e2a9bf0f46 100644 --- a/packages/scripts/network-setup/deployLib.ts +++ b/packages/scripts/network-setup/deployLib.ts @@ -5,6 +5,7 @@ import { bech32 } from "bech32"; import _, { cloneDeep } from "lodash"; import path from "path"; +import { InstantiateMsg as MarketplaceVaultInstantiateMsg } from "../../contracts-clients/nft-marketplace/NftMarketplace.types"; import { TeritoriNameServiceClient, TeritoriNameServiceQueryClient, @@ -14,7 +15,6 @@ import { ExecuteMsg as NameServiceExecuteMsg, InstantiateMsg as NameServiceInstantiateMsg, } from "../../contracts-clients/teritori-name-service/TeritoriNameService.types"; -import { InstantiateMsg as MarketplaceVaultInstantiateMsg } from "../../contracts-clients/teritori-nft-vault/TeritoriNftVault.types"; import { InstantiateMsg as SocialFeedInstantiateMsg } from "../../contracts-clients/teritori-social-feed/TeritoriSocialFeed.types"; import { CosmosNetworkInfo, diff --git a/packages/scripts/vaultInfo.ts b/packages/scripts/vaultInfo.ts index 61bc6451c5..9fc03420e4 100644 --- a/packages/scripts/vaultInfo.ts +++ b/packages/scripts/vaultInfo.ts @@ -1,4 +1,4 @@ -import { TeritoriNftVaultQueryClient } from "../contracts-clients/teritori-nft-vault/TeritoriNftVault.client"; +import { NftMarketplaceQueryClient } from "../contracts-clients/nft-marketplace/NftMarketplace.client"; import { mustGetNonSigningCosmWasmClient } from "../networks"; import { teritoriNetwork } from "../networks/teritori"; @@ -10,7 +10,7 @@ const main = async () => { console.log("contract address:", network.vaultContractAddress); - const client = new TeritoriNftVaultQueryClient( + const client = new NftMarketplaceQueryClient( await mustGetNonSigningCosmWasmClient(network.id), network.vaultContractAddress, ); From 1bcafbb7202f29fc2a7f875122a1706a2c0e4873 Mon Sep 17 00:00:00 2001 From: VishalRakholiya-iView <154412187+VishalRakholiya-iView@users.noreply.github.com> Date: Thu, 22 Feb 2024 20:52:46 +0530 Subject: [PATCH 12/17] feat: change input of name TNS register (#978) * feat: change input of name TNS register * feat: create common component for TNS and DAOSection * feat: common component for TNS and DAOSection * fix:remove comment * fix: common component UI --- .../components/inputs/AvailableNamesInput.tsx | 123 ++++++++++++++++++ .../TNSNameFinderModal.tsx | 14 +- .../components/CreateDAOSection.tsx | 98 +++----------- packages/utils/types/tns.ts | 1 + 4 files changed, 150 insertions(+), 86 deletions(-) create mode 100644 packages/components/inputs/AvailableNamesInput.tsx diff --git a/packages/components/inputs/AvailableNamesInput.tsx b/packages/components/inputs/AvailableNamesInput.tsx new file mode 100644 index 0000000000..98244051bd --- /dev/null +++ b/packages/components/inputs/AvailableNamesInput.tsx @@ -0,0 +1,123 @@ +import React from "react"; +import { Control, FieldValues, Path } from "react-hook-form"; +import { TextInputProps, View, ViewStyle } from "react-native"; + +import { TextInputCustom } from "./TextInputCustom"; +import { fontSemibold14 } from "../../utils/style/fonts"; +import { BrandText } from "../BrandText"; + +import { useNSAvailability } from "@/hooks/useNSAvailability"; +import { useSelectedNetworkInfo } from "@/hooks/useSelectedNetwork"; +import { NetworkKind, getCosmosNetwork } from "@/networks"; +import { + neutral33, + neutral77, + primaryColor, + redDefault, +} from "@/utils/style/colors"; +import { NameFinderFormType } from "@/utils/types/tns"; + +interface TextInputCustomProps + extends Omit { + name: Path; + nameValue: string; + label: string; + placeHolder: string; + value?: string; + onChangeText?: (value: string) => void; + onPressEnter?: () => void; + control?: Control; + style?: ViewStyle; +} + +export const AvailableNamesInput = ({ + nameValue, + label, + name, + placeHolder, + value, + onChangeText = () => {}, + onPressEnter = () => {}, + control, + style, +}: TextInputCustomProps) => { + const selectedNetwork = useSelectedNetworkInfo(); + const cosmosNetwork = getCosmosNetwork(selectedNetwork?.id); + const nameAvailability = useNSAvailability(selectedNetwork?.id, nameValue); + const price = + nameAvailability.availability === "mint" + ? nameAvailability.prettyPrice + : ""; + const usdPrice = + nameAvailability.availability === "mint" ? nameAvailability?.usdPrice : 0; + + let availabilityInfo = <>; + if (nameValue && selectedNetwork?.kind === NetworkKind.Cosmos) { + if (nameAvailability.availability === "invalid") { + availabilityInfo = ( + + Invalid + + ); + } else if (nameAvailability.availability === "mint") { + availabilityInfo = ( + + {!!usdPrice && ( + <> + + ${usdPrice?.toFixed(2)} + + + {" - "} + + + )} + + {price} + + + ); + } else if ( + nameAvailability.availability === "market" || + nameAvailability.availability === "none" + ) { + availabilityInfo = ( + + Taken + + ); + } + } + + return ( + + noBrokenCorners + isLoading={nameAvailability.availability === "loading"} + variant="labelOutside" + label={`${label}${ + nameValue + ? `: ${ + selectedNetwork?.kind === NetworkKind.Gno + ? "gno.land/r/demo/" + name + : nameValue + cosmosNetwork?.nameServiceTLD + }` + : "" + }`} + placeHolder={placeHolder} + name={name as "name" | "associatedHandle"} + onChangeText={(val: string) => onChangeText(val)} + onPressEnter={onPressEnter} + value={value} + rules={{ required: true }} + regexp={new RegExp(/^[a-zA-Z]+$/)} + style={style} + control={ + control + ? (control as unknown as Control) + : undefined + } + > + {availabilityInfo} + + ); +}; diff --git a/packages/components/modals/teritoriNameService/TNSNameFinderModal.tsx b/packages/components/modals/teritoriNameService/TNSNameFinderModal.tsx index b4ee13a381..6a3237ff78 100644 --- a/packages/components/modals/teritoriNameService/TNSNameFinderModal.tsx +++ b/packages/components/modals/teritoriNameService/TNSNameFinderModal.tsx @@ -8,12 +8,12 @@ import { neutral77, } from "../../../utils/style/colors"; import { fontSemibold14 } from "../../../utils/style/fonts"; -import { NameFinderFormType } from "../../../utils/types/tns"; import { BrandText } from "../../BrandText"; import { PrimaryButton } from "../../buttons/PrimaryButton"; -import { TextInputCustom } from "../../inputs/TextInputCustom"; import ModalBase from "../ModalBase"; +import { AvailableNamesInput } from "@/components/inputs/AvailableNamesInput"; + const AVAILABLE_DOMAINS = [".tori"]; const COMING_SOON_DOMAINS = [".rioter"]; @@ -124,14 +124,14 @@ export const TNSNameFinderModal: React.FC<{ childrenBottom={} width={372} > - - name="name" + setName(value)} style={{ marginBottom: 20, width: "100%" }} /> = ({ }); const selectedNetwork = useSelectedNetworkInfo(); - const cosmosNetwork = getCosmosNetwork(selectedNetwork?.id); const selectedRadioStructure = watch("structure"); const uri = watch("imageUrl"); const name = watch("associatedHandle"); + const nameAvailability = useNSAvailability(selectedNetwork?.id, name); useEffect(() => { setValue("nameAvailability", nameAvailability); }, [setValue, nameAvailability]); - let availabilityInfo = <>; - if (name && selectedNetwork?.kind === NetworkKind.Cosmos) { - switch (nameAvailability.availability) { - case "invalid": { - availabilityInfo = ( - - Invalid - - ); - break; - } - case "mint": { - availabilityInfo = ( - - {!!nameAvailability?.usdPrice && ( - <> - - ${nameAvailability.usdPrice?.toFixed(2)} - - - {" - "} - - - )} - - {nameAvailability.prettyPrice} - - - ); - break; - } - case "none": - case "market": { - // TODO: handle market case - availabilityInfo = ( - - Taken - - ); - break; - } - } - } - // functions const onErrorImageLoading = () => - setError("imageUrl", { - type: "pattern", - message: "This image is invalid", - }); + setError("imageUrl", { type: "pattern", message: "This image is invalid" }); return ( @@ -142,30 +87,25 @@ export const CreateDAOSection: React.FC = ({ - - noBrokenCorners - isLoading={nameAvailability.availability === "loading"} - variant="labelOutside" + { + setValue("associatedHandle", val, { + shouldDirty: true, + shouldTouch: true, + shouldValidate: true, + }); + }} + label="Associated Handle" + name="associatedHandle" control={control} - label={`Associated Handle${ - name - ? `: ${ - selectedNetwork?.kind === NetworkKind.Gno - ? "gno.land/r/demo/" + name - : name + cosmosNetwork?.nameServiceTLD - }` - : "" - }`} placeHolder={ selectedNetwork?.kind === NetworkKind.Gno ? "your_organization" : "your-organization" } - name="associatedHandle" - rules={{ required: true }} - > - {availabilityInfo} - + value={name} + /> diff --git a/packages/utils/types/tns.ts b/packages/utils/types/tns.ts index fdf0bc9139..3b4d94c1a4 100644 --- a/packages/utils/types/tns.ts +++ b/packages/utils/types/tns.ts @@ -27,6 +27,7 @@ export type TNSSendFundsFormType = { export type NameFinderFormType = { name: string; + associatedHandle: string; }; export type NSAvailability = From 344322c0b4b7b533d4053a7b575a22ed1c210bae Mon Sep 17 00:00:00 2001 From: n0izn0iz Date: Thu, 22 Feb 2024 20:36:09 +0100 Subject: [PATCH 13/17] fix: cw2981 support (#988) Signed-off-by: Norman Meier --- cosmwasm-contracts/nft-marketplace/.gitignore | 1 + cosmwasm-contracts/nft-marketplace/Cargo.lock | 200 +++++++++++++++++- cosmwasm-contracts/nft-marketplace/Cargo.toml | 1 + cosmwasm-contracts/nft-marketplace/Makefile | 30 +++ .../nft-marketplace/schema/nft_query_msg.json | 4 +- .../nft-marketplace/src/contract.rs | 66 ++++-- .../nft-marketplace/src/vault.rs | 4 +- .../nft-marketplace/NftMarketplace.client.ts | 2 +- .../nft-marketplace/NftMarketplace.types.ts | 4 +- 9 files changed, 289 insertions(+), 23 deletions(-) create mode 100644 cosmwasm-contracts/nft-marketplace/Makefile diff --git a/cosmwasm-contracts/nft-marketplace/.gitignore b/cosmwasm-contracts/nft-marketplace/.gitignore index dfdaaa6bcd..f9b9a838f9 100644 --- a/cosmwasm-contracts/nft-marketplace/.gitignore +++ b/cosmwasm-contracts/nft-marketplace/.gitignore @@ -1,5 +1,6 @@ # Build results /target +/artifacts # Cargo+Git helper file (https://github.com/rust-lang/cargo/blob/0.44.1/src/cargo/sources/git/utils.rs#L320-L327) .cargo-ok diff --git a/cosmwasm-contracts/nft-marketplace/Cargo.lock b/cosmwasm-contracts/nft-marketplace/Cargo.lock index 082d759199..098300105b 100644 --- a/cosmwasm-contracts/nft-marketplace/Cargo.lock +++ b/cosmwasm-contracts/nft-marketplace/Cargo.lock @@ -192,6 +192,41 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw-address-like" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451a4691083a88a3c0630a8a88799e9d4cd6679b7ce8ff22b8da2873ff31d380" +dependencies = [ + "cosmwasm-std", +] + +[[package]] +name = "cw-ownable" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093dfb4520c48b5848274dd88ea99e280a04bc08729603341c7fb0d758c74321" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-address-like", + "cw-ownable-derive", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "thiserror", +] + +[[package]] +name = "cw-ownable-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d3bf2e0f341bb6cc100d7d441d31cf713fbd3ce0c511f91e79f14b40a889af" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "cw-storage-plus" version = "0.13.4" @@ -214,6 +249,28 @@ dependencies = [ "serde", ] +[[package]] +name = "cw-storage-plus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b6f91c0b94481a3e9ef1ceb183c37d00764f8751e39b45fc09f4d9b970d469" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-storage-plus" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + [[package]] name = "cw-utils" version = "0.13.4" @@ -234,7 +291,37 @@ checksum = "0ae0b69fa7679de78825b4edeeec045066aa2b2c4b6e063d80042e565bb4da5c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", - "cw2", + "cw2 0.15.1", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a84c6c1c0acc3616398eba50783934bd6c964bad6974241eaee3460c8f5b26" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 0.16.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw-utils" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", "schemars", "semver", "serde", @@ -254,6 +341,50 @@ dependencies = [ "serde", ] +[[package]] +name = "cw2" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91398113b806f4d2a8d5f8d05684704a20ffd5968bf87e3473e1973710b884ad" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 1.2.0", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw2981-royalties" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985cdd5d304fb37ff16c2538f4d8f12a264af6526b967e066c6bb6972d60ab92" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.18.0", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw721" version = "0.13.4" @@ -279,6 +410,32 @@ dependencies = [ "serde", ] +[[package]] +name = "cw721" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a1ea6e6277bdd6dfc043a9b1380697fe29d6e24b072597439523658d21d791" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 0.16.0", + "schemars", + "serde", +] + +[[package]] +name = "cw721" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c4d286625ccadc957fe480dd3bdc54ada19e0e6b5b9325379db3130569e914" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils 1.0.3", + "schemars", + "serde", +] + [[package]] name = "cw721-base" version = "0.15.0" @@ -289,13 +446,49 @@ dependencies = [ "cosmwasm-std", "cw-storage-plus 0.15.1", "cw-utils 0.15.1", - "cw2", + "cw2 0.15.1", "cw721 0.15.0", "schemars", "serde", "thiserror", ] +[[package]] +name = "cw721-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77518e27431d43214cff4cdfbd788a7508f68d9b1f32389e6fce513e7eaccbef" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus 0.16.0", + "cw-utils 0.16.0", + "cw2 0.16.0", + "cw721 0.16.0", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw721-base" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da518d9f68bfda7d972cbaca2e8fcf04651d0edc3de72b04ae2bcd9289c81614" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ownable", + "cw-storage-plus 1.2.0", + "cw-utils 1.0.3", + "cw2 1.1.2", + "cw721 0.18.0", + "cw721-base 0.16.0", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "der" version = "0.7.8" @@ -498,8 +691,9 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 0.13.4", + "cw2981-royalties", "cw721 0.13.4", - "cw721-base", + "cw721-base 0.15.0", "schemars", "serde", ] diff --git a/cosmwasm-contracts/nft-marketplace/Cargo.toml b/cosmwasm-contracts/nft-marketplace/Cargo.toml index 7f3871069f..e5376cacfc 100644 --- a/cosmwasm-contracts/nft-marketplace/Cargo.toml +++ b/cosmwasm-contracts/nft-marketplace/Cargo.toml @@ -21,6 +21,7 @@ cosmwasm-std = { version = "1.0.0" } cw-storage-plus = { version = "0.13.4" } schemars = "0.8.10" serde = { version = "1.0.137", default-features = false, features = ["derive"] } +cw2981-royalties = "0.18.0" [dev-dependencies] cosmwasm-schema = { version = "1.1.0" } diff --git a/cosmwasm-contracts/nft-marketplace/Makefile b/cosmwasm-contracts/nft-marketplace/Makefile new file mode 100644 index 0000000000..0e6f79499a --- /dev/null +++ b/cosmwasm-contracts/nft-marketplace/Makefile @@ -0,0 +1,30 @@ +ADMIN=testnet-adm +ADMIN_ADDR=$(shell teritorid keys show $(ADMIN) --keyring-backend test --output json | jq -r .address) +NODE_FLAG=--node https://rpc.testnet.teritori.com:443 +TX_FLAGS=--from $(ADMIN) --chain-id teritori-test-6 $(NODE_FLAG) --gas auto --gas-adjustment 1.3 -y -b sync --output json --keyring-backend test -o json +QUERY_FLAGS=$(NODE_FLAG) -o json +CODE_ID=52 +CONFIG=$(shell cat config.json | jq --rawfile desc desc.txt -r '.admin_addr="$(ADMIN_ADDR)" | .description=$$desc | tojson | @sh') + +# only informative +CONTRACT_ADDRESS=tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0 + +.PHONY: artifacts/nft_marketplace.wasm +artifacts/nft_marketplace.wasm: + docker run --rm -v "$(PWD)":/code \ + --platform linux/amd64 \ + --mount type=volume,source=nft_marketplace_cache,target=/target \ + --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ + cosmwasm/rust-optimizer:0.14.0 + +.PHONY: deploy.testnet +deploy.testnet: artifacts/nft_marketplace.wasm + set -o pipefail; \ + TXHASH=$$(teritorid tx wasm store artifacts/nft_marketplace.wasm $(TX_FLAGS) | jq -r .txhash); \ + while ! teritorid query tx $$TXHASH $(QUERY_FLAGS) 2>/dev/null | jq -r '.logs[0].events[] | select(.type=="store_code").attributes[] | select(.key=="code_id").value'; do sleep 1; done + +.PHONY: instantiate.testnet +instantiate.testnet: config.json + set -o pipefail; \ + TXHASH=$$(teritorid tx wasm instantiate $(CODE_ID) $(CONFIG) --label Cw721Membership --admin $(ADMIN_ADDR) $(TX_FLAGS) | jq -r .txhash); \ + while ! teritorid query tx $$TXHASH $(QUERY_FLAGS) 2>/dev/null | jq -r '.logs[0].events[] | select(.type=="instantiate").attributes[] | select(.key=="_contract_address").value'; do sleep 1; done diff --git a/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json b/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json index 1fe7b95fd7..854fa0a59f 100644 --- a/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json +++ b/cosmwasm-contracts/nft-marketplace/schema/nft_query_msg.json @@ -306,7 +306,7 @@ ], "properties": { "msg": { - "$ref": "#/definitions/Cw2981QueryMsg" + "$ref": "#/definitions/Cw2981BorkedQueryMsg" } }, "additionalProperties": false @@ -316,7 +316,7 @@ } ], "definitions": { - "Cw2981QueryMsg": { + "Cw2981BorkedQueryMsg": { "oneOf": [ { "description": "Should be called on sale to see if royalties are owed by the marketplace selling the NFT, if CheckRoyalties returns true See https://eips.ethereum.org/EIPS/eip-2981", diff --git a/cosmwasm-contracts/nft-marketplace/src/contract.rs b/cosmwasm-contracts/nft-marketplace/src/contract.rs index 4c43178ca3..5b440eb12b 100644 --- a/cosmwasm-contracts/nft-marketplace/src/contract.rs +++ b/cosmwasm-contracts/nft-marketplace/src/contract.rs @@ -1,15 +1,17 @@ use crate::state::{Config, NFTInfo, CONFIG, NFT_LIST}; use crate::vault::{ - ConfigResponse, Cw2981QueryMsg, Cw721HookMsg, ExecuteMsg, InstantiateMsg, NftQueryMsg, + ConfigResponse, Cw2981BorkedQueryMsg, Cw721HookMsg, ExecuteMsg, InstantiateMsg, NftQueryMsg, QueryMsg, RoyaltiesInfoResponse, }; #[cfg(not(feature = "library"))] use cosmwasm_std::entry_point; use cosmwasm_std::{ - attr, from_binary, to_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, DepsMut, Env, - MessageInfo, QueryRequest, Response, StdError, StdResult, Uint128, WasmMsg, WasmQuery, + attr, from_binary, to_binary, to_json_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, + DepsMut, Empty, Env, MessageInfo, QueryRequest, Response, StdError, StdResult, Uint128, + WasmMsg, WasmQuery, }; +use cw2981_royalties::msg::Cw2981QueryMsg; use cw721::{Cw721ExecuteMsg, Cw721ReceiveMsg}; //Initialize the contract. @@ -30,6 +32,12 @@ pub fn instantiate( Ok(Response::new()) } +//Migration +#[cfg_attr(not(feature = "library"), entry_point)] +pub fn migrate(_deps: DepsMut, _env: Env, _msg: Empty) -> StdResult { + Ok(Response::new()) +} + //Execute the handle messages. #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute(deps: DepsMut, env: Env, info: MessageInfo, msg: ExecuteMsg) -> StdResult { @@ -337,16 +345,48 @@ pub fn query_royalties_info( contract_addr: String, token_id: String, sale_price: Uint128, -) -> StdResult { - deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { - contract_addr, - msg: to_binary(&NftQueryMsg::Extension { - msg: Cw2981QueryMsg::RoyaltyInfo { - token_id, - sale_price, - }, - })?, - })) +) -> StdResult { + let check: Result = + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: contract_addr.to_owned(), + msg: to_json_binary(&cw2981_royalties::QueryMsg::Extension { + msg: Cw2981QueryMsg::CheckRoyalties {}, + })?, + })); + if let Ok(check) = check { + if check.royalty_payments { + let royalties_info: Result = + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: contract_addr.to_owned(), + msg: to_json_binary(&cw2981_royalties::QueryMsg::Extension { + msg: Cw2981QueryMsg::RoyaltyInfo { + token_id: token_id.to_owned(), + sale_price, + }, + })?, + })); + if let Ok(royalties_info) = royalties_info { + return Ok(royalties_info); + } + } + } + + let borked_response: Result = + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr, + msg: to_binary(&NftQueryMsg::Extension { + msg: Cw2981BorkedQueryMsg::RoyaltyInfo { + token_id, + sale_price, + }, + })?, + })); + borked_response.map( + |borked_response| cw2981_royalties::msg::RoyaltiesInfoResponse { + address: borked_response.address, + royalty_amount: borked_response.royalty_amount, + }, + ) } #[cfg(test)] diff --git a/cosmwasm-contracts/nft-marketplace/src/vault.rs b/cosmwasm-contracts/nft-marketplace/src/vault.rs index 16edc48bdf..fdf4cb33ea 100644 --- a/cosmwasm-contracts/nft-marketplace/src/vault.rs +++ b/cosmwasm-contracts/nft-marketplace/src/vault.rs @@ -65,7 +65,7 @@ pub struct RoyaltiesInfoResponse { } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub enum Cw2981QueryMsg { +pub enum Cw2981BorkedQueryMsg { /// Should be called on sale to see if royalties are owed /// by the marketplace selling the NFT, if CheckRoyalties /// returns true @@ -86,4 +86,4 @@ pub enum Cw2981QueryMsg { CheckRoyalties {}, } -pub type NftQueryMsg = cw721_base::QueryMsg; +pub type NftQueryMsg = cw721_base::QueryMsg; diff --git a/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts b/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts index 2fd67b2785..e1c9fdddc1 100644 --- a/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts +++ b/packages/contracts-clients/nft-marketplace/NftMarketplace.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { Coin, StdFee } from "@cosmjs/amino"; -import { Uint128, AllNftsInVaultResponse, NFTInfo, ConfigResponse, ExecuteMsg, Binary, Cw721ReceiveMsg, InstantiateMsg, NftInfoResponse, NftListResponse, NftOwnerInfoResponse, NftQueryMsg, Cw2981QueryMsg, QueryMsg, RoyaltiesInfoResponse } from "./NftMarketplace.types"; +import { Uint128, AllNftsInVaultResponse, NFTInfo, ConfigResponse, ExecuteMsg, Binary, Cw721ReceiveMsg, InstantiateMsg, NftInfoResponse, NftListResponse, NftOwnerInfoResponse, NftQueryMsg, Cw2981BorkedQueryMsg, QueryMsg, RoyaltiesInfoResponse } from "./NftMarketplace.types"; export interface NftMarketplaceReadOnlyInterface { contractAddress: string; config: () => Promise; diff --git a/packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts b/packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts index c77c447935..80d3cb044b 100644 --- a/packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts +++ b/packages/contracts-clients/nft-marketplace/NftMarketplace.types.ts @@ -120,10 +120,10 @@ export type NftQueryMsg = { minter: {}; } | { extension: { - msg: Cw2981QueryMsg; + msg: Cw2981BorkedQueryMsg; }; }; -export type Cw2981QueryMsg = { +export type Cw2981BorkedQueryMsg = { RoyaltyInfo: { sale_price: Uint128; token_id: string; From 775055cef91ff1c81f1d8366afe782d028fe2e3e Mon Sep 17 00:00:00 2001 From: n0izn0iz Date: Thu, 22 Feb 2024 21:37:55 +0100 Subject: [PATCH 14/17] feat: improve premium feed (#983) * feat: improve cw721-membership Signed-off-by: Norman Meier * tmp Signed-off-by: Norman Meier * feat: cleaner ui Signed-off-by: Norman Meier * fix: marketplace quirk Signed-off-by: Norman Meier * fix: attr display Signed-off-by: Norman Meier * chore: revert to unborked cw2981 msg Signed-off-by: Norman Meier * chore: clean Signed-off-by: Norman Meier --------- Signed-off-by: Norman Meier --- .env | 2 +- .../cw721-membership/Cargo.lock | 12 +- .../cw721-membership/Cargo.toml | 4 +- cosmwasm-contracts/cw721-membership/Makefile | 4 +- .../cw721-membership/config.json | 2 +- .../schema/cw721-membership.json | 251 ++++++--- .../cw721-membership/schema/raw/execute.json | 63 ++- .../schema/raw/instantiate.json | 4 +- .../cw721-membership/schema/raw/query.json | 70 ++- .../schema/raw/response_to_channel.json | 24 +- .../raw/response_to_check_royalties.json | 15 - .../schema/raw/response_to_config.json | 4 +- .../schema/raw/response_to_extension.json | 47 ++ .../schema/raw/response_to_royalty_info.json | 24 - .../cw721-membership/src/contract.rs | 492 +++++++++++------- .../cw721-membership/src/error.rs | 17 +- .../cw721-membership/src/multitest.rs | 159 +++++- networks.json | 4 +- .../components/buttons/SecondaryButton.tsx | 6 +- .../buttons/SecondaryButtonOutline.tsx | 33 +- .../components/cards/NFTAttributeCard.tsx | 7 +- packages/components/hub/ProfileButton.tsx | 11 +- .../nftDetails/components/NFTSellInfo.tsx | 56 +- .../Cw721Membership.client.ts | 96 ++-- .../cw721-membership/Cw721Membership.types.ts | 55 +- packages/hooks/feed/usePremiumChannel.ts | 2 +- .../hooks/marketplace/useCw2981RoyaltyInfo.ts | 96 ++++ .../useMarketplaceConfig.ts} | 13 +- packages/networks/teritori-testnet/index.ts | 2 +- packages/screens/CoreDAO/CoreDAOScreen.tsx | 4 +- .../UserPublicProfile/components/UPPIntro.tsx | 31 +- .../modals/AccordionSelectComponent.tsx | 28 +- .../modals/PremiumSubscriptionBottom.tsx | 20 +- .../modals/PremiumSubscriptionModal.tsx | 9 +- .../modals/SubscriptionSetupModal.tsx | 16 +- 35 files changed, 1158 insertions(+), 525 deletions(-) delete mode 100644 cosmwasm-contracts/cw721-membership/schema/raw/response_to_check_royalties.json create mode 100644 cosmwasm-contracts/cw721-membership/schema/raw/response_to_extension.json delete mode 100644 cosmwasm-contracts/cw721-membership/schema/raw/response_to_royalty_info.json create mode 100644 packages/hooks/marketplace/useCw2981RoyaltyInfo.ts rename packages/hooks/{vault/useVaultConfig.ts => marketplace/useMarketplaceConfig.ts} (69%) diff --git a/.env b/.env index 4627fa7eec..3b6f35c2a6 100644 --- a/.env +++ b/.env @@ -1,7 +1,7 @@ INDEXER_NETWORK_ID=teritori-testnet TERITORI_MINTER_CODE_IDS=10 TENDERMINT_WEBSOCKET_ENDPOINT=wss://rpc.testnet.teritori.com/websocket -TERITORI_COLLECTION_WHITELIST=tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0,tori1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmstg4wkc,tori14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s3hewys,0x43cc70bf324d716782628bed38af97e4afe92f69,0x916ad9d549907ccbbaf9ba65526826bfc3a9c0c4,tori162skshe30f43kv2q2rw6we2mu3pvz43lm2zrg4hq50jdd2fjjdjsvm8mc7,tori1zxzv4j9dxarfhxhkxm5cfnv06vy6g4l80adjwaq3dxdzmh5jm8rsrkzz65,tori18etjzrma5604af50jjklk3wlkqcsxdrvmy6jzw5naw2t7kyv4rys3kpwky,tori10z8um7u47e24rv68ghd43tspeztmqy3cc283gvc3pj48zxs5ljdqn84deq,tori1afwrcs58afaka6ltynevwcvq8zhejr3ssn703c0hky5emh890vzsry5wp5 +TERITORI_COLLECTION_WHITELIST=tori1rs244rjrhap2v4setxlugkh8ungxlrsh8asvh0trsgvqvplvkd5q7752l6,tori1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmstg4wkc,tori14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s3hewys,0x43cc70bf324d716782628bed38af97e4afe92f69,0x916ad9d549907ccbbaf9ba65526826bfc3a9c0c4,tori162skshe30f43kv2q2rw6we2mu3pvz43lm2zrg4hq50jdd2fjjdjsvm8mc7,tori1zxzv4j9dxarfhxhkxm5cfnv06vy6g4l80adjwaq3dxdzmh5jm8rsrkzz65,tori18etjzrma5604af50jjklk3wlkqcsxdrvmy6jzw5naw2t7kyv4rys3kpwky,tori10z8um7u47e24rv68ghd43tspeztmqy3cc283gvc3pj48zxs5ljdqn84deq,tori1afwrcs58afaka6ltynevwcvq8zhejr3ssn703c0hky5emh890vzsry5wp5 PUBLIC_TENOR_KEY=AIzaSyA8TpVfoyoBaDdLww6wJ1Xe0OVN-Hi8qPE diff --git a/cosmwasm-contracts/cw721-membership/Cargo.lock b/cosmwasm-contracts/cw721-membership/Cargo.lock index 3c7ae7e0af..fc6ddfbe15 100644 --- a/cosmwasm-contracts/cw721-membership/Cargo.lock +++ b/cosmwasm-contracts/cw721-membership/Cargo.lock @@ -33,9 +33,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -522,12 +522,14 @@ dependencies = [ name = "cw721-membership" version = "0.1.0" dependencies = [ + "base64", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus 1.2.0", "cw2981-royalties", "cw721 0.18.0", "cw721-metadata-onchain", + "integer-encoding", "schemars", "serde", "serde_json", @@ -810,6 +812,12 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "integer-encoding" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924df4f0e24e2e7f9cdd90babb0b96f93b20f3ecfa949ea9e6613756b8c8e1bf" + [[package]] name = "itertools" version = "0.10.5" diff --git a/cosmwasm-contracts/cw721-membership/Cargo.toml b/cosmwasm-contracts/cw721-membership/Cargo.toml index de90c2018e..a71a250daf 100644 --- a/cosmwasm-contracts/cw721-membership/Cargo.toml +++ b/cosmwasm-contracts/cw721-membership/Cargo.toml @@ -17,7 +17,9 @@ cw-storage-plus = "1.1.0" thiserror = "1.0.44" cw721 = "0.18.0" cw721-metadata-onchain = { version = "0.15.0", features = ["library"] } -cw2981-royalties = "0.18.0" +cw2981-royalties = { version = "0.18.0", features = ["library"] } +integer-encoding = "4.0.0" +base64 = "0.21.7" [dev-dependencies] sylvia = { version = "0.7.0", features = ["mt"] } diff --git a/cosmwasm-contracts/cw721-membership/Makefile b/cosmwasm-contracts/cw721-membership/Makefile index fa60474615..eb706acc24 100644 --- a/cosmwasm-contracts/cw721-membership/Makefile +++ b/cosmwasm-contracts/cw721-membership/Makefile @@ -3,11 +3,11 @@ ADMIN_ADDR=$(shell teritorid keys show $(ADMIN) --keyring-backend test --output NODE_FLAG=--node https://rpc.testnet.teritori.com:443 TX_FLAGS=--from $(ADMIN) --chain-id teritori-test-6 $(NODE_FLAG) --gas auto --gas-adjustment 1.3 -y -b sync --output json --keyring-backend test -o json QUERY_FLAGS=$(NODE_FLAG) -o json -CODE_ID=52 +CODE_ID=66 CONFIG=$(shell cat config.json | jq --rawfile desc desc.txt -r '.admin_addr="$(ADMIN_ADDR)" | .description=$$desc | tojson | @sh') # only informative -CONTRACT_ADDRESS=tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0 +CONTRACT_ADDRESS=tori1rs244rjrhap2v4setxlugkh8ungxlrsh8asvh0trsgvqvplvkd5q7752l6 .PHONY: artifacts/cw721_membership.wasm artifacts/cw721_membership.wasm: diff --git a/cosmwasm-contracts/cw721-membership/config.json b/cosmwasm-contracts/cw721-membership/config.json index 1580f3a569..ecde160576 100644 --- a/cosmwasm-contracts/cw721-membership/config.json +++ b/cosmwasm-contracts/cw721-membership/config.json @@ -1,7 +1,7 @@ { "name": "Premium Memberships", "symbol": "PMEM", - "mint_royalties": 500, + "mint_royalties_per10k_default": 500, "image_uri": "ipfs://bafybeiaznarsgwk7stav6qrzjnwqw4j7eu7drm3xx4p3fokgsnrouelse4", "admin_addr": "__EXTERNAL__", "description": "__EXTERNAL__" diff --git a/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json b/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json index ba5826cfd9..028028d167 100644 --- a/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json +++ b/cosmwasm-contracts/cw721-membership/schema/cw721-membership.json @@ -10,7 +10,7 @@ "admin_addr", "description", "image_uri", - "mint_royalties", + "mint_royalties_per10k_default", "name", "symbol" ], @@ -24,7 +24,7 @@ "image_uri": { "type": "string" }, - "mint_royalties": { + "mint_royalties_per10k_default": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -70,14 +70,14 @@ { "type": "object", "required": [ - "upsert_channel" + "create_channel" ], "properties": { - "upsert_channel": { + "create_channel": { "type": "object", "required": [ "memberships_config", - "trade_royalties" + "trade_royalties_per10k" ], "properties": { "memberships_config": { @@ -86,7 +86,13 @@ "$ref": "#/definitions/MembershipConfig" } }, - "trade_royalties": { + "trade_royalties_addr": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -96,6 +102,55 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "update_channel" + ], + "properties": { + "update_channel": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "$ref": "#/definitions/Uint64" + }, + "memberships_config": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/MembershipConfig" + } + }, + "owner": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_addr": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_per10k": { + "type": [ + "integer", + "null" + ], + "format": "uint16", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -375,6 +430,50 @@ } ], "definitions": { + "Cw2981QueryMsg": { + "oneOf": [ + { + "description": "Should be called on sale to see if royalties are owed by the marketplace selling the NFT, if CheckRoyalties returns true See https://eips.ethereum.org/EIPS/eip-2981", + "type": "object", + "required": [ + "royalty_info" + ], + "properties": { + "royalty_info": { + "type": "object", + "required": [ + "sale_price", + "token_id" + ], + "properties": { + "sale_price": { + "$ref": "#/definitions/Uint128" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Called against contract to determine if this NFT implements royalties. Should return a boolean as part of CheckRoyaltiesResponse - default can simply be true if royalties are implemented at token level (i.e. always check on sale)", + "type": "object", + "required": [ + "check_royalties" + ], + "properties": { + "check_royalties": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, "QueryMsg": { "oneOf": [ { @@ -468,39 +567,23 @@ { "type": "object", "required": [ - "royalty_info" + "extension" ], "properties": { - "royalty_info": { + "extension": { "type": "object", "required": [ - "sale_price", - "token_id" + "msg" ], "properties": { - "sale_price": { - "$ref": "#/definitions/Uint128" - }, - "token_id": { - "type": "string" + "msg": { + "$ref": "#/definitions/Cw2981QueryMsg" } } } }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "check_royalties" - ], - "properties": { - "check_royalties": { - "type": "object" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ @@ -974,23 +1057,35 @@ "title": "ChannelResponse", "type": "object", "required": [ + "id", "memberships_config", - "mint_royalties", - "trade_royalties" + "mint_royalties_per10k", + "owner_addr", + "trade_royalties_addr", + "trade_royalties_per10k" ], "properties": { + "id": { + "$ref": "#/definitions/Uint64" + }, "memberships_config": { "type": "array", "items": { "$ref": "#/definitions/MembershipConfig" } }, - "mint_royalties": { + "mint_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 }, - "trade_royalties": { + "owner_addr": { + "$ref": "#/definitions/Addr" + }, + "trade_royalties_addr": { + "$ref": "#/definitions/Addr" + }, + "trade_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -998,6 +1093,10 @@ }, "additionalProperties": false, "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, "Coin": { "type": "object", "required": [ @@ -1093,21 +1192,6 @@ } } }, - "check_royalties": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CheckRoyaltiesResponse", - "description": "Shows if the contract implements royalties if royalty_payments is true, marketplaces should pay them", - "type": "object", - "required": [ - "royalty_payments" - ], - "properties": { - "royalty_payments": { - "type": "boolean" - } - }, - "additionalProperties": false - }, "config": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Config", @@ -1116,7 +1200,7 @@ "admin_addr", "description", "image_uri", - "mint_royalties", + "mint_royalties_per10k_default", "name", "symbol" ], @@ -1130,7 +1214,7 @@ "image_uri": { "type": "string" }, - "mint_royalties": { + "mint_royalties_per10k_default": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -1168,6 +1252,53 @@ }, "additionalProperties": false }, + "extension": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Cw2981Response", + "anyOf": [ + { + "$ref": "#/definitions/CheckRoyaltiesResponse" + }, + { + "$ref": "#/definitions/RoyaltiesInfoResponse" + } + ], + "definitions": { + "CheckRoyaltiesResponse": { + "description": "Shows if the contract implements royalties if royalty_payments is true, marketplaces should pay them", + "type": "object", + "required": [ + "royalty_payments" + ], + "properties": { + "royalty_payments": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "RoyaltiesInfoResponse": { + "type": "object", + "required": [ + "address", + "royalty_amount" + ], + "properties": { + "address": { + "type": "string" + }, + "royalty_amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } + }, "nft_info": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "NftInfoResponse_for_Metadata", @@ -1403,30 +1534,6 @@ } } }, - "royalty_info": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RoyaltiesInfoResponse", - "type": "object", - "required": [ - "address", - "royalty_amount" - ], - "properties": { - "address": { - "type": "string" - }, - "royalty_amount": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false, - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } - }, "subscription": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "SubscriptionResponse", diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/execute.json b/cosmwasm-contracts/cw721-membership/schema/raw/execute.json index aa7c6111f3..881be1b6af 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/execute.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/execute.json @@ -31,14 +31,14 @@ { "type": "object", "required": [ - "upsert_channel" + "create_channel" ], "properties": { - "upsert_channel": { + "create_channel": { "type": "object", "required": [ "memberships_config", - "trade_royalties" + "trade_royalties_per10k" ], "properties": { "memberships_config": { @@ -47,7 +47,13 @@ "$ref": "#/definitions/MembershipConfig" } }, - "trade_royalties": { + "trade_royalties_addr": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -57,6 +63,55 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "update_channel" + ], + "properties": { + "update_channel": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "$ref": "#/definitions/Uint64" + }, + "memberships_config": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/MembershipConfig" + } + }, + "owner": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_addr": { + "type": [ + "string", + "null" + ] + }, + "trade_royalties_per10k": { + "type": [ + "integer", + "null" + ], + "format": "uint16", + "minimum": 0.0 + } + } + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/instantiate.json b/cosmwasm-contracts/cw721-membership/schema/raw/instantiate.json index 95c0e74ff2..1b0dfbcc59 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/instantiate.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/instantiate.json @@ -6,7 +6,7 @@ "admin_addr", "description", "image_uri", - "mint_royalties", + "mint_royalties_per10k_default", "name", "symbol" ], @@ -20,7 +20,7 @@ "image_uri": { "type": "string" }, - "mint_royalties": { + "mint_royalties_per10k_default": { "type": "integer", "format": "uint16", "minimum": 0.0 diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/query.json b/cosmwasm-contracts/cw721-membership/schema/raw/query.json index f8cd2d91dd..fe8b23c9d7 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/query.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/query.json @@ -7,6 +7,50 @@ } ], "definitions": { + "Cw2981QueryMsg": { + "oneOf": [ + { + "description": "Should be called on sale to see if royalties are owed by the marketplace selling the NFT, if CheckRoyalties returns true See https://eips.ethereum.org/EIPS/eip-2981", + "type": "object", + "required": [ + "royalty_info" + ], + "properties": { + "royalty_info": { + "type": "object", + "required": [ + "sale_price", + "token_id" + ], + "properties": { + "sale_price": { + "$ref": "#/definitions/Uint128" + }, + "token_id": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "description": "Called against contract to determine if this NFT implements royalties. Should return a boolean as part of CheckRoyaltiesResponse - default can simply be true if royalties are implemented at token level (i.e. always check on sale)", + "type": "object", + "required": [ + "check_royalties" + ], + "properties": { + "check_royalties": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, "QueryMsg": { "oneOf": [ { @@ -100,39 +144,23 @@ { "type": "object", "required": [ - "royalty_info" + "extension" ], "properties": { - "royalty_info": { + "extension": { "type": "object", "required": [ - "sale_price", - "token_id" + "msg" ], "properties": { - "sale_price": { - "$ref": "#/definitions/Uint128" - }, - "token_id": { - "type": "string" + "msg": { + "$ref": "#/definitions/Cw2981QueryMsg" } } } }, "additionalProperties": false }, - { - "type": "object", - "required": [ - "check_royalties" - ], - "properties": { - "check_royalties": { - "type": "object" - } - }, - "additionalProperties": false - }, { "type": "object", "required": [ diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_channel.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_channel.json index 8263b9a701..83fadb62a8 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_channel.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_channel.json @@ -3,23 +3,35 @@ "title": "ChannelResponse", "type": "object", "required": [ + "id", "memberships_config", - "mint_royalties", - "trade_royalties" + "mint_royalties_per10k", + "owner_addr", + "trade_royalties_addr", + "trade_royalties_per10k" ], "properties": { + "id": { + "$ref": "#/definitions/Uint64" + }, "memberships_config": { "type": "array", "items": { "$ref": "#/definitions/MembershipConfig" } }, - "mint_royalties": { + "mint_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 }, - "trade_royalties": { + "owner_addr": { + "$ref": "#/definitions/Addr" + }, + "trade_royalties_addr": { + "$ref": "#/definitions/Addr" + }, + "trade_royalties_per10k": { "type": "integer", "format": "uint16", "minimum": 0.0 @@ -27,6 +39,10 @@ }, "additionalProperties": false, "definitions": { + "Addr": { + "description": "A human readable address.\n\nIn Cosmos, this is typically bech32 encoded. But for multi-chain smart contracts no assumptions should be made other than being UTF-8 encoded and of reasonable length.\n\nThis type represents a validated address. It can be created in the following ways 1. Use `Addr::unchecked(input)` 2. Use `let checked: Addr = deps.api.addr_validate(input)?` 3. Use `let checked: Addr = deps.api.addr_humanize(canonical_addr)?` 4. Deserialize from JSON. This must only be done from JSON that was validated before such as a contract's state. `Addr` must not be used in messages sent by the user because this would result in unvalidated instances.\n\nThis type is immutable. If you really need to mutate it (Really? Are you sure?), create a mutable copy using `let mut mutable = Addr::to_string()` and operate on that `String` instance.", + "type": "string" + }, "Coin": { "type": "object", "required": [ diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_check_royalties.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_check_royalties.json deleted file mode 100644 index 485cda44db..0000000000 --- a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_check_royalties.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CheckRoyaltiesResponse", - "description": "Shows if the contract implements royalties if royalty_payments is true, marketplaces should pay them", - "type": "object", - "required": [ - "royalty_payments" - ], - "properties": { - "royalty_payments": { - "type": "boolean" - } - }, - "additionalProperties": false -} diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_config.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_config.json index f8bc5ccf32..fee99ad9a8 100644 --- a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_config.json +++ b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_config.json @@ -6,7 +6,7 @@ "admin_addr", "description", "image_uri", - "mint_royalties", + "mint_royalties_per10k_default", "name", "symbol" ], @@ -20,7 +20,7 @@ "image_uri": { "type": "string" }, - "mint_royalties": { + "mint_royalties_per10k_default": { "type": "integer", "format": "uint16", "minimum": 0.0 diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_extension.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_extension.json new file mode 100644 index 0000000000..2cf920c9d8 --- /dev/null +++ b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_extension.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Cw2981Response", + "anyOf": [ + { + "$ref": "#/definitions/CheckRoyaltiesResponse" + }, + { + "$ref": "#/definitions/RoyaltiesInfoResponse" + } + ], + "definitions": { + "CheckRoyaltiesResponse": { + "description": "Shows if the contract implements royalties if royalty_payments is true, marketplaces should pay them", + "type": "object", + "required": [ + "royalty_payments" + ], + "properties": { + "royalty_payments": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "RoyaltiesInfoResponse": { + "type": "object", + "required": [ + "address", + "royalty_amount" + ], + "properties": { + "address": { + "type": "string" + }, + "royalty_amount": { + "$ref": "#/definitions/Uint128" + } + }, + "additionalProperties": false + }, + "Uint128": { + "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", + "type": "string" + } + } +} diff --git a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_royalty_info.json b/cosmwasm-contracts/cw721-membership/schema/raw/response_to_royalty_info.json deleted file mode 100644 index 49a85ab716..0000000000 --- a/cosmwasm-contracts/cw721-membership/schema/raw/response_to_royalty_info.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "RoyaltiesInfoResponse", - "type": "object", - "required": [ - "address", - "royalty_amount" - ], - "properties": { - "address": { - "type": "string" - }, - "royalty_amount": { - "$ref": "#/definitions/Uint128" - } - }, - "additionalProperties": false, - "definitions": { - "Uint128": { - "description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```", - "type": "string" - } - } -} diff --git a/cosmwasm-contracts/cw721-membership/src/contract.rs b/cosmwasm-contracts/cw721-membership/src/contract.rs index 2c6d2a13ff..f5d74d4ab6 100644 --- a/cosmwasm-contracts/cw721-membership/src/contract.rs +++ b/cosmwasm-contracts/cw721-membership/src/contract.rs @@ -1,33 +1,36 @@ use crate::error::ContractError; +use base64::engine::general_purpose::URL_SAFE_NO_PAD; +use base64::Engine; use cosmwasm_schema::cw_serde; use cosmwasm_std::{ Addr, BankMsg, Binary, Coin, CosmosMsg, Order, Response, StdResult, Storage, Timestamp, - Uint128, Uint64, WasmMsg, + Uint128, Uint64, }; -use cw2981_royalties::msg::{CheckRoyaltiesResponse, RoyaltiesInfoResponse}; +use cw2981_royalties::msg::{CheckRoyaltiesResponse, Cw2981QueryMsg, RoyaltiesInfoResponse}; use cw721::{ AllNftInfoResponse, ContractInfoResponse, Cw721ReceiveMsg, NftInfoResponse, NumTokensResponse, OwnerOfResponse, TokensResponse, }; use cw721_metadata_onchain::{Metadata, Trait}; -use cw_storage_plus::{Bound, Item, KeyDeserialize, Map}; +use cw_storage_plus::{Bound, Item, Map}; +use integer_encoding::*; use sylvia::types::{ExecCtx, InstantiateCtx, QueryCtx}; use sylvia::{contract, entry_points}; pub type NftExtension = Metadata; -// TODO: allow to transfer channel - -// TODO: opti: avoid duplicate parsing of token_id - -// TODO: shorter token_id (bech32 with t as prefix of hash of binary data??) +pub const DEFAULT_LIMIT: usize = 10; +// MAX_LIMIT is infinity, query gas restrictions should handle this, this allows protected nodes to return big batches if needed pub struct Cw721MembershipContract { pub(crate) config: Item<'static, Config>, pub(crate) num_tokens: Item<'static, Uint64>, - pub(crate) channels: Map<'static, Addr, Channel>, - pub(crate) nfts: Map<'static, (Addr, u64), Nft>, - pub(crate) by_owner: Map<'static, (Addr, Addr, u64), ()>, + pub(crate) num_channels: Item<'static, Uint64>, + pub(crate) channels: Map<'static, u64, Channel>, + pub(crate) channels_by_addr: Map<'static, Addr, u64>, + pub(crate) nfts: Map<'static, (u64, u64), Nft>, + pub(crate) by_owner: Map<'static, (Addr, u64, u64), ()>, + pub(crate) by_expiration: Map<'static, (String, u64, u64), ()>, pub(crate) mint_platform_fees: Map<'static, String, Uint128>, pub(crate) mint_funds: Map<'static, (Addr, String), Uint128>, } @@ -44,10 +47,12 @@ pub struct MembershipConfig { #[cw_serde] pub struct ChannelResponse { + pub id: Uint64, + pub owner_addr: Addr, pub memberships_config: Vec, - pub trade_royalties: u16, // 0-10000 = 0%-100% - pub mint_royalties: u16, // 0-10000 = 0%-100% - // TODO: tokens_count + pub trade_royalties_per10k: u16, // 0-10000 = 0%-100% + pub mint_royalties_per10k: u16, // 0-10000 = 0%-100% + pub trade_royalties_addr: Addr, } #[cw_serde] @@ -63,9 +68,11 @@ pub struct ChannelFundsResponse { #[cw_serde] pub struct Channel { memberships_config: Vec, - mint_royalties: u16, // 0-10000 = 0%-100% - trade_royalties: u16, // 0-10000 = 0%-100% + mint_royalties_per10k: u16, // 0-10000 = 0%-100% + trade_royalties_per10k: u16, // 0-10000 = 0%-100% + trade_royalties_addr: Addr, next_index: Uint64, + owner_addr: Addr, } #[cw_serde] @@ -81,7 +88,7 @@ pub struct Nft { #[cw_serde] pub struct Config { pub(crate) admin_addr: Addr, - pub(crate) mint_royalties: u16, // 0-10000 = 0%-100% + pub(crate) mint_royalties_per10k_default: u16, // 0-10000 = 0%-100% pub(crate) name: String, pub(crate) description: String, pub(crate) image_uri: String, @@ -100,7 +107,12 @@ pub struct SubscriptionResponse { pub level: u16, } -// TODO: trade royalties +#[cw_serde] +#[serde(untagged)] +pub enum Cw2981Response { + CheckRoyaltiesResponse(cw2981_royalties::msg::CheckRoyaltiesResponse), + RoyaltiesInfoResponse(cw2981_royalties::msg::RoyaltiesInfoResponse), +} #[entry_points] #[contract] @@ -110,10 +122,13 @@ impl Cw721MembershipContract { Self { config: Item::new("config"), channels: Map::new("channels"), + channels_by_addr: Map::new("channels_by_addr"), nfts: Map::new("nfts"), num_tokens: Item::new("num_tokens"), + num_channels: Item::new("num_channels"), by_owner: Map::new("by_owner"), - mint_platform_fees: Map::new("mint_royalties"), + by_expiration: Map::new("by_expiration"), + mint_platform_fees: Map::new("mint_platform_fees"), mint_funds: Map::new("mint_funds"), } } @@ -123,7 +138,7 @@ impl Cw721MembershipContract { &self, ctx: InstantiateCtx, admin_addr: String, - mint_royalties: u16, + mint_royalties_per10k_default: u16, name: String, description: String, image_uri: String, @@ -134,7 +149,7 @@ impl Cw721MembershipContract { ctx.deps.storage, &Config { admin_addr, - mint_royalties, + mint_royalties_per10k_default, name, description, image_uri, @@ -142,42 +157,120 @@ impl Cw721MembershipContract { }, )?; self.num_tokens.save(ctx.deps.storage, &Uint64::zero())?; + self.num_channels.save(ctx.deps.storage, &Uint64::zero())?; Ok(Response::default()) } // Membership mutations #[msg(exec)] - pub fn upsert_channel( + pub fn create_channel( &self, ctx: ExecCtx, memberships_config: Vec, - trade_royalties: u16, // 0-10000 = 0%-100% + trade_royalties_per10k: u16, // 0-10000 = 0%-100% + trade_royalties_addr: Option, ) -> Result { - let channel_addr = ctx.info.sender; - let config = self.config.load(ctx.deps.storage)?; + let owner_addr = ctx.info.sender; + + let channel_id_opt = self + .channels_by_addr + .may_load(ctx.deps.storage, owner_addr.to_owned())?; + + let channel_id: u64 = match channel_id_opt { + Some(_) => Err(ContractError::ChannelExists), + None => { + let channel_id = self + .num_channels + .update::<_, ContractError>(ctx.deps.storage, |num_channels| { + Ok(num_channels.checked_add(Uint64::one())?) + })?; + self.channels_by_addr.save( + ctx.deps.storage, + owner_addr.to_owned(), + &channel_id.u64(), + )?; + Ok(channel_id.u64()) + } + }?; + + let royalties_addr = match trade_royalties_addr { + Some(royalties_addr) => ctx.deps.api.addr_validate(royalties_addr.as_str())?, + None => owner_addr.to_owned(), + }; + + self.channels.update::<_, ContractError>( + ctx.deps.storage, + channel_id.into(), + |channel| match channel { + Some(_) => Err(ContractError::InternalError), + None => Ok(Channel { + memberships_config, + next_index: Uint64::one(), + mint_royalties_per10k: config.mint_royalties_per10k_default, + trade_royalties_per10k, + owner_addr: owner_addr, + trade_royalties_addr: royalties_addr, + }), + }, + )?; + + Ok(Response::default().add_attribute("channel_id", channel_id.to_string())) + } + + #[msg(exec)] + pub fn update_channel( + &self, + ctx: ExecCtx, + id: Uint64, + memberships_config: Option>, + trade_royalties_per10k: Option, + trade_royalties_addr: Option, + owner: Option, + ) -> Result { + let new_owner = owner; + self.channels - .update::<_, ContractError>( - ctx.deps.storage, - channel_addr, - |channel| match channel { - Some(channel) => Ok(Channel { - memberships_config, - next_index: channel.next_index, - mint_royalties: channel.mint_royalties, - trade_royalties: channel.trade_royalties, - }), - None => Ok(Channel { - memberships_config, - next_index: Uint64::one(), - mint_royalties: config.mint_royalties, - trade_royalties, - }), - }, - )?; + .update(ctx.deps.storage, id.into(), |channel| match channel { + Some(mut channel) => { + if ctx.info.sender != channel.owner_addr { + return Err(ContractError::Unauthorized); + } + + let mut changed = false; + + if let Some(memberships_config) = memberships_config { + channel.memberships_config = memberships_config; + changed = true; + } + + if let Some(trade_royalties_per10k) = trade_royalties_per10k { + channel.trade_royalties_per10k = trade_royalties_per10k; + changed = true; + } + if let Some(trade_royalties_addr) = trade_royalties_addr { + channel.trade_royalties_addr = + ctx.deps.api.addr_validate(trade_royalties_addr.as_str())?; + changed = true; + } + + if let Some(new_owner) = new_owner { + let new_owner = ctx.deps.api.addr_validate(new_owner.as_str())?; + channel.owner_addr = new_owner; + changed = true; + } + + if !changed { + return Err(ContractError::NoChanges); + } + + Ok(channel) + } + None => Err(ContractError::ChannelNotFound), + })?; Ok(Response::default()) } @@ -192,12 +285,16 @@ impl Cw721MembershipContract { let recipient_addr = ctx.deps.api.addr_validate(recipient_addr.as_str())?; let unchecked_channel_addr = Addr::unchecked(channel_addr.as_str()); // we don't need to validate the address because we won't find a channel if the address is invalid + let channel_id = self + .channels_by_addr + .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .map_err(|_| ContractError::UnknownChannelAddress)?; + let channel_addr = unchecked_channel_addr; let mut channel = self .channels - .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .load(ctx.deps.storage, channel_id.into()) .map_err(|_| ContractError::ChannelNotFound)?; - let channel_addr = unchecked_channel_addr; let membership = channel .memberships_config @@ -210,7 +307,9 @@ impl Cw721MembershipContract { .price .amount .checked_mul(Uint128::from( - self.config.load(ctx.deps.storage)?.mint_royalties, + self.config + .load(ctx.deps.storage)? + .mint_royalties_per10k_default, ))? .checked_div(Uint128::from(10000u16))?; self.mint_platform_fees.update::<_, ContractError>( @@ -246,14 +345,26 @@ impl Cw721MembershipContract { }; self.nfts.save( ctx.deps.storage, - (channel_addr.to_owned(), nft_index.into()), + (channel_id.into(), nft_index.into()), &nft, )?; + + // save in index self.by_owner.save( ctx.deps.storage, ( recipient_addr.to_owned(), - channel_addr.to_owned(), + channel_id.into(), + nft_index.into(), + ), + &(), + )?; + let expiry = nft.start_time.plus_seconds(nft.duration_seconds.u64()); + self.by_expiration.save( + ctx.deps.storage, + ( + recipient_addr.to_string() + &channel_id.to_string(), + expiry.seconds(), nft_index.into(), ), &(), @@ -261,7 +372,7 @@ impl Cw721MembershipContract { channel.next_index = channel.next_index.checked_add(Uint64::one())?; self.channels - .save(ctx.deps.storage, channel_addr.to_owned(), &channel)?; + .save(ctx.deps.storage, channel_id.into(), &channel)?; self.num_tokens .update::<_, ContractError>(ctx.deps.storage, |num_tokens| { @@ -269,8 +380,8 @@ impl Cw721MembershipContract { })?; // we need these for efficient indexing - let token_id = format_token_id(&channel_addr, nft_index); - let nft_info = self.internal_nft_info(ctx.deps.storage, &token_id)?; + let token_id = format_token_id(channel_id.into(), nft_index.into()); + let nft_info = self.internal_nft_info(ctx.deps.storage, channel_id, nft_index.u64())?; let json_nft_info = serde_json::to_string(&nft_info).map_err(|_| ContractError::SerializationError)?; @@ -300,7 +411,7 @@ impl Cw721MembershipContract { } if let Some(mint_royalties) = mint_royalties { - config.mint_royalties = mint_royalties; + config.mint_royalties_per10k_default = mint_royalties; } if let Some(name) = name { @@ -325,29 +436,6 @@ impl Cw721MembershipContract { Ok(Response::default()) } - // TODO: partial update - pub fn update_channel( - &self, - ctx: ExecCtx, - memberships_config: Option>, - ) -> Result { - let channel_addr = ctx.info.sender; - let mut channel = self - .channels - .load(ctx.deps.storage, channel_addr.to_owned()) - .map_err(|_| ContractError::ChannelNotFound)?; - - // TODO: think: maybe we shouldn't allow to mutate existing membership configs? - if let Some(memberships_config) = memberships_config { - channel.memberships_config = memberships_config; - } - - self.channels - .save(ctx.deps.storage, channel_addr, &channel)?; - - Ok(Response::default()) - } - #[msg(exec)] pub fn update_channel_mint_platform_fee( &self, @@ -361,15 +449,18 @@ impl Cw721MembershipContract { } let unchecked_channel_addr = Addr::unchecked(channel_addr.as_str()); // we don't need to validate the address because we won't find a channel if the address is invalid + let channel_id = self + .channels_by_addr + .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .map_err(|_| ContractError::UnknownChannelAddress)?; let mut channel = self .channels - .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .load(ctx.deps.storage, channel_id.into()) .map_err(|_| ContractError::ChannelNotFound)?; - let channel_addr = unchecked_channel_addr; - channel.mint_royalties = mint_royalties; + channel.mint_royalties_per10k = mint_royalties; self.channels - .save(ctx.deps.storage, channel_addr, &channel)?; + .save(ctx.deps.storage, channel_id.into(), &channel)?; Ok(Response::default()) } @@ -417,10 +508,11 @@ impl Cw721MembershipContract { destination_addr: Option, ) -> Result { let unchecked_channel_addr = Addr::unchecked(channel_addr.as_str()); // we don't need to validate the address because we won't find a channel if the address is invalid - if !self - .channels - .has(ctx.deps.storage, unchecked_channel_addr.to_owned()) - { + let channel_id = self + .channels_by_addr + .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .map_err(|_| ContractError::UnknownChannelAddress)?; + if !self.channels.has(ctx.deps.storage, channel_id.into()) { return Err(ContractError::ChannelNotFound); } let channel_addr = unchecked_channel_addr; @@ -471,15 +563,23 @@ impl Cw721MembershipContract { channel_addr: String, ) -> Result { let unchecked_channel_addr = Addr::unchecked(channel_addr.as_str()); // we don't need to validate the address because we won't find a channel if the address is invalid + let channel_id = self + .channels_by_addr + .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .map_err(|_| ContractError::UnknownChannelAddress)?; + let channel = self .channels - .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .load(ctx.deps.storage, channel_id.into()) .map_err(|_| ContractError::ChannelNotFound)?; Ok(ChannelResponse { + id: channel_id.into(), + owner_addr: channel.owner_addr, memberships_config: channel.memberships_config, - mint_royalties: channel.mint_royalties, - trade_royalties: channel.trade_royalties, + mint_royalties_per10k: channel.mint_royalties_per10k, + trade_royalties_per10k: channel.trade_royalties_per10k, + trade_royalties_addr: channel.trade_royalties_addr, }) } @@ -516,8 +616,6 @@ impl Cw721MembershipContract { Ok(ChannelFundsResponse { funds: funds? }) } - // FIXME: this might fail if an user has too many tokens for a particular channel - // maybe optimize by using expiration as key and start query range after now, this will only operate on unexpired tokens since you can't set the start date in the future #[msg(query)] pub fn subscription( &self, @@ -526,19 +624,28 @@ impl Cw721MembershipContract { channel_addr: String, ) -> Result { let sub_addr = Addr::unchecked(sub_addr.as_str()); - let channel_addr = Addr::unchecked(channel_addr.as_str()); + let unchecked_channel_addr = Addr::unchecked(channel_addr.as_str()); + let channel_id = self + .channels_by_addr + .load(ctx.deps.storage, unchecked_channel_addr.to_owned()) + .map_err(|_| ContractError::UnknownChannelAddress)?; let mut subscription: Option = None; let mut level: u16 = 0; + // only iterate over unexpired tokens for entry in self - .by_owner - .prefix((sub_addr, channel_addr.to_owned())) - .range(ctx.deps.storage, None, None, Order::Ascending) - { - let (nft_index, _) = entry?; - let nft = self.nfts.load( + .by_expiration + .sub_prefix(sub_addr.to_string() + &channel_id.to_string()) + .range( ctx.deps.storage, - (channel_addr.to_owned(), nft_index.into()), - )?; + Some(Bound::exclusive((ctx.env.block.time.seconds(), 0))), + None, + Order::Ascending, + ) + { + let ((_, nft_index), _) = entry?; + let nft = self + .nfts + .load(ctx.deps.storage, (channel_id.into(), nft_index.into()))?; // we don't need to check that we're past start time since it can't be in the future @@ -654,18 +761,15 @@ impl Cw721MembershipContract { /// Burn an NFT the sender has access to #[msg(exec)] pub fn burn(&self, ctx: ExecCtx, token_id: String) -> Result { - let (channel_addr, nft_index) = parse_token_id(&token_id)?; + let (channel_id, nft_index) = parse_token_id(&token_id)?; - let nft = self - .nfts - .load(ctx.deps.storage, (channel_addr.to_owned(), nft_index))?; + let nft = self.nfts.load(ctx.deps.storage, (channel_id, nft_index))?; if nft.owner_addr != ctx.info.sender { return Err(ContractError::Unauthorized); } - self.nfts - .remove(ctx.deps.storage, (channel_addr.to_owned(), nft_index)); + self.nfts.remove(ctx.deps.storage, (channel_id, nft_index)); self.by_owner - .remove(ctx.deps.storage, (ctx.info.sender, channel_addr, nft_index)); + .remove(ctx.deps.storage, (ctx.info.sender, channel_id, nft_index)); self.num_tokens .update::<_, ContractError>(ctx.deps.storage, |num_tokens| { Ok(num_tokens.checked_sub(Uint64::one())?) @@ -675,14 +779,34 @@ impl Cw721MembershipContract { // CW2981 Royalty Queries + #[msg(query)] + pub fn extension( + &self, + ctx: QueryCtx, + msg: Cw2981QueryMsg, + ) -> Result { + match msg { + Cw2981QueryMsg::CheckRoyalties {} => { + let res = self.check_royalties()?; + Ok(Cw2981Response::CheckRoyaltiesResponse(res)) + } + Cw2981QueryMsg::RoyaltyInfo { + token_id, + sale_price, + } => { + let res = self.royalty_info(ctx, token_id, sale_price)?; + Ok(Cw2981Response::RoyaltiesInfoResponse(res)) + } + } + } + /// Should be called on sale to see if royalties are owed /// by the marketplace selling the NFT, if CheckRoyalties /// returns true /// See https://eips.ethereum.org/EIPS/eip-2981 - #[msg(query)] - pub fn royalty_info( + fn royalty_info( &self, - _ctx: QueryCtx, + ctx: QueryCtx, token_id: String, // the denom of this sale must also be the denom returned by RoyaltiesInfoResponse // this was originally implemented as a Coin @@ -690,19 +814,19 @@ impl Cw721MembershipContract { // as CW20 is just mapping of addr -> balance sale_price: Uint128, ) -> Result { - let (channel_addr, _nft_index) = parse_token_id(&token_id)?; + let (channel_id, _nft_index) = parse_token_id(&token_id)?; let channel = self .channels - .load(_ctx.deps.storage, channel_addr.to_owned()) + .load(ctx.deps.storage, channel_id) .map_err(|_| ContractError::ChannelNotFound)?; let royalty_amount = sale_price - .checked_mul(Uint128::from(channel.trade_royalties))? + .checked_mul(Uint128::from(channel.trade_royalties_per10k))? .checked_div(Uint128::from(10000u128))?; Ok(RoyaltiesInfoResponse { - address: channel_addr.to_string(), + address: channel.owner_addr.to_string(), royalty_amount, }) } @@ -712,8 +836,7 @@ impl Cw721MembershipContract { /// CheckRoyaltiesResponse - default can simply be true /// if royalties are implemented at token level /// (i.e. always check on sale) - #[msg(query)] - pub fn check_royalties(&self, _ctx: QueryCtx) -> Result { + fn check_royalties(&self) -> Result { Ok(CheckRoyaltiesResponse { royalty_payments: true, }) @@ -731,7 +854,8 @@ impl Cw721MembershipContract { /// unset or false will filter out expired approvals, you must set to true to see them include_expired: Option, // not implemented ) -> Result { - self.internal_owner_of(&ctx, &token_id) + let (channel_id, nft_index) = parse_token_id(&token_id)?; + self.internal_owner_of(&ctx, channel_id, nft_index) } // TODO: @@ -769,7 +893,8 @@ impl Cw721MembershipContract { ctx: QueryCtx, token_id: String, ) -> Result, ContractError> { - self.internal_nft_info(ctx.deps.storage, &token_id) + let (channel_id, nft_index) = parse_token_id(&token_id)?; + self.internal_nft_info(ctx.deps.storage, channel_id, nft_index) } /// With MetaData Extension. @@ -783,8 +908,9 @@ impl Cw721MembershipContract { /// unset or false will filter out expired approvals, you must set to true to see them include_expired: Option, ) -> Result, ContractError> { - let access = self.internal_owner_of(&ctx, &token_id)?; - let info = self.internal_nft_info(ctx.deps.storage, &token_id)?; + let (channel_id, nft_index) = parse_token_id(&token_id)?; + let access = self.internal_owner_of(&ctx, channel_id, nft_index)?; + let info = self.internal_nft_info(ctx.deps.storage, channel_id, nft_index)?; Ok(AllNftInfoResponse { access, info }) } @@ -800,11 +926,11 @@ impl Cw721MembershipContract { limit: Option, ) -> Result { let owner_addr = ctx.deps.api.addr_validate(owner.as_str())?; - let limit = limit.map(|limit| limit as usize).unwrap_or(30); + let limit = limit.map(|limit| limit as usize).unwrap_or(DEFAULT_LIMIT); let min_bound = match start_after { Some(start_after) => { - let (channel_addr, nft_index) = parse_token_id(&start_after)?; - Some(Bound::exclusive((channel_addr, nft_index))) + let (channel_id, nft_index) = parse_token_id(&start_after)?; + Some(Bound::exclusive((channel_id, nft_index))) } None => None, }; @@ -815,8 +941,8 @@ impl Cw721MembershipContract { .range(ctx.deps.storage, min_bound, None, Order::Ascending) .take(limit) .map(|item| -> Result { - let ((channel_addr, nft_index), _) = item?; - Ok(format_token_id(&channel_addr, nft_index.into())) + let ((channel_id, nft_index), _) = item?; + Ok(format_token_id(channel_id, nft_index.into())) }) .collect(); Ok(TokensResponse { tokens: tokens? }) @@ -832,28 +958,23 @@ impl Cw721MembershipContract { start_after: Option, limit: Option, ) -> Result { - let limit = limit.map(|limit| limit as usize).unwrap_or(30); + let limit = limit.map(|limit| limit as usize).unwrap_or(DEFAULT_LIMIT); - let start_after = match start_after { + let min_bound = match start_after { Some(start_after) => { - let (channel_addr, nft_index) = parse_token_id(&start_after)?; - Some((channel_addr, nft_index)) + let (channel_id, nft_index) = parse_token_id(&start_after)?; + Some(Bound::exclusive((channel_id, nft_index))) } None => None, }; let tokens: Result, _> = self .nfts - .range( - ctx.deps.storage, - start_after.map(|sa| Bound::exclusive(sa)), - None, - Order::Ascending, - ) + .range(ctx.deps.storage, min_bound, None, Order::Ascending) .take(limit) .map(|item| -> Result { - let ((channel_addr, nft_index), _) = item?; - Ok(format_token_id(&channel_addr, Uint64::from(nft_index))) + let ((channel_id, nft_index), _) = item?; + Ok(format_token_id(channel_id, nft_index)) }) .collect(); Ok(TokensResponse { tokens: tokens? }) @@ -862,12 +983,10 @@ impl Cw721MembershipContract { fn internal_owner_of( &self, ctx: &QueryCtx, - token_id: &String, + channel_id: u64, + nft_index: u64, ) -> Result { - let (channel_addr, nft_index) = parse_token_id(&token_id)?; - let nft = self - .nfts - .load(ctx.deps.storage, (channel_addr, nft_index.into()))?; + let nft = self.nfts.load(ctx.deps.storage, (channel_id, nft_index))?; Ok(OwnerOfResponse { owner: nft.owner_addr.to_string(), approvals: vec![], @@ -877,13 +996,10 @@ impl Cw721MembershipContract { fn internal_nft_info( &self, storage: &dyn Storage, - token_id: &String, + channel_id: u64, + nft_index: u64, ) -> Result, ContractError> { - let (channel_addr, nft_index) = parse_token_id(token_id)?; - - let nft = self - .nfts - .load(storage, (channel_addr.to_owned(), nft_index.into()))?; + let nft = self.nfts.load(storage, (channel_id, nft_index))?; // TODO: improve info @@ -893,28 +1009,24 @@ impl Cw721MembershipContract { name: Some(nft.name), description: Some(nft.description), image: Some(nft.image_uri), - animation_url: None, - external_url: None, - background_color: None, - youtube_url: None, attributes: Some(vec![ Trait { - display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), - trait_type: "Channel address".to_string(), - value: channel_addr.to_string(), + display_type: None, + trait_type: "Channel".to_string(), + value: channel_id.to_string(), }, Trait { - display_type: Some("DISPLAY_TYPE_DATE".to_string()), + display_type: Some("date".to_string()), trait_type: "Starts".to_string(), - value: nft.start_time.to_string(), + value: nft.start_time.seconds().to_string(), }, Trait { - display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), - trait_type: "Duration in seconds".to_string(), + display_type: Some("duration".to_string()), + trait_type: "Duration".to_string(), value: nft.duration_seconds.to_string(), }, ]), - image_data: None, + ..Default::default() }, }) } @@ -926,13 +1038,13 @@ impl Cw721MembershipContract { token_id: String, ) -> Result { let recipient = ctx.deps.api.addr_validate(recipient.as_str())?; + let sender = ctx.info.sender.to_owned(); - let (channel_addr, nft_index) = parse_token_id(&token_id)?; + let (channel_id, nft_index) = parse_token_id(&token_id)?; - self.nfts.update( - ctx.deps.storage, - (channel_addr.to_owned(), nft_index), - |nft| match nft { + let nft = self + .nfts + .update(ctx.deps.storage, (channel_id, nft_index), |nft| match nft { Some(nft) => { if nft.owner_addr != ctx.info.sender { return Err(ContractError::Unauthorized); @@ -946,15 +1058,36 @@ impl Cw721MembershipContract { }) } None => Err(ContractError::NftNotFound), - }, - )?; + })?; - self.by_owner.remove( + self.by_owner + .remove(ctx.deps.storage, (ctx.info.sender, channel_id, nft_index)); + self.by_owner.save( + ctx.deps.storage, + (recipient.to_owned(), channel_id, nft_index), + &(), + )?; + let expiry = nft + .start_time + .plus_seconds(nft.duration_seconds.u64()) + .seconds(); + self.by_expiration.remove( ctx.deps.storage, - (ctx.info.sender, channel_addr.to_owned(), nft_index), + ( + sender.to_string() + &channel_id.to_string(), + expiry, + nft_index, + ), ); - self.by_owner - .save(ctx.deps.storage, (recipient, channel_addr, nft_index), &())?; + self.by_expiration.save( + ctx.deps.storage, + ( + recipient.to_string() + &channel_id.to_string(), + expiry, + nft_index, + ), + &(), + )?; Ok(Response::default()) } @@ -975,20 +1108,15 @@ pub fn assert_exact_funds(ctx: &ExecCtx, amount: Coin) -> Result Result<(Addr, u64), ContractError> { - let bytes = Binary::from_base64(token_id)?; - let nft_index = u64::from_be_bytes( - bytes[0..8] - .try_into() - .map_err(|_| ContractError::InvalidTokenId)?, - ); - let channel_addr = Addr::from_slice(&bytes[8..])?; - Ok((channel_addr, nft_index)) +pub fn parse_token_id(token_id: &String) -> Result<(u64, u64), ContractError> { + let bytes = URL_SAFE_NO_PAD.decode(token_id)?; + let (nft_index, nft_index_len) = + u64::decode_var(bytes.as_slice()).ok_or(ContractError::InvalidTokenId)?; + let (channel_id, _) = + u64::decode_var(&bytes[nft_index_len..]).ok_or(ContractError::InvalidTokenId)?; + Ok((channel_id, nft_index)) } -pub fn format_token_id(channel_addr: &Addr, nft_index: Uint64) -> String { - let nft_index_bytes = nft_index.to_be_bytes(); - let channel_addr_bytes = channel_addr.as_bytes(); - let all_bytes = [&nft_index_bytes, channel_addr_bytes].concat(); - Binary::from(all_bytes).to_base64() +pub fn format_token_id(channel_id: u64, nft_index: u64) -> String { + URL_SAFE_NO_PAD.encode([nft_index.encode_var_vec(), channel_id.encode_var_vec()].concat()) } diff --git a/cosmwasm-contracts/cw721-membership/src/error.rs b/cosmwasm-contracts/cw721-membership/src/error.rs index 5e661fce9b..456ce16058 100644 --- a/cosmwasm-contracts/cw721-membership/src/error.rs +++ b/cosmwasm-contracts/cw721-membership/src/error.rs @@ -12,9 +12,18 @@ pub enum ContractError { #[error("{0}")] DivideByZero(#[from] DivideByZeroError), + #[error("{0}")] + DecodeError(#[from] base64::DecodeError), + + #[error("{0}")] + ParseIntError(#[from] std::num::ParseIntError), + #[error("Channel already exists.")] ChannelExists, + #[error("This address does not own a channel.")] + UnknownChannelAddress, + #[error("Channel does not exist.")] ChannelNotFound, @@ -36,6 +45,12 @@ pub enum ContractError { #[error("Invalid funds.")] InvalidFunds, - #[error("Serialization error")] + #[error("Serialization error.")] SerializationError, + + #[error("Internal error.")] + InternalError, + + #[error("No changes.")] + NoChanges, } diff --git a/cosmwasm-contracts/cw721-membership/src/multitest.rs b/cosmwasm-contracts/cw721-membership/src/multitest.rs index 73656211a4..27dbc13477 100644 --- a/cosmwasm-contracts/cw721-membership/src/multitest.rs +++ b/cosmwasm-contracts/cw721-membership/src/multitest.rs @@ -1,11 +1,11 @@ -use cosmwasm_std::{Addr, Coin, Timestamp, Uint128, Uint64}; -use cw2981_royalties::msg::{CheckRoyaltiesResponse, RoyaltiesInfoResponse}; +use cosmwasm_std::{from_json, Addr, BalanceResponse, BankQuery, Coin, Timestamp, Uint128, Uint64}; +use cw2981_royalties::msg::{CheckRoyaltiesResponse, Cw2981QueryMsg, RoyaltiesInfoResponse}; use cw721::{NftInfoResponse, TokensResponse}; use cw721_metadata_onchain::{Metadata, Trait}; -use sylvia::{anyhow::Error, multitest::App}; +use sylvia::{anyhow::Error, cw_multi_test::Module, multitest::App}; use crate::contract::{ - multitest_utils::CodeId, MembershipConfig, Subscription, SubscriptionResponse, + multitest_utils::CodeId, Cw2981Response, MembershipConfig, Subscription, SubscriptionResponse, }; #[test] @@ -30,11 +30,34 @@ fn basic_full_flow() { }) .unwrap(); + let get_balance = |addr: String| -> BalanceResponse { + app.app() + .read_module(|router, api, storage| { + let block_info = &app.block_info(); + let querier = router.querier(api, storage, block_info); + let res = router + .bank + .query( + api, + storage, + &querier, + block_info, + BankQuery::Balance { + address: addr, + denom: "utori".to_string(), + }, + ) + .unwrap(); + from_json(res) + }) + .unwrap() + }; + // ------- instantiate contract let admin = "admin"; let contract_creator = "creator"; - let mint_royalties = 5; + let mint_royalties = 500; let coll_name = "coll_name"; let coll_desc = "coll_desc"; let coll_image_uri = "coll_image_uri"; @@ -58,7 +81,7 @@ fn basic_full_flow() { let config = contract.config().unwrap(); assert_eq!(config.admin_addr, admin.to_string()); - assert_eq!(config.mint_royalties, mint_royalties); + assert_eq!(config.mint_royalties_per10k_default, mint_royalties); assert_eq!(config.name, coll_name.to_string()); assert_eq!(config.description, coll_desc.to_string()); assert_eq!(config.image_uri, coll_image_uri.to_string()); @@ -78,18 +101,46 @@ fn basic_full_flow() { }, }]; + let initial_trade_royalties = 1000; let trade_royalties = 500; let channel_owner = "channel_owner"; + let channel_vault = "channel_vault"; + + let res = contract + .create_channel( + memberships_config.clone(), + initial_trade_royalties, + Some(channel_vault.to_string()), + ) + .call(channel_owner) + .unwrap(); + + let channel_response = contract.channel(channel_owner.to_string()).unwrap(); + assert_eq!(channel_response.memberships_config, memberships_config); + assert_eq!(channel_response.mint_royalties_per10k, mint_royalties); + assert_eq!( + channel_response.trade_royalties_addr, + channel_vault.to_string() + ); + assert_eq!( + channel_response.trade_royalties_per10k, + initial_trade_royalties + ); contract - .upsert_channel(memberships_config.clone(), trade_royalties) + .update_channel(channel_response.id, None, Some(trade_royalties), None, None) .call(channel_owner) .unwrap(); let channel_response = contract.channel(channel_owner.to_string()).unwrap(); + assert_eq!(channel_response.owner_addr, channel_owner); assert_eq!(channel_response.memberships_config, memberships_config); - assert_eq!(channel_response.mint_royalties, mint_royalties); - assert_eq!(channel_response.trade_royalties, trade_royalties); + assert_eq!(channel_response.mint_royalties_per10k, mint_royalties); + assert_eq!( + channel_response.trade_royalties_addr, + channel_vault.to_string() + ); + assert_eq!(channel_response.trade_royalties_per10k, trade_royalties); // ------- mint a nft @@ -102,7 +153,7 @@ fn basic_full_flow() { .call(sub_user) .unwrap(); - let token_id = "AAAAAAAAAAFjaGFubmVsX293bmVy"; + let token_id = "AQE"; // ------- test nft queries @@ -129,50 +180,89 @@ fn basic_full_flow() { token_uri: None, extension: Metadata { image: Some("https://example.com/image.png".to_string()), - name: Some("Sub #1".to_string()), + image_data: None, + external_url: None, description: Some("Channel description".to_string()), + name: Some("Sub #1".to_string()), attributes: Some(vec![ Trait { - display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), - trait_type: "Channel address".to_string(), - value: "channel_owner".to_string() + display_type: None, + trait_type: "Channel".to_string(), + value: "1".to_string() }, Trait { - display_type: Some("DISPLAY_TYPE_DATE".to_string()), + display_type: Some("date".to_string()), trait_type: "Starts".to_string(), - value: "1571797419.879305533".to_string() + value: "1571797419".to_string() }, Trait { - display_type: Some("DISPLAY_TYPE_PROPERTY".to_string()), - trait_type: "Duration in seconds".to_string(), + display_type: Some("duration".to_string()), + trait_type: "Duration".to_string(), value: "604800".to_string() - }, + } ]), - ..Default::default() + background_color: None, + animation_url: None, + youtube_url: None } } ); + // ------- test borked royalty queries + + let royalties_check = contract + .extension(Cw2981QueryMsg::CheckRoyalties {}) + .unwrap(); + assert_eq!( + royalties_check, + Cw2981Response::CheckRoyaltiesResponse(CheckRoyaltiesResponse { + royalty_payments: true + }), + ); + + let royalty_info = contract + .extension(Cw2981QueryMsg::RoyaltyInfo { + token_id: token_id.to_string(), + sale_price: Uint128::from(461558079u32), + }) + .unwrap(); + assert_eq!( + royalty_info, + Cw2981Response::RoyaltiesInfoResponse(RoyaltiesInfoResponse { + address: channel_owner.to_string(), + royalty_amount: Uint128::from(23077903u32) // 5% + }), + ); + // ------- test royalty queries - let royalties_check = contract.check_royalties().unwrap(); + /* + let royalties_check = contract + .extension(Cw2981Query::Cw2981QueryMsg( + Cw2981QueryMsg::CheckRoyalties {}, + )) + .unwrap(); assert_eq!( royalties_check, - CheckRoyaltiesResponse { + Cw2981Response::CheckRoyaltiesResponse(CheckRoyaltiesResponse { royalty_payments: true - } + }), ); let royalty_info = contract - .royalty_info(token_id.to_string(), Uint128::from(461558079u32)) + .extension(Cw2981Query::Cw2981QueryMsg(Cw2981QueryMsg::RoyaltyInfo { + token_id: token_id.to_string(), + sale_price: Uint128::from(461558079u32), + })) .unwrap(); assert_eq!( royalty_info, - RoyaltiesInfoResponse { + Cw2981Response::RoyaltiesInfoResponse(RoyaltiesInfoResponse { address: channel_owner.to_string(), royalty_amount: Uint128::from(23077903u32) // 5% - } + }), ); + */ // ------- test transfer and back @@ -232,4 +322,21 @@ fn basic_full_flow() { level: 0 } ); + + // check withdraw + contract + .withdraw_mint_funds(channel_owner.to_string(), Some(channel_vault.to_string())) + .call(channel_owner) + .unwrap(); + let channel_balance = get_balance(channel_vault.to_string()); + assert_eq!(channel_balance.amount.amount, Uint128::from(950000u32)); + + let platform_vault = "platform_vault"; + contract + .withdraw_mint_platform_fee(Some(platform_vault.to_string())) + .call(admin) + .unwrap(); + + let platform_balance = get_balance(platform_vault.to_string()); + assert_eq!(platform_balance.amount.amount, Uint128::from(50000u32)); } diff --git a/networks.json b/networks.json index 4cc3151f04..f2873b538e 100644 --- a/networks.json +++ b/networks.json @@ -10939,7 +10939,7 @@ "featureObjects": [ { "type": "CosmWasmPremiumFeed", - "membershipContractAddress": "tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0", + "membershipContractAddress": "tori1rs244rjrhap2v4setxlugkh8ungxlrsh8asvh0trsgvqvplvkd5q7752l6", "mintDenom": "utori" } ], @@ -10997,7 +10997,7 @@ "distributorContractAddress": "", "riotersFooterContractAddress": "", "secondaryDuringMintList": [ - "tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0", + "tori1rs244rjrhap2v4setxlugkh8ungxlrsh8asvh0trsgvqvplvkd5q7752l6", "tori14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s3hewys", "tori1hzz0s0ucrhdp6tue2lxk3c03nj6f60qy463we7lgx0wudd72ctmstg4wkc", "" diff --git a/packages/components/buttons/SecondaryButton.tsx b/packages/components/buttons/SecondaryButton.tsx index 32965f111a..b476086f75 100644 --- a/packages/components/buttons/SecondaryButton.tsx +++ b/packages/components/buttons/SecondaryButton.tsx @@ -38,6 +38,7 @@ export const SecondaryButton: React.FC<{ disabled?: boolean; fullWidth?: boolean; numberOfLines?: number; + hoverBorderColor?: string; loader?: boolean; textStyle?: TextStyle; }> = ({ @@ -54,6 +55,7 @@ export const SecondaryButton: React.FC<{ iconSVG, disabled = false, fullWidth = false, + hoverBorderColor, numberOfLines, loader, textStyle, @@ -93,7 +95,9 @@ export const SecondaryButton: React.FC<{ opacity: isDisabled ? 0.5 : 1, width: fullWidth ? "100%" : width, borderWidth: 1, - borderColor: hovered ? "white" : backgroundColor, + borderColor: hovered + ? hoverBorderColor || "white" + : backgroundColor, height: heightButton(size), alignItems: "center", justifyContent: "center", diff --git a/packages/components/buttons/SecondaryButtonOutline.tsx b/packages/components/buttons/SecondaryButtonOutline.tsx index 8a5e087352..f72022040c 100644 --- a/packages/components/buttons/SecondaryButtonOutline.tsx +++ b/packages/components/buttons/SecondaryButtonOutline.tsx @@ -12,7 +12,8 @@ import { neutral33, secondaryColor } from "../../utils/style/colors"; import { fontSemibold14 } from "../../utils/style/fonts"; import { BrandText } from "../BrandText"; import { SVG } from "../SVG"; -import { LegacyTertiaryBox } from "../boxes/LegacyTertiaryBox"; +import { BoxStyle } from "../boxes/Box"; +import { TertiaryBox } from "../boxes/TertiaryBox"; // FIXME: make a BaseButton and only pass backgroun/border and text colors in this kind of components @@ -25,7 +26,7 @@ export const SecondaryButtonOutline: React.FC<{ backgroundColor?: string; color?: string; borderColor?: string; - style?: StyleProp; + style?: StyleProp; touchableStyle?: StyleProp; iconSVG?: React.FC; disabled?: boolean; @@ -68,7 +69,6 @@ export const SecondaryButtonOutline: React.FC<{ }, [onPress, isAutoLoading]); const boxProps = { - style, disabled, squaresBackgroundColor, width, @@ -81,16 +81,21 @@ export const SecondaryButtonOutline: React.FC<{ disabled={disabled} style={[{ width: fullWidth ? "100%" : width }, touchableStyle]} > - {iconSVG ? ( @@ -125,7 +130,7 @@ export const SecondaryButtonOutline: React.FC<{ ))} - + ); }; diff --git a/packages/components/cards/NFTAttributeCard.tsx b/packages/components/cards/NFTAttributeCard.tsx index d98fcc93ae..77507a6b13 100644 --- a/packages/components/cards/NFTAttributeCard.tsx +++ b/packages/components/cards/NFTAttributeCard.tsx @@ -113,8 +113,11 @@ export const NFTAttributeCard: React.FC<{ }; const prettyAttributeValue = (attr: NFTAttribute): string => { - if (attr.display_type === "DISPLAY_TYPE_DATE") { - return moment(parseInt(attr.value.split(".")[0], 10) * 1000).calendar(); // FIXME: verify what date format is expected in this field + if (attr.display_type === "date") { + return moment(parseInt(attr.value, 10) * 1000).calendar(); + } else if (attr.display_type === "duration") { + const days = moment.duration(parseInt(attr.value, 10) * 1000).asDays(); + return days + " day" + (days > 1 ? "s" : ""); } return attr.value; }; diff --git a/packages/components/hub/ProfileButton.tsx b/packages/components/hub/ProfileButton.tsx index 6ee1fefbfe..f4bdde3a53 100644 --- a/packages/components/hub/ProfileButton.tsx +++ b/packages/components/hub/ProfileButton.tsx @@ -95,13 +95,16 @@ export const ProfileButton: React.FC<{ ); } - return ; + return ( + + ); }; const RegisterButton: React.FC<{ style?: StyleProp; networkId: string | undefined; -}> = ({ networkId, style }) => { + size: ButtonsSize; +}> = ({ networkId, style, size }) => { const network = getNetwork(networkId); const [gnoModalVisible, setGnoModalVisible] = useState(false); @@ -117,7 +120,7 @@ const RegisterButton: React.FC<{ style={style} > @@ -129,7 +132,7 @@ const RegisterButton: React.FC<{ return ( setGnoModalVisible(true)} diff --git a/packages/components/nftDetails/components/NFTSellInfo.tsx b/packages/components/nftDetails/components/NFTSellInfo.tsx index ab88237b0d..0568b39964 100644 --- a/packages/components/nftDetails/components/NFTSellInfo.tsx +++ b/packages/components/nftDetails/components/NFTSellInfo.tsx @@ -1,38 +1,37 @@ import { Decimal } from "@cosmjs/math"; -import { useQuery } from "@tanstack/react-query"; -import { NftMarketplaceQueryClient } from "../../../contracts-clients/nft-marketplace/NftMarketplace.client"; -import { - getNativeCurrency, - getNetwork, - mustGetNonSigningCosmWasmClient, - NetworkKind, -} from "../../../networks"; +import { getNativeCurrency } from "../../../networks"; import { prettyPrice } from "../../../utils/coins"; import { trimFixed } from "../../../utils/numbers"; import { fontMedium14 } from "../../../utils/style/fonts"; import { NFTInfo } from "../../../utils/types/nft"; import { BrandText } from "../../BrandText"; +import { useCw2981RoyaltyInfo } from "@/hooks/marketplace/useCw2981RoyaltyInfo"; +import { useMarketplaceConfig } from "@/hooks/marketplace/useMarketplaceConfig"; + export const NFTSellInfo: React.FC<{ nftInfo?: NFTInfo; price: string; }> = ({ nftInfo, price }) => { const networkId = nftInfo?.networkId; - const vaultConfig = useVaultConfig(networkId); + const { marketplaceConfig } = useMarketplaceConfig(networkId); const currency = getNativeCurrency(networkId, nftInfo?.mintDenom); + const { data: royaltyGain } = useCw2981RoyaltyInfo( + nftInfo?.collectionId, + nftInfo?.tokenId, + ); - if (!currency || !vaultConfig || !nftInfo || !networkId) { + if (!currency || !marketplaceConfig || !nftInfo || !networkId) { return null; } - const nftRoyalty = nftInfo.royalty || 0; - - const platformFeePercent = parseInt(vaultConfig.fee_bp || "0", 10) / 100; + const platformFeePercent = + parseInt(marketplaceConfig.fee_bp || "0", 10) / 100; const platformFee = platformFeePercent / 100; - const feeGain = nftRoyalty + platformFee; + const feeGain = (royaltyGain || 0) + platformFee; let willReceive = "?"; @@ -52,7 +51,7 @@ export const NFTSellInfo: React.FC<{ return ( <> - Artist Royalty: {trimFixed((nftRoyalty * 100).toFixed(2))}% + Artist Royalty: {trimFixed(((royaltyGain || 0) * 100).toFixed(2))}% Platform Fee: {trimFixed((platformFee * 100).toFixed(2))}% @@ -63,30 +62,3 @@ export const NFTSellInfo: React.FC<{ ); }; - -const useVaultConfig = (networkId: string | undefined) => { - const { data } = useQuery( - ["vaultConfig", networkId], - async () => { - const network = getNetwork(networkId); - - if ( - network?.kind !== NetworkKind.Cosmos || - !network.vaultContractAddress - ) { - return null; - } - - const cosmwasmClient = await mustGetNonSigningCosmWasmClient(network.id); - const vaultClient = new NftMarketplaceQueryClient( - cosmwasmClient, - network.vaultContractAddress, - ); - return await vaultClient.config(); - }, - { - staleTime: Infinity, - }, - ); - return data; -}; diff --git a/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts b/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts index 2dc94f9f73..ccea6a42c8 100644 --- a/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts +++ b/packages/contracts-clients/cw721-membership/Cw721Membership.client.ts @@ -6,7 +6,7 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { StdFee } from "@cosmjs/amino"; -import { InstantiateMsg, ExecuteMsg, ExecMsg, Uint64, Uint128, Binary, MembershipConfig, Coin, QueryMsg, QueryMsg1, AdminFundsResponse, Expiration, Timestamp, AllNftInfoResponseForMetadata, OwnerOfResponse, Approval, NftInfoResponseForMetadata, Metadata, Trait, TokensResponse, ChannelResponse, ChannelFundsResponse, CheckRoyaltiesResponse, Addr, Config, ContractInfoResponse, NumTokensResponse, RoyaltiesInfoResponse, SubscriptionResponse, Subscription } from "./Cw721Membership.types"; +import { InstantiateMsg, ExecuteMsg, ExecMsg, Uint64, Uint128, Binary, MembershipConfig, Coin, QueryMsg, QueryMsg1, Cw2981QueryMsg, AdminFundsResponse, Expiration, Timestamp, AllNftInfoResponseForMetadata, OwnerOfResponse, Approval, NftInfoResponseForMetadata, Metadata, Trait, TokensResponse, Addr, ChannelResponse, ChannelFundsResponse, Config, ContractInfoResponse, Cw2981Response, CheckRoyaltiesResponse, RoyaltiesInfoResponse, NumTokensResponse, SubscriptionResponse, Subscription } from "./Cw721Membership.types"; export interface Cw721MembershipReadOnlyInterface { contractAddress: string; config: () => Promise; @@ -28,14 +28,11 @@ export interface Cw721MembershipReadOnlyInterface { channelAddr: string; subAddr: string; }) => Promise; - royaltyInfo: ({ - salePrice, - tokenId + extension: ({ + msg }: { - salePrice: Uint128; - tokenId: string; - }) => Promise; - checkRoyalties: () => Promise; + msg: Cw2981QueryMsg; + }) => Promise; ownerOf: ({ includeExpired, tokenId @@ -86,8 +83,7 @@ export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterf this.adminFunds = this.adminFunds.bind(this); this.channelFunds = this.channelFunds.bind(this); this.subscription = this.subscription.bind(this); - this.royaltyInfo = this.royaltyInfo.bind(this); - this.checkRoyalties = this.checkRoyalties.bind(this); + this.extension = this.extension.bind(this); this.ownerOf = this.ownerOf.bind(this); this.numTokens = this.numTokens.bind(this); this.contractInfo = this.contractInfo.bind(this); @@ -143,25 +139,17 @@ export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterf } }); }; - royaltyInfo = async ({ - salePrice, - tokenId + extension = async ({ + msg }: { - salePrice: Uint128; - tokenId: string; - }): Promise => { + msg: Cw2981QueryMsg; + }): Promise => { return this.client.queryContractSmart(this.contractAddress, { - royalty_info: { - sale_price: salePrice, - token_id: tokenId + extension: { + msg } }); }; - checkRoyalties = async (): Promise => { - return this.client.queryContractSmart(this.contractAddress, { - check_royalties: {} - }); - }; ownerOf = async ({ includeExpired, tokenId @@ -246,12 +234,27 @@ export class Cw721MembershipQueryClient implements Cw721MembershipReadOnlyInterf export interface Cw721MembershipInterface extends Cw721MembershipReadOnlyInterface { contractAddress: string; sender: string; - upsertChannel: ({ + createChannel: ({ membershipsConfig, - tradeRoyalties + tradeRoyaltiesAddr, + tradeRoyaltiesPer10k }: { membershipsConfig: MembershipConfig[]; - tradeRoyalties: number; + tradeRoyaltiesAddr?: string; + tradeRoyaltiesPer10k: number; + }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; + updateChannel: ({ + id, + membershipsConfig, + owner, + tradeRoyaltiesAddr, + tradeRoyaltiesPer10k + }: { + id: Uint64; + membershipsConfig?: MembershipConfig[]; + owner?: string; + tradeRoyaltiesAddr?: string; + tradeRoyaltiesPer10k?: number; }, fee?: number | StdFee | "auto", memo?: string, _funds?: Coin[]) => Promise; subscribe: ({ channelAddr, @@ -328,7 +331,8 @@ export class Cw721MembershipClient extends Cw721MembershipQueryClient implements this.client = client; this.sender = sender; this.contractAddress = contractAddress; - this.upsertChannel = this.upsertChannel.bind(this); + this.createChannel = this.createChannel.bind(this); + this.updateChannel = this.updateChannel.bind(this); this.subscribe = this.subscribe.bind(this); this.updateConfig = this.updateConfig.bind(this); this.updateChannelMintPlatformFee = this.updateChannelMintPlatformFee.bind(this); @@ -339,17 +343,43 @@ export class Cw721MembershipClient extends Cw721MembershipQueryClient implements this.burn = this.burn.bind(this); } - upsertChannel = async ({ + createChannel = async ({ membershipsConfig, - tradeRoyalties + tradeRoyaltiesAddr, + tradeRoyaltiesPer10k }: { membershipsConfig: MembershipConfig[]; - tradeRoyalties: number; + tradeRoyaltiesAddr?: string; + tradeRoyaltiesPer10k: number; + }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { + return await this.client.execute(this.sender, this.contractAddress, { + create_channel: { + memberships_config: membershipsConfig, + trade_royalties_addr: tradeRoyaltiesAddr, + trade_royalties_per10k: tradeRoyaltiesPer10k + } + }, fee, memo, _funds); + }; + updateChannel = async ({ + id, + membershipsConfig, + owner, + tradeRoyaltiesAddr, + tradeRoyaltiesPer10k + }: { + id: Uint64; + membershipsConfig?: MembershipConfig[]; + owner?: string; + tradeRoyaltiesAddr?: string; + tradeRoyaltiesPer10k?: number; }, fee: number | StdFee | "auto" = "auto", memo?: string, _funds?: Coin[]): Promise => { return await this.client.execute(this.sender, this.contractAddress, { - upsert_channel: { + update_channel: { + id, memberships_config: membershipsConfig, - trade_royalties: tradeRoyalties + owner, + trade_royalties_addr: tradeRoyaltiesAddr, + trade_royalties_per10k: tradeRoyaltiesPer10k } }, fee, memo, _funds); }; diff --git a/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts b/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts index a3fcfdc959..8c8d2497d4 100644 --- a/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts +++ b/packages/contracts-clients/cw721-membership/Cw721Membership.types.ts @@ -8,16 +8,26 @@ export interface InstantiateMsg { admin_addr: string; description: string; image_uri: string; - mint_royalties: number; + mint_royalties_per10k_default: number; name: string; symbol: string; [k: string]: unknown; } export type ExecuteMsg = ExecMsg; export type ExecMsg = { - upsert_channel: { + create_channel: { memberships_config: MembershipConfig[]; - trade_royalties: number; + trade_royalties_addr?: string | null; + trade_royalties_per10k: number; + [k: string]: unknown; + }; +} | { + update_channel: { + id: Uint64; + memberships_config?: MembershipConfig[] | null; + owner?: string | null; + trade_royalties_addr?: string | null; + trade_royalties_per10k?: number | null; [k: string]: unknown; }; } | { @@ -115,13 +125,8 @@ export type QueryMsg1 = { [k: string]: unknown; }; } | { - royalty_info: { - sale_price: Uint128; - token_id: string; - [k: string]: unknown; - }; -} | { - check_royalties: { + extension: { + msg: Cw2981QueryMsg; [k: string]: unknown; }; } | { @@ -163,6 +168,14 @@ export type QueryMsg1 = { [k: string]: unknown; }; }; +export type Cw2981QueryMsg = { + royalty_info: { + sale_price: Uint128; + token_id: string; + }; +} | { + check_royalties: {}; +}; export interface AdminFundsResponse { funds: Coin[]; } @@ -209,23 +222,23 @@ export interface Trait { export interface TokensResponse { tokens: string[]; } +export type Addr = string; export interface ChannelResponse { + id: Uint64; memberships_config: MembershipConfig[]; - mint_royalties: number; - trade_royalties: number; + mint_royalties_per10k: number; + owner_addr: Addr; + trade_royalties_addr: Addr; + trade_royalties_per10k: number; } export interface ChannelFundsResponse { funds: Coin[]; } -export interface CheckRoyaltiesResponse { - royalty_payments: boolean; -} -export type Addr = string; export interface Config { admin_addr: Addr; description: string; image_uri: string; - mint_royalties: number; + mint_royalties_per10k_default: number; name: string; symbol: string; } @@ -233,13 +246,17 @@ export interface ContractInfoResponse { name: string; symbol: string; } -export interface NumTokensResponse { - count: number; +export type Cw2981Response = CheckRoyaltiesResponse | RoyaltiesInfoResponse; +export interface CheckRoyaltiesResponse { + royalty_payments: boolean; } export interface RoyaltiesInfoResponse { address: string; royalty_amount: Uint128; } +export interface NumTokensResponse { + count: number; +} export interface SubscriptionResponse { level: number; subscription?: Subscription | null; diff --git a/packages/hooks/feed/usePremiumChannel.ts b/packages/hooks/feed/usePremiumChannel.ts index dcbf9c7dad..084fceec45 100644 --- a/packages/hooks/feed/usePremiumChannel.ts +++ b/packages/hooks/feed/usePremiumChannel.ts @@ -21,7 +21,7 @@ export const usePremiumChannel = ( } catch (error) { if ( error instanceof Error && - error.message.includes("Channel does not exist") + error.message.includes("This address does not own a channel.") ) { return null; } diff --git a/packages/hooks/marketplace/useCw2981RoyaltyInfo.ts b/packages/hooks/marketplace/useCw2981RoyaltyInfo.ts new file mode 100644 index 0000000000..ad2648f2ee --- /dev/null +++ b/packages/hooks/marketplace/useCw2981RoyaltyInfo.ts @@ -0,0 +1,96 @@ +import { useQuery } from "@tanstack/react-query"; + +import { + Cw2981QueryMsg, + Cw721MembershipQueryClient, +} from "@/contracts-clients/cw721-membership"; +import { mustGetNonSigningCosmWasmClient, parseCollectionId } from "@/networks"; + +const royaltyQueryRange = 1000000; + +export const useCw2981RoyaltyInfo = ( + collectionId: string | undefined, + tokenId: string | undefined, +) => { + return useQuery( + ["cw2981-royalty-info", collectionId, tokenId], + async () => { + if (!collectionId || !tokenId) { + return 0; + } + + const [network, mintContractAddress] = parseCollectionId(collectionId); + if (!network) { + return 0; + } + + const client = await mustGetNonSigningCosmWasmClient(network.id); + + const getRoyaltyGain = async (contractAddress: string) => { + const cwClient = new Cw721MembershipQueryClient( + client, + contractAddress, + ); + let res; + try { + const checkRes = await cwClient.extension({ + msg: { check_royalties: {} }, + }); + if (!("royalty_payments" in checkRes)) { + throw new Error("check_royalties response is invalid"); + } + if (!checkRes.royalty_payments) { + throw new Error("royalties are not supported"); + } + res = await cwClient.extension({ + msg: { + royalty_info: { + token_id: tokenId, + sale_price: royaltyQueryRange.toString(), + }, + }, + }); + } catch (err) { + try { + // early teritori collections use this non-standard query + res = await cwClient.extension({ + msg: { + RoyaltyInfo: { + token_id: tokenId, + sale_price: royaltyQueryRange.toString(), + }, + } as unknown as Cw2981QueryMsg, + }); + } catch { + throw err; + } + } + if (!("royalty_amount" in res) || !res.royalty_amount) { + throw new Error("royalty_info response is invalid"); + } + return +res.royalty_amount / royaltyQueryRange; + }; + + try { + return await getRoyaltyGain(mintContractAddress); + } catch (err) { + if ( + err instanceof Error && + err.message.includes("unknown variant `extension`") + ) { + const conf = await client.queryContractSmart(mintContractAddress, { + config: {}, + }); + + const nftContractAddr = conf.nft_addr || conf.child_contract_addr; + return await getRoyaltyGain(nftContractAddr); + } + throw err; + } + }, + { + enabled: !!collectionId, + staleTime: Infinity, + }, + ); +}; diff --git a/packages/hooks/vault/useVaultConfig.ts b/packages/hooks/marketplace/useMarketplaceConfig.ts similarity index 69% rename from packages/hooks/vault/useVaultConfig.ts rename to packages/hooks/marketplace/useMarketplaceConfig.ts index 726478823d..de8c00df7a 100644 --- a/packages/hooks/vault/useVaultConfig.ts +++ b/packages/hooks/marketplace/useMarketplaceConfig.ts @@ -3,13 +3,16 @@ import { useQuery } from "@tanstack/react-query"; import { NftMarketplaceQueryClient } from "@/contracts-clients/nft-marketplace/NftMarketplace.client"; import { getCosmosNetwork, mustGetNonSigningCosmWasmClient } from "@/networks"; -export const useVaultConfig = (networkId: string) => { - const { data: vaultConfig, ...other } = useQuery( - ["vaultConfig", networkId], +export const useMarketplaceConfig = (networkId: string | undefined) => { + const { data: marketplaceConfig, ...other } = useQuery( + ["marketplace-config", networkId], async () => { + if (!networkId) { + return null; + } const network = getCosmosNetwork(networkId); if (!network?.vaultContractAddress) { - return undefined; + return null; } const cosmwasmClient = await mustGetNonSigningCosmWasmClient(networkId); const client = new NftMarketplaceQueryClient( @@ -20,5 +23,5 @@ export const useVaultConfig = (networkId: string) => { }, { staleTime: Infinity }, ); - return { vaultConfig, ...other }; + return { marketplaceConfig, ...other }; }; diff --git a/packages/networks/teritori-testnet/index.ts b/packages/networks/teritori-testnet/index.ts index 8bbc18d674..3ecfbb1be0 100644 --- a/packages/networks/teritori-testnet/index.ts +++ b/packages/networks/teritori-testnet/index.ts @@ -8,7 +8,7 @@ const nameServiceContractAddress = const premiumFeedFeature: CosmWasmPremiumFeed = { type: NetworkFeature.CosmWasmPremiumFeed, membershipContractAddress: - "tori16w7h5tkkjtr36rpcdg8qv4sfs2e44xcrz6a9eczcslywyfpsynfqyj5pt0", + "tori1rs244rjrhap2v4setxlugkh8ungxlrsh8asvh0trsgvqvplvkd5q7752l6", mintDenom: "utori", }; diff --git a/packages/screens/CoreDAO/CoreDAOScreen.tsx b/packages/screens/CoreDAO/CoreDAOScreen.tsx index 4a934c5b35..3e488a3457 100644 --- a/packages/screens/CoreDAO/CoreDAOScreen.tsx +++ b/packages/screens/CoreDAO/CoreDAOScreen.tsx @@ -16,10 +16,10 @@ import { NftMarketplaceClient } from "@/contracts-clients/nft-marketplace/NftMar import { TeritoriNameServiceQueryClient } from "@/contracts-clients/teritori-name-service/TeritoriNameService.client"; import { useDAOMakeProposal } from "@/hooks/dao/useDAOMakeProposal"; import { useFeedConfig } from "@/hooks/feed/useFeedConfig"; +import { useMarketplaceConfig } from "@/hooks/marketplace/useMarketplaceConfig"; import { useBalances } from "@/hooks/useBalances"; import { useBreedingConfig } from "@/hooks/useBreedingConfig"; import { useSelectedNetworkId } from "@/hooks/useSelectedNetwork"; -import { useVaultConfig } from "@/hooks/vault/useVaultConfig"; import { getCosmosNetwork, getKeplrSigningCosmWasmClient, @@ -141,7 +141,7 @@ const DAOManager: React.FC = () => { const VaultManager: React.FC<{ networkId: string }> = ({ networkId }) => { const network = getCosmosNetwork(networkId); - const { vaultConfig } = useVaultConfig(networkId); + const { marketplaceConfig: vaultConfig } = useMarketplaceConfig(networkId); const vaultBalances = useBalances(networkId, network?.vaultContractAddress); const { wrapWithFeedback } = useFeedbacks(); const selectedWallet = useSelectedWallet(); diff --git a/packages/screens/UserPublicProfile/components/UPPIntro.tsx b/packages/screens/UserPublicProfile/components/UPPIntro.tsx index 2df92a2dad..1e54d37c2d 100644 --- a/packages/screens/UserPublicProfile/components/UPPIntro.tsx +++ b/packages/screens/UserPublicProfile/components/UPPIntro.tsx @@ -21,18 +21,24 @@ import { SocialButton } from "@/components/buttons/SocialButton"; import { SocialButtonSecondary } from "@/components/buttons/SocialButtonSecondary"; import { ProfileButton } from "@/components/hub/ProfileButton"; import { UserAvatarWithFrame } from "@/components/images/AvatarWithFrame"; +import { usePremiumChannel } from "@/hooks/feed/usePremiumChannel"; import { usePremiumIsSubscribed } from "@/hooks/feed/usePremiumIsSubscribed"; -import { useDeveloperMode } from "@/hooks/useDeveloperMode"; import { useMaxResolution } from "@/hooks/useMaxResolution"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; import useSelectedWallet from "@/hooks/useSelectedWallet"; -import { accountExplorerLink, parseUserId } from "@/networks"; +import { + accountExplorerLink, + getNetworkFeature, + NetworkFeature, + parseUserId, +} from "@/networks"; import { DEFAULT_NAME } from "@/utils/social-feed"; import { neutral00, neutral55, neutral77, secondaryColor, + yellowPremium, } from "@/utils/style/colors"; import { fontBold16, fontMedium14, fontSemibold14 } from "@/utils/style/fonts"; import { layout, RESPONSIVE_BREAKPOINT_S } from "@/utils/style/layout"; @@ -50,14 +56,17 @@ export const UPPIntro: React.FC<{ const [network, userAddress] = parseUserId(userId); const { width } = useMaxResolution(); const { width: windowWidth } = useWindowDimensions(); + const { data: premiumChannel } = usePremiumChannel(network?.id, userAddress); + const networkHasPremiumFeature = !!getNetworkFeature( + network?.id, + NetworkFeature.CosmWasmPremiumFeed, + ); const { data: isSubscribed } = usePremiumIsSubscribed( userId, selectedWallet?.userId, ); - const [developerMode] = useDeveloperMode(); - const [subscriptionSetupModalVisible, setSubscriptionSetupModalVisible] = useState(false); const [premiumSubscriptionModalVisible, setPremiumSubscriptionModalVisible] = @@ -148,12 +157,13 @@ export const UPPIntro: React.FC<{ > {isUserOwner ? ( <> - {developerMode && ( + {!!networkHasPremiumFeature && ( <> ) : ( <> - {developerMode && ( + {!!premiumChannel && ( <> {isSubscribed ? ( ) : ( = ({ onItemSelect, }) => { const [isOpen, setIsOpen] = useState(false); + const durationDays = +item?.duration_seconds / (24 * 60 * 60); return ( @@ -53,13 +55,14 @@ export const AccordionSelectComponent: FC = ({ style={{ flexDirection: "row", justifyContent: "space-between", + gap: layout.spacing_x1_5, }} > = ({ width={48} /> - + {item?.display_name || "Tier name"} @@ -105,12 +103,10 @@ export const AccordionSelectComponent: FC = ({ gap: layout.spacing_x1_5, }} > - + + {durationDays} day{durationDays !== 1 ? "s" : ""} + + {prettyPrice(networkId, item?.price.amount, item?.price.denom)} = ({ {isOpen && ( - + {item?.description} )} diff --git a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx index 97923bd272..6de3e3cae3 100644 --- a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx +++ b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionBottom.tsx @@ -70,16 +70,21 @@ export const PremiumSubscriptionBottom: FC<{ }} > - Pay by: + Pay with: @@ -115,11 +119,15 @@ export const PremiumSubscriptionBottom: FC<{ { color: neutral77, lineHeight: 20, textAlign: "right" }, ]} > - Balance:{" "} + Balance: {prettyPrice( diff --git a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx index 134cdf68d3..d758aff880 100644 --- a/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx +++ b/packages/screens/UserPublicProfile/components/modals/PremiumSubscriptionModal.tsx @@ -6,14 +6,14 @@ import { PremiumSubscriptionBottom } from "./PremiumSubscriptionBottom"; import { BrandText } from "@/components/BrandText"; import { PrimaryBox } from "@/components/boxes/PrimaryBox"; -import { RoundedGradientImage } from "@/components/images/RoundedGradientImage"; +import { UserAvatarWithFrame } from "@/components/images/AvatarWithFrame"; import ModalBase from "@/components/modals/ModalBase"; import { SpacerColumn } from "@/components/spacer"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { usePremiumChannel } from "@/hooks/feed/usePremiumChannel"; import { useNSUserInfo } from "@/hooks/useNSUserInfo"; import useSelectedWallet from "@/hooks/useSelectedWallet"; -import { parseUserId } from "@/networks"; +import { getUserId, parseUserId } from "@/networks"; import { mustGetCw721MembershipSigningClient } from "@/utils/feed/client"; import { DEFAULT_NAME } from "@/utils/social-feed"; import { neutral55, neutral77 } from "@/utils/style/colors"; @@ -96,7 +96,10 @@ export const PremiumSubscriptionModal: React.FC<{ - + {metadata?.tokenId ? metadata?.public_name : DEFAULT_NAME} diff --git a/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx b/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx index 4e1eb4640c..39f3e50cb9 100644 --- a/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx +++ b/packages/screens/UserPublicProfile/components/modals/SubscriptionSetupModal.tsx @@ -304,10 +304,18 @@ const SubscriptionSetupForm: React.FC<{ const client = await mustGetCw721MembershipSigningClient( selectedWallet.userId, ); - await client.upsertChannel({ - membershipsConfig: chainTiers, - tradeRoyalties: 800, - }); + + if (channel) { + await client.updateChannel({ + id: channel.id, + membershipsConfig: chainTiers, + }); + } else { + await client.createChannel({ + membershipsConfig: chainTiers, + tradeRoyaltiesPer10k: 800, // 8% default + }); + } onClose(); })} From 6b7a75a34dc79ed4387ccafa133219babf8644df Mon Sep 17 00:00:00 2001 From: sujal-into <155436948+sujal-into@users.noreply.github.com> Date: Fri, 23 Feb 2024 03:11:53 +0545 Subject: [PATCH 15/17] feat: app mode toggle functionality (#949) * preference settings screen added with toggle button to change mode, added the toggle in the normal mode too to change to mini * on value change function edited --- packages/components/navigation/Sidebar.tsx | 29 ++++++++- .../navigation/getMiniModeScreens.tsx | 10 +++ .../Settings/PreferencesSetttingScreen.tsx | 62 +++++++++++++++++++ .../screens/Mini/Settings/SettingsScreen.tsx | 4 ++ packages/utils/navigation.ts | 2 + 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 packages/screens/Mini/Settings/PreferencesSetttingScreen.tsx diff --git a/packages/components/navigation/Sidebar.tsx b/packages/components/navigation/Sidebar.tsx index f343b93dbf..580ecad652 100644 --- a/packages/components/navigation/Sidebar.tsx +++ b/packages/components/navigation/Sidebar.tsx @@ -20,7 +20,7 @@ import { useSelectedNetworkInfo } from "../../hooks/useSelectedNetwork"; import useSelectedWallet from "../../hooks/useSelectedWallet"; import { NetworkFeature, NetworkKind } from "../../networks"; import { neutral00, neutral33 } from "../../utils/style/colors"; -import { fontBold16, fontBold9 } from "../../utils/style/fonts"; +import { fontBold16, fontBold9, fontSemibold14 } from "../../utils/style/fonts"; import { fullSidebarWidth, headerHeight, @@ -28,10 +28,13 @@ import { smallSidebarWidth, } from "../../utils/style/layout"; import { SidebarType } from "../../utils/types/sidebar"; +import { BrandText } from "../BrandText"; +import ToggleButton from "../buttons/ToggleButton"; import { Separator } from "../separators/Separator"; -import { SpacerColumn } from "../spacer"; +import { SpacerColumn, SpacerRow } from "../spacer"; import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; +import { useAppMode } from "@/hooks/useAppMode"; const SpringConfig: WithSpringConfig = { stiffness: 100, @@ -62,6 +65,7 @@ export const Sidebar: React.FC = () => { const insets = useSafeAreaInsets(); const { name: currentRouteName } = useRoute(); const { isSidebarExpanded, dynamicSidebar } = useSidebar(); + const [appMode, handleSet] = useAppMode(); const layoutStyle = useAnimatedStyle( () => ({ @@ -131,6 +135,27 @@ export const Sidebar: React.FC = () => { ListHeaderComponent={} ListFooterComponent={ <> + {Platform.OS !== "web" && ( + + Normal Mode + + { + handleSet("mini"); + }} + /> + + )} { presentation: "transparentModal", }} /> + null, + title: "Settings", + presentation: "transparentModal", + }} + /> = ({ + navigation, +}) => { + const [appMode, handleSet] = useAppMode(); + + const navigateToSettings = () => navigation.replace("MiniSettings"); + + return ( + + + + + + + Mini Mode + + + { + handleSet("web3Addict"); + }} + /> + + + + Disabling this will run your app in web3Addict mode. + + + + + ); +}; diff --git a/packages/screens/Mini/Settings/SettingsScreen.tsx b/packages/screens/Mini/Settings/SettingsScreen.tsx index 2ec1c680ca..93410ecbc3 100644 --- a/packages/screens/Mini/Settings/SettingsScreen.tsx +++ b/packages/screens/Mini/Settings/SettingsScreen.tsx @@ -29,6 +29,10 @@ const settingScreens: { title: string; navigateTo: RouteName }[] = [ title: "Chat Settings", navigateTo: "MiniChatSetting", }, + { + title: "Preferences", + navigateTo: "MiniPreferencesSetting", + }, { title: "About Teritori", navigateTo: "About", diff --git a/packages/utils/navigation.ts b/packages/utils/navigation.ts index c915e7c80e..32e9a23466 100644 --- a/packages/utils/navigation.ts +++ b/packages/utils/navigation.ts @@ -113,6 +113,7 @@ export type RootStackParamList = { MiniFriend: undefined; MiniNewGroup: undefined; MiniChatSetting: { back?: RouteName }; + MiniPreferencesSetting: { back?: RouteName }; MiniSettings: undefined; MiniAccountDetails: { accountName: string; id: string }; MiniAddAccount: undefined; @@ -268,6 +269,7 @@ const navConfig: { MiniFriend: "mini-friend", MiniNewGroup: "mini-new-group", MiniChatSetting: "mini-chat-setting", + MiniPreferencesSetting: "mini-preferences-setting", MiniSettings: "mini-settings", MiniAccountDetails: "mini-account-details", MiniAddAccount: "mini-add-account", From 9342c214c2d076839e658397237c3276b0a71865 Mon Sep 17 00:00:00 2001 From: ChiragPansuriya-iView <134677881+ChiragPansuriya-iView@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:48:34 +0530 Subject: [PATCH 16/17] feat: governance proposal list ui v2 (#980) * fix: governance proposal list ui updated as per figma * fix: lint error fixed * fix: refactoring governance box * fix: color and style change * fix: search functionality added * fix: remove second dropdown and updated UI as per figma * fix: revert victory package changes * fix: removed victory package * fix: dropdown click issue fixed * chore: rename option * fix: replace getKeys to objectKeys in Statesdropdown --------- Co-authored-by: n0izn0iz --- assets/icons/passed.svg | 3 + assets/icons/reject.svg | 3 + assets/icons/voting.svg | 3 + package.json | 1 - .../GovernanceBox/ConfirmationVote.tsx | 113 --- .../GovernanceBox/GovernanceBox.tsx | 475 +++------- .../GovernanceBox/GovernanceExpire.tsx | 66 ++ .../GovernanceBox/GovernanceProgressBar.tsx | 69 ++ .../GovernanceBox/GovernanceTitle.tsx | 59 ++ .../components/sorts/SearchInputRounded.tsx | 47 + .../screens/Governance/GovernanceDetails.tsx | 811 ------------------ .../screens/Governance/GovernanceScreen.tsx | 80 +- .../screens/Governance/NavBarGovernance.tsx | 86 -- .../components/dropdowns/StatesDropdown.tsx | 158 ++++ packages/utils/style/colors.ts | 2 +- packages/utils/types/gov.ts | 32 +- yarn.lock | 3 +- 17 files changed, 584 insertions(+), 1427 deletions(-) create mode 100644 assets/icons/passed.svg create mode 100644 assets/icons/reject.svg create mode 100644 assets/icons/voting.svg delete mode 100644 packages/components/GovernanceBox/ConfirmationVote.tsx create mode 100644 packages/components/GovernanceBox/GovernanceExpire.tsx create mode 100644 packages/components/GovernanceBox/GovernanceProgressBar.tsx create mode 100644 packages/components/GovernanceBox/GovernanceTitle.tsx create mode 100644 packages/components/sorts/SearchInputRounded.tsx delete mode 100644 packages/screens/Governance/GovernanceDetails.tsx delete mode 100644 packages/screens/Governance/NavBarGovernance.tsx create mode 100644 packages/screens/Governance/components/dropdowns/StatesDropdown.tsx diff --git a/assets/icons/passed.svg b/assets/icons/passed.svg new file mode 100644 index 0000000000..542cc79046 --- /dev/null +++ b/assets/icons/passed.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/reject.svg b/assets/icons/reject.svg new file mode 100644 index 0000000000..dda8936c72 --- /dev/null +++ b/assets/icons/reject.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/voting.svg b/assets/icons/voting.svg new file mode 100644 index 0000000000..1dde87532b --- /dev/null +++ b/assets/icons/voting.svg @@ -0,0 +1,3 @@ + + + diff --git a/package.json b/package.json index 87a48c5933..274fa73cca 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,6 @@ "text-encoding-polyfill": "^0.6.7", "tsx": "^4.7.0", "uuid": "^9.0.0", - "victory": "^36.6.12", "victory-native": "^36.6.8", "waveform-data": "^4.3.0", "yaml": "^2.3.4", diff --git a/packages/components/GovernanceBox/ConfirmationVote.tsx b/packages/components/GovernanceBox/ConfirmationVote.tsx deleted file mode 100644 index f4366e0cba..0000000000 --- a/packages/components/GovernanceBox/ConfirmationVote.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import React, { useState } from "react"; -import { View, StyleProp, ViewStyle } from "react-native"; - -import checklogo from "../../../assets/icons/checklogo.svg"; -import { BrandText } from "../../components/BrandText/BrandText"; -import ModalBase from "../../components/modals/ModalBase"; -import { neutral44 } from "../../utils/style/colors"; -import { SVG } from "../SVG"; - -const Separator: React.FC<{ style?: StyleProp }> = ({ style }) => ( - -); - -export const ConfirmationVote: React.FC<{ - visible?: boolean; - onClose: () => void; - numberProposal: string; - vote: string; -}> = ({ visible, onClose, numberProposal, vote }) => { - const [displayConfirmation, setDisplayConfirmation] = useState(visible); - function handleConfirmClick() { - onClose(); - setDisplayConfirmation(false); - } - - return ( - { - handleConfirmClick(); - console.log(displayConfirmation); - }} - label="Successful vote" - visible={displayConfirmation} - width={372} - childrenBottom={ - <> - - - - - - - You have successfully voted{" "} - - {vote} - - - - - - - - on proposal{" "} - - #{numberProposal} - - - - - - } - > - - - - - ); -}; diff --git a/packages/components/GovernanceBox/GovernanceBox.tsx b/packages/components/GovernanceBox/GovernanceBox.tsx index 5cfea70e83..e2e79ea43d 100644 --- a/packages/components/GovernanceBox/GovernanceBox.tsx +++ b/packages/components/GovernanceBox/GovernanceBox.tsx @@ -1,401 +1,130 @@ -import { LinearGradient } from "expo-linear-gradient"; -import React, { Suspense, useState } from "react"; -import { - ColorValue, - DimensionValue, - ScrollView, - TouchableOpacity, - View, -} from "react-native"; - -import { BrandText } from "../../components/BrandText/BrandText"; -import { LegacyTertiaryBox } from "../../components/boxes/LegacyTertiaryBox"; -import { tulipTree } from "../../utils/style/colors"; +import React from "react"; +import { TouchableOpacity, View } from "react-native"; -import { ProposalStatus } from "@/utils/types/gov"; +import { GovernanceExpire } from "./GovernanceExpire"; +import PassedSVG from "../../../assets/icons/passed.svg"; +import RejectSVG from "../../../assets/icons/reject.svg"; +import VotingSVG from "../../../assets/icons/voting.svg"; -// FIXME: code dedup +import { BrandText } from "@/components/BrandText"; +import { GovernanceProgressBar } from "@/components/GovernanceBox/GovernanceProgressBar"; +import { GovernanceTitle } from "@/components/GovernanceBox/GovernanceTitle"; +import { + additionalSuccess, + errorColor, + neutral17, + neutral22, + neutralA3, + primaryColor, + secondaryColor, + withAlpha, +} from "@/utils/style/colors"; +import { fontSemibold14 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; +import { Proposal } from "@/utils/types/gov"; export const GovernanceBox: React.FC<{ - numberProposal: string; - titleProposal: string; - descriptionProposal: string; - votingEndTime: string; - votingStartTime: string; - colorMostVoted: ColorValue | undefined; - percentageYesValue: number; - percentageNoValue: number; - percentageNoWithVetoValue: number; - percentageAbstainValue: number; - votingSubmitTime: string; - votingDepositEndTime: string; - status: ProposalStatus; -}> = ({ - numberProposal, - titleProposal, - descriptionProposal, - votingEndTime, - colorMostVoted, - percentageYesValue, - percentageNoValue, - percentageNoWithVetoValue, - percentageAbstainValue, - votingStartTime, - votingSubmitTime, - votingDepositEndTime, - status, -}) => { - const totalUsers = - percentageYesValue + - percentageNoValue + - percentageNoWithVetoValue + - percentageAbstainValue; - const totalParticipant = totalUsers - percentageAbstainValue; - const percentageTotalParticipant = - ((totalParticipant / totalUsers) * 100).toFixed(2).toString() + "%"; - const [displayGovernanceDetails, setDisplayGovernanceDetails] = - useState(false); - - const test = "%"; - const percentageYes = - ((percentageYesValue / totalUsers) * 100) - .toFixed(2) - .toString() - .substring(0, 5) + test; - const percentageNo = - ((percentageNoValue / totalUsers) * 100) - .toFixed(2) - .toString() - .substring(0, 5) + test; - - const percentageNoWithVeto = ((percentageNoWithVetoValue / totalUsers) * 100) - .toFixed(2) - .toString(); - - let topPercentage; - if (percentageYesValue > percentageNoValue) { - topPercentage = percentageYes; - colorMostVoted = "#16BBFF"; - } else { - topPercentage = percentageNo; - colorMostVoted = tulipTree; - } - - const numberProposalHashtag = "#" + numberProposal; - - function activePopup() { - setDisplayGovernanceDetails(!displayGovernanceDetails); - } - - function activeGovernanceDetailsPopup() { - if (displayGovernanceDetails) { - const GovernanceDetails = React.lazy(() => - import("@/screens/Governance/GovernanceDetails").then((module) => ({ - default: module.GovernanceDetails, - })), - ); - - return ( - }> - activePopup()} - numberProposal={numberProposalHashtag} - titleProposal={titleProposal} - descriptionProposal={descriptionProposal} - totalParticipant={totalParticipant} - percentageTotalParticipant={percentageTotalParticipant} - votingEndTime={votingEndTime} - votingStartTime={votingStartTime} - votingSubmitTime={votingSubmitTime} - votingDepositEndTime={votingDepositEndTime} - percentageYes={percentageYes} - percentageNo={percentageNo} - percentageNoWithVeto={percentageNoWithVeto} - status={status} - /> - - ); - } else { - return <>; - } - } - + proposal: Proposal; +}> = ({ proposal }) => { return ( - - { - activePopup(); + + - {activeGovernanceDetailsPopup()} - - + - {status === "PROPOSAL_STATUS_VOTING" && ( - - - VOTING PERIOD - + {proposal.status === "PROPOSAL_STATUS_VOTING" && ( + + + )} - {status === "PROPOSAL_STATUS_REJECTED" && ( - - - REJECTED - - + {proposal.status === "PROPOSAL_STATUS_REJECTED" && ( + )} - {status === "PROPOSAL_STATUS_PASSED" && ( - - - PASSED - - + {proposal.status === "PROPOSAL_STATUS_PASSED" && ( + )} - - - - {numberProposalHashtag} - - - - {titleProposal} - - - - - - {descriptionProposal} - - - - - - - - - - - - + {"#" + proposal.proposal_id + " " + proposal.content.title} + - - - - Voting End Time - - - - {votingEndTime.slice(0, 10)} - {"\u00A0"} - {votingEndTime.slice(11, 16)} - {"\u00A0"} UTC - - - - - - - - Turnout - - - - {percentageTotalParticipant} - - - - - - - - Most voted on - - - - - - - {topPercentage} - - - - + - - - + + + + + Reviews + + + 35 + + + + ); }; diff --git a/packages/components/GovernanceBox/GovernanceExpire.tsx b/packages/components/GovernanceBox/GovernanceExpire.tsx new file mode 100644 index 0000000000..9808da45d1 --- /dev/null +++ b/packages/components/GovernanceBox/GovernanceExpire.tsx @@ -0,0 +1,66 @@ +import React from "react"; +import { StyleProp, View, ViewStyle } from "react-native"; + +import { BrandText } from "../BrandText/BrandText"; + +import { neutral22, redDefault } from "@/utils/style/colors"; +import { fontSemibold12 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; + +const getExpireDate = (votingEndTime: string): string => { + const currentTime: Date = new Date(); + const endTime: Date = new Date(votingEndTime); + const difference: number = endTime.getTime() - currentTime.getTime(); + const days: number = Math.floor(difference / (1000 * 60 * 60 * 24)); + const hours: number = Math.floor( + (difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), + ); + if (days === 0) { + return `Expires in ${hours}h`; + } else { + return `Expires in ${days}d ${hours}h`; + } +}; + +export const GovernanceExpire: React.FC<{ + style?: StyleProp; + votingEndTime: string; +}> = ({ votingEndTime, style }) => { + return ( + + + + + + {getExpireDate(votingEndTime)} + + + + ); +}; diff --git a/packages/components/GovernanceBox/GovernanceProgressBar.tsx b/packages/components/GovernanceBox/GovernanceProgressBar.tsx new file mode 100644 index 0000000000..171e5996b5 --- /dev/null +++ b/packages/components/GovernanceBox/GovernanceProgressBar.tsx @@ -0,0 +1,69 @@ +import React from "react"; +import { DimensionValue, View } from "react-native"; + +import { + additionalRed, + additionalSuccess, + errorColor, + neutral55, +} from "@/utils/style/colors"; +import { layout } from "@/utils/style/layout"; +import { FinalTallyResult } from "@/utils/types/gov"; + +export const GovernanceProgressBar: React.FC<{ + result: FinalTallyResult; +}> = ({ result }) => { + const percentageYesValue = parseFloat(result.yes); + const percentageNoWithVetoValue = parseFloat(result.no_with_veto); + const percentageNoValue = parseFloat(result.no); + const percentageAbstainValue = parseFloat(result.abstain); + + const totalUsers = + percentageYesValue + + percentageNoValue + + percentageNoWithVetoValue + + percentageAbstainValue; + + const percentageYes: DimensionValue = `${(percentageYesValue / totalUsers) * 100}%`; + const percentageNo: DimensionValue = `${(percentageNoValue / totalUsers) * 100}%`; + const percentageNoWithVeto: DimensionValue = `${(percentageNoWithVetoValue / totalUsers) * 100}%`; + const percentageAbstain: DimensionValue = `${(percentageAbstainValue / totalUsers) * 100}%`; + + return ( + <> + + + + + + + + ); +}; diff --git a/packages/components/GovernanceBox/GovernanceTitle.tsx b/packages/components/GovernanceBox/GovernanceTitle.tsx new file mode 100644 index 0000000000..b6df983e12 --- /dev/null +++ b/packages/components/GovernanceBox/GovernanceTitle.tsx @@ -0,0 +1,59 @@ +import React from "react"; +import { View } from "react-native"; +import { SvgProps } from "react-native-svg"; + +import { BrandText } from "@/components/BrandText"; +import { SVG } from "@/components/SVG"; +import { neutral22, primaryColor } from "@/utils/style/colors"; +import { fontSemibold12 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; + +export const GovernanceTitle: React.FC<{ + titleColor?: string; + borderColor?: string; + title: string; + hasBorder?: boolean; + iconSVG: React.FC; +}> = ({ + titleColor = primaryColor, + title, + hasBorder = false, + iconSVG, + borderColor, +}) => { + return ( + <> + + + + + + {title} + + + + + ); +}; diff --git a/packages/components/sorts/SearchInputRounded.tsx b/packages/components/sorts/SearchInputRounded.tsx new file mode 100644 index 0000000000..7cec5ae339 --- /dev/null +++ b/packages/components/sorts/SearchInputRounded.tsx @@ -0,0 +1,47 @@ +import React from "react"; +import { TextInput, TextStyle } from "react-native"; + +import searchSVG from "../../../assets/icons/search.svg"; +import { fontMedium14 } from "../../utils/style/fonts"; +import { layout } from "../../utils/style/layout"; +import { SVG } from "../SVG"; +import { PrimaryBox } from "../boxes/PrimaryBox"; + +import { neutral33, secondaryColor } from "@/utils/style/colors"; + +export const SearchInputRounded: React.FC<{ + handleChangeSearch: (e: string) => void; +}> = ({ handleChangeSearch }) => { + return ( + + + + + ); +}; diff --git a/packages/screens/Governance/GovernanceDetails.tsx b/packages/screens/Governance/GovernanceDetails.tsx deleted file mode 100644 index f6bfde96ab..0000000000 --- a/packages/screens/Governance/GovernanceDetails.tsx +++ /dev/null @@ -1,811 +0,0 @@ -import { isDeliverTxFailure, MsgVoteEncodeObject } from "@cosmjs/stargate"; -import moment from "moment"; -import React, { useCallback, useState } from "react"; -import { ScrollView, StyleProp, View, ViewStyle } from "react-native"; -import { RadioButton } from "react-native-paper"; -import { VictoryPie } from "victory"; - -import ModalBase from "../../components/modals/ModalBase"; -import useSelectedWallet from "../../hooks/useSelectedWallet"; - -import { BrandText } from "@/components/BrandText"; -import { ConfirmationVote } from "@/components/GovernanceBox/ConfirmationVote"; -import { LegacyTertiaryBox } from "@/components/boxes/LegacyTertiaryBox"; -import { PrimaryButton } from "@/components/buttons/PrimaryButton"; -import { SecondaryButton } from "@/components/buttons/SecondaryButton"; -import { useFeedbacks } from "@/context/FeedbacksProvider"; -import { getKeplrSigningStargateClient } from "@/networks"; -import { neutral44, tulipTree } from "@/utils/style/colors"; -import { ProposalStatus } from "@/utils/types/gov"; - -const Separator: React.FC<{ style?: StyleProp }> = ({ style }) => ( - -); - -export const GovernanceDetails: React.FC<{ - visible?: boolean; - onClose: () => void; - numberProposal: string; - titleProposal: string; - descriptionProposal: string; - totalParticipant: number; - percentageTotalParticipant: string; - votingEndTime: string; - votingStartTime: string; - votingSubmitTime: string; - votingDepositEndTime: string; - percentageYes: string; - percentageNo: string; - percentageNoWithVeto: string; - status: ProposalStatus; -}> = ({ - visible, - onClose, - numberProposal, - titleProposal, - descriptionProposal, - totalParticipant, - percentageTotalParticipant, - votingStartTime, - votingEndTime, - votingSubmitTime, - votingDepositEndTime, - percentageYes, - percentageNo, - percentageNoWithVeto, - status, -}) => { - const [displayVote, setdisplayVote] = useState(false); - const [displayConfirmationVote, setdisplayConfirmationVote] = useState(false); - const [checked, setChecked] = useState("nothingChecked"); - const [displayPopup] = useState(visible); - const { setToastError } = useFeedbacks(); - - function activeVotePopup() { - onClose(); - setdisplayVote(!displayVote); - } - - const valueChartYes = parseInt(percentageYes.replace("%", ""), 10); - const valueChartNo = parseInt(percentageNo.replace("%", ""), 10); - const valueChartAbstain = 100 - valueChartYes - valueChartNo; - - const selectedWallet = useSelectedWallet(); - let voteOption = 0; - - if (checked === "Yes") { - voteOption = 1; - } - - if (checked === "No") { - voteOption = 3; - } - - if (checked === "NoWithVeto") { - voteOption = 4; - } - - if (checked === "Abstain") { - voteOption = 2; - } - - const handlePress = useCallback(async () => { - if (!selectedWallet?.connected || !selectedWallet.address) { - setToastError({ - title: "Wallet Error", - message: "You need to register your teritori wallet", - }); - return; - } - - try { - const client = await getKeplrSigningStargateClient( - selectedWallet.networkId, - ); - - const vote: MsgVoteEncodeObject = { - typeUrl: "/cosmos.gov.v1beta1.MsgVote", - value: { - proposalId: BigInt(numberProposal.substring(1)), - voter: String(selectedWallet.address), - option: voteOption, - }, - }; - const result = await client.signAndBroadcast( - selectedWallet.address, - [vote], - "auto", - ); - if (isDeliverTxFailure(result)) { - setToastError({ - title: "Vote failed", - message: "Transaction failed", - }); - } - } catch (err) { - console.error(err); - if (err instanceof Error) { - setToastError({ - title: "Vote failed", - message: err.message, - }); - } - } - }, [ - numberProposal, - selectedWallet?.address, - selectedWallet?.connected, - selectedWallet?.networkId, - setToastError, - voteOption, - ]); - - function deleteConfirmationVote() { - setdisplayConfirmationVote(false); - setdisplayVote(!displayVote); - } - - function activeConfirmationVotePopup() { - if (displayConfirmationVote && checked !== "nothingChecked") { - return ( - deleteConfirmationVote()} - /> - ); - } else { - return <>; - } - } - - function activeVote() { - setdisplayVote(!displayVote); - } - - const canVoteDeposit = () => moment(votingDepositEndTime).isAfter(moment()); - - return ( - { - activeVotePopup(); - }} - label="Governance Details" - visible={displayPopup} - width={1300} - > - - - - {numberProposal} - - - - - {titleProposal} - - - {status === "PROPOSAL_STATUS_VOTING" && ( - - - VOTING PERIOD - - - )} - {status === "PROPOSAL_STATUS_REJECTED" && ( - - - REJECTED - - - )} - - {status === "PROPOSAL_STATUS_PASSED" && ( - - - PASSED - - - )} - - - - - - Submit Time - - - {votingSubmitTime.slice(0, 10)} - {"\u00A0"} - {votingSubmitTime.slice(11, 16)} - {"\u00A0"} UTC - - - - - - - Deposit End Time - - - {votingDepositEndTime.slice(0, 10)} - {"\u00A0"} - {votingDepositEndTime.slice(11, 16)} - {"\u00A0"} UTC - - - - - - - Voting Start - - - {votingStartTime.slice(0, 10)} - {"\u00A0"} - {votingStartTime.slice(11, 16)} - {"\u00A0"} UTC - - - - - - - Voting End - - - {votingEndTime.slice(0, 10)} - {"\u00A0"} - {votingEndTime.slice(11, 16)} - {"\u00A0"} UTC - - - - - - - - - Total - - - - - {totalParticipant} - - - - - - null} - /> - - - - - Turnout: - - - {percentageTotalParticipant} - - - - - - - Yes {percentageYes} - - - - - - - Yes {percentageNo} - - - - - - - NoWithVeto {percentageNoWithVeto} - - - - - - - NoWithVeto {percentageNoWithVeto} - - - - {canVoteDeposit() && ( - activeVote()} - /> - )} - - - {activeConfirmationVotePopup()} - - setdisplayVote(false)} - label="Your vote" - visible={displayVote} - width={372} - childrenBottom={ - <> - - - - - - - - { - if (checked !== "nothingChecked") { - handlePress(); - activeVotePopup(); - setdisplayConfirmationVote(true); - } - }} - /> - - - - } - > - - {numberProposal} - - - IncreaseMaxValidators=100 to MaxValidators=110 {"\n"} - {"\n"} - - - - - setChecked("Yes")} - /> - - setChecked("No")} - /> - setChecked("NoWithVeto")} - /> - setChecked("Abstain")} - /> - - - - Yes - - - No - - - NoWithVeto - - - Abstain - - - - - - - - - - - - - - - - {descriptionProposal} - - - - - ); -}; diff --git a/packages/screens/Governance/GovernanceScreen.tsx b/packages/screens/Governance/GovernanceScreen.tsx index 68f8c54f95..07c930e8e8 100644 --- a/packages/screens/Governance/GovernanceScreen.tsx +++ b/packages/screens/Governance/GovernanceScreen.tsx @@ -1,20 +1,22 @@ import React, { useEffect, useMemo, useState } from "react"; import { View } from "react-native"; -import { NavBarGovernance } from "./NavBarGovernance"; +import { StatesDropdown } from "./components/dropdowns/StatesDropdown"; +import { GovernanceBox } from "../../components/GovernanceBox/GovernanceBox"; import { BrandText } from "@/components/BrandText"; -import { GovernanceBox } from "@/components/GovernanceBox/GovernanceBox"; import { ScreenContainer } from "@/components/ScreenContainer"; +import { SearchInputRounded } from "@/components/sorts/SearchInputRounded"; import { useSelectedNetworkId } from "@/hooks/useSelectedNetwork"; import { mustGetCosmosNetwork, NetworkKind } from "@/networks"; +import { fontSemibold20, fontSemibold28 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; import { Proposal, ProposalStatus } from "@/utils/types/gov"; -// FIXME: properly handle pagination - export const GovernanceScreen: React.FC = () => { const [proposals, setProposals] = useState([]); const [filter, setFilter] = useState(); + const [searchInput, setSearchInput] = useState(""); const selectedNetworkId = useSelectedNetworkId(); useEffect(() => { @@ -40,43 +42,55 @@ export const GovernanceScreen: React.FC = () => { ); return ( - - Decentralized Governance - - + Decentralized Governance + } + > + + Decentralized Governance + + setSearchInput(text)} + /> + + + - {filteredProposals.map((proposals, index) => ( - - ))} + {filteredProposals + .filter((value) => + value.content.title + .toLowerCase() + .includes(searchInput.toLowerCase()), + ) + .map((proposals) => ( + + ))} ); diff --git a/packages/screens/Governance/NavBarGovernance.tsx b/packages/screens/Governance/NavBarGovernance.tsx deleted file mode 100644 index 67852283f8..0000000000 --- a/packages/screens/Governance/NavBarGovernance.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState } from "react"; -import { TouchableOpacity, View } from "react-native"; - -import { BrandText } from "@/components/BrandText"; -import { neutral33 } from "@/utils/style/colors"; -import { ProposalStatus } from "@/utils/types/gov"; - -const def = { - all: { - name: "All Periods", - filter: undefined, - }, - voting: { - name: "Voting", - filter: "PROPOSAL_STATUS_VOTING", - }, - passed: { - name: "Passed", - filter: "PROPOSAL_STATUS_PASSED", - }, - rejected: { - name: "Rejected", - filter: "PROPOSAL_STATUS_REJECTED", - }, -}; - -export const NavBarGovernance: React.FC<{ - onChange: (filter?: ProposalStatus) => void; -}> = ({ onChange }) => { - const [selected, setSelected] = useState("all"); - - return ( - - - {getKeys(def).map((key) => { - return ( - { - onChange(def[key].filter as any); // FIXME: typing - setSelected(key); - }} - style={{ - height: "100%", - borderRightColor: neutral33, - borderRightWidth: 1, - }} - > - - - {def[key].name} - - - - ); - })} - - - ); -}; - -const getKeys = Object.keys as (obj: T) => (keyof T)[]; diff --git a/packages/screens/Governance/components/dropdowns/StatesDropdown.tsx b/packages/screens/Governance/components/dropdowns/StatesDropdown.tsx new file mode 100644 index 0000000000..9fd8ba53c8 --- /dev/null +++ b/packages/screens/Governance/components/dropdowns/StatesDropdown.tsx @@ -0,0 +1,158 @@ +import React, { useState } from "react"; +import { TouchableOpacity, View, ViewStyle } from "react-native"; + +import chevronDownSVG from "./../../../../../assets/icons/chevron-down.svg"; +import chevronUpSVG from "./../../../../../assets/icons/chevron-up.svg"; + +import { BrandText } from "@/components/BrandText"; +import { SVG } from "@/components/SVG"; +import { Separator } from "@/components/separators/Separator"; +import { SpacerColumn } from "@/components/spacer"; +import { useDropdowns } from "@/hooks/useDropdowns"; +import { neutral33, neutral55, secondaryColor } from "@/utils/style/colors"; +import { fontMedium14, fontSemibold14 } from "@/utils/style/fonts"; +import { layout } from "@/utils/style/layout"; +import { ProposalStatus } from "@/utils/types/gov"; +import { objectKeys } from "@/utils/typescript"; + +const def = { + all: { + name: "All states", + filter: undefined, + }, + voting: { + name: "Voting", + filter: "PROPOSAL_STATUS_VOTING", + }, + passed: { + name: "Passed", + filter: "PROPOSAL_STATUS_PASSED", + }, + rejected: { + name: "Rejected", + filter: "PROPOSAL_STATUS_REJECTED", + }, +}; + +interface StatesDropdownGovProps { + style?: ViewStyle; + onChange: (filter?: ProposalStatus) => void; +} + +export const StatesDropdown = ({ style, onChange }: StatesDropdownGovProps) => { + const [isDropdownOpen, setDropdownState, ref] = useDropdowns(); + const [selected, setSelected] = useState("all"); + + return ( + + + + + isDropdownOpen ? setDropdownState(false) : setDropdownState(true) + } + > + + {def[selected].name} + + + + {isDropdownOpen && ( + + + + {objectKeys(def).map((key, index) => { + return ( + { + onChange(def[key].filter as any); + setSelected(key); + setDropdownState(false); + }} + style={{ + paddingTop: layout.spacing_x1_5, + width: "100%", + }} + > + + {def[key].name} + + + {objectKeys(def).length - 1 !== index && ( + <> + + + + )} + + ); + })} + + )} + + + + ); +}; diff --git a/packages/utils/style/colors.ts b/packages/utils/style/colors.ts index cb2a1c74fc..0df679439d 100644 --- a/packages/utils/style/colors.ts +++ b/packages/utils/style/colors.ts @@ -17,7 +17,6 @@ export const blueDefault = "#007AFF"; export const codGrayColor = "#1C1C1C"; export const mineShaftColor = "#3D3D3D"; export const reefColor = "#D2FFAE"; -export const tulipTree = "#EAA54B"; export const gameHighlight = "#FCEE4F"; export const yankeesBlue = "#16283C"; @@ -44,6 +43,7 @@ export const transparentColor = "transparent"; export const additionalRed = "#FFAEAE"; export const additionalGreen = successColor; +export const additionalSuccess = "#3EBE7B"; export const azureBlue = "#0A84FF"; export const azureBlue20 = "rgba(10, 132, 255, 0.3)"; diff --git a/packages/utils/types/gov.ts b/packages/utils/types/gov.ts index e12bac513f..f3316675b2 100644 --- a/packages/utils/types/gov.ts +++ b/packages/utils/types/gov.ts @@ -3,14 +3,32 @@ export type ProposalStatus = | "PROPOSAL_STATUS_REJECTED" | "PROPOSAL_STATUS_VOTING"; -// FIXME: fully define type +interface Content { + "@type": string; + title: string; + description: string; +} + +export interface FinalTallyResult { + yes: string; + abstain: string; + no: string; + no_with_veto: string; +} + +interface TotalDeposit { + denom: string; + amount: string; +} + export interface Proposal { - content: any; - status: ProposalStatus; proposal_id: string; - final_tally_result: any; - voting_end_time: string; - voting_start_time: string; - deposit_end_time: string; + content: Content; + status: ProposalStatus; + final_tally_result: FinalTallyResult; submit_time: string; + deposit_end_time: string; + total_deposit: TotalDeposit[]; + voting_start_time: string; + voting_end_time: string; } diff --git a/yarn.lock b/yarn.lock index d1ac532048..6c2e12a5e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19161,7 +19161,6 @@ __metadata: tsx: ^4.7.0 typescript: ^5.3.0 uuid: ^9.0.0 - victory: ^36.6.12 victory-native: ^36.6.8 waveform-data: ^4.3.0 yaml: ^2.3.4 @@ -20510,7 +20509,7 @@ __metadata: languageName: node linkType: hard -"victory@npm:^36.6.12, victory@npm:^36.8.2": +"victory@npm:^36.8.2": version: 36.8.2 resolution: "victory@npm:36.8.2" dependencies: From fe0f35dcbd55a406313ecbb40c5ed03603dbe649 Mon Sep 17 00:00:00 2001 From: Sakul Budhathoki Date: Fri, 23 Feb 2024 18:56:55 +0545 Subject: [PATCH 17/17] feat: re-export Shutdown function from wesh module (#992) * feat: re-export Shutdown function from wesh module * fix: transport issue on web; disable WebsocketTransport on web --- .gitignore | 6 +++--- packages/weshnet/client.ts | 2 +- .../src/main/java/expo/modules/weshd/WeshdModule.kt | 8 ++++++-- weshd/index.ts | 4 ++++ weshd/ios/src/WeshdModule.swift | 13 +++++++++---- weshd/src/WeshdModule.web.ts | 1 + 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index ef60fb6bab..a2c570ba73 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,6 @@ web-build/ /cache/ /ios /android -/weshd/ios/Frameworks/ -/weshd/android/libs/ /app-build/ # macOS @@ -93,7 +91,9 @@ substreams-*/target # weshnet -/temp/ +/weshd/ios/Frameworks/ +/weshd/android/libs/ +/weshd/temp/ # eslint /.eslintcache diff --git a/packages/weshnet/client.ts b/packages/weshnet/client.ts index 813efb541d..40ffceab62 100644 --- a/packages/weshnet/client.ts +++ b/packages/weshnet/client.ts @@ -11,7 +11,7 @@ import { afterWeshnetConnectionAction } from "./services"; const createWeshClient = (url: string) => { const rpc = new GrpcWebImpl(url, { debug: false, - transport: grpc.WebsocketTransport(), + transport: Platform.OS === "web" ? undefined : grpc.WebsocketTransport(), }); const client = new ProtocolServiceClientImpl(rpc); diff --git a/weshd/android/src/main/java/expo/modules/weshd/WeshdModule.kt b/weshd/android/src/main/java/expo/modules/weshd/WeshdModule.kt index cf5fef30c6..56108b5ff1 100644 --- a/weshd/android/src/main/java/expo/modules/weshd/WeshdModule.kt +++ b/weshd/android/src/main/java/expo/modules/weshd/WeshdModule.kt @@ -65,11 +65,15 @@ fun getAbsolutePathForWeshDir(context: Context): String { // Defines a JavaScript synchronous function that runs the native code on the JavaScript thread. Function("boot") { -> - val absolutePath = getAbsolutePathForWeshDir(context) - Wesh.boot(absolutePath) + val absolutePath = getAbsolutePathForWeshDir(context) + Wesh.boot(absolutePath) } + Function("shutdown") { -> + Wesh.shutdown() + } + AsyncFunction("getPort") { -> return@AsyncFunction Wesh.getPort() } diff --git a/weshd/index.ts b/weshd/index.ts index e03396acf9..7eeba63748 100644 --- a/weshd/index.ts +++ b/weshd/index.ts @@ -12,6 +12,10 @@ export async function getPort() { return await WeshdModule.getPort(); } +export async function shutdown() { + return await WeshdModule.shutdown(); +} + export async function setValueAsync(value: string) { return await WeshdModule.setValueAsync(value); } diff --git a/weshd/ios/src/WeshdModule.swift b/weshd/ios/src/WeshdModule.swift index 452f0e8e82..406c26047d 100644 --- a/weshd/ios/src/WeshdModule.swift +++ b/weshd/ios/src/WeshdModule.swift @@ -27,11 +27,16 @@ public class WeshdModule: Module { Events("onChange") // Defines a JavaScript synchronous function that runs the native code on the JavaScript thread. - AsyncFunction("boot") { - WeshFramework.WeshBoot(getDocumentsDirectory()) + AsyncFunction("boot") { + WeshFramework.WeshBoot(getDocumentsDirectory()) } - AsyncFunction("getPort") { () -> Int in - return WeshFramework.WeshGetPort() + + AsyncFunction("getPort") { () -> Int in + return WeshFramework.WeshGetPort() + } + + AsyncFunction("shutdown") { + WeshFramework.WeshShutdown() } // Defines a JavaScript function that always returns a Promise and whose native code diff --git a/weshd/src/WeshdModule.web.ts b/weshd/src/WeshdModule.web.ts index 736cb9dbf6..2c20dbedb2 100644 --- a/weshd/src/WeshdModule.web.ts +++ b/weshd/src/WeshdModule.web.ts @@ -12,4 +12,5 @@ export default { const params = new URL(window?.location?.href || ""); return Number(params?.searchParams?.get("weshPort") || 0); }, + shutdown() {}, };