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.
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useEstimation.d.ts +11 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/stats.html +1 -1
- package/package.json +6 -6
- package/dist/utils/basisPoints.d.ts +0 -3
- package/dist/utils/conversion.d.ts +0 -3
- package/dist/utils/etherscan.d.ts +0 -3
- package/dist/utils/formatting.d.ts +0 -7
- package/dist/utils/index.d.ts +0 -3
package/dist/hooks/index.d.ts
CHANGED
|
@@ -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
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
|
|
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
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
64
|
-
"@hybrd/contracts": "^0.3.
|
|
65
|
-
"@hybrd/types": "^0.3.
|
|
66
|
-
"@hybrd/utils": "^0.3.
|
|
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": "
|
|
119
|
+
"gitHead": "1ace416af2f6c6a4c36654413f6c23dcb1c38170"
|
|
120
120
|
}
|
|
@@ -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;
|
package/dist/utils/index.d.ts
DELETED