hybrid 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,15 @@
1
1
  import { Signer } from "ethers";
2
2
  import type { BytesLike } from "ethers/lib/utils";
3
- type DataOrFn = BytesLike | ((signer: Signer) => BytesLike);
3
+ type DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null;
4
4
  type Estimate = {
5
- gas: number;
6
- gasPrice: number;
7
- wei: number;
8
- eth: number;
5
+ gas?: number;
6
+ gasPrice?: number;
7
+ wei?: number;
8
+ eth?: number;
9
9
  };
10
- export declare function useEstimation(dataOrFn: DataOrFn, chainId?: number): Estimate;
10
+ type Opts = {
11
+ deployData: DataOrFn;
12
+ chainId?: number;
13
+ };
14
+ export declare function useEstimation(opts: Opts): Estimate;
11
15
  export {};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as r,WagmiConfig as n,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as m,localhost as f}from"wagmi/chains";import{publicProvider as h}from"wagmi/providers/public";import p,{useMemo as b,useState as B,useEffect as D,useCallback as v}from"react";import w from"clsx";import{Wallet as S,utils as N}from"ethers";export*from"@hybrd/types";export*from"@hybrd/utils";const g=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),_=[d,m,f];function k(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(_,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];r&&n.push(h());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),m={client:d,chains:s,provider:u,webSocketProvider:l};return t(g.Provider,{value:m,children:t(n,{client:d,children:c})})}const P=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({chainId:r}),[l,d]=B(!1),[m,f]=B(!1),[h,p]=B(!1),b=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:m,isError:h,totalSupply:function(t,e,r){const[n,o]=B(r);return D((()=>{let e=!1;const r=t();if(null!=r)return r.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),n}((()=>{if(b)return b.connect(s).totalSupply().then((t=>t.toNumber()))}),[b,n]),mint:v((t=>{if(b)return d(!0),b.connect(u).mint(t).then((t=>t.wait())).then((t=>(f(!0),setTimeout((()=>f(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[u,b])}};var y={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 C={default:y.DefaultButtonBase,success:y.DefaultButtonSuccess,error:y.DefaultButtonError},E=e=>{const{className:r=y.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(r,C[n],c&&y.DefaultButtonDisabled),onClick:o,children:i})},x=e=>{const{amount:r=1,button:n=E,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:m}=s(),{chain:f}=u(),{switchNetwork:h}=l(),{isMinting:p,isSuccess:b,isError:B,mint:D}=P(i);if(console.log({contract:i}),p)return t(n,{disabled:!0,className:o,children:"Minting"});if(b)return t(n,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(n,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=m[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,f?.id!==i?.chainId&&h?{onClick:()=>h(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>D(r),children:"Mint Now"})};function I(t,e){const r=i({chainId:e}),{data:n}=o(),[c,a]=B({gas:null,gasPrice:null,wei:null,eth:null}),s=v((e=>"function"==typeof t?t(e):t),[t]);return D((()=>{const{address:t}=S.createRandom(),e=s(r);(async function(t,e){const r=await t.estimateGas(e).then((t=>t.toString())).then(Number),n=await t.getGasPrice().then((t=>t.toString())).then(Number),o=r*n,i=parseFloat(N.formatEther(o.toString()));return{gas:r,gasPrice:n,wei:o,eth:i}})(r,{data:e,from:t}).then(a).catch((t=>{console.error("useEstimation",t)}))}),[n,r,e,s]),c}export{x as MintButton,k as Web3Provider,I as useEstimation,P as useMinting};
1
+ import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as r,WagmiConfig as n,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as m,localhost as h}from"wagmi/chains";import{alchemyProvider as f}from"wagmi/providers/alchemy";import{publicProvider as p}from"wagmi/providers/public";import v,{useMemo as B,useState as D,useEffect as b,useCallback as w}from"react";import N from"clsx";import{Wallet as S,utils as g}from"ethers";export*from"@hybrd/types";export*from"@hybrd/utils";const y=v.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),_=[d,m,h];function k(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=B((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(_,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];e&&n.push(f({apiKey:e}));r&&n.push(p());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),m={client:d,chains:s,provider:u,webSocketProvider:l};return t(y.Provider,{value:m,children:t(n,{client:d,children:c})})}const P=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({chainId:r}),[l,d]=D(!1),[m,h]=D(!1),[f,p]=D(!1),v=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:m,isError:f,totalSupply:function(t,e,r){const[n,o]=D(r);return b((()=>{let e=!1;const r=t();if(null!=r)return r.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),n}((()=>{if(v)return v.connect(s).totalSupply().then((t=>t.toNumber()))}),[v,n]),mint:w((t=>{if(v)return d(!0),v.connect(u).mint(t).then((t=>t.wait())).then((t=>(h(!0),setTimeout((()=>h(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[u,v])}};var C={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 x={default:C.DefaultButtonBase,success:C.DefaultButtonSuccess,error:C.DefaultButtonError},E=e=>{const{className:r=C.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:N(r,x[n],c&&C.DefaultButtonDisabled),onClick:o,children:i})},I=e=>{const{amount:r=1,button:n=E,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:m}=s(),{chain:h}=u(),{switchNetwork:f}=l(),{isMinting:p,isSuccess:v,isError:B,mint:D}=P(i);if(console.log({contract:i}),p)return t(n,{disabled:!0,className:o,children:"Minting"});if(v)return t(n,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(n,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=m[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==i?.chainId&&f?{onClick:()=>f(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>D(r),children:"Mint Now"})},M=()=>{const[t,e]=D();return o({watch:!0,onBlock:e}),t};function K(t){const{deployData:e,chainId:r}=t,n=i({chainId:r}),o=M(),[c,a]=D({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),s=w((t=>"function"==typeof e?e(t):e),[e]);return b((()=>{const{address:t}=S.createRandom(),e=s(n);e&&async function(t,e){const r=await t.estimateGas(e).then((t=>t.toString())).then(Number),n=await t.getFeeData().then((t=>t.maxFeePerGas.toString())).then(Number),o=r*n,i=parseFloat(g.formatUnits(o,"ether"));return{gas:r,gasPrice:n,wei:o,eth:i}}(n,{data:e,from:t}).then(a).catch((t=>{console.error("useEstimation",t)}))}),[o,n,r,s]),c}export{I as MintButton,k as Web3Provider,K as useEstimation,P as useMinting};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/providers/Web3Provider.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { configureChains, createClient, WagmiConfig, Client } from \"wagmi\"\nimport { mainnet, goerli, localhost } from \"wagmi/chains\"\n\nimport { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nimport React, { useMemo } from \"react\"\nimport { Provider } from \"@ethersproject/providers\"\n\ntype Config = {\n appName?: string\n alchemyKey?: string\n // infuraKey?: string\n publicProvider?: boolean\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n provider: ({ chainId }: { chainId?: number }) => Provider\n webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined,\n provider: undefined,\n webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, localhost]\n\nexport function Web3Provider(props: { children: React.ReactNode } & Config) {\n const { appName, children, ...keys } = props\n\n const { chains, provider, webSocketProvider } = useMemo(() => {\n const { chains, provider, webSocketProvider } = configureChains(\n SUPPORTED_CHAINS,\n buildProviders(keys)\n )\n return { chains, provider, webSocketProvider }\n }, [keys])\n\n // const { connectors } = getDefaultWallets({\n // appName: appName || \"Hybrid App\",\n // chains\n // })\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider\n })\n\n const contextValue = {\n client,\n chains,\n provider,\n webSocketProvider\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>{children}</WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\nfunction buildProviders(config: Config) {\n const {\n alchemyKey,\n // infuraKey,\n publicProvider: usePublic = true\n } = 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 if (usePublic) {\n providers.push(publicProvider())\n }\n\n // providers.push(\n // jsonRpcProvider({\n // rpc: () => ({\n // http: \"http://localhost:8545\",\n // ws: \"ws://localhost:8545\"\n // })\n // })\n // )\n\n return providers\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\nexport const useMinting = (config: DeployedContract): UseMinting => {\n const address = config?.address\n const chainId = config?.chainId\n\n const { data: block } = useBlockNumber()\n const provider = useProvider({ 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,\n abi: config?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n const mint = useCallback(\n (amount: number) => {\n if (!contract) return\n\n setMinting(true)\n return contract\n .connect(signer)\n .mint(amount)\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]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n totalSupply,\n mint\n }\n}\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n console.log({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike)\n\ntype Estimate = {\n gas: number\n gasPrice: number\n wei: number\n eth: number\n}\n\nexport function useEstimation(dataOrFn: DataOrFn, chainId?: number) {\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber()\n const [estimate, setEstimate] = useState<Estimate>({\n gas: null,\n gasPrice: null,\n wei: null,\n eth: null\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof dataOrFn === \"function\" ? dataOrFn(provider) : dataOrFn\n },\n [dataOrFn]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider\n .estimateGas(tx)\n .then((res) => res.toString())\n .then(Number)\n\n const gasPrice = await provider\n .getGasPrice()\n .then((res) => res.toString())\n .then(Number)\n\n const wei = gas * gasPrice\n const eth = parseFloat(utils.formatEther(wei.toString()))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["Web3Context","React","createContext","client","undefined","chains","provider","webSocketProvider","SUPPORTED_CHAINS","mainnet","goerli","localhost","Web3Provider","props","appName","children","keys","useMemo","configureChains","config","alchemyKey","publicProvider","usePublic","providers","push","buildProviders","createClient","autoConnect","contextValue","_jsx","Provider","value","WagmiConfig","useMinting","address","chainId","data","block","useBlockNumber","useProvider","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","contract","useContract","abi","totalSupply","factory","deps","initial","val","setVal","useEffect","cancel","promise","then","catch","error","console","useAsyncMemo","connect","res","toNumber","mint","useCallback","amount","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","className","intent","onClick","disabled","clsx","DefaultButtonDisabled","MintButton","button","Button","connectors","useConnect","chain","network","useNetwork","switchNetwork","useSwitchNetwork","log","connector","id","useEstimation","dataOrFn","estimate","setEstimate","gas","gasPrice","wei","eth","buildData","from","Wallet","createRandom","async","estimateGas","toString","Number","getGasPrice","parseFloat","utils","formatEther","getEstimate"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/providers/Web3Provider.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { configureChains, createClient, WagmiConfig, Client } from \"wagmi\"\nimport { mainnet, goerli, localhost } from \"wagmi/chains\"\n\nimport { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nimport React, { useMemo } from \"react\"\nimport { Provider } from \"@ethersproject/providers\"\n\ntype Config = {\n appName?: string\n alchemyKey?: string\n // infuraKey?: string\n publicProvider?: boolean\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n provider: ({ chainId }: { chainId?: number }) => Provider\n webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined,\n provider: undefined,\n webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, localhost]\n\nexport function Web3Provider(props: { children: React.ReactNode } & Config) {\n const { appName, children, ...keys } = props\n\n const { chains, provider, webSocketProvider } = useMemo(() => {\n const { chains, provider, webSocketProvider } = configureChains(\n SUPPORTED_CHAINS,\n buildProviders(keys)\n )\n return { chains, provider, webSocketProvider }\n }, [keys])\n\n // const { connectors } = getDefaultWallets({\n // appName: appName || \"Hybrid App\",\n // chains\n // })\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider\n })\n\n const contextValue = {\n client,\n chains,\n provider,\n webSocketProvider\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>{children}</WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\nfunction buildProviders(config: Config) {\n const {\n alchemyKey,\n // infuraKey,\n publicProvider: usePublic = true\n } = 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 if (usePublic) {\n providers.push(publicProvider())\n }\n\n // providers.push(\n // jsonRpcProvider({\n // rpc: () => ({\n // http: \"http://localhost:8545\",\n // ws: \"ws://localhost:8545\"\n // })\n // })\n // )\n\n return providers\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\nexport const useMinting = (config: DeployedContract): UseMinting => {\n const address = config?.address\n const chainId = config?.chainId\n\n const { data: block } = useBlockNumber()\n const provider = useProvider({ 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,\n abi: config?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n const mint = useCallback(\n (amount: number) => {\n if (!contract) return\n\n setMinting(true)\n return contract\n .connect(signer)\n .mint(amount)\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]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n totalSupply,\n mint\n }\n}\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n console.log({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider\n .estimateGas(tx)\n .then((res) => res.toString())\n .then(Number)\n\n const gasPrice = await provider\n .getFeeData()\n .then((res) => res.maxFeePerGas.toString())\n .then(Number)\n\n const wei = gas * gasPrice\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["Web3Context","React","createContext","client","undefined","chains","provider","webSocketProvider","SUPPORTED_CHAINS","mainnet","goerli","localhost","Web3Provider","props","appName","children","keys","useMemo","configureChains","config","alchemyKey","publicProvider","usePublic","providers","push","alchemyProvider","apiKey","buildProviders","createClient","autoConnect","contextValue","_jsx","Provider","value","WagmiConfig","useMinting","address","chainId","data","block","useBlockNumber","useProvider","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","contract","useContract","abi","totalSupply","factory","deps","initial","val","setVal","useEffect","cancel","promise","then","catch","error","console","useAsyncMemo","connect","res","toNumber","mint","useCallback","amount","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","className","intent","onClick","disabled","clsx","DefaultButtonDisabled","MintButton","button","Button","connectors","useConnect","chain","network","useNetwork","switchNetwork","useSwitchNetwork","log","connector","id","useBlockBeat","setBlock","watch","onBlock","useEstimation","opts","deployData","estimate","setEstimate","gas","gasPrice","wei","eth","buildData","from","Wallet","createRandom","async","estimateGas","toString","Number","getFeeData","maxFeePerGas","parseFloat","utils","formatUnits","getEstimate"],"mappings":"smBAkBO,MAAMA,EAAcC,EAAMC,cAK9B,CACDC,YAAQC,EACRC,YAAQD,EACRE,cAAUF,EACVG,uBAAmBH,IAGfI,EAAmB,CAACC,EAASC,EAAQC,GAErC,SAAUC,EAAaC,GAC3B,MAAMC,QAAEA,EAAOC,SAAEA,KAAaC,GAASH,GAEjCR,OAAEA,EAAMC,SAAEA,EAAQC,kBAAEA,GAAsBU,GAAQ,KACtD,MAAMZ,OAAEA,EAAMC,SAAEA,EAAQC,kBAAEA,GAAsBW,EAC9CV,EAgCN,SAAwBW,GACtB,MAAMC,WACJA,EAEAC,eAAgBC,GAAY,GAC1BH,EACEI,EAAY,GAEdH,GACFG,EAAUC,KACRC,EAAgB,CACdC,OAAQN,KAaVE,GACFC,EAAUC,KAAKH,KAYjB,OAAOE,CACT,CArEMI,CAAeX,IAEjB,MAAO,CAAEX,SAAQC,WAAUC,oBAAmB,GAC7C,CAACS,IAOEb,EAASyB,EAAa,CAC1BC,aAAa,EAEbvB,WACAC,sBAGIuB,EAAe,CACnB3B,SACAE,SACAC,WACAC,qBAGF,OACEwB,EAAC/B,EAAYgC,SAAS,CAAAC,MAAOH,EAAYf,SACvCgB,EAACG,EAAW,CAAC/B,OAAQA,WAASY,KAGpC,CChDa,MAAAoB,EAAchB,IACzB,MAAMiB,EAAUjB,GAAQiB,QAClBC,EAAUlB,GAAQkB,SAEhBC,KAAMC,GAAUC,IAClBlC,EAAWmC,EAAY,CAAEJ,aACvBC,KAAMI,GAAWC,EAAU,CAAEN,aAE9BO,EAAWC,GAAcC,GAAkB,IAC3CC,EAAWC,GAAcF,GAAkB,IAC3CG,EAASC,GAAYJ,GAAkB,GAExCK,EAAWC,EAAY,CAC3BhB,UACAiB,IAAKlC,GAAQkC,MAmCf,MAAO,CACLT,YACAG,YACAE,UACAK,qBC1DFC,EACAC,EACAC,GAEA,MAAOC,EAAKC,GAAUb,EAAwBW,GAsB9C,OApBAG,GAAU,KACR,IAAIC,GAAS,EACb,MAAMC,EAAUP,IAChB,GAAIO,QAYJ,OAVAA,EACGC,MAAML,IACAG,GACHF,EAAOD,EACR,IAEFM,OAAOC,IACNC,QAAQD,MAAM,0BAA0BA,IAAQ,IAG7C,KACLJ,GAAS,CAAI,CACd,GACAL,GAEIE,CACT,CDL8BS,EAAa,KACvC,GAAKhB,EACL,OAAOA,EACJiB,QAAQ9D,GACRgD,cACAS,MAAMM,GAAmBA,EAAIC,YAAW,GAC1C,CAACnB,EAAUZ,IA+BZgC,KA7BWC,GACVC,IACC,GAAKtB,EAGL,OADAN,GAAW,GACJM,EACJiB,QAAQ1B,GACR6B,KAAKE,GACLV,MAAMW,GAA4BA,EAAGC,SACrCZ,MAAMa,IACL5B,GAAW,GACX6B,YAAW,IAAM7B,GAAW,IAAQ,KAC7B4B,KAERZ,OAAOc,IACNZ,QAAQD,MAAMa,GACd5B,GAAS,GACT2B,YAAW,IAAM3B,GAAS,IAAQ,IAAK,IAExC6B,SAAQ,IAAMlC,GAAW,IAAO,GAErC,CAACH,EAAQS,IASV,4VE/DH,MAAM6B,EAAU,CACdC,QAASC,EAAOC,kBAChBC,QAASF,EAAOG,qBAChBpB,MAAOiB,EAAOI,oBAGVC,EAAiB1E,IACrB,MAAM2E,UAEJA,EAAYN,EAAOK,cAAaE,OAChCA,EAAS,UAASC,QAClBA,EAAO3E,SACPA,EAAQ4E,SACRA,GACE9E,EAEJ,OACEkB,EACE,SAAA,CAAAyD,UAAWI,EACTJ,EACAR,EAAQS,GACRE,GAAYT,EAAOW,uBAErBH,QAASA,EAER3E,SAAAA,GAEJ,EC1BG+E,EAAcjF,IAClB,MAAM4D,OACJA,EAAS,EACTsB,OAAQC,EAAST,EAAaC,UAC9BA,EAASrC,SACTA,GACEtC,GACIyB,KAAMI,GAAWC,KACnByB,QAAEA,EAAO6B,WAAEA,GAAeC,KACxBC,MAAOC,GAAYC,KACrBC,cAAEA,GAAkBC,KAEpB3D,UAAEA,EAASG,UAAEA,EAASE,QAAEA,EAAOsB,KAAEA,GAASpC,EAAWgB,GAI3D,GAFAe,QAAQsC,IAAI,CAAErD,aAEVP,EACF,OACEb,EAACiE,EAAO,CAAAL,UAAS,EAAAH,UAAWA,EAEnBzE,SAAA,YAIb,GAAIgC,EACF,OACEhB,EAACiE,EAAM,CAACL,UAAS,EAAAH,UAAWA,EAAWC,OAAO,UAAS1E,SAAA,WAM3D,GAAIkC,EACF,OACElB,EAACiE,EAAM,CAACL,UAAS,EAAAH,UAAWA,EAAWC,OAAO,QAAO1E,SAAA,mBAMzD,IAAK2B,EAAQ,CACX,MAAM+D,EAAYR,EAAW,GAC7B,OACElE,EAACiE,EAAM,CAACR,UAAWA,EAAWE,QAAS,IAAMtB,EAAQ,CAAEqC,cAE9C1F,SAAA,kBAEZ,CAED,OAEIgB,EAACiE,EAFDI,GAASM,KAAOvD,GAAUd,SAAWiE,EAGnC,CAAAZ,QAAS,IAAMY,EAAcnD,GAAUd,SACvCmD,UAAWA,EACXC,OAAO,QAGA1E,SAAA,mBAKHyE,UAAWA,EAAWE,QAAS,IAAMnB,EAAKE,GAAO1D,SAAA,YAG1D,EC/DG4F,EAAe,KACnB,MAAOpE,EAAOqE,GAAY9D,IAG1B,OAFAN,EAAe,CAAEqE,OAAO,EAAMC,QAASF,IAEhCrE,CAAK,EAQR,SAAUwE,EAAcC,GAC5B,MAAMC,WAAEA,EAAU5E,QAAEA,GAAY2E,EAC1B1G,EAAWmC,EAAY,CAAEJ,YACzBE,EAAQoE,KAEPO,EAAUC,GAAerE,EAAmB,CACjDsE,SAAKhH,EACLiH,cAAUjH,EACVkH,SAAKlH,EACLmH,SAAKnH,IAGDoH,EAAYhD,GACflE,GAC8B,mBAAf2G,EACVA,EAAW3G,GACX2G,GAEN,CAACA,IAkBH,OAfArD,GAAU,KACR,MAAQxB,QAASqF,GAASC,EAAOC,eAC3BrF,EAAOkF,EAAUlH,GAClBgC,GAeTsF,eACEtH,EACAoE,GAEA,MAAM0C,QAAY9G,EACfuH,YAAYnD,GACZX,MAAMM,GAAQA,EAAIyD,aAClB/D,KAAKgE,QAEFV,QAAiB/G,EACpB0H,aACAjE,MAAMM,GAAQA,EAAI4D,aAAaH,aAC/B/D,KAAKgE,QAEFT,EAAMF,EAAMC,EACZE,EAAMW,WAAWC,EAAMC,YAAYd,EAAK,UAE9C,MAAO,CACLF,MACAC,WACAC,MACAC,MAEJ,CApCIc,CAAY/H,EAAU,CACpBgC,OACAmF,SAEC1D,KAAKoD,GACLnD,OAAOc,IACNZ,QAAQD,MAAM,gBAAiBa,EAAI,GACnC,GACH,CAACvC,EAAOjC,EAAU+B,EAASmF,IAEvBN,CACT"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as r,WagmiConfig as n,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as m,localhost as f}from"wagmi/chains";import{publicProvider as h}from"wagmi/providers/public";import p,{useMemo as b,useState as B,useEffect as D,useCallback as v}from"react";import w from"clsx";import{Wallet as S,utils as N}from"ethers";export*from"@hybrd/types";export*from"@hybrd/utils";const g=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),_=[d,m,f];function k(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(_,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];r&&n.push(h());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),m={client:d,chains:s,provider:u,webSocketProvider:l};return t(g.Provider,{value:m,children:t(n,{client:d,children:c})})}const P=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({chainId:r}),[l,d]=B(!1),[m,f]=B(!1),[h,p]=B(!1),b=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:m,isError:h,totalSupply:function(t,e,r){const[n,o]=B(r);return D((()=>{let e=!1;const r=t();if(null!=r)return r.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),n}((()=>{if(b)return b.connect(s).totalSupply().then((t=>t.toNumber()))}),[b,n]),mint:v((t=>{if(b)return d(!0),b.connect(u).mint(t).then((t=>t.wait())).then((t=>(f(!0),setTimeout((()=>f(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[u,b])}};var y={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 C={default:y.DefaultButtonBase,success:y.DefaultButtonSuccess,error:y.DefaultButtonError},E=e=>{const{className:r=y.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(r,C[n],c&&y.DefaultButtonDisabled),onClick:o,children:i})},x=e=>{const{amount:r=1,button:n=E,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:m}=s(),{chain:f}=u(),{switchNetwork:h}=l(),{isMinting:p,isSuccess:b,isError:B,mint:D}=P(i);if(console.log({contract:i}),p)return t(n,{disabled:!0,className:o,children:"Minting"});if(b)return t(n,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(n,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=m[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,f?.id!==i?.chainId&&h?{onClick:()=>h(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>D(r),children:"Mint Now"})};function I(t,e){const r=i({chainId:e}),{data:n}=o(),[c,a]=B({gas:null,gasPrice:null,wei:null,eth:null}),s=v((e=>"function"==typeof t?t(e):t),[t]);return D((()=>{const{address:t}=S.createRandom(),e=s(r);(async function(t,e){const r=await t.estimateGas(e).then((t=>t.toString())).then(Number),n=await t.getGasPrice().then((t=>t.toString())).then(Number),o=r*n,i=parseFloat(N.formatEther(o.toString()));return{gas:r,gasPrice:n,wei:o,eth:i}})(r,{data:e,from:t}).then(a).catch((t=>{console.error("useEstimation",t)}))}),[n,r,e,s]),c}export{x as MintButton,k as Web3Provider,I as useEstimation,P as useMinting};
1
+ import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as r,WagmiConfig as n,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as m,localhost as h}from"wagmi/chains";import{alchemyProvider as f}from"wagmi/providers/alchemy";import{publicProvider as p}from"wagmi/providers/public";import v,{useMemo as B,useState as D,useEffect as b,useCallback as w}from"react";import N from"clsx";import{Wallet as S,utils as g}from"ethers";export*from"@hybrd/types";export*from"@hybrd/utils";const y=v.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),_=[d,m,h];function k(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=B((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(_,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];e&&n.push(f({apiKey:e}));r&&n.push(p());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),m={client:d,chains:s,provider:u,webSocketProvider:l};return t(y.Provider,{value:m,children:t(n,{client:d,children:c})})}const P=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({chainId:r}),[l,d]=D(!1),[m,h]=D(!1),[f,p]=D(!1),v=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:m,isError:f,totalSupply:function(t,e,r){const[n,o]=D(r);return b((()=>{let e=!1;const r=t();if(null!=r)return r.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),n}((()=>{if(v)return v.connect(s).totalSupply().then((t=>t.toNumber()))}),[v,n]),mint:w((t=>{if(v)return d(!0),v.connect(u).mint(t).then((t=>t.wait())).then((t=>(h(!0),setTimeout((()=>h(!1)),3e3),t))).catch((t=>{console.error(t),p(!0),setTimeout((()=>p(!1)),1e3)})).finally((()=>d(!1)))}),[u,v])}};var C={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 x={default:C.DefaultButtonBase,success:C.DefaultButtonSuccess,error:C.DefaultButtonError},E=e=>{const{className:r=C.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:N(r,x[n],c&&C.DefaultButtonDisabled),onClick:o,children:i})},I=e=>{const{amount:r=1,button:n=E,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:m}=s(),{chain:h}=u(),{switchNetwork:f}=l(),{isMinting:p,isSuccess:v,isError:B,mint:D}=P(i);if(console.log({contract:i}),p)return t(n,{disabled:!0,className:o,children:"Minting"});if(v)return t(n,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(n,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=m[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==i?.chainId&&f?{onClick:()=>f(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>D(r),children:"Mint Now"})},M=()=>{const[t,e]=D();return o({watch:!0,onBlock:e}),t};function K(t){const{deployData:e,chainId:r}=t,n=i({chainId:r}),o=M(),[c,a]=D({gas:void 0,gasPrice:void 0,wei:void 0,eth:void 0}),s=w((t=>"function"==typeof e?e(t):e),[e]);return b((()=>{const{address:t}=S.createRandom(),e=s(n);e&&async function(t,e){const r=await t.estimateGas(e).then((t=>t.toString())).then(Number),n=await t.getFeeData().then((t=>t.maxFeePerGas.toString())).then(Number),o=r*n,i=parseFloat(g.formatUnits(o,"ether"));return{gas:r,gasPrice:n,wei:o,eth:i}}(n,{data:e,from:t}).then(a).catch((t=>{console.error("useEstimation",t)}))}),[o,n,r,s]),c}export{I as MintButton,k as Web3Provider,K as useEstimation,P as useMinting};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/providers/Web3Provider.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { configureChains, createClient, WagmiConfig, Client } from \"wagmi\"\nimport { mainnet, goerli, localhost } from \"wagmi/chains\"\n\nimport { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nimport React, { useMemo } from \"react\"\nimport { Provider } from \"@ethersproject/providers\"\n\ntype Config = {\n appName?: string\n alchemyKey?: string\n // infuraKey?: string\n publicProvider?: boolean\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n provider: ({ chainId }: { chainId?: number }) => Provider\n webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined,\n provider: undefined,\n webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, localhost]\n\nexport function Web3Provider(props: { children: React.ReactNode } & Config) {\n const { appName, children, ...keys } = props\n\n const { chains, provider, webSocketProvider } = useMemo(() => {\n const { chains, provider, webSocketProvider } = configureChains(\n SUPPORTED_CHAINS,\n buildProviders(keys)\n )\n return { chains, provider, webSocketProvider }\n }, [keys])\n\n // const { connectors } = getDefaultWallets({\n // appName: appName || \"Hybrid App\",\n // chains\n // })\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider\n })\n\n const contextValue = {\n client,\n chains,\n provider,\n webSocketProvider\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>{children}</WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\nfunction buildProviders(config: Config) {\n const {\n alchemyKey,\n // infuraKey,\n publicProvider: usePublic = true\n } = 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 if (usePublic) {\n providers.push(publicProvider())\n }\n\n // providers.push(\n // jsonRpcProvider({\n // rpc: () => ({\n // http: \"http://localhost:8545\",\n // ws: \"ws://localhost:8545\"\n // })\n // })\n // )\n\n return providers\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\nexport const useMinting = (config: DeployedContract): UseMinting => {\n const address = config?.address\n const chainId = config?.chainId\n\n const { data: block } = useBlockNumber()\n const provider = useProvider({ 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,\n abi: config?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n const mint = useCallback(\n (amount: number) => {\n if (!contract) return\n\n setMinting(true)\n return contract\n .connect(signer)\n .mint(amount)\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]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n totalSupply,\n mint\n }\n}\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n console.log({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike)\n\ntype Estimate = {\n gas: number\n gasPrice: number\n wei: number\n eth: number\n}\n\nexport function useEstimation(dataOrFn: DataOrFn, chainId?: number) {\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber()\n const [estimate, setEstimate] = useState<Estimate>({\n gas: null,\n gasPrice: null,\n wei: null,\n eth: null\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof dataOrFn === \"function\" ? dataOrFn(provider) : dataOrFn\n },\n [dataOrFn]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider\n .estimateGas(tx)\n .then((res) => res.toString())\n .then(Number)\n\n const gasPrice = await provider\n .getGasPrice()\n .then((res) => res.toString())\n .then(Number)\n\n const wei = gas * gasPrice\n const eth = parseFloat(utils.formatEther(wei.toString()))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["Web3Context","React","createContext","client","undefined","chains","provider","webSocketProvider","SUPPORTED_CHAINS","mainnet","goerli","localhost","Web3Provider","props","appName","children","keys","useMemo","configureChains","config","alchemyKey","publicProvider","usePublic","providers","push","buildProviders","createClient","autoConnect","contextValue","_jsx","Provider","value","WagmiConfig","useMinting","address","chainId","data","block","useBlockNumber","useProvider","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","contract","useContract","abi","totalSupply","factory","deps","initial","val","setVal","useEffect","cancel","promise","then","catch","error","console","useAsyncMemo","connect","res","toNumber","mint","useCallback","amount","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","className","intent","onClick","disabled","clsx","DefaultButtonDisabled","MintButton","button","Button","connectors","useConnect","chain","network","useNetwork","switchNetwork","useSwitchNetwork","log","connector","id","useEstimation","dataOrFn","estimate","setEstimate","gas","gasPrice","wei","eth","buildData","from","Wallet","createRandom","async","estimateGas","toString","Number","getGasPrice","parseFloat","utils","formatEther","getEstimate"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/providers/Web3Provider.tsx","../src/hooks/useMinting.ts","../src/hooks/internal/useAsyncMemo.ts","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/hooks/useEstimation.ts"],"sourcesContent":["import { configureChains, createClient, WagmiConfig, Client } from \"wagmi\"\nimport { mainnet, goerli, localhost } from \"wagmi/chains\"\n\nimport { alchemyProvider } from \"wagmi/providers/alchemy\"\nimport { infuraProvider } from \"wagmi/providers/infura\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nimport React, { useMemo } from \"react\"\nimport { Provider } from \"@ethersproject/providers\"\n\ntype Config = {\n appName?: string\n alchemyKey?: string\n // infuraKey?: string\n publicProvider?: boolean\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: any[]\n provider: ({ chainId }: { chainId?: number }) => Provider\n webSocketProvider: ({ chainId }: { chainId?: number }) => Provider\n}>({\n client: undefined,\n chains: undefined,\n provider: undefined,\n webSocketProvider: undefined\n})\n\nconst SUPPORTED_CHAINS = [mainnet, goerli, localhost]\n\nexport function Web3Provider(props: { children: React.ReactNode } & Config) {\n const { appName, children, ...keys } = props\n\n const { chains, provider, webSocketProvider } = useMemo(() => {\n const { chains, provider, webSocketProvider } = configureChains(\n SUPPORTED_CHAINS,\n buildProviders(keys)\n )\n return { chains, provider, webSocketProvider }\n }, [keys])\n\n // const { connectors } = getDefaultWallets({\n // appName: appName || \"Hybrid App\",\n // chains\n // })\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider\n })\n\n const contextValue = {\n client,\n chains,\n provider,\n webSocketProvider\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>{children}</WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\nfunction buildProviders(config: Config) {\n const {\n alchemyKey,\n // infuraKey,\n publicProvider: usePublic = true\n } = 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 if (usePublic) {\n providers.push(publicProvider())\n }\n\n // providers.push(\n // jsonRpcProvider({\n // rpc: () => ({\n // http: \"http://localhost:8545\",\n // ws: \"ws://localhost:8545\"\n // })\n // })\n // )\n\n return providers\n}\n","import type {\n TransactionReceipt,\n TransactionResponse\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useBlockNumber, useContract, useProvider, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useAsyncMemo } from \"./internal/useAsyncMemo\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n totalSupply: number | undefined\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\nexport const useMinting = (config: DeployedContract): UseMinting => {\n const address = config?.address\n const chainId = config?.chainId\n\n const { data: block } = useBlockNumber()\n const provider = useProvider({ 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,\n abi: config?.abi\n })\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n const mint = useCallback(\n (amount: number) => {\n if (!contract) return\n\n setMinting(true)\n return contract\n .connect(signer)\n .mint(amount)\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]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n totalSupply,\n mint\n }\n}\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useConnect, useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n console.log({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import { ethers, Signer, utils, Wallet } from \"ethers\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useBlockNumber, useProvider, useWebSocketProvider } from \"wagmi\"\nimport type { BytesLike, Deferrable } from \"ethers/lib/utils\"\n\ntype DataOrFn = BytesLike | ((signer: Signer) => BytesLike) | null\n\ntype Estimate = {\n gas?: number\n gasPrice?: number\n wei?: number\n eth?: number\n}\n\nconst useBlockBeat = () => {\n const [block, setBlock] = useState<number>()\n useBlockNumber({ watch: true, onBlock: setBlock })\n\n return block\n}\n\ntype Opts = {\n deployData: DataOrFn\n chainId?: number\n}\n\nexport function useEstimation(opts: Opts) {\n const { deployData, chainId } = opts\n const provider = useProvider({ chainId })\n const block = useBlockBeat()\n\n const [estimate, setEstimate] = useState<Estimate>({\n gas: undefined,\n gasPrice: undefined,\n wei: undefined,\n eth: undefined\n })\n\n const buildData = useCallback(\n (provider) => {\n return typeof deployData === \"function\"\n ? deployData(provider)\n : deployData\n },\n [deployData]\n )\n\n useEffect(() => {\n const { address: from } = Wallet.createRandom()\n const data = buildData(provider)\n if (!data) return\n\n getEstimate(provider, {\n data,\n from\n })\n .then(setEstimate)\n .catch((err) => {\n console.error(\"useEstimation\", err)\n })\n }, [block, provider, chainId, buildData])\n\n return estimate\n}\n\nasync function getEstimate(\n provider: any,\n tx: Deferrable<ethers.providers.TransactionRequest>\n) {\n const gas = await provider\n .estimateGas(tx)\n .then((res) => res.toString())\n .then(Number)\n\n const gasPrice = await provider\n .getFeeData()\n .then((res) => res.maxFeePerGas.toString())\n .then(Number)\n\n const wei = gas * gasPrice\n const eth = parseFloat(utils.formatUnits(wei, \"ether\"))\n\n return {\n gas,\n gasPrice,\n wei,\n eth\n }\n}\n"],"names":["Web3Context","React","createContext","client","undefined","chains","provider","webSocketProvider","SUPPORTED_CHAINS","mainnet","goerli","localhost","Web3Provider","props","appName","children","keys","useMemo","configureChains","config","alchemyKey","publicProvider","usePublic","providers","push","alchemyProvider","apiKey","buildProviders","createClient","autoConnect","contextValue","_jsx","Provider","value","WagmiConfig","useMinting","address","chainId","data","block","useBlockNumber","useProvider","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","contract","useContract","abi","totalSupply","factory","deps","initial","val","setVal","useEffect","cancel","promise","then","catch","error","console","useAsyncMemo","connect","res","toNumber","mint","useCallback","amount","tx","wait","reciept","setTimeout","err","finally","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","className","intent","onClick","disabled","clsx","DefaultButtonDisabled","MintButton","button","Button","connectors","useConnect","chain","network","useNetwork","switchNetwork","useSwitchNetwork","log","connector","id","useBlockBeat","setBlock","watch","onBlock","useEstimation","opts","deployData","estimate","setEstimate","gas","gasPrice","wei","eth","buildData","from","Wallet","createRandom","async","estimateGas","toString","Number","getFeeData","maxFeePerGas","parseFloat","utils","formatUnits","getEstimate"],"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.js","children":[{"name":"src","children":[{"name":"providers/Web3Provider.tsx","uid":"a9ae-26"},{"name":"hooks","children":[{"uid":"a9ae-28","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"a9ae-30"},{"uid":"a9ae-36","name":"useEstimation.ts"}]},{"name":"components","children":[{"uid":"a9ae-32","name":"DefaultButton.tsx"},{"uid":"a9ae-34","name":"MintButton.tsx"}]}]}]}],"isRoot":true},"nodeParts":{"a9ae-26":{"renderedLength":1763,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-25"},"a9ae-28":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-27"},"a9ae-30":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-29"},"a9ae-32":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-31"},"a9ae-34":{"renderedLength":1323,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-33"},"a9ae-36":{"renderedLength":1268,"gzipLength":0,"brotliLength":0,"metaUid":"a9ae-35"}},"nodeMetas":{"a9ae-25":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.js":"a9ae-26"},"imported":[{"uid":"a9ae-42"},{"uid":"a9ae-43"},{"uid":"a9ae-44"},{"uid":"a9ae-45"},{"uid":"a9ae-46"}],"importedBy":[{"uid":"a9ae-37"}]},"a9ae-27":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.js":"a9ae-28"},"imported":[{"uid":"a9ae-46"},{"uid":"a9ae-43"},{"uid":"a9ae-29"}],"importedBy":[{"uid":"a9ae-39"},{"uid":"a9ae-33"}]},"a9ae-29":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.js":"a9ae-30"},"imported":[{"uid":"a9ae-46"}],"importedBy":[{"uid":"a9ae-27"}]},"a9ae-31":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.js":"a9ae-32"},"imported":[{"uid":"a9ae-42"},{"uid":"a9ae-48"},{"uid":"a9ae-49"}],"importedBy":[{"uid":"a9ae-33"}]},"a9ae-33":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.js":"a9ae-34"},"imported":[{"uid":"a9ae-42"},{"uid":"a9ae-27"},{"uid":"a9ae-43"},{"uid":"a9ae-31"}],"importedBy":[{"uid":"a9ae-38"}]},"a9ae-35":{"id":"/src/hooks/useEstimation.ts","moduleParts":{"index.js":"a9ae-36"},"imported":[{"uid":"a9ae-47"},{"uid":"a9ae-46"},{"uid":"a9ae-43"}],"importedBy":[{"uid":"a9ae-39"}]},"a9ae-37":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"a9ae-25"},{"uid":"a9ae-38"},{"uid":"a9ae-39"},{"uid":"a9ae-40"},{"uid":"a9ae-41"}],"importedBy":[],"isEntry":true},"a9ae-38":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"a9ae-33"}],"importedBy":[{"uid":"a9ae-37"}]},"a9ae-39":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"a9ae-35"},{"uid":"a9ae-27"}],"importedBy":[{"uid":"a9ae-37"}]},"a9ae-40":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-37"}],"isExternal":true},"a9ae-41":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-37"}],"isExternal":true},"a9ae-42":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-25"},{"uid":"a9ae-33"},{"uid":"a9ae-31"}],"isExternal":true},"a9ae-43":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-25"},{"uid":"a9ae-33"},{"uid":"a9ae-35"},{"uid":"a9ae-27"}],"isExternal":true},"a9ae-44":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-25"}],"isExternal":true},"a9ae-45":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-25"}],"isExternal":true},"a9ae-46":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-25"},{"uid":"a9ae-35"},{"uid":"a9ae-27"},{"uid":"a9ae-29"}],"isExternal":true},"a9ae-47":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-35"}],"isExternal":true},"a9ae-48":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-31"}],"isExternal":true},"a9ae-49":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"a9ae-31"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
6160
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.js","children":[{"name":"src","children":[{"name":"providers/Web3Provider.tsx","uid":"7f58-1"},{"name":"hooks","children":[{"uid":"7f58-3","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"7f58-5"},{"uid":"7f58-11","name":"useEstimation.ts"}]},{"name":"components","children":[{"uid":"7f58-7","name":"DefaultButton.tsx"},{"uid":"7f58-9","name":"MintButton.tsx"}]}]}]}],"isRoot":true},"nodeParts":{"7f58-1":{"renderedLength":1731,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-0"},"7f58-3":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-2"},"7f58-5":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-4"},"7f58-7":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-6"},"7f58-9":{"renderedLength":1323,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-8"},"7f58-11":{"renderedLength":1534,"gzipLength":0,"brotliLength":0,"metaUid":"7f58-10"}},"nodeMetas":{"7f58-0":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.js":"7f58-1"},"imported":[{"uid":"7f58-17"},{"uid":"7f58-18"},{"uid":"7f58-19"},{"uid":"7f58-20"},{"uid":"7f58-21"},{"uid":"7f58-22"}],"importedBy":[{"uid":"7f58-12"}]},"7f58-2":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.js":"7f58-3"},"imported":[{"uid":"7f58-22"},{"uid":"7f58-18"},{"uid":"7f58-4"}],"importedBy":[{"uid":"7f58-14"},{"uid":"7f58-8"}]},"7f58-4":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.js":"7f58-5"},"imported":[{"uid":"7f58-22"}],"importedBy":[{"uid":"7f58-2"}]},"7f58-6":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.js":"7f58-7"},"imported":[{"uid":"7f58-17"},{"uid":"7f58-24"},{"uid":"7f58-25"}],"importedBy":[{"uid":"7f58-8"}]},"7f58-8":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.js":"7f58-9"},"imported":[{"uid":"7f58-17"},{"uid":"7f58-2"},{"uid":"7f58-18"},{"uid":"7f58-6"}],"importedBy":[{"uid":"7f58-13"}]},"7f58-10":{"id":"/src/hooks/useEstimation.ts","moduleParts":{"index.js":"7f58-11"},"imported":[{"uid":"7f58-23"},{"uid":"7f58-22"},{"uid":"7f58-18"}],"importedBy":[{"uid":"7f58-14"}]},"7f58-12":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"7f58-0"},{"uid":"7f58-13"},{"uid":"7f58-14"},{"uid":"7f58-15"},{"uid":"7f58-16"}],"importedBy":[],"isEntry":true},"7f58-13":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"7f58-8"}],"importedBy":[{"uid":"7f58-12"}]},"7f58-14":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"7f58-10"},{"uid":"7f58-2"}],"importedBy":[{"uid":"7f58-12"}]},"7f58-15":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-12"}],"isExternal":true},"7f58-16":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-12"}],"isExternal":true},"7f58-17":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"},{"uid":"7f58-8"},{"uid":"7f58-6"}],"isExternal":true},"7f58-18":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"},{"uid":"7f58-8"},{"uid":"7f58-10"},{"uid":"7f58-2"}],"isExternal":true},"7f58-19":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"}],"isExternal":true},"7f58-20":{"id":"wagmi/providers/alchemy","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"}],"isExternal":true},"7f58-21":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"}],"isExternal":true},"7f58-22":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-0"},{"uid":"7f58-10"},{"uid":"7f58-2"},{"uid":"7f58-4"}],"isExternal":true},"7f58-23":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-10"}],"isExternal":true},"7f58-24":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-6"}],"isExternal":true},"7f58-25":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"7f58-6"}]}},"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,9 @@ var drawChart = (function (exports) {
6175
6175
  </body>
6176
6176
  </html>
6177
6177
 
6178
+ oaded', run);
6179
+ /*-->*/
6180
+ </script>
6181
+ </body>
6182
+ </html>
6183
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hybrid",
3
3
  "author": "IanH <ian@ianh.xyz>",
4
- "version": "0.3.7",
4
+ "version": "0.3.9",
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.3.7",
64
- "@hybrd/contracts": "^0.3.7",
65
- "@hybrd/types": "^0.3.7",
66
- "@hybrd/utils": "^0.3.7",
63
+ "@hybrd/cli": "^0.3.9",
64
+ "@hybrd/contracts": "^0.3.9",
65
+ "@hybrd/types": "^0.3.9",
66
+ "@hybrd/utils": "^0.3.9",
67
67
  "abitype": "^0.7.1",
68
68
  "axios": "^1.2.2",
69
69
  "clsx": "^1.2.1",
@@ -116,5 +116,5 @@
116
116
  "react-dom": ">=17",
117
117
  "wagmi": "^0.6.0"
118
118
  },
119
- "gitHead": "8fd953bfd8f3c4563de1f6a640973f36fcc39d1d"
119
+ "gitHead": "3051b10d64def0d2d00cafabf308c7b2b27fba9d"
120
120
  }