hybrid 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useWallet.d.ts +5 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/stats.html +1 -6
- package/package.json +7 -7
package/dist/hooks/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as
|
|
1
|
+
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as x}from"wagmi/providers/alchemy";import{infuraProvider as w}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(x({apiKey:t})),n&&r.push(w({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};function $(){const{useContext:e}=E(),{connect:t}=e();return{connect:t}}export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating,$ as useWallet};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext\n} from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { buildProviders } from \"./helpers\"\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n}\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n useContext: () => WalletConnectorContext\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n wallet?: WalletConnector\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector\n } = props\n\n const chains = SUPPORTED_CHAINS\n const providers = buildProviders(props)\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers\n })\n\n const contextValue = {\n client,\n useContext,\n chains\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\";\nimport { useMinting } from \"../hooks/useMinting\";\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\";\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\";\nimport { DeployedContract } from \"@hybrd/types\";\n\ntype MintButtonProps = {\n className?: string;\n contract: DeployedContract;\n button?: React.FC<DefaultButtonProps>;\n amount?: number;\n};\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props;\n\n const { useContext } = useHybridContext();\n const { connect } = useContext();\n\n const { data: signer } = useSigner();\n const { chain: network } = useNetwork();\n const { switchNetwork } = useSwitchNetwork();\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract });\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n );\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n );\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n );\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n );\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n );\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n );\n};\n\nexport default MintButton;\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"8xBAIwB,SAAAA,EAAuBC,GAC7C,MAAMC,SAAEA,EAAQC,kBAAEA,GAAsBC,EACtCH,EAAOI,OACPJ,EAAOK,WAiBT,MAAO,CACLC,OAfaC,EAAa,CAC1BC,aAAa,EAEbP,WACAC,sBAYAO,WATiB,KACjB,MAAMC,QAAEA,EAAOC,WAAEA,GAAeC,IAChC,MAAO,CACLF,QAAS,IAAMA,EAAQ,CAAEG,UAAWF,EAAW,KAChD,EAMDG,SAAU,EAAGC,cAA8CC,EAAGC,EAAA,CAAAF,SAAAA,IAElE,UCOgBG,IACd,OAAOC,EAAMV,WAAWW,EAC1B,CAEO,MAAMA,EAAcD,EAAME,cAI9B,CACDf,YAAQgB,EACRlB,YAAQkB,EACRb,gBAAYa,IAGRC,EAAmB,CAACC,EAASC,EAAQC,EAAUC,EAAgBC,GAE/D,SAAUC,EACdC,GAKA,MAAMf,SACJA,EACAgB,OAAQC,EAAwBC,GAC9BH,EAEE1B,EAASmB,EACTlB,EC3DF,SAAyBL,GAC7B,MAAMkC,WAAEA,EAAUC,UAAEA,GAAcnC,EAC5BK,EAAY,GAuBlB,OArBI6B,GACF7B,EAAU+B,KACRC,EAAgB,CACdC,OAAQJ,KAKVC,GACF9B,EAAU+B,KACRG,EAAe,CACbD,OAAQH,KAQd9B,EAAU+B,KAAKI,KAERnC,CACT,CDiCoBoC,CAAeX,IAE3BxB,OAAEA,EAAMG,WAAEA,EAAUK,SAAEA,GAAakB,EAAsB,CAC7D5B,SACAC,cAGIqC,EAAe,CACnBpC,SACAG,aACAL,UAGF,OACEY,EAACI,EAAYN,UAAS6B,MAAOD,EAAY3B,SACvCC,EAAC4B,GAAYtC,OAAQA,EAAMS,SACzBC,EAACF,EAAU,CAAAC,SAAAA,OAInB,CE/EwB,SAAA8B,EAAYf,GAIlC,MAAMgB,UAAEA,EAASC,QAAEA,GAAYjB,GACzBkB,QAAEA,EAAOC,YAAEA,GAAgBC,KAC3BxC,QAAEA,EAAOC,WAAEA,GAAeC,KACxBuC,MAAOC,GAAYC,IACrBC,ECPF,SAAqBN,GACzB,MAAOM,EAAKC,GAAUC,IAChBvD,EAAWwD,EAAY,CAAEV,QAAS,IAOxC,OALAW,GAAU,KACHV,GACL/C,EAAS0D,cAAcX,GAASY,KAAKL,EAAO,GAC3C,CAACM,KAAM5D,IAEHqD,CACT,CDHcQ,CAAWd,GAEvB,OACEe,EACE,IAAA,CAAAjB,UAAWkB,EACTlB,EACA,4EACD/B,SAAA,EAECkC,GACAjC,EAAQ,SAAA,CAAAiD,QAAS,IAAMvD,EAAQ,CAAEG,UAAWF,EAAW,KAE9CI,SAAA,mBAGVkC,GACCc,EAAM,OAAA,CAAAjB,UAAU,GAAE/B,SAAA,CAAA,eACH,IACbC,OACEkD,KAAMC,EAAoBnB,EAASD,GAAWK,EAAQgB,IACtDtB,UAAWkB,EAAKlB,EAAW,aAC3BuB,OAAO,SACPC,IAAI,aAEHvD,SAAAuC,GAAOiB,EAAmBvB,UAMvC,CEjBa,MAAAwB,EAAc1C,IACzB,MAAQ2C,SAAUC,GAAqB5C,EACjCiB,EAAU2B,GAAkB3B,SAC1B4B,KAAMC,GAAWC,EAAU,CAAE9B,aAE9B+B,EAAWC,GAAcvB,GAAkB,IAC3CwB,EAAWC,GAAczB,GAAkB,IAC3C0B,EAASC,GAAY3B,GAAkB,GAExCiB,EAAWW,EAAY,CAC3BpC,QAAS0B,GAAkB1B,QAC3BqC,IAAKX,GAAkBW,MAkCzB,MAAO,CACLP,YACAE,YACAE,UACAI,KAnCWC,GACXC,MAAOC,EAAgBC,EAAiB,CAAA,KACtC,IAAKjB,EAAU,OACfM,GAAW,GAIX,MAAMpC,MAAEA,EAAQgD,EAAUC,KAAK,KAAIC,SAAEA,GAAaH,EAElD,OAAOjB,EACJ/D,QAAQkE,GACRU,KAAKG,EAAQ,CACZ9C,QACAkD,aAEDjC,MAAMkC,GAA4BA,EAAGC,SACrCnC,MAAMoC,IACLf,GAAW,GACXgB,YAAW,IAAMhB,GAAW,IAAQ,KAC7Be,KAERE,OAAOC,IACNC,QAAQC,MAAMF,GACdhB,GAAS,GACTc,YAAW,IAAMd,GAAS,IAAQ,IAAK,IAExCmB,SAAQ,IAAMvB,GAAW,IAAO,GAErC,CAACH,EAAQH,EAAU1B,IAQpB,4VChEH,MAAMwD,EAAU,CACdC,QAASC,EAAOC,kBAChBC,QAASF,EAAOG,qBAChBP,MAAOI,EAAOI,oBAGVC,EAAiBhF,IACrB,MAAMgB,UAEJA,EAAY2D,EAAOK,cAAaC,MAChCA,EAAKC,OACLA,EAAS,UAAS/C,QAClBA,EAAOlD,SACPA,EAAQkG,SACRA,GACEnF,EAEJ,OACEd,EAAA,SAAA,CACE8B,UAAWkB,EACTlB,EACAyD,EAAQS,GACRC,GAAYR,EAAOS,uBAErBjD,QAASA,EACT8C,MAAOA,EAAKhG,SAEXA,GAEJ,EC5BGoG,EAAcrF,IAClB,MAAM2D,OACJA,EAAS,EACT2B,OAAQC,EAASP,EAAahE,UAC9BA,EAAS2B,SACTA,GACE3C,GAEErB,WAAEA,GAAeS,KACjBR,QAAEA,GAAYD,KAEZkE,KAAMC,GAAWC,KACjB1B,MAAOC,GAAYC,KACrBiE,cAAEA,GAAkBC,KAEpBzC,UAAEA,EAASE,UAAEA,EAASE,QAAEA,EAAOI,KAAEA,GAASd,EAAW,CAAEC,aAE7D,OAEIzD,EAACqG,EAFDvC,EAEQ,CAAAmC,UAAS,EAAAnE,UAAWA,EAEnB/B,SAAA,WAITiE,EAEO,CAACiC,UAAS,EAAAnE,UAAWA,EAAWkE,OAAO,UAASjG,SAAA,UAMvDmE,EAEO,CAAC+B,UAAS,EAAAnE,UAAWA,EAAWkE,OAAO,QAAOjG,SAAA,kBAMpD6D,EAUDxB,GAASgB,KAAOK,GAAU1B,SAAWuE,EAGnC,CAAArD,QAAS,IAAMqD,EAAc7C,GAAU1B,SACvCD,UAAWA,EACXkE,OAAO,QAGAjG,SAAA,mBAKH+B,UAAWA,EAAWmB,QAAS,IAAMqB,EAAKG,GAAO1E,SAAA,YAnBhD,CAAC+B,UAAWA,EAAWmB,QAASvD,EAAOK,SAAA,kBAsBhD,ECpEE,SAAUyG,EAAe1F,GAI7B,MAAMkB,QAAEA,EAASyB,SAAUC,GAAqB5C,EAC1CiB,EAAU2B,GAAkB3B,QAC5B9C,EAAWwD,EAAY,CAAEV,aAExB0E,EAAWC,GAAclE,GAAS,IAClCmE,EAAOC,GAAYpE,KACnBqE,EAAMC,GAAWtE,IAElBiB,EAAWW,EAAY,CAC3BpC,QAAS0B,GAAkB1B,QAC3BqC,IAAKX,GAAkBW,MA4BzB,OAzBA3B,GAAU,KACHgB,IACHgD,GAAW,GACXE,GAAS,GACTE,GAAQ,IAGLrD,GACLA,EACG/D,QAAQT,GACR8H,UAAU/E,GACVY,MAAMoE,GAAmBA,EAAIC,aAC7BrE,MAAMsE,GAAQA,EAAM,IACpBtE,MAAM+D,IACLC,EAASD,GACTG,GAASH,EAAM,IAEhBzB,OAAOC,IACNC,QAAQC,MAAMF,GACdyB,GAAS,GACTE,GAAQ,EAAK,IAEdxB,SAAQ,IAAMoB,GAAW,IAAO,GAClC,CAAC1E,EAAS0B,IAEN,CACL+C,UAAWA,EACXzE,UACA2E,QACAE,OAEJ,CC3CA,MAAMM,EAA6B,EACjCrF,YACAiE,QACAhG,WACA0D,WACA2C,OAAQC,EAASP,EACjBsB,QAASC,EAAmBrH,EAAc,IAAA,CAAAD,SAAA,YAC1C8G,KAAMS,EAAgBtH,EAAiD,IAAA,CAAAD,SAAA,mDAEvE,MAAMiC,QAAEA,GAAYE,KACdzC,WAAEA,GAAeS,KACjBR,QAAEA,GAAYD,KAEdgH,UAAEA,EAASE,MAAEA,GAAUH,EAAe,CAAExE,UAASyB,aAEvD,OAAKzB,EAQDyE,EAEAzG,EAAA,OAAA,CAAM8B,UAAWA,EAAWiE,MAAOA,EAAKhG,SACrCsH,IAKHV,EAEA3G,EAAA,MAAA,CAAK8B,UAAWA,EAAWiE,MAAOA,EAAKhG,SACpCA,IAMLC,EAAA,OAAA,CAAM8B,UAAWA,EAAWiE,MAAOA,EAAKhG,SACrCuH,IAxBDtH,EAACqG,EAAM,CAACvE,UAAWA,EAAWiE,MAAOA,EAAO9C,QAAS,IAAMvD,IAElDK,SAAA,kBAwBZ,EClDGwH,EAAezG,IACnB,MAAMgB,UAAEA,EAAW2B,SAAUC,GAAqB5C,EAC5CiB,EAAU2B,GAAkB3B,QAC5B9C,EAAWwD,EAAY,CAAEV,aACvB4B,KAAM6D,GAAUC,EAAe,CAAEC,OAAO,IAE1CjE,EAAWW,EAAY,CAC3BpC,QAAS0B,GAAkB1B,QAC3BqC,IAAKX,GAAkBW,MAGnBsD,WCPNC,EACAC,EACAC,GAEA,MAAOC,EAAKC,GAAUxF,EAAwBsF,GAsB9C,OApBApF,GAAU,KACR,IAAIuF,GAAS,EACb,MAAMC,EAAUN,IAChB,GAAIM,QAYJ,OAVAA,EACGtF,MAAMmF,IACAE,GACHD,EAAOD,EACR,IAEF7C,OAAOG,IACND,QAAQC,MAAM,0BAA0BA,IAAQ,IAG7C,KACL4C,GAAS,CAAI,CACd,GACAJ,GAEIE,CACT,CDpB8BI,EAAa,KACvC,GAAK1E,EACL,OAAOA,EACJ/D,QAAQT,GACR0I,cACA/E,MAAMoE,GAAmBA,EAAIC,YAAW,GAC1C,CAACxD,EAAU+D,IAEd,OAAOxH,UAAM8B,UAAWA,EAAY/B,SAAA4H,GAAmB"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts","../src/hooks/useWallet.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\";\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli,\n} from \"wagmi/chains\";\n\nimport React from \"react\";\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext,\n} from \"@hybrd/types\";\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\";\nimport { buildProviders } from \"./helpers\";\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n};\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context);\n}\n\nexport const Web3Context = React.createContext<{\n client: Client;\n chains: any[];\n useContext: () => WalletConnectorContext;\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined,\n});\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost];\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode;\n wallet?: WalletConnector;\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props;\n\n const chains = SUPPORTED_CHAINS;\n const providers = buildProviders(props);\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers,\n });\n\n const contextValue = {\n client,\n useContext,\n chains,\n };\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n );\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\"\nimport { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import { useHybridContext } from \"../providers/Web3Provider\"\n\ntype UseWallet = {\n connect: () => void\n}\n\nexport function useWallet(): UseWallet {\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n return {\n connect,\n }\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useWallet"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as
|
|
1
|
+
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as c,useConnect as o,WagmiConfig as s,useProvider as a,useAccount as i,useNetwork as l,useSigner as u,useContract as d,useSwitchNetwork as m,useBlockNumber as h}from"wagmi";import{mainnet as f,goerli as p,arbitrum as b,arbitrumGoerli as y,localhost as N}from"wagmi/chains";import B,{useState as D,useEffect as v,useCallback as C}from"react";import{alchemyProvider as x}from"wagmi/providers/alchemy";import{infuraProvider as w}from"wagmi/providers/infura";import{publicProvider as g}from"wagmi/providers/public";import{etherscanAddressURL as _,truncateEthAddress as k}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";import{BigNumber as P}from"ethers";export*from"@hybrd/types";function S(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers);return{client:c({autoConnect:!0,provider:s,webSocketProvider:a}),useContext:()=>{const{connect:e,connectors:t}=o();return{connect:()=>e({connector:t[0]})}},Provider:({children:n})=>e(t,{children:n})}}function E(){return B.useContext(K)}const K=B.createContext({client:void 0,chains:void 0,useContext:void 0}),M=[f,p,b,y,N];function L(t){const{children:n,wallet:r=S}=t,c=M,o=function(e){const{alchemyKey:t,infuraKey:n}=e,r=[];return t&&r.push(x({apiKey:t})),n&&r.push(w({apiKey:n})),r.push(g()),r}(t),{client:a,useContext:i,Provider:l}=r({chains:c,providers:o}),u={client:a,useContext:i,chains:c};return e(K.Provider,{value:u,children:e(s,{client:a,children:e(l,{children:n})})})}function O(t){const{className:r,chainId:c}=t,{address:s,isConnected:u}=i(),{connect:d,connectors:m}=o(),{chain:h}=l(),f=function(e){const[t,n]=D(),r=a({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[name,r]),t}(s);return n("p",{className:I(r,"text-sm text-center flex space-x-3 items-center justify-center text-gray"),children:[!u&&e("button",{onClick:()=>d({connector:m[0]}),children:"Connect Wallet"}),u&&n("span",{className:"",children:["connected as"," ",e("a",{href:_(s,c||h.id),className:I(r,"underline"),target:"_blank",rel:"noreferrer",children:f||k(s)})]})]})}const W=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[c,o]=D(!1),[s,a]=D(!1),[i,l]=D(!1),m=d({address:t?.address,abi:t?.abi});return{isMinting:c,isSuccess:s,isError:i,mint:C((async(e,t={})=>{if(!m)return;o(!0);const{value:n=P.from("0"),gasPrice:c}=t;return m.connect(r).mint(e,{value:n,gasPrice:c}).then((e=>e.wait())).then((e=>(a(!0),setTimeout((()=>a(!1)),3e3),e))).catch((e=>{console.error(e),l(!0),setTimeout((()=>l(!1)),1e3)})).finally((()=>o(!1)))}),[r,m,n])}};var j={DefaultButton:"DefaultButton-module_DefaultButton__Px-Zc",DefaultButtonBase:"DefaultButton-module_DefaultButtonBase__KRytO",DefaultButtonSuccess:"DefaultButton-module_DefaultButtonSuccess__eaosU",DefaultButtonError:"DefaultButton-module_DefaultButtonError__B7CKv",DefaultButtonDisabled:"DefaultButton-module_DefaultButtonDisabled__-PIdK"};const A={default:j.DefaultButtonBase,success:j.DefaultButtonSuccess,error:j.DefaultButtonError},T=t=>{const{className:n=j.DefaultButton,style:r,intent:c="default",onClick:o,children:s,disabled:a}=t;return e("button",{className:I(n,A[c],a&&j.DefaultButtonDisabled),onClick:o,style:r,children:s})},R=t=>{const{amount:n=1,button:r=T,className:c,contract:o}=t,{useContext:s}=E(),{connect:a}=s(),{data:i}=u(),{chain:d}=l(),{switchNetwork:h}=m(),{isMinting:f,isSuccess:p,isError:b,mint:y}=W({contract:o});return e(r,f?{disabled:!0,className:c,children:"Minting"}:p?{disabled:!0,className:c,intent:"success",children:"Minted"}:b?{disabled:!0,className:c,intent:"error",children:"Error Occurred"}:i?d?.id!==o?.chainId&&h?{onClick:()=>h(o?.chainId),className:c,intent:"error",children:"Switch Network"}:{className:c,onClick:()=>y(n),children:"Mint Now"}:{className:c,onClick:a,children:"Connect Wallet"})};function U(e){const{address:t,contract:n}=e,r=n?.chainId,c=a({chainId:r}),[o,s]=D(!0),[i,l]=D(),[u,m]=D(),h=d({address:n?.address,abi:n?.abi});return v((()=>{n||(s(!1),l(!1),m(!0)),h&&h.connect(c).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{l(e),m(!e)})).catch((e=>{console.error(e),l(!1),m(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:o,address:t,allow:i,deny:u}}const Y=({className:t,style:n,children:r,contract:c,button:o=T,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:l}=i(),{useContext:u}=E(),{connect:d}=u(),{isLoading:m,allow:h}=U({address:l,contract:c});return l?m?e("span",{className:t,style:n,children:s}):h?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(o,{className:t,style:n,onClick:()=>d(),children:"Connect Wallet"})},Z=t=>{const{className:n,contract:r}=t,c=r?.chainId,o=a({chainId:c}),{data:s}=h({watch:!0}),i=d({address:r?.address,abi:r?.abi}),l=function(e,t,n){const[r,c]=D(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||c(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(i)return i.connect(o).totalSupply().then((e=>e.toNumber()))}),[i,s]);return e("span",{className:n,children:l})};function $(){const{useContext:e}=E(),{connect:t}=e();return{connect:t}}export{O as ConnectedAs,R as MintButton,Y as TokenGate,Z as TotalSupply,L as Web3Provider,W as useMinting,U as useTokenGating,$ as useWallet};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\"\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli\n} from \"wagmi/chains\"\n\nimport React from \"react\"\n// import { Provider } from \"@ethersproject/providers\"\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext\n} from \"@hybrd/types\"\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { buildProviders } from \"./helpers\"\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n}\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n useContext: () => WalletConnectorContext\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost]\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n wallet?: WalletConnector\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector\n } = props\n\n const chains = SUPPORTED_CHAINS\n const providers = buildProviders(props)\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers\n })\n\n const contextValue = {\n client,\n useContext,\n chains\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\";\nimport { useMinting } from \"../hooks/useMinting\";\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\";\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\";\nimport { DeployedContract } from \"@hybrd/types\";\n\ntype MintButtonProps = {\n className?: string;\n contract: DeployedContract;\n button?: React.FC<DefaultButtonProps>;\n amount?: number;\n};\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props;\n\n const { useContext } = useHybridContext();\n const { connect } = useContext();\n\n const { data: signer } = useSigner();\n const { chain: network } = useNetwork();\n const { switchNetwork } = useSwitchNetwork();\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract });\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n );\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n );\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n );\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n );\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n );\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n );\n};\n\nexport default MintButton;\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/helpers.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/hooks/useMinting.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useTokenGating.ts","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts","../src/hooks/useWallet.ts"],"sourcesContent":["import React from \"react\";\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\";\nimport type { WalletConnection, WalletConnectorContext } from \"@hybrd/types\";\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n );\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n });\n\n const useContext = (): WalletConnectorContext => {\n const { connect, connectors } = useConnect();\n return {\n connect: () => connect({ connector: connectors[0] }),\n };\n };\n\n return {\n client: client as Client,\n useContext,\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection;\n}\n","import { WagmiConfig, Client } from \"wagmi\";\nimport {\n mainnet,\n goerli,\n localhost,\n arbitrum,\n arbitrumGoerli,\n} from \"wagmi/chains\";\n\nimport React from \"react\";\nimport {\n ProviderKeys,\n WalletConnector,\n WalletConnectorContext,\n} from \"@hybrd/types\";\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\";\nimport { buildProviders } from \"./helpers\";\n\nexport type Config = {\n // appName?: string\n // alchemyKey?: string\n // infuraKey?: string\n // publicProvider?: boolean\n};\n\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n\nexport function useHybridContext() {\n return React.useContext(Web3Context);\n}\n\nexport const Web3Context = React.createContext<{\n client: Client;\n chains: any[];\n useContext: () => WalletConnectorContext;\n}>({\n client: undefined,\n chains: undefined,\n useContext: undefined,\n});\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, arbitrum, arbitrumGoerli, localhost];\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode;\n wallet?: WalletConnector;\n } & ProviderKeys\n) {\n const {\n children,\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props;\n\n const chains = SUPPORTED_CHAINS;\n const providers = buildProviders(props);\n\n const { client, useContext, Provider } = createWalletConnector({\n chains,\n providers,\n });\n\n const contextValue = {\n client,\n useContext,\n chains,\n };\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n );\n}\n","import { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport type { ProviderKeys } from \"@hybrd/types\"\n\nexport function buildProviders(config: ProviderKeys) {\n const { alchemyKey, infuraKey } = config\n const providers = []\n\n if (alchemyKey) {\n providers.push(\n alchemyProvider({\n apiKey: alchemyKey\n })\n )\n }\n\n if (infuraKey) {\n providers.push(\n infuraProvider({\n apiKey: infuraKey\n })\n )\n }\n\n // TODO - add hybrid provider\n // providers.push(hybridProvider())\n\n providers.push(publicProvider())\n\n return providers\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useConnect, useNetwork } from \"wagmi\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p\n className={clsx(\n className,\n \"text-sm text-center flex space-x-3 items-center justify-center text-gray\"\n )}\n >\n {!isConnected && (\n <button onClick={() => connect({ connector: connectors[0] })}>\n Connect Wallet\n </button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [name, provider])\n\n return ens\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint\n }\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useHybridContext } from \"../providers/Web3Provider\"\nimport { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny\n }\n}\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useHybridContext } from \"../providers/Web3Provider\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>\n}: Props) => {\n const { address } = useAccount()\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n\n const contract = useContract({\n address: deployedContract?.address,\n abi: deployedContract?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import { useHybridContext } from \"../providers/Web3Provider\"\n\ntype UseWallet = {\n connect: () => void\n}\n\nexport function useWallet(): UseWallet {\n const { useContext } = useHybridContext()\n const { connect } = useContext()\n\n return {\n connect,\n }\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","useContext","connect","connectors","useConnect","connector","Provider","children","_jsx","_Fragment","useHybridContext","React","Web3Context","createContext","undefined","SUPPORTED_CHAINS","mainnet","goerli","arbitrum","arbitrumGoerli","localhost","Web3Provider","props","wallet","createWalletConnector","createDefaultWalletConnector","alchemyKey","infuraKey","push","alchemyProvider","apiKey","infuraProvider","publicProvider","buildProviders","contextValue","value","WagmiConfig","ConnectedAs","className","chainId","address","isConnected","useAccount","chain","network","useNetwork","ens","setENS","useState","useProvider","useEffect","lookupAddress","then","name","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","useMinting","contract","deployedContract","data","signer","useSigner","isMinting","setMinting","isSuccess","setSuccess","isError","setError","useContract","abi","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","tx","wait","reciept","setTimeout","catch","err","console","error","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","useTokenGating","isLoading","setLoading","allow","setAllow","deny","setDeny","balanceOf","res","toNumber","bal","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo","useWallet"],"mappings":"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"}
|
package/dist/stats.html
CHANGED
|
@@ -6157,7 +6157,7 @@ var drawChart = (function (exports) {
|
|
|
6157
6157
|
</script>
|
|
6158
6158
|
<script>
|
|
6159
6159
|
/*<!--*/
|
|
6160
|
-
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers","children":[{"uid":"
|
|
6160
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers","children":[{"uid":"b622-43","name":"DefaultWalletConnector.tsx"},{"uid":"b622-45","name":"Web3Provider.tsx"},{"uid":"b622-47","name":"helpers.ts"}]},{"name":"components","children":[{"uid":"b622-49","name":"ConnectedAs.tsx"},{"uid":"b622-55","name":"DefaultButton.tsx"},{"uid":"b622-57","name":"MintButton.tsx"},{"uid":"b622-61","name":"TokenGate.tsx"},{"uid":"b622-63","name":"TotalSupply.tsx"}]},{"name":"hooks","children":[{"name":"internal","children":[{"uid":"b622-51","name":"useEnsName.tsx"},{"uid":"b622-65","name":"useAsyncMemo.ts"}]},{"uid":"b622-53","name":"useMinting.ts"},{"uid":"b622-59","name":"useTokenGating.ts"},{"uid":"b622-67","name":"useWallet.ts"}]}]}]}],"isRoot":true},"nodeParts":{"b622-43":{"renderedLength":599,"gzipLength":0,"brotliLength":0,"metaUid":"b622-42"},"b622-45":{"renderedLength":1089,"gzipLength":0,"brotliLength":0,"metaUid":"b622-44"},"b622-47":{"renderedLength":464,"gzipLength":0,"brotliLength":0,"metaUid":"b622-46"},"b622-49":{"renderedLength":799,"gzipLength":0,"brotliLength":0,"metaUid":"b622-48"},"b622-51":{"renderedLength":351,"gzipLength":0,"brotliLength":0,"metaUid":"b622-50"},"b622-53":{"renderedLength":1451,"gzipLength":0,"brotliLength":0,"metaUid":"b622-52"},"b622-55":{"renderedLength":579,"gzipLength":0,"brotliLength":0,"metaUid":"b622-54"},"b622-57":{"renderedLength":1409,"gzipLength":0,"brotliLength":0,"metaUid":"b622-56"},"b622-59":{"renderedLength":1205,"gzipLength":0,"brotliLength":0,"metaUid":"b622-58"},"b622-61":{"renderedLength":928,"gzipLength":0,"brotliLength":0,"metaUid":"b622-60"},"b622-63":{"renderedLength":687,"gzipLength":0,"brotliLength":0,"metaUid":"b622-62"},"b622-65":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"b622-64"},"b622-67":{"renderedLength":146,"gzipLength":0,"brotliLength":0,"metaUid":"b622-66"}},"nodeMetas":{"b622-42":{"id":"/src/providers/DefaultWalletConnector.tsx","moduleParts":{"index.mjs":"b622-43"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-44"}]},"b622-44":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"b622-45"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-75"},{"uid":"b622-76"},{"uid":"b622-42"},{"uid":"b622-46"}],"importedBy":[{"uid":"b622-68"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-66"}]},"b622-46":{"id":"/src/providers/helpers.ts","moduleParts":{"index.mjs":"b622-47"},"imported":[{"uid":"b622-77"},{"uid":"b622-78"},{"uid":"b622-79"}],"importedBy":[{"uid":"b622-44"}]},"b622-48":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"b622-49"},"imported":[{"uid":"b622-73"},{"uid":"b622-72"},{"uid":"b622-80"},{"uid":"b622-81"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-69"}]},"b622-50":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"b622-51"},"imported":[{"uid":"b622-74"},{"uid":"b622-76"}],"importedBy":[{"uid":"b622-81"}]},"b622-52":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"b622-53"},"imported":[{"uid":"b622-82"},{"uid":"b622-76"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-70"},{"uid":"b622-56"}]},"b622-54":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"b622-55"},"imported":[{"uid":"b622-73"},{"uid":"b622-80"},{"uid":"b622-83"}],"importedBy":[{"uid":"b622-56"},{"uid":"b622-60"}]},"b622-56":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"b622-57"},"imported":[{"uid":"b622-73"},{"uid":"b622-44"},{"uid":"b622-52"},{"uid":"b622-74"},{"uid":"b622-54"}],"importedBy":[{"uid":"b622-69"}]},"b622-58":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"b622-59"},"imported":[{"uid":"b622-76"},{"uid":"b622-74"}],"importedBy":[{"uid":"b622-70"},{"uid":"b622-60"}]},"b622-60":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"b622-61"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-58"},{"uid":"b622-54"},{"uid":"b622-44"}],"importedBy":[{"uid":"b622-69"}]},"b622-62":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"b622-63"},"imported":[{"uid":"b622-73"},{"uid":"b622-74"},{"uid":"b622-64"}],"importedBy":[{"uid":"b622-69"}]},"b622-64":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"b622-65"},"imported":[{"uid":"b622-76"}],"importedBy":[{"uid":"b622-62"},{"uid":"b622-81"}]},"b622-66":{"id":"/src/hooks/useWallet.ts","moduleParts":{"index.mjs":"b622-67"},"imported":[{"uid":"b622-44"}],"importedBy":[{"uid":"b622-70"}]},"b622-68":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"b622-44"},{"uid":"b622-69"},{"uid":"b622-70"},{"uid":"b622-71"},{"uid":"b622-72"}],"importedBy":[],"isEntry":true},"b622-69":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"}],"importedBy":[{"uid":"b622-68"}]},"b622-70":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-66"}],"importedBy":[{"uid":"b622-68"}]},"b622-71":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-68"}],"isExternal":true},"b622-72":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-68"},{"uid":"b622-48"}],"isExternal":true},"b622-73":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-42"},{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"},{"uid":"b622-54"}],"isExternal":true},"b622-74":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-42"},{"uid":"b622-48"},{"uid":"b622-56"},{"uid":"b622-60"},{"uid":"b622-62"},{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-50"}],"isExternal":true},"b622-75":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"}],"isExternal":true},"b622-76":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-44"},{"uid":"b622-52"},{"uid":"b622-58"},{"uid":"b622-64"},{"uid":"b622-50"}],"isExternal":true},"b622-77":{"id":"wagmi/providers/alchemy","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-78":{"id":"wagmi/providers/infura","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-79":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-46"}],"isExternal":true},"b622-80":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-48"},{"uid":"b622-54"}],"isExternal":true},"b622-81":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"b622-64"},{"uid":"b622-50"}],"importedBy":[{"uid":"b622-48"}]},"b622-82":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-52"}],"isExternal":true},"b622-83":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"b622-54"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
|
|
6161
6161
|
|
|
6162
6162
|
const run = () => {
|
|
6163
6163
|
const width = window.innerWidth;
|
|
@@ -6175,8 +6175,3 @@ var drawChart = (function (exports) {
|
|
|
6175
6175
|
</body>
|
|
6176
6176
|
</html>
|
|
6177
6177
|
|
|
6178
|
-
/*-->*/
|
|
6179
|
-
</script>
|
|
6180
|
-
</body>
|
|
6181
|
-
</html>
|
|
6182
|
-
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hybrid",
|
|
3
3
|
"author": "IanH <ian@ianh.xyz>",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"description": "Solidity + TypeScript Framework for Web3 Development",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"hybrid",
|
|
@@ -60,10 +60,10 @@
|
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@ethersproject/providers": "^5.7.1",
|
|
63
|
-
"@hybrd/cli": "^0.5.
|
|
64
|
-
"@hybrd/contracts": "^0.5.
|
|
65
|
-
"@hybrd/types": "^0.5.
|
|
66
|
-
"@hybrd/utils": "^0.5.
|
|
63
|
+
"@hybrd/cli": "^0.5.1",
|
|
64
|
+
"@hybrd/contracts": "^0.5.1",
|
|
65
|
+
"@hybrd/types": "^0.5.1",
|
|
66
|
+
"@hybrd/utils": "^0.5.1",
|
|
67
67
|
"@testing-library/react-hooks": "^8.0.1",
|
|
68
68
|
"abitype": "^0.7.1",
|
|
69
69
|
"axios": "^1.2.2",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"typescript": "^4.7.4",
|
|
109
109
|
"vi-fetch": "^0.8.0",
|
|
110
110
|
"vite": "^4.0.4",
|
|
111
|
-
"vitest": "^0.
|
|
111
|
+
"vitest": "^0.29.8",
|
|
112
112
|
"vitest-fetch-mock": "^0.2.1",
|
|
113
113
|
"wagmi": "^0.12.1"
|
|
114
114
|
},
|
|
@@ -118,5 +118,5 @@
|
|
|
118
118
|
"react-dom": ">=17",
|
|
119
119
|
"wagmi": "^0.12.1"
|
|
120
120
|
},
|
|
121
|
-
"gitHead": "
|
|
121
|
+
"gitHead": "5cf8f3193dcdf9168270a472c194286a430f007d"
|
|
122
122
|
}
|