hybrid 0.3.5 → 0.3.6

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 +1,2 @@
1
+ export * from "./useEstimation";
1
2
  export * from "./useMinting";
@@ -0,0 +1,11 @@
1
+ import { Signer } from "ethers";
2
+ import type { BytesLike } from "ethers/lib/utils";
3
+ type DataOrFn = BytesLike | ((signer: Signer) => BytesLike);
4
+ type Estimate = {
5
+ gas: number;
6
+ gasPrice: number;
7
+ wei: number;
8
+ eth: number;
9
+ };
10
+ export declare function useEstimation(dataOrFn: DataOrFn, chainId?: number): Estimate;
11
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { Web3Provider } from "./providers/Web3Provider";
2
2
  export * from "./components";
3
3
  export * from "./hooks";
4
- export * from "./utils";
5
4
  export * from "@hybrd/types";
5
+ export * from "@hybrd/utils";
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 c,useSigner as i,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as f,localhost as h}from"wagmi/chains";import{publicProvider as m}from"wagmi/providers/public";import p,{useMemo as b,useState as B,useEffect as v,useCallback as D}from"react";import w from"clsx";import{utils as S,ethers as k}from"ethers";export*from"@hybrd/types";const _=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),g=[d,f,h];function y(o){const{appName:c,children:i,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(g,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];r&&n.push(m());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),f={client:d,chains:s,provider:u,webSocketProvider:l};return t(_.Provider,{value:f,children:t(n,{client:d,children:i})})}const N=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=c({chainId:r}),{data:u}=i({chainId:r}),[l,d]=B(!1),[f,h]=B(!1),[m,p]=B(!1),b=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:f,isError:m,totalSupply:function(t,e,r){const[n,o]=B(r);return v((()=>{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:D((t=>{if(b)return d(!0),b.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,b])}};var E={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 P={default:E.DefaultButtonBase,success:E.DefaultButtonSuccess,error:E.DefaultButtonError},C=e=>{const{className:r=E.DefaultButton,intent:n="default",onClick:o,children:c,disabled:i}=e;return t("button",{className:w(r,P[n],i&&E.DefaultButtonDisabled),onClick:o,children:c})},I=e=>{const{amount:r=1,button:n=C,className:o,contract:c}=e,{data:a}=i(),{connect:d,connectors:f}=s(),{chain:h}=u(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=N(c);if(console.log({contract:c}),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=f[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==c?.chainId&&m?{onClick:()=>m(c?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(r),children:"Mint Now"})};function x(t){return"number"!=typeof t?null:parseInt(t.toString())/100}function M(t){return 100*t}function K(t){return"number"!=typeof t?0:parseInt(t.toString())/1e4}function U(t){return parseFloat(S.formatEther(t.toString()))}function O(t){return void 0===t?null:k.utils.parseUnits(t.toString(),"ether")}function T(t,e=1){return A(e)+"/address/"+t}function j(t,e=1){return A(e)+"/tx/"+t}function A(t=1){switch(t){case 1:return"https://etherscan.io";case 3:return"https://ropsten.etherscan.io";case 4:return"https://rinkeby.etherscan.io";case 5:return"https://goerli.etherscan.io";case 137:return"https://polygonscan.com";case 80001:return"https://mumbai.polygonscan.com";default:throw new Error("Etherscan: Unknown chain id "+t)}}export{I as MintButton,y as Web3Provider,K as bipsToDecimal,x as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,N as useMinting,U as weiToEth};
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};
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/utils/basisPoints.ts","../src/utils/conversion.ts","../src/utils/etherscan.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","export function bipsToPercent(bp: number | string) {\n if (typeof bp !== \"number\") return null\n return parseInt(bp.toString()) / 100\n}\n\nexport function percentToBips(percent: number) {\n return percent * 100\n}\n\nexport function bipsToDecimal(bp: number | string) {\n if (typeof bp !== \"number\") return 0\n return parseInt(bp.toString()) / 10000\n}\n","import { BigNumber, BigNumberish, ethers, utils } from \"ethers\"\n\nexport function weiToEth(wei: BigNumberish): number {\n return parseFloat(utils.formatEther(wei.toString()))\n}\n\nexport function ethToWei(eth: number): BigNumber | null {\n if (typeof eth === \"undefined\") return null\n return ethers.utils.parseUnits(eth.toString(), \"ether\")\n}\n","export function etherscanAddressURL(address: string, chainId = 1) {\n return etherscanHost(chainId) + \"/address/\" + address\n}\n\nexport function etherscanTxURL(hash: string, chainId = 1) {\n return etherscanHost(chainId) + \"/tx/\" + hash\n}\n\nexport function etherscanHost(chainId = 1) {\n switch (chainId) {\n case 1:\n return `https://etherscan.io`\n case 3:\n return `https://ropsten.etherscan.io`\n case 4:\n return `https://rinkeby.etherscan.io`\n case 5:\n return `https://goerli.etherscan.io`\n case 137:\n return `https://polygonscan.com`\n case 80001:\n return `https://mumbai.polygonscan.com`\n default:\n throw new Error(\"Etherscan: Unknown chain id \" + chainId)\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","bipsToPercent","bp","parseInt","toString","percentToBips","percent","bipsToDecimal","weiToEth","wei","parseFloat","utils","formatEther","ethToWei","eth","ethers","parseUnits","etherscanAddressURL","etherscanHost","etherscanTxURL","hash","Error"],"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 } 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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"}
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 c,useSigner as i,useContract as a,useConnect as s,useNetwork as u,useSwitchNetwork as l}from"wagmi";import{mainnet as d,goerli as f,localhost as h}from"wagmi/chains";import{publicProvider as m}from"wagmi/providers/public";import p,{useMemo as b,useState as B,useEffect as v,useCallback as D}from"react";import w from"clsx";import{utils as S,ethers as k}from"ethers";export*from"@hybrd/types";const _=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),g=[d,f,h];function y(o){const{appName:c,children:i,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(g,function(t){const{alchemyKey:e,publicProvider:r=!0}=t,n=[];r&&n.push(m());return n}(a));return{chains:t,provider:r,webSocketProvider:n}}),[a]),d=r({autoConnect:!0,provider:u,webSocketProvider:l}),f={client:d,chains:s,provider:u,webSocketProvider:l};return t(_.Provider,{value:f,children:t(n,{client:d,children:i})})}const N=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=c({chainId:r}),{data:u}=i({chainId:r}),[l,d]=B(!1),[f,h]=B(!1),[m,p]=B(!1),b=a({address:e,abi:t?.abi});return{isMinting:l,isSuccess:f,isError:m,totalSupply:function(t,e,r){const[n,o]=B(r);return v((()=>{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:D((t=>{if(b)return d(!0),b.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,b])}};var E={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 P={default:E.DefaultButtonBase,success:E.DefaultButtonSuccess,error:E.DefaultButtonError},C=e=>{const{className:r=E.DefaultButton,intent:n="default",onClick:o,children:c,disabled:i}=e;return t("button",{className:w(r,P[n],i&&E.DefaultButtonDisabled),onClick:o,children:c})},I=e=>{const{amount:r=1,button:n=C,className:o,contract:c}=e,{data:a}=i(),{connect:d,connectors:f}=s(),{chain:h}=u(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=N(c);if(console.log({contract:c}),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=f[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==c?.chainId&&m?{onClick:()=>m(c?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(r),children:"Mint Now"})};function x(t){return"number"!=typeof t?null:parseInt(t.toString())/100}function M(t){return 100*t}function K(t){return"number"!=typeof t?0:parseInt(t.toString())/1e4}function U(t){return parseFloat(S.formatEther(t.toString()))}function O(t){return void 0===t?null:k.utils.parseUnits(t.toString(),"ether")}function T(t,e=1){return A(e)+"/address/"+t}function j(t,e=1){return A(e)+"/tx/"+t}function A(t=1){switch(t){case 1:return"https://etherscan.io";case 3:return"https://ropsten.etherscan.io";case 4:return"https://rinkeby.etherscan.io";case 5:return"https://goerli.etherscan.io";case 137:return"https://polygonscan.com";case 80001:return"https://mumbai.polygonscan.com";default:throw new Error("Etherscan: Unknown chain id "+t)}}export{I as MintButton,y as Web3Provider,K as bipsToDecimal,x as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,N as useMinting,U as weiToEth};
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};
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/utils/basisPoints.ts","../src/utils/conversion.ts","../src/utils/etherscan.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","export function bipsToPercent(bp: number | string) {\n if (typeof bp !== \"number\") return null\n return parseInt(bp.toString()) / 100\n}\n\nexport function percentToBips(percent: number) {\n return percent * 100\n}\n\nexport function bipsToDecimal(bp: number | string) {\n if (typeof bp !== \"number\") return 0\n return parseInt(bp.toString()) / 10000\n}\n","import { BigNumber, BigNumberish, ethers, utils } from \"ethers\"\n\nexport function weiToEth(wei: BigNumberish): number {\n return parseFloat(utils.formatEther(wei.toString()))\n}\n\nexport function ethToWei(eth: number): BigNumber | null {\n if (typeof eth === \"undefined\") return null\n return ethers.utils.parseUnits(eth.toString(), \"ether\")\n}\n","export function etherscanAddressURL(address: string, chainId = 1) {\n return etherscanHost(chainId) + \"/address/\" + address\n}\n\nexport function etherscanTxURL(hash: string, chainId = 1) {\n return etherscanHost(chainId) + \"/tx/\" + hash\n}\n\nexport function etherscanHost(chainId = 1) {\n switch (chainId) {\n case 1:\n return `https://etherscan.io`\n case 3:\n return `https://ropsten.etherscan.io`\n case 4:\n return `https://rinkeby.etherscan.io`\n case 5:\n return `https://goerli.etherscan.io`\n case 137:\n return `https://polygonscan.com`\n case 80001:\n return `https://mumbai.polygonscan.com`\n default:\n throw new Error(\"Etherscan: Unknown chain id \" + chainId)\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","bipsToPercent","bp","parseInt","toString","percentToBips","percent","bipsToDecimal","weiToEth","wei","parseFloat","utils","formatEther","ethToWei","eth","ethers","parseUnits","etherscanAddressURL","etherscanHost","etherscanTxURL","hash","Error"],"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 } 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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"}
package/dist/stats.html CHANGED
@@ -6157,7 +6157,7 @@ var drawChart = (function (exports) {
6157
6157
  </script>
6158
6158
  <script>
6159
6159
  /*<!--*/
6160
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers/Web3Provider.tsx","uid":"89b7-30"},{"name":"hooks","children":[{"uid":"89b7-32","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"89b7-34"}]},{"name":"components","children":[{"uid":"89b7-36","name":"DefaultButton.tsx"},{"uid":"89b7-38","name":"MintButton.tsx"}]},{"name":"utils","children":[{"uid":"89b7-40","name":"basisPoints.ts"},{"uid":"89b7-42","name":"conversion.ts"},{"uid":"89b7-44","name":"etherscan.ts"}]}]}]}],"isRoot":true},"nodeParts":{"89b7-30":{"renderedLength":1763,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-29"},"89b7-32":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-31"},"89b7-34":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-33"},"89b7-36":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-35"},"89b7-38":{"renderedLength":1323,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-37"},"89b7-40":{"renderedLength":312,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-39"},"89b7-42":{"renderedLength":229,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-41"},"89b7-44":{"renderedLength":764,"gzipLength":0,"brotliLength":0,"metaUid":"89b7-43"}},"nodeMetas":{"89b7-29":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"89b7-30"},"imported":[{"uid":"89b7-50"},{"uid":"89b7-51"},{"uid":"89b7-52"},{"uid":"89b7-53"},{"uid":"89b7-54"}],"importedBy":[{"uid":"89b7-45"}]},"89b7-31":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"89b7-32"},"imported":[{"uid":"89b7-54"},{"uid":"89b7-51"},{"uid":"89b7-33"}],"importedBy":[{"uid":"89b7-47"},{"uid":"89b7-37"}]},"89b7-33":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"89b7-34"},"imported":[{"uid":"89b7-54"}],"importedBy":[{"uid":"89b7-31"}]},"89b7-35":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"89b7-36"},"imported":[{"uid":"89b7-50"},{"uid":"89b7-56"},{"uid":"89b7-57"}],"importedBy":[{"uid":"89b7-37"}]},"89b7-37":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"89b7-38"},"imported":[{"uid":"89b7-50"},{"uid":"89b7-31"},{"uid":"89b7-51"},{"uid":"89b7-35"}],"importedBy":[{"uid":"89b7-46"}]},"89b7-39":{"id":"/src/utils/basisPoints.ts","moduleParts":{"index.mjs":"89b7-40"},"imported":[],"importedBy":[{"uid":"89b7-48"}]},"89b7-41":{"id":"/src/utils/conversion.ts","moduleParts":{"index.mjs":"89b7-42"},"imported":[{"uid":"89b7-55"}],"importedBy":[{"uid":"89b7-48"}]},"89b7-43":{"id":"/src/utils/etherscan.ts","moduleParts":{"index.mjs":"89b7-44"},"imported":[],"importedBy":[{"uid":"89b7-48"}]},"89b7-45":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"89b7-29"},{"uid":"89b7-46"},{"uid":"89b7-47"},{"uid":"89b7-48"},{"uid":"89b7-49"}],"importedBy":[],"isEntry":true},"89b7-46":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"89b7-37"}],"importedBy":[{"uid":"89b7-45"}]},"89b7-47":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"89b7-31"}],"importedBy":[{"uid":"89b7-45"}]},"89b7-48":{"id":"/src/utils/index.ts","moduleParts":{},"imported":[{"uid":"89b7-39"},{"uid":"89b7-41"},{"uid":"89b7-43"}],"importedBy":[{"uid":"89b7-45"}]},"89b7-49":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-45"}],"isExternal":true},"89b7-50":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-29"},{"uid":"89b7-37"},{"uid":"89b7-35"}],"isExternal":true},"89b7-51":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-29"},{"uid":"89b7-37"},{"uid":"89b7-31"}],"isExternal":true},"89b7-52":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-29"}],"isExternal":true},"89b7-53":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-29"}],"isExternal":true},"89b7-54":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-29"},{"uid":"89b7-31"},{"uid":"89b7-33"}],"isExternal":true},"89b7-55":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-41"}],"isExternal":true},"89b7-56":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-35"}],"isExternal":true},"89b7-57":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"89b7-35"}]}},"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":"05ae-26"},{"name":"hooks","children":[{"uid":"05ae-28","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"05ae-30"},{"uid":"05ae-36","name":"useEstimation.ts"}]},{"name":"components","children":[{"uid":"05ae-32","name":"DefaultButton.tsx"},{"uid":"05ae-34","name":"MintButton.tsx"}]}]}]}],"isRoot":true},"nodeParts":{"05ae-26":{"renderedLength":1763,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-25"},"05ae-28":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-27"},"05ae-30":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-29"},"05ae-32":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-31"},"05ae-34":{"renderedLength":1323,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-33"},"05ae-36":{"renderedLength":1268,"gzipLength":0,"brotliLength":0,"metaUid":"05ae-35"}},"nodeMetas":{"05ae-25":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.js":"05ae-26"},"imported":[{"uid":"05ae-42"},{"uid":"05ae-43"},{"uid":"05ae-44"},{"uid":"05ae-45"},{"uid":"05ae-46"}],"importedBy":[{"uid":"05ae-37"}]},"05ae-27":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.js":"05ae-28"},"imported":[{"uid":"05ae-46"},{"uid":"05ae-43"},{"uid":"05ae-29"}],"importedBy":[{"uid":"05ae-39"},{"uid":"05ae-33"}]},"05ae-29":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.js":"05ae-30"},"imported":[{"uid":"05ae-46"}],"importedBy":[{"uid":"05ae-27"}]},"05ae-31":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.js":"05ae-32"},"imported":[{"uid":"05ae-42"},{"uid":"05ae-48"},{"uid":"05ae-49"}],"importedBy":[{"uid":"05ae-33"}]},"05ae-33":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.js":"05ae-34"},"imported":[{"uid":"05ae-42"},{"uid":"05ae-27"},{"uid":"05ae-43"},{"uid":"05ae-31"}],"importedBy":[{"uid":"05ae-38"}]},"05ae-35":{"id":"/src/hooks/useEstimation.ts","moduleParts":{"index.js":"05ae-36"},"imported":[{"uid":"05ae-47"},{"uid":"05ae-46"},{"uid":"05ae-43"}],"importedBy":[{"uid":"05ae-39"}]},"05ae-37":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"05ae-25"},{"uid":"05ae-38"},{"uid":"05ae-39"},{"uid":"05ae-40"},{"uid":"05ae-41"}],"importedBy":[],"isEntry":true},"05ae-38":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"05ae-33"}],"importedBy":[{"uid":"05ae-37"}]},"05ae-39":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"05ae-35"},{"uid":"05ae-27"}],"importedBy":[{"uid":"05ae-37"}]},"05ae-40":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-37"}],"isExternal":true},"05ae-41":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-37"}],"isExternal":true},"05ae-42":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-25"},{"uid":"05ae-33"},{"uid":"05ae-31"}],"isExternal":true},"05ae-43":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-25"},{"uid":"05ae-33"},{"uid":"05ae-35"},{"uid":"05ae-27"}],"isExternal":true},"05ae-44":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-25"}],"isExternal":true},"05ae-45":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-25"}],"isExternal":true},"05ae-46":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-25"},{"uid":"05ae-35"},{"uid":"05ae-27"},{"uid":"05ae-29"}],"isExternal":true},"05ae-47":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-35"}],"isExternal":true},"05ae-48":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-31"}],"isExternal":true},"05ae-49":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"05ae-31"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
6161
6161
 
6162
6162
  const run = () => {
6163
6163
  const width = window.innerWidth;
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.5",
4
+ "version": "0.3.6",
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.5",
64
- "@hybrd/contracts": "^0.3.5",
65
- "@hybrd/types": "^0.3.5",
66
- "@hybrd/utils": "^0.3.5",
63
+ "@hybrd/cli": "^0.3.6",
64
+ "@hybrd/contracts": "^0.3.6",
65
+ "@hybrd/types": "^0.3.6",
66
+ "@hybrd/utils": "^0.3.6",
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": "6a0e97133b5847877725c59a684c4a79cd2871c5"
119
+ "gitHead": "1ace416af2f6c6a4c36654413f6c23dcb1c38170"
120
120
  }
@@ -1,3 +0,0 @@
1
- export declare function bipsToPercent(bp: number | string): number;
2
- export declare function percentToBips(percent: number): number;
3
- export declare function bipsToDecimal(bp: number | string): number;
@@ -1,3 +0,0 @@
1
- import { BigNumber, BigNumberish } from "ethers";
2
- export declare function weiToEth(wei: BigNumberish): number;
3
- export declare function ethToWei(eth: number): BigNumber | null;
@@ -1,3 +0,0 @@
1
- export declare function etherscanAddressURL(address: string, chainId?: number): string;
2
- export declare function etherscanTxURL(hash: string, chainId?: number): string;
3
- export declare function etherscanHost(chainId?: number): "https://etherscan.io" | "https://goerli.etherscan.io" | "https://ropsten.etherscan.io" | "https://rinkeby.etherscan.io" | "https://polygonscan.com" | "https://mumbai.polygonscan.com";
@@ -1,7 +0,0 @@
1
- export declare function truncateEthAddress(address: string | undefined): string;
2
- /**
3
- * @note - IH - 20220831
4
- * It would probably be cleaner to just send the now and diff fields from <Group> to here.
5
- * another option would be to just ditch this and move this formatter into the useTiming() hook
6
- */
7
- export declare function countdown(time: Date, after: string): string;
@@ -1,3 +0,0 @@
1
- export * from "./basisPoints";
2
- export * from "./conversion";
3
- export * from "./etherscan";