hybrid 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { DefaultButtonProps } from "./DefaultButton";
3
- import { Contract } from "types";
3
+ import { Contract } from "@hybrd/types";
4
4
  type MintButtonProps = {
5
5
  className?: string;
6
6
  contract: Contract;
@@ -1,5 +1,4 @@
1
1
  import type { TransactionReceipt } from "@ethersproject/providers";
2
- import { Contract } from "types";
3
2
  type UseMinting = {
4
3
  isMinting: boolean;
5
4
  isSuccess: boolean;
package/dist/index.d.ts CHANGED
@@ -2,4 +2,5 @@ export { Web3Provider } from "./providers/Web3Provider";
2
2
  export * from "./components";
3
3
  export * from "./hooks";
4
4
  export * from "./utils";
5
- export * from "./types";
5
+ export * from "@hybrd/types";
6
+ export { readConfig } from "@hybrd/cli";
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as n,WagmiConfig as r,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as u,useNetwork as s,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";const _=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),N=[d,f,h];function g(o){const{appName:i,children:c,...a}=o,{chains:u,provider:s,webSocketProvider:l}=b((()=>{const{chains:t,provider:n,webSocketProvider:r}=e(N,function(t){const{alchemyKey:e,publicProvider:n=!0}=t,r=[];n&&r.push(m());return r}(a));return{chains:t,provider:n,webSocketProvider:r}}),[a]),d=n({autoConnect:!0,provider:s,webSocketProvider:l}),f={client:d,chains:u,provider:s,webSocketProvider:l};return t(_.Provider,{value:f,children:t(r,{client:d,children:c})})}const y=t=>{const e=t?.address,n=t?.chainId,{data:r}=o(),u=i({chainId:n}),{data:s}=c({chainId:n}),[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,n){const[r,o]=B(n);return v((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(b)return b.connect(u).totalSupply().then((t=>t.toNumber()))}),[b,r]),mint:D((t=>{if(b)return d(!0),b.connect(s).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)))}),[s,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:n=E.DefaultButton,intent:r="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(n,P[r],c&&E.DefaultButtonDisabled),onClick:o,children:i})},I=e=>{const{amount:n=1,button:r=C,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:f}=u(),{chain:h}=s(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=y(i);if(p)return t(r,{disabled:!0,className:o,children:"Minting"});if(b)return t(r,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(r,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=f[0];return t(r,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(r,h?.id!==i?.chainId&&m?{onClick:()=>m(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(n),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,g as Web3Provider,K as bipsToDecimal,x as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,y 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 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 g}from"ethers";export*from"@hybrd/types";export{readConfig}from"@hybrd/cli";const k=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),y=[d,f,h];function _(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(y,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(k.Provider,{value:f,children:t(n,{client:d,children:c})})}const N=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({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 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 E={default:C.DefaultButtonBase,success:C.DefaultButtonSuccess,error:C.DefaultButtonError},P=e=>{const{className:r=C.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(r,E[n],c&&C.DefaultButtonDisabled),onClick:o,children:i})},x=e=>{const{amount:r=1,button:n=P,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:f}=s(),{chain:h}=u(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=N(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=f[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==i?.chainId&&m?{onClick:()=>m(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(r),children:"Mint Now"})};function I(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:g.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{x as MintButton,_ as Web3Provider,K as bipsToDecimal,I as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,N as useMinting,U as weiToEth};
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 { Contract } from \"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: Contract): 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 { Contract } from \"types\"\n\ntype MintButtonProps = {\n className?: string\n contract: Contract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","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","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/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 { Contract } from \"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: Contract): 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 { Contract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: Contract\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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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as t}from"react/jsx-runtime";import{configureChains as e,createClient as n,WagmiConfig as r,useBlockNumber as o,useProvider as i,useSigner as c,useContract as a,useConnect as u,useNetwork as s,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";const _=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),N=[d,f,h];function g(o){const{appName:i,children:c,...a}=o,{chains:u,provider:s,webSocketProvider:l}=b((()=>{const{chains:t,provider:n,webSocketProvider:r}=e(N,function(t){const{alchemyKey:e,publicProvider:n=!0}=t,r=[];n&&r.push(m());return r}(a));return{chains:t,provider:n,webSocketProvider:r}}),[a]),d=n({autoConnect:!0,provider:s,webSocketProvider:l}),f={client:d,chains:u,provider:s,webSocketProvider:l};return t(_.Provider,{value:f,children:t(r,{client:d,children:c})})}const y=t=>{const e=t?.address,n=t?.chainId,{data:r}=o(),u=i({chainId:n}),{data:s}=c({chainId:n}),[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,n){const[r,o]=B(n);return v((()=>{let e=!1;const n=t();if(null!=n)return n.then((t=>{e||o(t)})).catch((t=>{console.error(`Error in useAsyncMemo: ${t}`)})),()=>{e=!0}}),e),r}((()=>{if(b)return b.connect(u).totalSupply().then((t=>t.toNumber()))}),[b,r]),mint:D((t=>{if(b)return d(!0),b.connect(s).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)))}),[s,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:n=E.DefaultButton,intent:r="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(n,P[r],c&&E.DefaultButtonDisabled),onClick:o,children:i})},I=e=>{const{amount:n=1,button:r=C,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:f}=u(),{chain:h}=s(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=y(i);if(p)return t(r,{disabled:!0,className:o,children:"Minting"});if(b)return t(r,{disabled:!0,className:o,intent:"success",children:"Minted"});if(B)return t(r,{disabled:!0,className:o,intent:"error",children:"Error Occurred"});if(!a){const e=f[0];return t(r,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(r,h?.id!==i?.chainId&&m?{onClick:()=>m(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(n),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,g as Web3Provider,K as bipsToDecimal,x as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,y 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 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 g}from"ethers";export*from"@hybrd/types";export{readConfig}from"@hybrd/cli";const k=p.createContext({client:void 0,chains:void 0,provider:void 0,webSocketProvider:void 0}),y=[d,f,h];function _(o){const{appName:i,children:c,...a}=o,{chains:s,provider:u,webSocketProvider:l}=b((()=>{const{chains:t,provider:r,webSocketProvider:n}=e(y,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(k.Provider,{value:f,children:t(n,{client:d,children:c})})}const N=t=>{const e=t?.address,r=t?.chainId,{data:n}=o(),s=i({chainId:r}),{data:u}=c({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 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 E={default:C.DefaultButtonBase,success:C.DefaultButtonSuccess,error:C.DefaultButtonError},P=e=>{const{className:r=C.DefaultButton,intent:n="default",onClick:o,children:i,disabled:c}=e;return t("button",{className:w(r,E[n],c&&C.DefaultButtonDisabled),onClick:o,children:i})},x=e=>{const{amount:r=1,button:n=P,className:o,contract:i}=e,{data:a}=c(),{connect:d,connectors:f}=s(),{chain:h}=u(),{switchNetwork:m}=l(),{isMinting:p,isSuccess:b,isError:B,mint:v}=N(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=f[0];return t(n,{className:o,onClick:()=>d({connector:e}),children:"Connect Wallet"})}return t(n,h?.id!==i?.chainId&&m?{onClick:()=>m(i?.chainId),className:o,intent:"error",children:"Switch Network"}:{className:o,onClick:()=>v(r),children:"Mint Now"})};function I(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:g.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{x as MintButton,_ as Web3Provider,K as bipsToDecimal,I as bipsToPercent,O as ethToWei,T as etherscanAddressURL,A as etherscanHost,j as etherscanTxURL,M as percentToBips,N as useMinting,U as weiToEth};
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 { Contract } from \"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: Contract): 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 { Contract } from \"types\"\n\ntype MintButtonProps = {\n className?: string\n contract: Contract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract\n } = props\n const { data: signer } = useSigner()\n const { connect, connectors } = useConnect()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting(contract)\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n const connector = connectors[0]\n return (\n <Button className={className} onClick={() => connect({ connector })}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","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","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/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 { Contract } from \"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: Contract): 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 { Contract } from \"@hybrd/types\"\n\ntype MintButtonProps = {\n className?: string\n contract: Contract\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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"}
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":"299d-30"},{"name":"hooks","children":[{"uid":"299d-32","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"299d-34"}]},{"name":"components","children":[{"uid":"299d-36","name":"DefaultButton.tsx"},{"uid":"299d-38","name":"MintButton.tsx"}]},{"name":"utils","children":[{"uid":"299d-40","name":"basisPoints.ts"},{"uid":"299d-42","name":"conversion.ts"},{"uid":"299d-44","name":"etherscan.ts"}]}]}]}],"isRoot":true},"nodeParts":{"299d-30":{"renderedLength":1763,"gzipLength":0,"brotliLength":0,"metaUid":"299d-29"},"299d-32":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"299d-31"},"299d-34":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"299d-33"},"299d-36":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"299d-35"},"299d-38":{"renderedLength":1292,"gzipLength":0,"brotliLength":0,"metaUid":"299d-37"},"299d-40":{"renderedLength":312,"gzipLength":0,"brotliLength":0,"metaUid":"299d-39"},"299d-42":{"renderedLength":229,"gzipLength":0,"brotliLength":0,"metaUid":"299d-41"},"299d-44":{"renderedLength":764,"gzipLength":0,"brotliLength":0,"metaUid":"299d-43"}},"nodeMetas":{"299d-29":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.js":"299d-30"},"imported":[{"uid":"299d-50"},{"uid":"299d-51"},{"uid":"299d-52"},{"uid":"299d-53"},{"uid":"299d-54"}],"importedBy":[{"uid":"299d-45"}]},"299d-31":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.js":"299d-32"},"imported":[{"uid":"299d-54"},{"uid":"299d-51"},{"uid":"299d-33"}],"importedBy":[{"uid":"299d-47"},{"uid":"299d-37"}]},"299d-33":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.js":"299d-34"},"imported":[{"uid":"299d-54"}],"importedBy":[{"uid":"299d-31"}]},"299d-35":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.js":"299d-36"},"imported":[{"uid":"299d-50"},{"uid":"299d-56"},{"uid":"299d-57"}],"importedBy":[{"uid":"299d-37"}]},"299d-37":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.js":"299d-38"},"imported":[{"uid":"299d-50"},{"uid":"299d-31"},{"uid":"299d-51"},{"uid":"299d-35"}],"importedBy":[{"uid":"299d-46"}]},"299d-39":{"id":"/src/utils/basisPoints.ts","moduleParts":{"index.js":"299d-40"},"imported":[],"importedBy":[{"uid":"299d-48"}]},"299d-41":{"id":"/src/utils/conversion.ts","moduleParts":{"index.js":"299d-42"},"imported":[{"uid":"299d-55"}],"importedBy":[{"uid":"299d-48"}]},"299d-43":{"id":"/src/utils/etherscan.ts","moduleParts":{"index.js":"299d-44"},"imported":[],"importedBy":[{"uid":"299d-48"}]},"299d-45":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"299d-29"},{"uid":"299d-46"},{"uid":"299d-47"},{"uid":"299d-48"},{"uid":"299d-49"}],"importedBy":[],"isEntry":true},"299d-46":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"299d-37"}],"importedBy":[{"uid":"299d-45"}]},"299d-47":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"299d-31"}],"importedBy":[{"uid":"299d-45"}]},"299d-48":{"id":"/src/utils/index.ts","moduleParts":{},"imported":[{"uid":"299d-39"},{"uid":"299d-41"},{"uid":"299d-43"}],"importedBy":[{"uid":"299d-45"}]},"299d-49":{"id":"/src/types.ts","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-45"}]},"299d-50":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-29"},{"uid":"299d-37"},{"uid":"299d-35"}],"isExternal":true},"299d-51":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-29"},{"uid":"299d-37"},{"uid":"299d-31"}],"isExternal":true},"299d-52":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-29"}],"isExternal":true},"299d-53":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-29"}],"isExternal":true},"299d-54":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-29"},{"uid":"299d-31"},{"uid":"299d-33"}],"isExternal":true},"299d-55":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-41"}],"isExternal":true},"299d-56":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-35"}],"isExternal":true},"299d-57":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"299d-35"}]}},"env":{"rollup":"3.19.1"},"options":{"gzip":false,"brotli":false,"sourcemap":true}};
6160
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.mjs","children":[{"name":"src","children":[{"name":"providers/Web3Provider.tsx","uid":"279c-1"},{"name":"hooks","children":[{"uid":"279c-3","name":"useMinting.ts"},{"name":"internal/useAsyncMemo.ts","uid":"279c-5"}]},{"name":"components","children":[{"uid":"279c-7","name":"DefaultButton.tsx"},{"uid":"279c-9","name":"MintButton.tsx"}]},{"name":"utils","children":[{"uid":"279c-11","name":"basisPoints.ts"},{"uid":"279c-13","name":"conversion.ts"},{"uid":"279c-15","name":"etherscan.ts"}]}]}]}],"isRoot":true},"nodeParts":{"279c-1":{"renderedLength":1763,"gzipLength":0,"brotliLength":0,"metaUid":"279c-0"},"279c-3":{"renderedLength":1459,"gzipLength":0,"brotliLength":0,"metaUid":"279c-2"},"279c-5":{"renderedLength":577,"gzipLength":0,"brotliLength":0,"metaUid":"279c-4"},"279c-7":{"renderedLength":558,"gzipLength":0,"brotliLength":0,"metaUid":"279c-6"},"279c-9":{"renderedLength":1323,"gzipLength":0,"brotliLength":0,"metaUid":"279c-8"},"279c-11":{"renderedLength":312,"gzipLength":0,"brotliLength":0,"metaUid":"279c-10"},"279c-13":{"renderedLength":229,"gzipLength":0,"brotliLength":0,"metaUid":"279c-12"},"279c-15":{"renderedLength":764,"gzipLength":0,"brotliLength":0,"metaUid":"279c-14"}},"nodeMetas":{"279c-0":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.mjs":"279c-1"},"imported":[{"uid":"279c-22"},{"uid":"279c-23"},{"uid":"279c-24"},{"uid":"279c-25"},{"uid":"279c-26"}],"importedBy":[{"uid":"279c-16"}]},"279c-2":{"id":"/src/hooks/useMinting.ts","moduleParts":{"index.mjs":"279c-3"},"imported":[{"uid":"279c-26"},{"uid":"279c-23"},{"uid":"279c-4"}],"importedBy":[{"uid":"279c-18"},{"uid":"279c-8"}]},"279c-4":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{"index.mjs":"279c-5"},"imported":[{"uid":"279c-26"}],"importedBy":[{"uid":"279c-2"}]},"279c-6":{"id":"/src/components/DefaultButton.tsx","moduleParts":{"index.mjs":"279c-7"},"imported":[{"uid":"279c-22"},{"uid":"279c-28"},{"uid":"279c-29"}],"importedBy":[{"uid":"279c-8"}]},"279c-8":{"id":"/src/components/MintButton.tsx","moduleParts":{"index.mjs":"279c-9"},"imported":[{"uid":"279c-22"},{"uid":"279c-2"},{"uid":"279c-23"},{"uid":"279c-6"}],"importedBy":[{"uid":"279c-17"}]},"279c-10":{"id":"/src/utils/basisPoints.ts","moduleParts":{"index.mjs":"279c-11"},"imported":[],"importedBy":[{"uid":"279c-19"}]},"279c-12":{"id":"/src/utils/conversion.ts","moduleParts":{"index.mjs":"279c-13"},"imported":[{"uid":"279c-27"}],"importedBy":[{"uid":"279c-19"}]},"279c-14":{"id":"/src/utils/etherscan.ts","moduleParts":{"index.mjs":"279c-15"},"imported":[],"importedBy":[{"uid":"279c-19"}]},"279c-16":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"279c-0"},{"uid":"279c-17"},{"uid":"279c-18"},{"uid":"279c-19"},{"uid":"279c-20"},{"uid":"279c-21"}],"importedBy":[],"isEntry":true},"279c-17":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"279c-8"}],"importedBy":[{"uid":"279c-16"}]},"279c-18":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"279c-2"}],"importedBy":[{"uid":"279c-16"}]},"279c-19":{"id":"/src/utils/index.ts","moduleParts":{},"imported":[{"uid":"279c-10"},{"uid":"279c-12"},{"uid":"279c-14"}],"importedBy":[{"uid":"279c-16"}]},"279c-20":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-16"}],"isExternal":true},"279c-21":{"id":"@hybrd/cli","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-16"}],"isExternal":true},"279c-22":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-0"},{"uid":"279c-8"},{"uid":"279c-6"}],"isExternal":true},"279c-23":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-0"},{"uid":"279c-8"},{"uid":"279c-2"}],"isExternal":true},"279c-24":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-0"}],"isExternal":true},"279c-25":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-0"}],"isExternal":true},"279c-26":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-0"},{"uid":"279c-2"},{"uid":"279c-4"}],"isExternal":true},"279c-27":{"id":"ethers","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-12"}],"isExternal":true},"279c-28":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-6"}],"isExternal":true},"279c-29":{"id":"/src/components/DefaultButton.module.css","moduleParts":{},"imported":[],"importedBy":[{"uid":"279c-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,8 @@ var drawChart = (function (exports) {
6175
6175
  </body>
6176
6176
  </html>
6177
6177
 
6178
+ /*-->*/
6179
+ </script>
6180
+ </body>
6181
+ </html>
6182
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "hybrid",
3
3
  "author": "IanH <ian@ianh.xyz>",
4
- "version": "0.3.1",
4
+ "version": "0.3.3",
5
5
  "description": "Solidity + TypeScript Framework for Web3 Development",
6
6
  "keywords": [
7
7
  "hybrid",
@@ -61,8 +61,9 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@ethersproject/providers": "^5.7.1",
64
- "@hybrd/cli": "^0.3.1",
65
- "@hybrd/contracts": "^0.3.1",
64
+ "@hybrd/cli": "^0.3.3",
65
+ "@hybrd/contracts": "^0.3.3",
66
+ "@hybrd/types": "^0.3.3",
66
67
  "abitype": "^0.7.1",
67
68
  "axios": "^1.2.2",
68
69
  "clsx": "^1.2.1",
@@ -114,5 +115,5 @@
114
115
  "react-dom": ">=17",
115
116
  "wagmi": "^0.6.0"
116
117
  },
117
- "gitHead": "0db17e1c141c8176421c3120b42139d4dc255263"
118
+ "gitHead": "01ecf17a490c1165816a82095e29f6180d242ac9"
118
119
  }
@@ -1,7 +0,0 @@
1
- import { ChainProviderFn } from "wagmi";
2
- export type Config = {
3
- alchemyKey?: string;
4
- infuraKey?: string;
5
- public?: boolean;
6
- };
7
- export declare function buildProviders(config: Config): ChainProviderFn<import("@wagmi/chains").Chain, import("@ethersproject/providers").BaseProvider, import("@ethersproject/providers").WebSocketProvider>[];
package/dist/types.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import { Abi } from "abitype";
2
- export type Contract = {
3
- abi: Abi;
4
- bytecode: string;
5
- address: string;
6
- chainId: number;
7
- };
8
- export type { TransactionReceipt as Receipt, TransactionResponse as Transaction } from "@ethersproject/providers";
@@ -1,2 +0,0 @@
1
- /// <reference types="react" />
2
- export declare const ConnectButton: () => JSX.Element;