hybrid 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
1
  export * from "./useMinting";
2
2
  export * from "./useTokenGating";
3
+ export * from "./useWallet";
@@ -0,0 +1,5 @@
1
+ type UseWallet = {
2
+ connect: () => void;
3
+ };
4
+ export declare function useWallet(): UseWallet;
5
+ export {};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as w}from"wagmi/providers/alchemy";import{infuraProvider as x}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(w({apiKey:t})),n&&r.push(x({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating};
1
+ import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as x}from"wagmi/providers/alchemy";import{infuraProvider as w}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(x({apiKey:t})),n&&r.push(w({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};function $(){const{useContext:e}=E(),{connect:t}=e();return{connect:t}}export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating,$ as useWallet};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext\n} from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { buildProviders } from \"./helpers\"\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n}\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n useContext: () => WalletConnectorContext\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n wallet?: WalletConnector\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector\n } = props\n\n const chains = SUPPORTED_CHAINS\n const providers = buildProviders(props)\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers\n })\n\n const contextValue = {\n client,\n useContext,\n chains\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\";\nimport { useMinting } from \"../hooks/useMinting\";\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\";\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\";\nimport { DeployedContract } from \"@hybrd/types\";\n\ntype MintButtonProps = {\n className?: string;\n contract: DeployedContract;\n button?: React.FC<DefaultButtonProps>;\n amount?: number;\n};\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props;\n\n const { useContext } = useHybridContext();\n const { connect } = useContext();\n\n const { data: signer } = useSigner();\n const { chain: network } = useNetwork();\n const { switchNetwork } = useSwitchNetwork();\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract });\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n );\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n );\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n );\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n );\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n );\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n );\n};\n\nexport default MintButton;\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts","../src/hooks/useWallet.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\";\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli,\n} from \"wagmi/chains\";\n\nimport React from \"react\";\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext,\n} from \"@hybrd/types\";\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\";\nimport { buildProviders } from \"./helpers\";\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n};\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context);\n}\n\nexport const Web3Context = React.createContext<{\n client: Client;\n chains: any[];\n useContext: () => WalletConnectorContext;\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined,\n});\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost];\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode;\n wallet?: WalletConnector;\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props;\n\n const chains = SUPPORTED_CHAINS;\n const providers = buildProviders(props);\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers,\n });\n\n const contextValue = {\n client,\n useContext,\n chains,\n };\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n );\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\"\nimport { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import { useHybridContext } from \"../providers/Web3Provider\"\n\ntype UseWallet = {\n connect: () => void\n}\n\nexport function useWallet(): UseWallet {\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n return {\n connect,\n }\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useWallet"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as w}from"wagmi/providers/alchemy";import{infuraProvider as x}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(w({apiKey:t})),n&&r.push(x({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating};
1
+ import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as x}from"wagmi/providers/alchemy";import{infuraProvider as w}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(x({apiKey:t})),n&&r.push(w({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};function $(){const{useContext:e}=E(),{connect:t}=e();return{connect:t}}export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating,$ as useWallet};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext\n} from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { buildProviders } from \"./helpers\"\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n}\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n useContext: () => WalletConnectorContext\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n wallet?: WalletConnector\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector\n } = props\n\n const chains = SUPPORTED_CHAINS\n const providers = buildProviders(props)\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers\n })\n\n const contextValue = {\n client,\n useContext,\n chains\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\";\nimport { useMinting } from \"../hooks/useMinting\";\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\";\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\";\nimport { DeployedContract } from \"@hybrd/types\";\n\ntype MintButtonProps = {\n className?: string;\n contract: DeployedContract;\n button?: React.FC<DefaultButtonProps>;\n amount?: number;\n};\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props;\n\n const { useContext } = useHybridContext();\n const { connect } = useContext();\n\n const { data: signer } = useSigner();\n const { chain: network } = useNetwork();\n const { switchNetwork } = useSwitchNetwork();\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract });\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n );\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n );\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n );\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n );\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n );\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n );\n};\n\nexport default MintButton;\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts","../src/hooks/useWallet.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\";\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli,\n} from \"wagmi/chains\";\n\nimport React from \"react\";\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext,\n} from \"@hybrd/types\";\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\";\nimport { buildProviders } from \"./helpers\";\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n};\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context);\n}\n\nexport const Web3Context = React.createContext<{\n client: Client;\n chains: any[];\n useContext: () => WalletConnectorContext;\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined,\n});\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost];\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode;\n wallet?: WalletConnector;\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props;\n\n const chains = SUPPORTED_CHAINS;\n const providers = buildProviders(props);\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers,\n });\n\n const contextValue = {\n client,\n useContext,\n chains,\n };\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n );\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\"\nimport { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import { useHybridContext } from \"../providers/Web3Provider\"\n\ntype UseWallet = {\n connect: () => void\n}\n\nexport function useWallet(): UseWallet {\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n return {\n connect,\n }\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useWallet"],"mappings":"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"}
package/dist/stats.html CHANGED
@@ -6157,7 +6157,7 @@ var drawChart = (function (exports) {
6157
6157
  </script>
6158
6158
  <script>
6159
6159
  /*<!--*/
6160
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers","children":[{"uid":"580e-1","name":"DefaultWalletConnector.tsx"},{"uid":"580e-3","name":"Web3Provider.tsx"},{"uid":"580e-5","name":"helpers.ts"}]},{"name":"components","children":[{"uid":"580e-7","name":"ConnectedAs.tsx"},{"uid":"580e-13","name":"DefaultButton.tsx"},{"uid":"580e-15","name":"MintButton.tsx"},{"uid":"580e-19","name":"TokenGate.tsx"},{"uid":"580e-21","name":"TotalSupply.tsx"}]},{"name":"hooks","children":[{"name":"internal","children":[{"uid":"580e-9","name":"useEnsName.tsx"},{"uid":"580e-23","name":"useAsyncMemo.ts"}]},{"uid":"580e-11","name":"useMinting.ts"},{"uid":"580e-17","name":"useTokenGating.ts"}]}]}]}],"isRoot":true},"nodeParts":{"580e-1":{"renderedLength":599,"gzipLength":0,"brotliLength":0,"metaUid":"580e-0"},"580e-3":{"renderedLength":1085,"gzipLength":0,"brotliLength":0,"metaUid":"580e-2"},"580e-5":{"renderedLength":464,"gzipLength":0,"brotliLength":0,"metaUid":"580e-4"},"580e-7":{"renderedLength":799,"gzipLength":0,"brotliLength":0,"metaUid":"580e-6"},"580e-9":{"renderedLength":351,"gzipLength":0,"brotliLength":0,"metaUid":"580e-8"},"580e-11":{"renderedLength":1451,"gzipLength":0,"brotliLength":0,"metaUid":"580e-10"},"580e-13":{"renderedLength":579,"gzipLength":0,"brotliLength":0,"metaUid":"580e-12"},"580e-15":{"renderedLength":1409,"gzipLength":0,"brotliLength":0,"metaUid":"580e-14"},"580e-17":{"renderedLength":1205,"gzipLength":0,"brotliLength":0,"metaUid":"580e-16"},"580e-19":{"renderedLength":928,"gzipLength":0,"brotliLength":0,"metaUid":"580e-18"},"580e-21":{"renderedLength":687,"gzipLength":0,"brotliLength":0,"metaUid":"580e-20"},"580e-23":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"580e-22"}},"nodeMetas":{"580e-0":{"id":"/src/providers/DefaultWalletConnector.tsx","moduleParts":{"index.mjs":"580e-1"},"imported":[{"uid":"580e-29"},{"uid":"580e-30"}],"importedBy":[{"uid":"580e-2"}]},"580e-2":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"580e-3"},"imported":[{"uid":"580e-29"},{"uid":"580e-30"},{"uid":"580e-31"},{"uid":"580e-32"},{"uid":"580e-0"},{"uid":"580e-4"}],"importedBy":[{"uid":"580e-24"},{"uid":"580e-14"},{"uid":"580e-18"}]},"580e-4":{"id":"/src/providers/helpers.ts","moduleParts":{"index.mjs":"580e-5"},"imported":[{"uid":"580e-33"},{"uid":"580e-34"},{"uid":"580e-35"}],"importedBy":[{"uid":"580e-2"}]},"580e-6":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"580e-7"},"imported":[{"uid":"580e-29"},{"uid":"580e-28"},{"uid":"580e-36"},{"uid":"580e-37"},{"uid":"580e-30"}],"importedBy":[{"uid":"580e-25"}]},"580e-8":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"580e-9"},"imported":[{"uid":"580e-30"},{"uid":"580e-32"}],"importedBy":[{"uid":"580e-37"}]},"580e-10":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"580e-11"},"imported":[{"uid":"580e-38"},{"uid":"580e-32"},{"uid":"580e-30"}],"importedBy":[{"uid":"580e-26"},{"uid":"580e-14"}]},"580e-12":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"580e-13"},"imported":[{"uid":"580e-29"},{"uid":"580e-36"},{"uid":"580e-39"}],"importedBy":[{"uid":"580e-14"},{"uid":"580e-18"}]},"580e-14":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"580e-15"},"imported":[{"uid":"580e-29"},{"uid":"580e-2"},{"uid":"580e-10"},{"uid":"580e-30"},{"uid":"580e-12"}],"importedBy":[{"uid":"580e-25"}]},"580e-16":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"580e-17"},"imported":[{"uid":"580e-32"},{"uid":"580e-30"}],"importedBy":[{"uid":"580e-26"},{"uid":"580e-18"}]},"580e-18":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"580e-19"},"imported":[{"uid":"580e-29"},{"uid":"580e-30"},{"uid":"580e-16"},{"uid":"580e-12"},{"uid":"580e-2"}],"importedBy":[{"uid":"580e-25"}]},"580e-20":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"580e-21"},"imported":[{"uid":"580e-29"},{"uid":"580e-30"},{"uid":"580e-22"}],"importedBy":[{"uid":"580e-25"}]},"580e-22":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"580e-23"},"imported":[{"uid":"580e-32"}],"importedBy":[{"uid":"580e-20"},{"uid":"580e-37"}]},"580e-24":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"580e-2"},{"uid":"580e-25"},{"uid":"580e-26"},{"uid":"580e-27"},{"uid":"580e-28"}],"importedBy":[],"isEntry":true},"580e-25":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"580e-6"},{"uid":"580e-14"},{"uid":"580e-18"},{"uid":"580e-20"}],"importedBy":[{"uid":"580e-24"}]},"580e-26":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"580e-10"},{"uid":"580e-16"}],"importedBy":[{"uid":"580e-24"}]},"580e-27":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-24"}],"isExternal":true},"580e-28":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-24"},{"uid":"580e-6"}],"isExternal":true},"580e-29":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-2"},{"uid":"580e-0"},{"uid":"580e-6"},{"uid":"580e-14"},{"uid":"580e-18"},{"uid":"580e-20"},{"uid":"580e-12"}],"isExternal":true},"580e-30":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-2"},{"uid":"580e-0"},{"uid":"580e-6"},{"uid":"580e-14"},{"uid":"580e-18"},{"uid":"580e-20"},{"uid":"580e-10"},{"uid":"580e-16"},{"uid":"580e-8"}],"isExternal":true},"580e-31":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-2"}],"isExternal":true},"580e-32":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-2"},{"uid":"580e-10"},{"uid":"580e-16"},{"uid":"580e-22"},{"uid":"580e-8"}],"isExternal":true},"580e-33":{"id":"wagmi/providers/alchemy","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-4"}],"isExternal":true},"580e-34":{"id":"wagmi/providers/infura","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-4"}],"isExternal":true},"580e-35":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-4"}],"isExternal":true},"580e-36":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-6"},{"uid":"580e-12"}],"isExternal":true},"580e-37":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"580e-22"},{"uid":"580e-8"}],"importedBy":[{"uid":"580e-6"}]},"580e-38":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-10"}],"isExternal":true},"580e-39":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"580e-12"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
6160
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers","children":[{"uid":"b622-43","name":"DefaultWalletConnector.tsx"},{"uid":"b622-45","name":"Web3Provider.tsx"},{"uid":"b622-47","name":"helpers.ts"}]},{"name":"components","children":[{"uid":"b622-49","name":"ConnectedAs.tsx"},{"uid":"b622-55","name":"DefaultButton.tsx"},{"uid":"b622-57","name":"MintButton.tsx"},{"uid":"b622-61","name":"TokenGate.tsx"},{"uid":"b622-63","name":"TotalSupply.tsx"}]},{"name":"hooks","children":[{"name":"internal","children":[{"uid":"b622-51","name":"useEnsName.tsx"},{"uid":"b622-65","name":"useAsyncMemo.ts"}]},{"uid":"b622-53","name":"useMinting.ts"},{"uid":"b622-59","name":"useTokenGating.ts"},{"uid":"b622-67","name":"useWallet.ts"}]}]}]}],"isRoot":true},"nodeParts":{"b622-43":{"renderedLength":599,"gzipLength":0,"brotliLength":0,"metaUid":"b622-42"},"b622-45":{"renderedLength":1089,"gzipLength":0,"brotliLength":0,"metaUid":"b622-44"},"b622-47":{"renderedLength":464,"gzipLength":0,"brotliLength":0,"metaUid":"b622-46"},"b622-49":{"renderedLength":799,"gzipLength":0,"brotliLength":0,"metaUid":"b622-48"},"b622-51":{"renderedLength":351,"gzipLength":0,"brotliLength":0,"metaUid":"b622-50"},"b622-53":{"renderedLength":1451,"gzipLength":0,"brotliLength":0,"metaUid":"b622-52"},"b622-55":{"renderedLength":579,"gzipLength":0,"brotliLength":0,"metaUid":"b622-54"},"b622-57":{"renderedLength":1409,"gzipLength":0,"brotliLength":0,"metaUid":"b622-56"},"b622-59":{"renderedLength":1205,"gzipLength":0,"brotliLength":0,"metaUid":"b622-58"},"b622-61":{"renderedLength":928,"gzipLength":0,"brotliLength":0,"metaUid":"b622-60"},"b622-63":{"renderedLength":687,"gzipLength":0,"brotliLength":0,"metaUid":"b622-62"},"b622-65":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"b622-64"},"b622-67":{"renderedLength":146,"gzipLength":0,"brotliLength":0,"metaUid":"b622-66"}},"nodeMetas":{"b622-42":{"id":"/src/providers/DefaultWalletConnector.tsx","moduleParts":{"index.mjs":"b622-43"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-44"}]},"b622-44":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"b622-45"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-75"},{"uid":"b622-76"},{"uid":"b622-42"},{"uid":"b622-46"}],"importedBy":[{"uid":"b622-68"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-66"}]},"b622-46":{"id":"/src/providers/helpers.ts","moduleParts":{"index.mjs":"b622-47"},"imported":[{"uid":"b622-77"},{"uid":"b622-78"},{"uid":"b622-79"}],"importedBy":[{"uid":"b622-44"}]},"b622-48":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"b622-49"},"imported":[{"uid":"b622-73"},{"uid":"b622-72"},{"uid":"b622-80"},{"uid":"b622-81"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-69"}]},"b622-50":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"b622-51"},"imported":[{"uid":"b622-74"},{"uid":"b622-76"}],"importedBy":[{"uid":"b622-81"}]},"b622-52":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"b622-53"},"imported":[{"uid":"b622-82"},{"uid":"b622-76"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-70"},{"uid":"b622-56"}]},"b622-54":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"b622-55"},"imported":[{"uid":"b622-73"},{"uid":"b622-80"},{"uid":"b622-83"}],"importedBy":[{"uid":"b622-56"},{"uid":"b622-60"}]},"b622-56":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"b622-57"},"imported":[{"uid":"b622-73"},{"uid":"b622-44"},{"uid":"b622-52"},{"uid":"b622-74"},{"uid":"b622-54"}],"importedBy":[{"uid":"b622-69"}]},"b622-58":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"b622-59"},"imported":[{"uid":"b622-76"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-70"},{"uid":"b622-60"}]},"b622-60":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"b622-61"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-58"},{"uid":"b622-54"},{"uid":"b622-44"}],"importedBy":[{"uid":"b622-69"}]},"b622-62":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"b622-63"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-64"}],"importedBy":[{"uid":"b622-69"}]},"b622-64":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"b622-65"},"imported":[{"uid":"b622-76"}],"importedBy":[{"uid":"b622-62"},{"uid":"b622-81"}]},"b622-66":{"id":"/src/hooks/useWallet.ts","moduleParts":{"index.mjs":"b622-67"},"imported":[{"uid":"b622-44"}],"importedBy":[{"uid":"b622-70"}]},"b622-68":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"b622-44"},{"uid":"b622-69"},{"uid":"b622-70"},{"uid":"b622-71"},{"uid":"b622-72"}],"importedBy":[],"isEntry":true},"b622-69":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"}],"importedBy":[{"uid":"b622-68"}]},"b622-70":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-66"}],"importedBy":[{"uid":"b622-68"}]},"b622-71":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-68"}],"isExternal":true},"b622-72":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-68"},{"uid":"b622-48"}],"isExternal":true},"b622-73":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-42"},{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"},{"uid":"b622-54"}],"isExternal":true},"b622-74":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-42"},{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"},{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-50"}],"isExternal":true},"b622-75":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"}],"isExternal":true},"b622-76":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-64"},{"uid":"b622-50"}],"isExternal":true},"b622-77":{"id":"wagmi/providers/alchemy","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-78":{"id":"wagmi/providers/infura","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-79":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-80":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-48"},{"uid":"b622-54"}],"isExternal":true},"b622-81":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"b622-64"},{"uid":"b622-50"}],"importedBy":[{"uid":"b622-48"}]},"b622-82":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-52"}],"isExternal":true},"b622-83":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-54"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
6161
6161
 
6162
6162
  const run = () => {
6163
6163
  const width = window.innerWidth;
@@ -6175,8 +6175,3 @@ var drawChart = (function (exports) {
6175
6175
  </body>
6176
6176
  </html>
6177
6177
 
6178
- /*-->*/
6179
- </script>
6180
- </body>
6181
- </html>
6182
-
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hybrid",
3
3
  "author": "IanH <ian@ianh.xyz>",
4
- "version": "0.5.0",
4
+ "version": "0.5.1",
5
5
  "description": "Solidity + TypeScript Framework for Web3 Development",
6
6
  "keywords": [
7
7
  "hybrid",
@@ -60,10 +60,10 @@
60
60
  },
61
61
  "dependencies": {
62
62
  "@ethersproject/providers": "^5.7.1",
63
- "@hybrd/cli": "^0.5.0",
64
- "@hybrd/contracts": "^0.5.0",
65
- "@hybrd/types": "^0.5.0",
66
- "@hybrd/utils": "^0.5.0",
63
+ "@hybrd/cli": "^0.5.1",
64
+ "@hybrd/contracts": "^0.5.1",
65
+ "@hybrd/types": "^0.5.1",
66
+ "@hybrd/utils": "^0.5.1",
67
67
  "@testing-library/react-hooks": "^8.0.1",
68
68
  "abitype": "^0.7.1",
69
69
  "axios": "^1.2.2",
@@ -108,7 +108,7 @@
108
108
  "typescript": "^4.7.4",
109
109
  "vi-fetch": "^0.8.0",
110
110
  "vite": "^4.0.4",
111
- "vitest": "^0.23.0",
111
+ "vitest": "^0.29.8",
112
112
  "vitest-fetch-mock": "^0.2.1",
113
113
  "wagmi": "^0.12.1"
114
114
  },
@@ -118,5 +118,5 @@
118
118
  "react-dom": ">=17",
119
119
  "wagmi": "^0.12.1"
120
120
  },
121
- "gitHead": "1cf73399069af826bc49b8061ae6809096920d0f"
121
+ "gitHead": "5cf8f3193dcdf9168270a472c194286a430f007d"
122
122
  }