hybrid 0.7.2 → 0.7.4
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/client/index.d.ts +2 -0
- package/client/index.js +1 -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 +6 -1
- package/package.json +7 -6
package/client/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Deployments } from "/.hybrid/client"
|
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
|
|
1
|
+
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as o,useConnect as c,WagmiConfig as s,mainnet as a,goerli as i,useProvider as l,useSigner as u,useContract as d,useAccount as h,useNetwork as m,useSwitchNetwork as f,useBlockNumber as p}from"wagmi";import B,{useState as N,useEffect as v,useCallback as _}from"react";import{publicProvider as D}from"wagmi/providers/public";import{jsonRpcProvider as b}from"wagmi/providers/jsonRpc";import{etherscanAddressURL as y,truncateEthAddress as w}from"@hybrd/utils";export*from"@hybrd/utils";import k from"clsx";import{BigNumber as C}from"ethers";export*from"@hybrd/types";function I(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers),i=o({autoConnect:!0,provider:s,webSocketProvider:a});return{client:i,hooks:{useWallet:()=>{const{connect:e}=c();return{connect:()=>e({connector:i.connector})}}},Provider:({children:n})=>e(t,{children:n})}}const P=B.createContext({client:void 0,chains:void 0,hooks:{useWallet:()=>({connect:()=>{console.error("No wallet provider found")},disconnect:()=>{console.error("No wallet provider found")}})}});function g(e){const{hybridKey:t}=e,n=[];return n.push(function({apiKey:e}){return b({rpc:t=>{if("localhost"===t.network)return{http:"http://localhost:8545",webSocket:"ws://localhost:8545"};const n=t?.network||"mainnet";return{http:process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP||process.env.HYBRID_RPC_HTTP||`https://rpc.hybrid.dev/${n}/${e||""}`,webSocket:process.env.NEXT_PUBLIC_HYBRID_RPC_WS||process.env.HYBRID_RPC_WS||`wss://rpc.hybrid.dev/${n}/${e||""}`}}})}({apiKey:t})),n.push(D()),n}function S(t){const{children:n,chains:r=[a,i],wallet:o=I}=t,{client:c,hooks:l,Provider:u}=o({chains:r,providers:g(t)}),d={client:c,hooks:l,chains:r};return e(P.Provider,{value:d,children:e(s,{client:c,children:e(u,{children:n})})})}const x=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[o,c]=N(!1),[s,a]=N(!1),[i,l]=N(!1),h=d(t);return{isMinting:o,isSuccess:s,isError:i,mint:_((async(e,t={})=>{if(!h)return;c(!0);const{value:n=C.from("0"),gasPrice:o}=t;return h.connect(r).mint(e,{value:n,gasPrice:o}).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((()=>c(!1)))}),[r,h,n])}};function R(e){const{address:t,contract:n}=e,r=n?.chainId,o=l({chainId:r}),[c,s]=N(!0),[a,i]=N(),[u,h]=N(),m=d(n);return v((()=>{n||(s(!1),i(!1),h(!0)),m&&m.connect(o).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{i(e),h(!e)})).catch((e=>{console.error(e),i(!1),h(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:c,address:t,allow:a,deny:u}}function E(){const{hooks:e}=B.useContext(P);return e.useWallet()}function T(t){const{className:r,chainId:o}=t,{address:c,isConnected:s}=h(),{connect:a}=E(),{chain:i}=m(),u=function(e){const[t,n]=N(),r=l({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[e,r]),t}(c);return n("p",{className:k(r,"flex space-x-3 items-center justify-cente"),children:[!s&&e("button",{onClick:()=>a(),children:"Connect Wallet"}),s&&n("span",{className:"",children:["connected as"," ",e("a",{href:y(c,o||i.id),className:k(r,"underline"),target:"_blank",rel:"noreferrer",children:u||w(c)})]})]})}var W={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 H={default:W.DefaultButtonBase,success:W.DefaultButtonSuccess,error:W.DefaultButtonError},K=t=>{const{className:n=W.DefaultButton,style:r,intent:o="default",onClick:c,children:s,disabled:a}=t;return e("button",{className:k(n,H[o],a&&W.DefaultButtonDisabled),onClick:c,style:r,children:s})},M=t=>{const{amount:n=1,button:r=K,className:o,contract:c}=t,{connect:s}=E(),{data:a}=u(),{chain:i}=m(),{switchNetwork:l}=f(),{isMinting:d,isSuccess:h,isError:p,mint:B}=x({contract:c});return e(r,d?{disabled:!0,className:o,children:"Minting"}:h?{disabled:!0,className:o,intent:"success",children:"Minted"}:p?{disabled:!0,className:o,intent:"error",children:"Error Occurred"}:a?i?.id!==c?.chainId&&l?{onClick:()=>l(c?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>B(n),children:"Mint Now"}:{className:o,onClick:s,children:"Connect Wallet"})},L=({className:t,style:n,children:r,contract:o,button:c=K,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:i}=h(),{connect:l}=E(),{isLoading:u,allow:d}=R({address:i,contract:o});return i?u?e("span",{className:t,style:n,children:s}):d?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(c,{className:t,style:n,onClick:()=>l(),children:"Connect Wallet"})},Y=t=>{const{className:n,contract:r}=t,o=r?.chainId,c=l({chainId:o}),{data:s}=p({watch:!0}),a=d(r),i=function(e,t,n){const[r,o]=N(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||o(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(a)return a.connect(c).totalSupply().then((e=>e.toNumber()))}),[a,s]);return e("span",{className:n,children:i})};export{T as ConnectedAs,M as MintButton,L as TokenGate,Y as TotalSupply,S as Web3Provider,x as useMinting,R as useTokenGating,E 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/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../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 } 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 useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\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\n// I really want to support an HOC its cleaner in some cases.\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","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\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(deployedContract)\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 { 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(deployedContract)\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 { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\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 } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</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 }, [address, provider])\n\n return ens\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 { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 const contract = useContract(deployedContract)\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","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","chainName","network","http","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","webSocket","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../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 } 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 useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\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\n// I really want to support an HOC its cleaner in some cases.\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","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\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(deployedContract)\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 { 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(deployedContract)\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 { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\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 } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</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 }, [address, provider])\n\n return ens\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 { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 const contract = useContract(deployedContract)\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","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"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
|
|
1
|
+
import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import{configureChains as r,createClient as o,useConnect as c,WagmiConfig as s,mainnet as a,goerli as i,useProvider as l,useSigner as u,useContract as d,useAccount as h,useNetwork as m,useSwitchNetwork as f,useBlockNumber as p}from"wagmi";import B,{useState as N,useEffect as v,useCallback as _}from"react";import{publicProvider as D}from"wagmi/providers/public";import{jsonRpcProvider as b}from"wagmi/providers/jsonRpc";import{etherscanAddressURL as y,truncateEthAddress as w}from"@hybrd/utils";export*from"@hybrd/utils";import k from"clsx";import{BigNumber as C}from"ethers";export*from"@hybrd/types";function I(n){const{provider:s,webSocketProvider:a}=r(n.chains,n.providers),i=o({autoConnect:!0,provider:s,webSocketProvider:a});return{client:i,hooks:{useWallet:()=>{const{connect:e}=c();return{connect:()=>e({connector:i.connector})}}},Provider:({children:n})=>e(t,{children:n})}}const P=B.createContext({client:void 0,chains:void 0,hooks:{useWallet:()=>({connect:()=>{console.error("No wallet provider found")},disconnect:()=>{console.error("No wallet provider found")}})}});function g(e){const{hybridKey:t}=e,n=[];return n.push(function({apiKey:e}){return b({rpc:t=>{if("localhost"===t.network)return{http:"http://localhost:8545",webSocket:"ws://localhost:8545"};const n=t?.network||"mainnet";return{http:process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP||process.env.HYBRID_RPC_HTTP||`https://rpc.hybrid.dev/${n}/${e||""}`,webSocket:process.env.NEXT_PUBLIC_HYBRID_RPC_WS||process.env.HYBRID_RPC_WS||`wss://rpc.hybrid.dev/${n}/${e||""}`}}})}({apiKey:t})),n.push(D()),n}function S(t){const{children:n,chains:r=[a,i],wallet:o=I}=t,{client:c,hooks:l,Provider:u}=o({chains:r,providers:g(t)}),d={client:c,hooks:l,chains:r};return e(P.Provider,{value:d,children:e(s,{client:c,children:e(u,{children:n})})})}const x=e=>{const{contract:t}=e,n=t?.chainId,{data:r}=u({chainId:n}),[o,c]=N(!1),[s,a]=N(!1),[i,l]=N(!1),h=d(t);return{isMinting:o,isSuccess:s,isError:i,mint:_((async(e,t={})=>{if(!h)return;c(!0);const{value:n=C.from("0"),gasPrice:o}=t;return h.connect(r).mint(e,{value:n,gasPrice:o}).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((()=>c(!1)))}),[r,h,n])}};function R(e){const{address:t,contract:n}=e,r=n?.chainId,o=l({chainId:r}),[c,s]=N(!0),[a,i]=N(),[u,h]=N(),m=d(n);return v((()=>{n||(s(!1),i(!1),h(!0)),m&&m.connect(o).balanceOf(t).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{i(e),h(!e)})).catch((e=>{console.error(e),i(!1),h(!0)})).finally((()=>s(!1)))}),[t,n]),{isLoading:c,address:t,allow:a,deny:u}}function E(){const{hooks:e}=B.useContext(P);return e.useWallet()}function T(t){const{className:r,chainId:o}=t,{address:c,isConnected:s}=h(),{connect:a}=E(),{chain:i}=m(),u=function(e){const[t,n]=N(),r=l({chainId:1});return v((()=>{e&&r.lookupAddress(e).then(n)}),[e,r]),t}(c);return n("p",{className:k(r,"flex space-x-3 items-center justify-cente"),children:[!s&&e("button",{onClick:()=>a(),children:"Connect Wallet"}),s&&n("span",{className:"",children:["connected as"," ",e("a",{href:y(c,o||i.id),className:k(r,"underline"),target:"_blank",rel:"noreferrer",children:u||w(c)})]})]})}var W={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 H={default:W.DefaultButtonBase,success:W.DefaultButtonSuccess,error:W.DefaultButtonError},K=t=>{const{className:n=W.DefaultButton,style:r,intent:o="default",onClick:c,children:s,disabled:a}=t;return e("button",{className:k(n,H[o],a&&W.DefaultButtonDisabled),onClick:c,style:r,children:s})},M=t=>{const{amount:n=1,button:r=K,className:o,contract:c}=t,{connect:s}=E(),{data:a}=u(),{chain:i}=m(),{switchNetwork:l}=f(),{isMinting:d,isSuccess:h,isError:p,mint:B}=x({contract:c});return e(r,d?{disabled:!0,className:o,children:"Minting"}:h?{disabled:!0,className:o,intent:"success",children:"Minted"}:p?{disabled:!0,className:o,intent:"error",children:"Error Occurred"}:a?i?.id!==c?.chainId&&l?{onClick:()=>l(c?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>B(n),children:"Mint Now"}:{className:o,onClick:s,children:"Connect Wallet"})},L=({className:t,style:n,children:r,contract:o,button:c=K,loading:s=e("p",{children:"Loading"}),deny:a=e("p",{children:"You must own a token to view this content."})})=>{const{address:i}=h(),{connect:l}=E(),{isLoading:u,allow:d}=R({address:i,contract:o});return i?u?e("span",{className:t,style:n,children:s}):d?e("div",{className:t,style:n,children:r}):e("span",{className:t,style:n,children:a}):e(c,{className:t,style:n,onClick:()=>l(),children:"Connect Wallet"})},Y=t=>{const{className:n,contract:r}=t,o=r?.chainId,c=l({chainId:o}),{data:s}=p({watch:!0}),a=d(r),i=function(e,t,n){const[r,o]=N(n);return v((()=>{let t=!1;const n=e();if(null!=n)return n.then((e=>{t||o(e)})).catch((e=>{console.error(`Error in useAsyncMemo: ${e}`)})),()=>{t=!0}}),t),r}((()=>{if(a)return a.connect(c).totalSupply().then((e=>e.toNumber()))}),[a,s]);return e("span",{className:n,children:i})};export{T as ConnectedAs,M as MintButton,L as TokenGate,Y as TotalSupply,S as Web3Provider,x as useMinting,R as useTokenGating,E 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/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../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 } 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 useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\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\n// I really want to support an HOC its cleaner in some cases.\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","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\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(deployedContract)\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 { 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(deployedContract)\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 { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\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 } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</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 }, [address, provider])\n\n return ens\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 { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 const contract = useContract(deployedContract)\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","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","chainName","network","http","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","webSocket","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","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/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../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 } 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 useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\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\n// I really want to support an HOC its cleaner in some cases.\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","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\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(deployedContract)\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 { 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(deployedContract)\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 { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\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 } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</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 }, [address, provider])\n\n return ens\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 { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\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 { connect } = useWallet()\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 const contract = useContract(deployedContract)\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","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"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.
|
|
6160
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers","children":[{"uid":"36a3-1","name":"DefaultWalletConnector.tsx"},{"uid":"36a3-3","name":"Web3Provider.tsx"},{"uid":"36a3-5","name":"hybridProvider.tsx"}]},{"name":"hooks","children":[{"uid":"36a3-7","name":"useMinting.ts"},{"uid":"36a3-9","name":"useTokenGating.ts"},{"uid":"36a3-11","name":"useWallet.ts"},{"name":"internal","children":[{"uid":"36a3-15","name":"useEnsName.tsx"},{"uid":"36a3-25","name":"useAsyncMemo.ts"}]}]},{"name":"components","children":[{"uid":"36a3-13","name":"ConnectedAs.tsx"},{"uid":"36a3-17","name":"DefaultButton.tsx"},{"uid":"36a3-19","name":"MintButton.tsx"},{"uid":"36a3-21","name":"TokenGate.tsx"},{"uid":"36a3-23","name":"TotalSupply.tsx"}]}]}]}],"isRoot":true},"nodeParts":{"36a3-1":{"renderedLength":620,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-0"},"36a3-3":{"renderedLength":1176,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-2"},"36a3-5":{"renderedLength":841,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-4"},"36a3-7":{"renderedLength":1383,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-6"},"36a3-9":{"renderedLength":1136,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-8"},"36a3-11":{"renderedLength":87,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-10"},"36a3-13":{"renderedLength":727,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-12"},"36a3-15":{"renderedLength":354,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-14"},"36a3-17":{"renderedLength":579,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-16"},"36a3-19":{"renderedLength":1361,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-18"},"36a3-21":{"renderedLength":881,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-20"},"36a3-23":{"renderedLength":617,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-22"},"36a3-25":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"36a3-24"}},"nodeMetas":{"36a3-0":{"id":"/src/providers/DefaultWalletConnector.tsx","moduleParts":{"index.mjs":"36a3-1"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-32"}],"importedBy":[{"uid":"36a3-2"}]},"36a3-2":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"36a3-3"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-32"},{"uid":"36a3-33"},{"uid":"36a3-0"},{"uid":"36a3-34"},{"uid":"36a3-4"}],"importedBy":[{"uid":"36a3-26"},{"uid":"36a3-10"}]},"36a3-4":{"id":"/src/providers/hybridProvider.tsx","moduleParts":{"index.mjs":"36a3-5"},"imported":[{"uid":"36a3-35"}],"importedBy":[{"uid":"36a3-2"}]},"36a3-6":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"36a3-7"},"imported":[{"uid":"36a3-38"},{"uid":"36a3-33"},{"uid":"36a3-32"}],"importedBy":[{"uid":"36a3-28"},{"uid":"36a3-18"}]},"36a3-8":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.mjs":"36a3-9"},"imported":[{"uid":"36a3-33"},{"uid":"36a3-32"}],"importedBy":[{"uid":"36a3-28"},{"uid":"36a3-20"}]},"36a3-10":{"id":"/src/hooks/useWallet.ts","moduleParts":{"index.mjs":"36a3-11"},"imported":[{"uid":"36a3-2"}],"importedBy":[{"uid":"36a3-28"}]},"36a3-12":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.mjs":"36a3-13"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-30"},{"uid":"36a3-36"},{"uid":"36a3-37"},{"uid":"36a3-32"},{"uid":"36a3-28"}],"importedBy":[{"uid":"36a3-27"}]},"36a3-14":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.mjs":"36a3-15"},"imported":[{"uid":"36a3-32"},{"uid":"36a3-33"}],"importedBy":[{"uid":"36a3-37"}]},"36a3-16":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"36a3-17"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-36"},{"uid":"36a3-39"}],"importedBy":[{"uid":"36a3-18"},{"uid":"36a3-20"}]},"36a3-18":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"36a3-19"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-6"},{"uid":"36a3-32"},{"uid":"36a3-16"},{"uid":"36a3-28"}],"importedBy":[{"uid":"36a3-27"}]},"36a3-20":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.mjs":"36a3-21"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-32"},{"uid":"36a3-8"},{"uid":"36a3-16"},{"uid":"36a3-28"}],"importedBy":[{"uid":"36a3-27"}]},"36a3-22":{"id":"/src/components/TotalSupply.tsx","moduleParts":{"index.mjs":"36a3-23"},"imported":[{"uid":"36a3-31"},{"uid":"36a3-32"},{"uid":"36a3-24"}],"importedBy":[{"uid":"36a3-27"}]},"36a3-24":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"36a3-25"},"imported":[{"uid":"36a3-33"}],"importedBy":[{"uid":"36a3-22"},{"uid":"36a3-37"}]},"36a3-26":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"36a3-2"},{"uid":"36a3-27"},{"uid":"36a3-28"},{"uid":"36a3-29"},{"uid":"36a3-30"}],"importedBy":[],"isEntry":true},"36a3-27":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"36a3-12"},{"uid":"36a3-18"},{"uid":"36a3-20"},{"uid":"36a3-22"}],"importedBy":[{"uid":"36a3-26"}]},"36a3-28":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"36a3-6"},{"uid":"36a3-8"},{"uid":"36a3-10"}],"importedBy":[{"uid":"36a3-26"},{"uid":"36a3-12"},{"uid":"36a3-18"},{"uid":"36a3-20"}]},"36a3-29":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-26"}],"isExternal":true},"36a3-30":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-26"},{"uid":"36a3-12"}],"isExternal":true},"36a3-31":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-2"},{"uid":"36a3-0"},{"uid":"36a3-12"},{"uid":"36a3-18"},{"uid":"36a3-20"},{"uid":"36a3-22"},{"uid":"36a3-16"}],"isExternal":true},"36a3-32":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-2"},{"uid":"36a3-0"},{"uid":"36a3-12"},{"uid":"36a3-18"},{"uid":"36a3-20"},{"uid":"36a3-22"},{"uid":"36a3-6"},{"uid":"36a3-8"},{"uid":"36a3-14"}],"isExternal":true},"36a3-33":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-2"},{"uid":"36a3-6"},{"uid":"36a3-8"},{"uid":"36a3-24"},{"uid":"36a3-14"}],"isExternal":true},"36a3-34":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-2"}],"isExternal":true},"36a3-35":{"id":"wagmi/providers/jsonRpc","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-4"}],"isExternal":true},"36a3-36":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-12"},{"uid":"36a3-16"}],"isExternal":true},"36a3-37":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"36a3-24"},{"uid":"36a3-14"}],"importedBy":[{"uid":"36a3-12"}]},"36a3-38":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-6"}],"isExternal":true},"36a3-39":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"36a3-16"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
|
|
6161
6161
|
|
|
6162
6162
|
const run = () => {
|
|
6163
6163
|
const width = window.innerWidth;
|
|
@@ -6175,3 +6175,8 @@ var drawChart = (function (exports) {
|
|
|
6175
6175
|
</body>
|
|
6176
6176
|
</html>
|
|
6177
6177
|
|
|
6178
|
+
>*/
|
|
6179
|
+
</script>
|
|
6180
|
+
</body>
|
|
6181
|
+
</html>
|
|
6182
|
+
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hybrid",
|
|
3
3
|
"author": "IanH <ian@ianh.xyz>",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.4",
|
|
5
5
|
"description": "Solidity + TypeScript Framework for Web3 Development",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"hybrid",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"test": "vitest"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
|
+
"client/*",
|
|
42
43
|
"dist/*",
|
|
43
44
|
"README.md"
|
|
44
45
|
],
|
|
@@ -57,10 +58,10 @@
|
|
|
57
58
|
},
|
|
58
59
|
"dependencies": {
|
|
59
60
|
"@ethersproject/providers": "^5.7.1",
|
|
60
|
-
"@hybrd/cli": "^0.7.
|
|
61
|
-
"@hybrd/contracts": "^0.7.
|
|
62
|
-
"@hybrd/types": "^0.7.
|
|
63
|
-
"@hybrd/utils": "^0.7.
|
|
61
|
+
"@hybrd/cli": "^0.7.4",
|
|
62
|
+
"@hybrd/contracts": "^0.7.4",
|
|
63
|
+
"@hybrd/types": "^0.7.4",
|
|
64
|
+
"@hybrd/utils": "^0.7.4",
|
|
64
65
|
"@testing-library/react-hooks": "^8.0.1",
|
|
65
66
|
"abitype": "^0.7.1",
|
|
66
67
|
"axios": "^1.2.2",
|
|
@@ -113,5 +114,5 @@
|
|
|
113
114
|
"react-dom": ">=17",
|
|
114
115
|
"wagmi": "^0.12.8"
|
|
115
116
|
},
|
|
116
|
-
"gitHead": "
|
|
117
|
+
"gitHead": "1c1fcae67bb8678e7ef77417268c335f46d0ddb2"
|
|
117
118
|
}
|