hybrid 0.4.1 → 0.4.3

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,8 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  import { DeployedContract } from "@hybrd/types";
3
- type MintButtonProps = {
3
+ type TotalSupplyProps = {
4
4
  className?: string;
5
5
  contract: DeployedContract;
6
6
  };
7
- declare const MintButton: (props: MintButtonProps) => JSX.Element;
8
- export default MintButton;
7
+ declare const TotalSupply: (props: TotalSupplyProps) => JSX.Element;
8
+ export default TotalSupply;
@@ -4,7 +4,6 @@ type UseMinting = {
4
4
  isMinting: boolean;
5
5
  isSuccess: boolean;
6
6
  isError: boolean;
7
- totalSupply: number | undefined;
8
7
  mint: (amount: number) => Promise<TransactionReceipt | undefined>;
9
8
  };
10
9
  type Props = {
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{WagmiConfig as r,useProvider as c,useAccount as o,useConnect as a,useNetwork as s,useBlockNumber as i,useSigner as l,useContract as u,useSwitchNetwork as d}from"wagmi";import{mainnet as h,goerli as m,arbitrum as f,arbitrumGoerli as p,localhost as B}from"wagmi/chains";import D,{useContext as b,useState as g,useEffect as y,useCallback as N}from"react";import{etherscanAddressURL as w,truncateEthAddress as _}from"@hybrd/utils";export*from"@hybrd/utils";import v from"clsx";import{BigNumber as k,Wallet as x,utils as I}from"ethers";export*from"@hybrd/types";function C(){return b(S)}const S=D.createContext({client:void 0,chains:void 0}),P=[h,m,f,p,B];function E(e){console.log({props:e});const{children:n,wallet:c}=e,o=P,{client:a,Provider:s}=c({chains:o}),i={client:a,chains:o};return t(S.Provider,{value:i,children:t(r,{client:a,children:t(s,{children:n})})})}function M(n){const{className:r,chainId:i}=n,{address:l,isConnected:u}=o(),{connect:d,connectors:h}=a(),{chain:m}=s(),f=function(t){const[e,n]=g(),r=c({chainId:1});return y((()=>{t&&r.lookupAddress(t).then(n)}),[name,r]),e}(l);return e("p",{className:v(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&t("button",{onClick:()=>d({connector:h[0]}),children:"Connect Wallet"}),u&&e("span",{className:"",children:["connected as"," ",t("a",{href:w(l,i||m.id),className:v(r,"underline"),target:"_blank",rel:"noreferrer",children:f||_(l)})]})]})}const K=t=>{const{contract:e}=t,n=e?.chainId,r=c({chainId:n}),{data:o}=i(),{data:a}=l({chainId:n}),[s,d]=g(!1),[h,m]=g(!1),[f,p]=g(!1),B=u({address:e?.address,abi:e?.abi});return{isMinting:s,isSuccess:h,isError:f,totalSupply:function(t,e,n){const[r,c]=g(n);return y((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||c(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(B)return B.connect(r).totalSupply().then((t=>t.toNumber()))}),[B,o]),mint:N((async(t,e={})=>{if(!B)return;d(!0);const{value:n=k.from("0"),gasPrice:r}=e;return B.connect(a).mint(t,{value:n,gasPrice:r}).then((t=>t.wait())).then((t=>(m(!0),setTimeout((()=>m(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[a,B,n])}};var L={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 O={default:L.DefaultButtonBase,success:L.DefaultButtonSuccess,error:L.DefaultButtonError},T=e=>{const{className:n=L.DefaultButton,intent:r="default",onClick:c,children:o,disabled:a}=e;return t("button",{className:v(n,O[r],a&&L.DefaultButtonDisabled),onClick:c,children:o})},j=e=>{const{amount:n=1,button:r=T,className:c,contract:o}=e,{data:i}=l(),{connect:u,connectors:h}=a(),{chain:m}=s(),{switchNetwork:f}=d(),{isMinting:p,isSuccess:B,isError:D,mint:b}=K({contract:o});if(p)return t(r,{disabled:!0,className:c,children:"Minting"});if(B)return t(r,{disabled:!0,className:c,intent:"success",children:"Minted"});if(D)return t(r,{disabled:!0,className:c,intent:"error",children:"Error Occurred"});if(!i){const e=h[0];return t(r,{className:c,onClick:()=>u({connector:e}),children:"Connect Wallet"})}return t(r,m?.id!==o?.chainId&&f?{onClick:()=>f(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>b(n),children:"Mint Now"})};function A(t){const{address:e,contract:n}=t,r=n?.chainId,o=c({chainId:r}),[a,s]=g(!0),[i,l]=g(),[d,h]=g(),m=u({address:n?.address,abi:n?.abi});return y((()=>{n||(s(!1),l(!1),h(!0)),m&&m.connect(o).balanceOf(e).then((t=>t.toNumber())).then((t=>{console.log({allow:t}),l(t),h(!t)})).catch((t=>{console.error(t),l(!1),h(!0)})).finally((()=>s(!1)))}),[e,n]),{isLoading:a,address:e,allow:i,deny:d}}const G=({children:e,contract:r,loading:c=t("p",{children:"Loading"}),deny:a=t("p",{children:"You must own a token to view this content."})})=>{const{address:s}=o(),{isLoading:i,allow:l}=A({address:s,contract:r});return t(n,{children:i?c:l?e:a})},R=e=>{const{className:n,contract:r}=e,{totalSupply:c}=K({contract:r});return t("span",{className:n,children:c})},U=()=>{const[t,e]=g();return i({watch:!0,onBlock:e}),t};function W(t){const{deployData:e,chainId:n}=t,r=c({chainId:n}),o=U(),[a,s]=g({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),i=N((t=>"function"==typeof e?e(t):e),[e]);return y((()=>{const{address:t}=x.createRandom(),e=i(r);e&&async function(t,e){const n=await t.estimateGas(e),r=await t.getGasPrice(),c=n.mul(r),o=parseFloat(I.formatUnits(c,"ether"));return{gas:n,gasPrice:r,wei:c,eth:o}}(r,{data:e,from:t}).then(s).catch((t=>{console.error("useEstimation",t)}))}),[o,r,n,i]),a}export{M as ConnectedAs,j as MintButton,G as TokenGate,R as TotalSupply,E as Web3Provider,W as useEstimation,C as useHybrid,K as useMinting,A as useTokenGating};
1
+ import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{WagmiConfig as r,useProvider as c,useAccount as o,useConnect as a,useNetwork as s,useSigner as i,useContract as l,useSwitchNetwork as u,useBlockNumber as d}from"wagmi";import{mainnet as h,goerli as m,arbitrum as f,arbitrumGoerli as p,localhost as B}from"wagmi/chains";import D,{useContext as b,useState as g,useEffect as N,useCallback as w}from"react";import{etherscanAddressURL as y,truncateEthAddress as _}from"@hybrd/utils";export*from"@hybrd/utils";import v from"clsx";import{BigNumber as I,Wallet as k,utils as x}from"ethers";export*from"@hybrd/types";function C(){return b(P)}const P=D.createContext({client:void 0,chains:void 0}),E=[h,m,f,p,B];function S(e){console.log({props:e});const{children:n,wallet:c}=e,o=E,{client:a,Provider:s}=c({chains:o}),i={client:a,chains:o};return t(P.Provider,{value:i,children:t(r,{client:a,children:t(s,{children:n})})})}function M(n){const{className:r,chainId:i}=n,{address:l,isConnected:u}=o(),{connect:d,connectors:h}=a(),{chain:m}=s(),f=function(t){const[e,n]=g(),r=c({chainId:1});return N((()=>{t&&r.lookupAddress(t).then(n)}),[name,r]),e}(l);return e("p",{className:v(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&t("button",{onClick:()=>d({connector:h[0]}),children:"Connect Wallet"}),u&&e("span",{className:"",children:["connected as"," ",t("a",{href:y(l,i||m.id),className:v(r,"underline"),target:"_blank",rel:"noreferrer",children:f||_(l)})]})]})}const K=t=>{const{contract:e}=t,n=e?.chainId,{data:r}=i({chainId:n}),[c,o]=g(!1),[a,s]=g(!1),[u,d]=g(!1),h=l({address:e?.address,abi:e?.abi});return{isMinting:c,isSuccess:a,isError:u,mint:w((async(t,e={})=>{if(!h)return;o(!0);const{value:n=I.from("0"),gasPrice:c}=e;return h.connect(r).mint(t,{value:n,gasPrice:c}).then((t=>t.wait())).then((t=>(s(!0),setTimeout((()=>s(!1)),3e3),t))).catch((t=>{console.error(t),d(!0),setTimeout((()=>d(!1)),1e3)})).finally((()=>o(!1)))}),[r,h,n])}};var L={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 O={default:L.DefaultButtonBase,success:L.DefaultButtonSuccess,error:L.DefaultButtonError},j=e=>{const{className:n=L.DefaultButton,intent:r="default",onClick:c,children:o,disabled:a}=e;return t("button",{className:v(n,O[r],a&&L.DefaultButtonDisabled),onClick:c,children:o})},A=e=>{const{amount:n=1,button:r=j,className:c,contract:o}=e,{data:l}=i(),{connect:d,connectors:h}=a(),{chain:m}=s(),{switchNetwork:f}=u(),{isMinting:p,isSuccess:B,isError:D,mint:b}=K({contract:o});if(p)return t(r,{disabled:!0,className:c,children:"Minting"});if(B)return t(r,{disabled:!0,className:c,intent:"success",children:"Minted"});if(D)return t(r,{disabled:!0,className:c,intent:"error",children:"Error Occurred"});if(!l){const e=h[0];return t(r,{className:c,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(r,m?.id!==o?.chainId&&f?{onClick:()=>f(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>b(n),children:"Mint Now"})};function G(t){const{address:e,contract:n}=t,r=n?.chainId,o=c({chainId:r}),[a,s]=g(!0),[i,u]=g(),[d,h]=g(),m=l({address:n?.address,abi:n?.abi});return N((()=>{n||(s(!1),u(!1),h(!0)),m&&m.connect(o).balanceOf(e).then((t=>t.toNumber())).then((t=>{console.log({allow:t}),u(t),h(!t)})).catch((t=>{console.error(t),u(!1),h(!0)})).finally((()=>s(!1)))}),[e,n]),{isLoading:a,address:e,allow:i,deny:d}}const R=({children:e,contract:r,loading:c=t("p",{children:"Loading"}),deny:a=t("p",{children:"You must own a token to view this content."})})=>{const{address:s}=o(),{isLoading:i,allow:l}=G({address:s,contract:r});return t(n,{children:i?c:l?e:a})},T=e=>{const{className:n,contract:r}=e,o=r?.chainId,a=c({chainId:o}),{data:s}=d(),i=l({address:r?.address,abi:r?.abi}),u=function(t,e,n){const[r,c]=g(n);return N((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||c(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(i)return i.connect(a).totalSupply().then((t=>t.toNumber()))}),[i,s]);return t("span",{className:n,children:u})},U=()=>{const[t,e]=g();return d({watch:!0,onBlock:e}),t};function W(t){const{deployData:e,chainId:n}=t,r=c({chainId:n}),o=U(),[a,s]=g({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),i=w((t=>"function"==typeof e?e(t):e),[e]);return N((()=>{const{address:t}=k.createRandom(),e=i(r);e&&async function(t,e){const n=await t.estimateGas(e),r=await t.getGasPrice(),c=n.mul(r),o=parseFloat(x.formatUnits(c,"ether"));return{gas:n,gasPrice:r,wei:c,eth:o}}(r,{data:e,from:t}).then(s).catch((t=>{console.error("useEstimation",t)}))}),[o,r,n,i]),a}export{M as ConnectedAs,A as MintButton,R as TokenGate,T as TotalSupply,S as Web3Provider,W as useEstimation,C as useHybrid,K as useMinting,G as useTokenGating};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/providers/Web3Provider.tsx","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React, { useContext, useMemo } from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport { WalletConnector } from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\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 useHybrid() {\n return useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n // provider: ({ chainId }: { chainId?: number }) => Provider\n // webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined\n // provider: undefined,\n // webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(props: {\n children: React.ReactNode\n wallet: WalletConnector\n}) {\n console.log({ props })\n\n const { children, wallet: createDefaultWalletConnector } = props\n const chains = SUPPORTED_CHAINS\n\n // const { chains, provider, webSocketProvider } = useMemo(() => {\n // const { chains, provider, webSocketProvider } = configureChains(\n // SUPPORTED_CHAINS,\n // buildProviders(keys)\n // )\n // return { chains, provider, webSocketProvider }\n // }, [keys])\n\n const { client, Provider } = createDefaultWalletConnector({\n chains\n })\n\n // const { client, Provider } = useMemo(\n // () =>\n // createDefaultWalletConnector({\n // chains\n // }),\n // []\n // )\n\n const contextValue = {\n client,\n chains\n // provider,\n // webSocketProvider\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 { 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 { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\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 provider = useProvider({ chainId })\n\n const { data: block } = useBlockNumber()\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 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 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 totalSupply,\n mint\n }\n}\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 clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\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 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 >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, 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 const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\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 const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\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 console.log({ 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\"\n\ntype Props = {\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n children,\n contract,\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 { isLoading, allow } = useTokenGating({ address, contract })\n\n return <>{isLoading ? loadingComponent : allow ? children : denyComponent}</>\n}\n\nexport default TokenGate\n","import { useMinting } from \"../hooks/useMinting\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const { className, contract } = props\n const { totalSupply } = useMinting({ contract })\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default MintButton\n","import { BigNumber, ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider.estimateGas(tx)\n const gasPrice = await provider.getGasPrice()\n const wei = gas.mul(gasPrice)\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["useHybrid","useContext","Web3Context","React","createContext","client","undefined","chains","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","console","log","children","wallet","createDefaultWalletConnector","Provider","contextValue","_jsx","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","connect","connectors","useConnect","chain","network","useNetwork","ens","setENS","useState","provider","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","connector","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","block","useBlockNumber","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","totalSupply","factory","deps","initial","val","setVal","cancel","promise","catch","error","useAsyncMemo","res","toNumber","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","TokenGate","loading","loadingComponent","denyComponent","useBlockBeat","setBlock","watch","onBlock","useEstimation","deployData","estimate","setEstimate","gas","wei","eth","buildData","Wallet","createRandom","estimateGas","getGasPrice","mul","parseFloat","utils","formatUnits","getEstimate"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/providers/Web3Provider.tsx","../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/useEstimation.ts"],"sourcesContent":["import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React, { useContext, useMemo } from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport { WalletConnector } from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\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 useHybrid() {\n return useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n // provider: ({ chainId }: { chainId?: number }) => Provider\n // webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined\n // provider: undefined,\n // webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(props: {\n children: React.ReactNode\n wallet: WalletConnector\n}) {\n console.log({ props })\n\n const { children, wallet: createDefaultWalletConnector } = props\n const chains = SUPPORTED_CHAINS\n\n // const { chains, provider, webSocketProvider } = useMemo(() => {\n // const { chains, provider, webSocketProvider } = configureChains(\n // SUPPORTED_CHAINS,\n // buildProviders(keys)\n // )\n // return { chains, provider, webSocketProvider }\n // }, [keys])\n\n const { client, Provider } = createDefaultWalletConnector({\n chains\n })\n\n // const { client, Provider } = useMemo(\n // () =>\n // createDefaultWalletConnector({\n // chains\n // }),\n // []\n // )\n\n const contextValue = {\n client,\n chains\n // provider,\n // webSocketProvider\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 { 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 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 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 >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, 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 const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\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 const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\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 console.log({ 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\"\n\ntype Props = {\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n children,\n contract,\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 { isLoading, allow } = useTokenGating({ address, contract })\n\n return <>{isLoading ? loadingComponent : allow ? children : denyComponent}</>\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()\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 { BigNumber, ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider.estimateGas(tx)\n const gasPrice = await provider.getGasPrice()\n const wei = gas.mul(gasPrice)\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["useHybrid","useContext","Web3Context","React","createContext","client","undefined","chains","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","console","log","children","wallet","createDefaultWalletConnector","Provider","contextValue","_jsx","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","connect","connectors","useConnect","chain","network","useNetwork","ens","setENS","useState","provider","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","connector","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","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useBlockBeat","setBlock","watch","onBlock","useEstimation","deployData","estimate","setEstimate","gas","wei","eth","buildData","Wallet","createRandom","estimateGas","getGasPrice","mul","parseFloat","utils","formatUnits","getEstimate"],"mappings":"6nBA+BgBA,IACd,OAAOC,EAAWC,EACpB,CAEO,MAAMA,EAAcC,EAAMC,cAK9B,CACDC,YAAQC,EACRC,YAAQD,IAKJE,EAAmB,CAACC,EAASC,EAAQC,EAAUC,EAAgBC,GAE/D,SAAUC,EAAaC,GAI3BC,QAAQC,IAAI,CAAEF,UAEd,MAAMG,SAAEA,EAAUC,OAAQC,GAAiCL,EACrDR,EAASC,GAUTH,OAAEA,EAAMgB,SAAEA,GAAaD,EAA6B,CACxDb,WAWIe,EAAe,CACnBjB,SACAE,UAKF,OACEgB,EAACrB,EAAYmB,UAASG,MAAOF,EAAYJ,SACvCK,EAACE,GAAYpB,OAAQA,EAAMa,SACzBK,EAACF,EAAU,CAAAH,SAAAA,OAInB,CCvFwB,SAAAQ,EAAYX,GAIlC,MAAMY,UAAEA,EAASC,QAAEA,GAAYb,GACzBc,QAAEA,EAAOC,YAAEA,GAAgBC,KAC3BC,QAAEA,EAAOC,WAAEA,GAAeC,KACxBC,MAAOC,GAAYC,IACrBC,ECPF,SAAqBT,GACzB,MAAOS,EAAKC,GAAUC,IAChBC,EAAWC,EAAY,CAAEd,QAAS,IAOxC,OALAe,GAAU,KACHd,GACLY,EAASG,cAAcf,GAASgB,KAAKN,EAAO,GAC3C,CAACO,KAAML,IAEHH,CACT,CDHcS,CAAWlB,GAEvB,OACEmB,EACE,IAAA,CAAArB,UAAWsB,EACTtB,EACA,4EACDT,SAAA,EAECY,GACAP,EAAQ,SAAA,CAAA2B,QAAS,IAAMlB,EAAQ,CAAEmB,UAAWlB,EAAW,KAE9Cf,SAAA,mBAGVY,GACCkB,EAAM,OAAA,CAAArB,UAAU,GAAET,SAAA,CAAA,eACH,IACbK,OACE6B,KAAMC,EAAoBxB,EAASD,GAAWQ,EAAQkB,IACtD3B,UAAWsB,EAAKtB,EAAW,aAC3B4B,OAAO,SACPC,IAAI,aAEHtC,SAAAoB,GAAOmB,EAAmB5B,UAMvC,CEjBa,MAAA6B,EAAc3C,IACzB,MAAQ4C,SAAUC,GAAqB7C,EACjCa,EAAUgC,GAAkBhC,SAC1BiC,KAAMC,GAAWC,EAAU,CAAEnC,aAE9BoC,EAAWC,GAAczB,GAAkB,IAC3C0B,EAAWC,GAAc3B,GAAkB,IAC3C4B,EAASC,GAAY7B,GAAkB,GAExCmB,EAAWW,EAAY,CAC3BzC,QAAS+B,GAAkB/B,QAC3B0C,IAAKX,GAAkBW,MAkCzB,MAAO,CACLP,YACAE,YACAE,UACAI,KAnCWC,GACXC,MAAOC,EAAgBC,EAAiB,CAAA,KACtC,IAAKjB,EAAU,OACfM,GAAW,GAIX,MAAMzC,MAAEA,EAAQqD,EAAUC,KAAK,KAAIC,SAAEA,GAAaH,EAElD,OAAOjB,EACJ3B,QAAQ8B,GACRU,KAAKG,EAAQ,CACZnD,QACAuD,aAEDlC,MAAMmC,GAA4BA,EAAGC,SACrCpC,MAAMqC,IACLf,GAAW,GACXgB,YAAW,IAAMhB,GAAW,IAAQ,KAC7Be,KAERE,OAAOC,IACNrE,QAAQsE,MAAMD,GACdhB,GAAS,GACTc,YAAW,IAAMd,GAAS,IAAQ,IAAK,IAExCkB,SAAQ,IAAMtB,GAAW,IAAO,GAErC,CAACH,EAAQH,EAAU/B,IAQpB,4VCjEH,MAAM4D,EAAU,CACdC,QAASC,EAAOC,kBAChBC,QAASF,EAAOG,qBAChBP,MAAOI,EAAOI,oBAGVC,EAAiBhF,IACrB,MAAMY,UAEJA,EAAY+D,EAAOK,cAAaC,OAChCA,EAAS,UAAS9C,QAClBA,EAAOhC,SACPA,EAAQ+E,SACRA,GACElF,EAEJ,OACEQ,EACE,SAAA,CAAAI,UAAWsB,EACTtB,EACA6D,EAAQQ,GACRC,GAAYP,EAAOQ,uBAErBhD,QAASA,EAERhC,SAAAA,GAEJ,EC1BGiF,EAAcpF,IAClB,MAAM4D,OACJA,EAAS,EACTyB,OAAQC,EAASN,EAAapE,UAC9BA,EAASgC,SACTA,GACE5C,GACI8C,KAAMC,GAAWC,KACnB/B,QAAEA,EAAOC,WAAEA,GAAeC,KACxBC,MAAOC,GAAYC,KACrBiE,cAAEA,GAAkBC,KAEpBvC,UAAEA,EAASE,UAAEA,EAASE,QAAEA,EAAOI,KAAEA,GAASd,EAAW,CAAEC,aAE7D,GAAIK,EACF,OACEzC,EAAC8E,EAAO,CAAAJ,UAAS,EAAAtE,UAAWA,EAEnBT,SAAA,YAIb,GAAIgD,EACF,OACE3C,EAAC8E,EAAM,CAACJ,UAAS,EAAAtE,UAAWA,EAAWqE,OAAO,UAAS9E,SAAA,WAM3D,GAAIkD,EACF,OACE7C,EAAC8E,EAAM,CAACJ,UAAS,EAAAtE,UAAWA,EAAWqE,OAAO,QAAO9E,SAAA,mBAMzD,IAAK4C,EAAQ,CACX,MAAMX,EAAYlB,EAAW,GAC7B,OACEV,EAAC8E,EAAM,CAAC1E,UAAWA,EAAWuB,QAAS,IAAMlB,EAAQ,CAAEmB,cAE9CjC,SAAA,kBAEZ,CAED,OAEIK,EAAC8E,EAFDjE,GAASkB,KAAOK,GAAU/B,SAAW0E,EAGnC,CAAApD,QAAS,IAAMoD,EAAc3C,GAAU/B,SACvCD,UAAWA,EACXqE,OAAO,QAGA9E,SAAA,mBAKHS,UAAWA,EAAWuB,QAAS,IAAMsB,EAAKG,GAAOzD,SAAA,YAG1D,EC/DG,SAAUsF,EAAezF,GAI7B,MAAMc,QAAEA,EAAS8B,SAAUC,GAAqB7C,EAC1Ca,EAAUgC,GAAkBhC,QAC5Ba,EAAWC,EAAY,CAAEd,aAExB6E,EAAWC,GAAclE,GAAS,IAClCmE,EAAOC,GAAYpE,KACnBqE,EAAMC,GAAWtE,IAElBmB,EAAWW,EAAY,CAC3BzC,QAAS+B,GAAkB/B,QAC3B0C,IAAKX,GAAkBW,MA6BzB,OA1BA5B,GAAU,KACHiB,IACH8C,GAAW,GACXE,GAAS,GACTE,GAAQ,IAGLnD,GACLA,EACG3B,QAAQS,GACRsE,UAAUlF,GACVgB,MAAMmE,GAAmBA,EAAIC,aAE7BpE,MAAM8D,IACL3F,QAAQC,IAAI,CAAE0F,UACdC,EAASD,GACTG,GAASH,EAAM,IAEhBvB,OAAOC,IACNrE,QAAQsE,MAAMD,GACduB,GAAS,GACTE,GAAQ,EAAK,IAEdvB,SAAQ,IAAMmB,GAAW,IAAO,GAClC,CAAC7E,EAAS+B,IAEN,CACL6C,UAAWA,EACX5E,UACA8E,QACAE,OAEJ,CCjDM,MAAAK,EAA6B,EACjChG,WACAyC,WACAwD,QAASC,EAAmB7F,EAAA,IAAA,CAAAL,SAAA,YAC5B2F,KAAMQ,EAAgB9F,EAAA,IAAA,CAAAL,SAAA,mDAEtB,MAAMW,QAAEA,GAAYE,KACd0E,UAAEA,EAASE,MAAEA,GAAUH,EAAe,CAAE3E,UAAS8B,aAEvD,OAAOpC,cAAGkF,EAAYW,EAAmBT,EAAQzF,EAAWmG,GAAiB,ECXzEC,EAAevG,IACnB,MAAMY,UAAEA,EAAWgC,SAAUC,GAAqB7C,EAC5Ca,EAAUgC,GAAkBhC,QAC5Ba,EAAWC,EAAY,CAAEd,aACvBiC,KAAM0D,GAAUC,IAElB7D,EAAWW,EAAY,CAC3BzC,QAAS+B,GAAkB/B,QAC3B0C,IAAKX,GAAkBW,MAGnBkD,WCPNC,EACAC,EACAC,GAEA,MAAOC,EAAKC,GAAUtF,EAAwBoF,GAsB9C,OApBAjF,GAAU,KACR,IAAIoF,GAAS,EACb,MAAMC,EAAUN,IAChB,GAAIM,QAYJ,OAVAA,EACGnF,MAAMgF,IACAE,GACHD,EAAOD,EACR,IAEFzC,OAAOE,IACNtE,QAAQsE,MAAM,0BAA0BA,IAAQ,IAG7C,KACLyC,GAAS,CAAI,CACd,GACAJ,GAEIE,CACT,CDpB8BI,EAAa,KACvC,GAAKtE,EACL,OAAOA,EACJ3B,QAAQS,GACRgF,cACA5E,MAAMmE,GAAmBA,EAAIC,YAAW,GAC1C,CAACtD,EAAU4D,IAEd,OAAOhG,UAAMI,UAAWA,EAAYT,SAAAuG,GAAmB,EEfnDS,EAAe,KACnB,MAAOX,EAAOY,GAAY3F,IAG1B,OAFAgF,EAAe,CAAEY,OAAO,EAAMC,QAASF,IAEhCZ,CAAK,EAQR,SAAUe,EAAc1D,GAC5B,MAAM2D,WAAEA,EAAU3G,QAAEA,GAAYgD,EAC1BnC,EAAWC,EAAY,CAAEd,YACzB2F,EAAQW,KAEPM,EAAUC,GAAejG,EAAmB,CACjDkG,SAAKpI,EACLyE,cAAUzE,EACVqI,SAAKrI,EACLsI,SAAKtI,IAGDuI,EAAYpE,GACfhC,GAC8B,mBAAf8F,EACVA,EAAW9F,GACX8F,GAEN,CAACA,IAkBH,OAfA5F,GAAU,KACR,MAAQd,QAASiD,GAASgE,EAAOC,eAC3BlF,EAAOgF,EAAUpG,GAClBoB,GAeTa,eACEjC,EACAuC,GAEA,MAAM0D,QAAYjG,EAASuG,YAAYhE,GACjCD,QAAiBtC,EAASwG,cAC1BN,EAAMD,EAAIQ,IAAInE,GACd6D,EAAMO,WAAWC,EAAMC,YAAYV,EAAK,UAE9C,MAAO,CACLD,MACA3D,WACA4D,MACAC,MAEJ,CA5BIU,CAAY7G,EAAU,CACpBoB,OACAiB,SAECjC,KAAK4F,GACLrD,OAAOC,IACNrE,QAAQsE,MAAM,gBAAiBD,EAAI,GACnC,GACH,CAACkC,EAAO9E,EAAUb,EAASiH,IAEvBL,CACT"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{WagmiConfig as r,useProvider as c,useAccount as o,useConnect as a,useNetwork as s,useBlockNumber as i,useSigner as l,useContract as u,useSwitchNetwork as d}from"wagmi";import{mainnet as h,goerli as m,arbitrum as f,arbitrumGoerli as p,localhost as B}from"wagmi/chains";import D,{useContext as b,useState as g,useEffect as y,useCallback as N}from"react";import{etherscanAddressURL as w,truncateEthAddress as _}from"@hybrd/utils";export*from"@hybrd/utils";import v from"clsx";import{BigNumber as k,Wallet as x,utils as I}from"ethers";export*from"@hybrd/types";function C(){return b(S)}const S=D.createContext({client:void 0,chains:void 0}),P=[h,m,f,p,B];function E(e){console.log({props:e});const{children:n,wallet:c}=e,o=P,{client:a,Provider:s}=c({chains:o}),i={client:a,chains:o};return t(S.Provider,{value:i,children:t(r,{client:a,children:t(s,{children:n})})})}function M(n){const{className:r,chainId:i}=n,{address:l,isConnected:u}=o(),{connect:d,connectors:h}=a(),{chain:m}=s(),f=function(t){const[e,n]=g(),r=c({chainId:1});return y((()=>{t&&r.lookupAddress(t).then(n)}),[name,r]),e}(l);return e("p",{className:v(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&t("button",{onClick:()=>d({connector:h[0]}),children:"Connect Wallet"}),u&&e("span",{className:"",children:["connected as"," ",t("a",{href:w(l,i||m.id),className:v(r,"underline"),target:"_blank",rel:"noreferrer",children:f||_(l)})]})]})}const K=t=>{const{contract:e}=t,n=e?.chainId,r=c({chainId:n}),{data:o}=i(),{data:a}=l({chainId:n}),[s,d]=g(!1),[h,m]=g(!1),[f,p]=g(!1),B=u({address:e?.address,abi:e?.abi});return{isMinting:s,isSuccess:h,isError:f,totalSupply:function(t,e,n){const[r,c]=g(n);return y((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||c(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(B)return B.connect(r).totalSupply().then((t=>t.toNumber()))}),[B,o]),mint:N((async(t,e={})=>{if(!B)return;d(!0);const{value:n=k.from("0"),gasPrice:r}=e;return B.connect(a).mint(t,{value:n,gasPrice:r}).then((t=>t.wait())).then((t=>(m(!0),setTimeout((()=>m(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[a,B,n])}};var L={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 O={default:L.DefaultButtonBase,success:L.DefaultButtonSuccess,error:L.DefaultButtonError},T=e=>{const{className:n=L.DefaultButton,intent:r="default",onClick:c,children:o,disabled:a}=e;return t("button",{className:v(n,O[r],a&&L.DefaultButtonDisabled),onClick:c,children:o})},j=e=>{const{amount:n=1,button:r=T,className:c,contract:o}=e,{data:i}=l(),{connect:u,connectors:h}=a(),{chain:m}=s(),{switchNetwork:f}=d(),{isMinting:p,isSuccess:B,isError:D,mint:b}=K({contract:o});if(p)return t(r,{disabled:!0,className:c,children:"Minting"});if(B)return t(r,{disabled:!0,className:c,intent:"success",children:"Minted"});if(D)return t(r,{disabled:!0,className:c,intent:"error",children:"Error Occurred"});if(!i){const e=h[0];return t(r,{className:c,onClick:()=>u({connector:e}),children:"Connect Wallet"})}return t(r,m?.id!==o?.chainId&&f?{onClick:()=>f(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>b(n),children:"Mint Now"})};function A(t){const{address:e,contract:n}=t,r=n?.chainId,o=c({chainId:r}),[a,s]=g(!0),[i,l]=g(),[d,h]=g(),m=u({address:n?.address,abi:n?.abi});return y((()=>{n||(s(!1),l(!1),h(!0)),m&&m.connect(o).balanceOf(e).then((t=>t.toNumber())).then((t=>{console.log({allow:t}),l(t),h(!t)})).catch((t=>{console.error(t),l(!1),h(!0)})).finally((()=>s(!1)))}),[e,n]),{isLoading:a,address:e,allow:i,deny:d}}const G=({children:e,contract:r,loading:c=t("p",{children:"Loading"}),deny:a=t("p",{children:"You must own a token to view this content."})})=>{const{address:s}=o(),{isLoading:i,allow:l}=A({address:s,contract:r});return t(n,{children:i?c:l?e:a})},R=e=>{const{className:n,contract:r}=e,{totalSupply:c}=K({contract:r});return t("span",{className:n,children:c})},U=()=>{const[t,e]=g();return i({watch:!0,onBlock:e}),t};function W(t){const{deployData:e,chainId:n}=t,r=c({chainId:n}),o=U(),[a,s]=g({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),i=N((t=>"function"==typeof e?e(t):e),[e]);return y((()=>{const{address:t}=x.createRandom(),e=i(r);e&&async function(t,e){const n=await t.estimateGas(e),r=await t.getGasPrice(),c=n.mul(r),o=parseFloat(I.formatUnits(c,"ether"));return{gas:n,gasPrice:r,wei:c,eth:o}}(r,{data:e,from:t}).then(s).catch((t=>{console.error("useEstimation",t)}))}),[o,r,n,i]),a}export{M as ConnectedAs,j as MintButton,G as TokenGate,R as TotalSupply,E as Web3Provider,W as useEstimation,C as useHybrid,K as useMinting,A as useTokenGating};
1
+ import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{WagmiConfig as r,useProvider as c,useAccount as o,useConnect as a,useNetwork as s,useSigner as i,useContract as l,useSwitchNetwork as u,useBlockNumber as d}from"wagmi";import{mainnet as h,goerli as m,arbitrum as f,arbitrumGoerli as p,localhost as B}from"wagmi/chains";import D,{useContext as b,useState as g,useEffect as N,useCallback as w}from"react";import{etherscanAddressURL as y,truncateEthAddress as _}from"@hybrd/utils";export*from"@hybrd/utils";import v from"clsx";import{BigNumber as I,Wallet as k,utils as x}from"ethers";export*from"@hybrd/types";function C(){return b(P)}const P=D.createContext({client:void 0,chains:void 0}),E=[h,m,f,p,B];function S(e){console.log({props:e});const{children:n,wallet:c}=e,o=E,{client:a,Provider:s}=c({chains:o}),i={client:a,chains:o};return t(P.Provider,{value:i,children:t(r,{client:a,children:t(s,{children:n})})})}function M(n){const{className:r,chainId:i}=n,{address:l,isConnected:u}=o(),{connect:d,connectors:h}=a(),{chain:m}=s(),f=function(t){const[e,n]=g(),r=c({chainId:1});return N((()=>{t&&r.lookupAddress(t).then(n)}),[name,r]),e}(l);return e("p",{className:v(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&t("button",{onClick:()=>d({connector:h[0]}),children:"Connect Wallet"}),u&&e("span",{className:"",children:["connected as"," ",t("a",{href:y(l,i||m.id),className:v(r,"underline"),target:"_blank",rel:"noreferrer",children:f||_(l)})]})]})}const K=t=>{const{contract:e}=t,n=e?.chainId,{data:r}=i({chainId:n}),[c,o]=g(!1),[a,s]=g(!1),[u,d]=g(!1),h=l({address:e?.address,abi:e?.abi});return{isMinting:c,isSuccess:a,isError:u,mint:w((async(t,e={})=>{if(!h)return;o(!0);const{value:n=I.from("0"),gasPrice:c}=e;return h.connect(r).mint(t,{value:n,gasPrice:c}).then((t=>t.wait())).then((t=>(s(!0),setTimeout((()=>s(!1)),3e3),t))).catch((t=>{console.error(t),d(!0),setTimeout((()=>d(!1)),1e3)})).finally((()=>o(!1)))}),[r,h,n])}};var L={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 O={default:L.DefaultButtonBase,success:L.DefaultButtonSuccess,error:L.DefaultButtonError},j=e=>{const{className:n=L.DefaultButton,intent:r="default",onClick:c,children:o,disabled:a}=e;return t("button",{className:v(n,O[r],a&&L.DefaultButtonDisabled),onClick:c,children:o})},A=e=>{const{amount:n=1,button:r=j,className:c,contract:o}=e,{data:l}=i(),{connect:d,connectors:h}=a(),{chain:m}=s(),{switchNetwork:f}=u(),{isMinting:p,isSuccess:B,isError:D,mint:b}=K({contract:o});if(p)return t(r,{disabled:!0,className:c,children:"Minting"});if(B)return t(r,{disabled:!0,className:c,intent:"success",children:"Minted"});if(D)return t(r,{disabled:!0,className:c,intent:"error",children:"Error Occurred"});if(!l){const e=h[0];return t(r,{className:c,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(r,m?.id!==o?.chainId&&f?{onClick:()=>f(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>b(n),children:"Mint Now"})};function G(t){const{address:e,contract:n}=t,r=n?.chainId,o=c({chainId:r}),[a,s]=g(!0),[i,u]=g(),[d,h]=g(),m=l({address:n?.address,abi:n?.abi});return N((()=>{n||(s(!1),u(!1),h(!0)),m&&m.connect(o).balanceOf(e).then((t=>t.toNumber())).then((t=>{console.log({allow:t}),u(t),h(!t)})).catch((t=>{console.error(t),u(!1),h(!0)})).finally((()=>s(!1)))}),[e,n]),{isLoading:a,address:e,allow:i,deny:d}}const R=({children:e,contract:r,loading:c=t("p",{children:"Loading"}),deny:a=t("p",{children:"You must own a token to view this content."})})=>{const{address:s}=o(),{isLoading:i,allow:l}=G({address:s,contract:r});return t(n,{children:i?c:l?e:a})},T=e=>{const{className:n,contract:r}=e,o=r?.chainId,a=c({chainId:o}),{data:s}=d(),i=l({address:r?.address,abi:r?.abi}),u=function(t,e,n){const[r,c]=g(n);return N((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||c(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(i)return i.connect(a).totalSupply().then((t=>t.toNumber()))}),[i,s]);return t("span",{className:n,children:u})},U=()=>{const[t,e]=g();return d({watch:!0,onBlock:e}),t};function W(t){const{deployData:e,chainId:n}=t,r=c({chainId:n}),o=U(),[a,s]=g({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),i=w((t=>"function"==typeof e?e(t):e),[e]);return N((()=>{const{address:t}=k.createRandom(),e=i(r);e&&async function(t,e){const n=await t.estimateGas(e),r=await t.getGasPrice(),c=n.mul(r),o=parseFloat(x.formatUnits(c,"ether"));return{gas:n,gasPrice:r,wei:c,eth:o}}(r,{data:e,from:t}).then(s).catch((t=>{console.error("useEstimation",t)}))}),[o,r,n,i]),a}export{M as ConnectedAs,A as MintButton,R as TokenGate,T as TotalSupply,S as Web3Provider,W as useEstimation,C as useHybrid,K as useMinting,G as useTokenGating};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/providers/Web3Provider.tsx","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React, { useContext, useMemo } from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport { WalletConnector } from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\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 useHybrid() {\n return useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n // provider: ({ chainId }: { chainId?: number }) => Provider\n // webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined\n // provider: undefined,\n // webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(props: {\n children: React.ReactNode\n wallet: WalletConnector\n}) {\n console.log({ props })\n\n const { children, wallet: createDefaultWalletConnector } = props\n const chains = SUPPORTED_CHAINS\n\n // const { chains, provider, webSocketProvider } = useMemo(() => {\n // const { chains, provider, webSocketProvider } = configureChains(\n // SUPPORTED_CHAINS,\n // buildProviders(keys)\n // )\n // return { chains, provider, webSocketProvider }\n // }, [keys])\n\n const { client, Provider } = createDefaultWalletConnector({\n chains\n })\n\n // const { client, Provider } = useMemo(\n // () =>\n // createDefaultWalletConnector({\n // chains\n // }),\n // []\n // )\n\n const contextValue = {\n client,\n chains\n // provider,\n // webSocketProvider\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 { 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 { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\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 provider = useProvider({ chainId })\n\n const { data: block } = useBlockNumber()\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 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 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 totalSupply,\n mint\n }\n}\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 clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\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 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 >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, 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 const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\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 const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\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 console.log({ 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\"\n\ntype Props = {\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n children,\n contract,\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 { isLoading, allow } = useTokenGating({ address, contract })\n\n return <>{isLoading ? loadingComponent : allow ? children : denyComponent}</>\n}\n\nexport default TokenGate\n","import { useMinting } from \"../hooks/useMinting\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const { className, contract } = props\n const { totalSupply } = useMinting({ contract })\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default MintButton\n","import { BigNumber, ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider.estimateGas(tx)\n const gasPrice = await provider.getGasPrice()\n const wei = gas.mul(gasPrice)\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["useHybrid","useContext","Web3Context","React","createContext","client","undefined","chains","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","console","log","children","wallet","createDefaultWalletConnector","Provider","contextValue","_jsx","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","connect","connectors","useConnect","chain","network","useNetwork","ens","setENS","useState","provider","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","connector","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","block","useBlockNumber","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","totalSupply","factory","deps","initial","val","setVal","cancel","promise","catch","error","useAsyncMemo","res","toNumber","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","TokenGate","loading","loadingComponent","denyComponent","useBlockBeat","setBlock","watch","onBlock","useEstimation","deployData","estimate","setEstimate","gas","wei","eth","buildData","Wallet","createRandom","estimateGas","getGasPrice","mul","parseFloat","utils","formatUnits","getEstimate"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/providers/Web3Provider.tsx","../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/useEstimation.ts"],"sourcesContent":["import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React, { useContext, useMemo } from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport { WalletConnector } from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\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 useHybrid() {\n return useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n // provider: ({ chainId }: { chainId?: number }) => Provider\n // webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined\n // provider: undefined,\n // webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(props: {\n children: React.ReactNode\n wallet: WalletConnector\n}) {\n console.log({ props })\n\n const { children, wallet: createDefaultWalletConnector } = props\n const chains = SUPPORTED_CHAINS\n\n // const { chains, provider, webSocketProvider } = useMemo(() => {\n // const { chains, provider, webSocketProvider } = configureChains(\n // SUPPORTED_CHAINS,\n // buildProviders(keys)\n // )\n // return { chains, provider, webSocketProvider }\n // }, [keys])\n\n const { client, Provider } = createDefaultWalletConnector({\n chains\n })\n\n // const { client, Provider } = useMemo(\n // () =>\n // createDefaultWalletConnector({\n // chains\n // }),\n // []\n // )\n\n const contextValue = {\n client,\n chains\n // provider,\n // webSocketProvider\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 { 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 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 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 >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, 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 const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\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 const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\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 console.log({ 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\"\n\ntype Props = {\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n children,\n contract,\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 { isLoading, allow } = useTokenGating({ address, contract })\n\n return <>{isLoading ? loadingComponent : allow ? children : denyComponent}</>\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()\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 { BigNumber, ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider.estimateGas(tx)\n const gasPrice = await provider.getGasPrice()\n const wei = gas.mul(gasPrice)\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["useHybrid","useContext","Web3Context","React","createContext","client","undefined","chains","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","console","log","children","wallet","createDefaultWalletConnector","Provider","contextValue","_jsx","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","connect","connectors","useConnect","chain","network","useNetwork","ens","setENS","useState","provider","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","connector","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","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useBlockBeat","setBlock","watch","onBlock","useEstimation","deployData","estimate","setEstimate","gas","wei","eth","buildData","Wallet","createRandom","estimateGas","getGasPrice","mul","parseFloat","utils","formatUnits","getEstimate"],"mappings":"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"}
@@ -1,2 +1,4 @@
1
1
  import type { WalletConnection } from "@hybrd/types";
2
- export default function DefaultWalletConnector(config: any): WalletConnection;
2
+ export default function DefaultWalletConnector(config: any): ({ chains }: {
3
+ chains: any;
4
+ }) => WalletConnection;
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/Web3Provider.tsx","uid":"f159-37"},{"name":"components","children":[{"uid":"f159-39","name":"ConnectedAs.tsx"},{"uid":"f159-47","name":"DefaultButton.tsx"},{"uid":"f159-49","name":"MintButton.tsx"},{"uid":"f159-53","name":"TokenGate.tsx"},{"uid":"f159-55","name":"TotalSupply.tsx"}]},{"name":"hooks","children":[{"name":"internal","children":[{"uid":"f159-41","name":"useEnsName.tsx"},{"uid":"f159-45","name":"useAsyncMemo.ts"}]},{"uid":"f159-43","name":"useMinting.ts"},{"uid":"f159-51","name":"useTokenGating.ts"},{"uid":"f159-57","name":"useEstimation.ts"}]}]}]}],"isRoot":true},"nodeParts":{"f159-37":{"renderedLength":1529,"gzipLength":0,"brotliLength":0,"metaUid":"f159-36"},"f159-39":{"renderedLength":799,"gzipLength":0,"brotliLength":0,"metaUid":"f159-38"},"f159-41":{"renderedLength":351,"gzipLength":0,"brotliLength":0,"metaUid":"f159-40"},"f159-43":{"renderedLength":1806,"gzipLength":0,"brotliLength":0,"metaUid":"f159-42"},"f159-45":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"f159-44"},"f159-47":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"f159-46"},"f159-49":{"renderedLength":1298,"gzipLength":0,"brotliLength":0,"metaUid":"f159-48"},"f159-51":{"renderedLength":1244,"gzipLength":0,"brotliLength":0,"metaUid":"f159-50"},"f159-53":{"renderedLength":420,"gzipLength":0,"brotliLength":0,"metaUid":"f159-52"},"f159-55":{"renderedLength":204,"gzipLength":0,"brotliLength":0,"metaUid":"f159-54"},"f159-57":{"renderedLength":1385,"gzipLength":0,"brotliLength":0,"metaUid":"f159-56"}},"nodeMetas":{"f159-36":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"f159-37"},"imported":[{"uid":"f159-63"},{"uid":"f159-64"},{"uid":"f159-65"},{"uid":"f159-66"}],"importedBy":[{"uid":"f159-58"},{"uid":"f159-70"}]},"f159-38":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"f159-39"},"imported":[{"uid":"f159-63"},{"uid":"f159-62"},{"uid":"f159-67"},{"uid":"f159-68"},{"uid":"f159-64"}],"importedBy":[{"uid":"f159-59"}]},"f159-40":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"f159-41"},"imported":[{"uid":"f159-64"},{"uid":"f159-66"}],"importedBy":[{"uid":"f159-68"}]},"f159-42":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"f159-43"},"imported":[{"uid":"f159-69"},{"uid":"f159-66"},{"uid":"f159-64"},{"uid":"f159-44"}],"importedBy":[{"uid":"f159-60"},{"uid":"f159-48"},{"uid":"f159-54"}]},"f159-44":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"f159-45"},"imported":[{"uid":"f159-66"}],"importedBy":[{"uid":"f159-42"},{"uid":"f159-68"}]},"f159-46":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"f159-47"},"imported":[{"uid":"f159-63"},{"uid":"f159-67"},{"uid":"f159-71"}],"importedBy":[{"uid":"f159-48"}]},"f159-48":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"f159-49"},"imported":[{"uid":"f159-63"},{"uid":"f159-42"},{"uid":"f159-64"},{"uid":"f159-46"}],"importedBy":[{"uid":"f159-59"}]},"f159-50":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"f159-51"},"imported":[{"uid":"f159-66"},{"uid":"f159-64"}],"importedBy":[{"uid":"f159-60"},{"uid":"f159-52"}]},"f159-52":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"f159-53"},"imported":[{"uid":"f159-63"},{"uid":"f159-64"},{"uid":"f159-50"}],"importedBy":[{"uid":"f159-59"}]},"f159-54":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"f159-55"},"imported":[{"uid":"f159-63"},{"uid":"f159-42"}],"importedBy":[{"uid":"f159-59"}]},"f159-56":{"id":"/src/hooks/useEstimation.ts","moduleParts":{"index.mjs":"f159-57"},"imported":[{"uid":"f159-69"},{"uid":"f159-66"},{"uid":"f159-64"}],"importedBy":[{"uid":"f159-60"}]},"f159-58":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"f159-36"},{"uid":"f159-59"},{"uid":"f159-60"},{"uid":"f159-61"},{"uid":"f159-62"}],"importedBy":[],"isEntry":true},"f159-59":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"f159-38"},{"uid":"f159-48"},{"uid":"f159-52"},{"uid":"f159-54"}],"importedBy":[{"uid":"f159-58"}]},"f159-60":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"f159-56"},{"uid":"f159-42"},{"uid":"f159-50"}],"importedBy":[{"uid":"f159-58"}]},"f159-61":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-58"}],"isExternal":true},"f159-62":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-58"},{"uid":"f159-38"}],"isExternal":true},"f159-63":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-36"},{"uid":"f159-38"},{"uid":"f159-48"},{"uid":"f159-52"},{"uid":"f159-54"},{"uid":"f159-46"}],"isExternal":true},"f159-64":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-36"},{"uid":"f159-38"},{"uid":"f159-48"},{"uid":"f159-52"},{"uid":"f159-56"},{"uid":"f159-42"},{"uid":"f159-50"},{"uid":"f159-40"}],"isExternal":true},"f159-65":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-36"}],"isExternal":true},"f159-66":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-36"},{"uid":"f159-56"},{"uid":"f159-42"},{"uid":"f159-50"},{"uid":"f159-44"},{"uid":"f159-70"},{"uid":"f159-40"}],"isExternal":true},"f159-67":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-38"},{"uid":"f159-46"}],"isExternal":true},"f159-68":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"f159-44"},{"uid":"f159-70"},{"uid":"f159-40"}],"importedBy":[{"uid":"f159-38"}]},"f159-69":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-56"},{"uid":"f159-42"}],"isExternal":true},"f159-70":{"id":"/src/hooks/internal/useContext.ts","moduleParts":{},"imported":[{"uid":"f159-66"},{"uid":"f159-36"}],"importedBy":[{"uid":"f159-68"}]},"f159-71":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"f159-46"}]}},"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/Web3Provider.tsx","uid":"a9ff-1"},{"name":"components","children":[{"uid":"a9ff-3","name":"ConnectedAs.tsx"},{"uid":"a9ff-9","name":"DefaultButton.tsx"},{"uid":"a9ff-11","name":"MintButton.tsx"},{"uid":"a9ff-15","name":"TokenGate.tsx"},{"uid":"a9ff-17","name":"TotalSupply.tsx"}]},{"name":"hooks","children":[{"name":"internal","children":[{"uid":"a9ff-5","name":"useEnsName.tsx"},{"uid":"a9ff-19","name":"useAsyncMemo.ts"}]},{"uid":"a9ff-7","name":"useMinting.ts"},{"uid":"a9ff-13","name":"useTokenGating.ts"},{"uid":"a9ff-21","name":"useEstimation.ts"}]}]}]}],"isRoot":true},"nodeParts":{"a9ff-1":{"renderedLength":1529,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-0"},"a9ff-3":{"renderedLength":799,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-2"},"a9ff-5":{"renderedLength":351,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-4"},"a9ff-7":{"renderedLength":1451,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-6"},"a9ff-9":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-8"},"a9ff-11":{"renderedLength":1296,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-10"},"a9ff-13":{"renderedLength":1244,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-12"},"a9ff-15":{"renderedLength":420,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-14"},"a9ff-17":{"renderedLength":672,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-16"},"a9ff-19":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-18"},"a9ff-21":{"renderedLength":1385,"gzipLength":0,"brotliLength":0,"metaUid":"a9ff-20"}},"nodeMetas":{"a9ff-0":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"a9ff-1"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-28"},{"uid":"a9ff-29"},{"uid":"a9ff-30"}],"importedBy":[{"uid":"a9ff-22"},{"uid":"a9ff-34"}]},"a9ff-2":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"a9ff-3"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-26"},{"uid":"a9ff-31"},{"uid":"a9ff-32"},{"uid":"a9ff-28"}],"importedBy":[{"uid":"a9ff-23"}]},"a9ff-4":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"a9ff-5"},"imported":[{"uid":"a9ff-28"},{"uid":"a9ff-30"}],"importedBy":[{"uid":"a9ff-32"}]},"a9ff-6":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"a9ff-7"},"imported":[{"uid":"a9ff-33"},{"uid":"a9ff-30"},{"uid":"a9ff-28"}],"importedBy":[{"uid":"a9ff-24"},{"uid":"a9ff-10"}]},"a9ff-8":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"a9ff-9"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-31"},{"uid":"a9ff-35"}],"importedBy":[{"uid":"a9ff-10"}]},"a9ff-10":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"a9ff-11"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-6"},{"uid":"a9ff-28"},{"uid":"a9ff-8"}],"importedBy":[{"uid":"a9ff-23"}]},"a9ff-12":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"a9ff-13"},"imported":[{"uid":"a9ff-30"},{"uid":"a9ff-28"}],"importedBy":[{"uid":"a9ff-24"},{"uid":"a9ff-14"}]},"a9ff-14":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"a9ff-15"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-28"},{"uid":"a9ff-12"}],"importedBy":[{"uid":"a9ff-23"}]},"a9ff-16":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"a9ff-17"},"imported":[{"uid":"a9ff-27"},{"uid":"a9ff-28"},{"uid":"a9ff-18"}],"importedBy":[{"uid":"a9ff-23"}]},"a9ff-18":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"a9ff-19"},"imported":[{"uid":"a9ff-30"}],"importedBy":[{"uid":"a9ff-16"},{"uid":"a9ff-32"}]},"a9ff-20":{"id":"/src/hooks/useEstimation.ts","moduleParts":{"index.mjs":"a9ff-21"},"imported":[{"uid":"a9ff-33"},{"uid":"a9ff-30"},{"uid":"a9ff-28"}],"importedBy":[{"uid":"a9ff-24"}]},"a9ff-22":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"a9ff-0"},{"uid":"a9ff-23"},{"uid":"a9ff-24"},{"uid":"a9ff-25"},{"uid":"a9ff-26"}],"importedBy":[],"isEntry":true},"a9ff-23":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"a9ff-2"},{"uid":"a9ff-10"},{"uid":"a9ff-14"},{"uid":"a9ff-16"}],"importedBy":[{"uid":"a9ff-22"}]},"a9ff-24":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"a9ff-20"},{"uid":"a9ff-6"},{"uid":"a9ff-12"}],"importedBy":[{"uid":"a9ff-22"}]},"a9ff-25":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-22"}],"isExternal":true},"a9ff-26":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-22"},{"uid":"a9ff-2"}],"isExternal":true},"a9ff-27":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-0"},{"uid":"a9ff-2"},{"uid":"a9ff-10"},{"uid":"a9ff-14"},{"uid":"a9ff-16"},{"uid":"a9ff-8"}],"isExternal":true},"a9ff-28":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-0"},{"uid":"a9ff-2"},{"uid":"a9ff-10"},{"uid":"a9ff-14"},{"uid":"a9ff-16"},{"uid":"a9ff-20"},{"uid":"a9ff-6"},{"uid":"a9ff-12"},{"uid":"a9ff-4"}],"isExternal":true},"a9ff-29":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-0"}],"isExternal":true},"a9ff-30":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-0"},{"uid":"a9ff-20"},{"uid":"a9ff-6"},{"uid":"a9ff-12"},{"uid":"a9ff-18"},{"uid":"a9ff-34"},{"uid":"a9ff-4"}],"isExternal":true},"a9ff-31":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-2"},{"uid":"a9ff-8"}],"isExternal":true},"a9ff-32":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"a9ff-18"},{"uid":"a9ff-34"},{"uid":"a9ff-4"}],"importedBy":[{"uid":"a9ff-2"}]},"a9ff-33":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-20"},{"uid":"a9ff-6"}],"isExternal":true},"a9ff-34":{"id":"/src/hooks/internal/useContext.ts","moduleParts":{},"imported":[{"uid":"a9ff-30"},{"uid":"a9ff-0"}],"importedBy":[{"uid":"a9ff-32"}]},"a9ff-35":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ff-8"}]}},"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,3 +6175,8 @@ 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.4.1",
4
+ "version": "0.4.3",
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.4.1",
64
- "@hybrd/contracts": "^0.4.1",
65
- "@hybrd/types": "^0.4.1",
66
- "@hybrd/utils": "^0.4.1",
63
+ "@hybrd/cli": "^0.4.3",
64
+ "@hybrd/contracts": "^0.4.3",
65
+ "@hybrd/types": "^0.4.3",
66
+ "@hybrd/utils": "^0.4.3",
67
67
  "abitype": "^0.7.1",
68
68
  "axios": "^1.2.2",
69
69
  "clsx": "^1.2.1",
@@ -117,5 +117,5 @@
117
117
  "react-dom": ">=17",
118
118
  "wagmi": "^0.12.1"
119
119
  },
120
- "gitHead": "bb8b851a3a972e0614d03cd998b27c5a89e9e27d"
120
+ "gitHead": "308fc877d9ef76297fcbb894e91a22a39f367103"
121
121
  }