hybrid 0.7.4 → 0.7.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/components/ContractRead.d.ts +16 -0
- package/dist/components/ContractWrite.d.ts +16 -0
- package/dist/components/TokenGate.d.ts +0 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/hooks/index.d.ts +0 -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 -6
- package/package.json +6 -10
- package/client/index.d.ts +0 -2
- package/client/index.js +0 -1
- package/dist/components/DefaultButton.d.ts +0 -11
- package/dist/components/MintButton.d.ts +0 -11
- package/dist/components/TotalSupply.d.ts +0 -8
- package/dist/hooks/useMinting.d.ts +0 -13
- package/dist/style.css +0 -2
- package/dist/style.css.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { DeployedContract } from "@hybrd/types";
|
|
3
|
+
import { useContractRead } from "wagmi";
|
|
4
|
+
type RenderProps = {
|
|
5
|
+
isError: boolean;
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
isSuccess: boolean;
|
|
8
|
+
};
|
|
9
|
+
type ContractReadProps = {
|
|
10
|
+
contract: DeployedContract;
|
|
11
|
+
prepare: Omit<Parameters<typeof useContractRead>, "abi" | "address">;
|
|
12
|
+
render?: (props: RenderProps) => JSX.Element;
|
|
13
|
+
as?: React.ElementType;
|
|
14
|
+
} & React.HTMLAttributes<HTMLSpanElement>;
|
|
15
|
+
declare const ContractRead: (props: ContractReadProps) => JSX.Element;
|
|
16
|
+
export default ContractRead;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { usePrepareContractWrite } from "wagmi";
|
|
3
|
+
import { DeployedContract } from "@hybrd/types";
|
|
4
|
+
type ButtonProps = {
|
|
5
|
+
isError: boolean;
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
isSuccess: boolean;
|
|
8
|
+
} & React.HTMLAttributes<HTMLButtonElement>;
|
|
9
|
+
type ContractWriteProps = {
|
|
10
|
+
contract: DeployedContract;
|
|
11
|
+
prepare: Omit<Parameters<typeof usePrepareContractWrite>, "abi" | "address">;
|
|
12
|
+
render?: (props: ButtonProps) => JSX.Element;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
} & React.HTMLAttributes<HTMLButtonElement>;
|
|
15
|
+
declare const ContractWrite: (props: ContractWriteProps) => JSX.Element;
|
|
16
|
+
export default ContractWrite;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { DeployedContract } from "@hybrd/types";
|
|
3
|
-
import { DefaultButtonProps } from "./DefaultButton";
|
|
4
3
|
type Props = {
|
|
5
4
|
className?: string;
|
|
6
|
-
button?: React.FC<DefaultButtonProps>;
|
|
7
5
|
style?: React.CSSProperties;
|
|
8
6
|
children: React.ReactNode;
|
|
9
7
|
contract: DeployedContract;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default as ConnectedAs } from "./ConnectedAs";
|
|
2
|
-
export { default as
|
|
2
|
+
export { default as ContractWrite } from "./ContractWrite";
|
|
3
3
|
export { default as TokenGate } from "./TokenGate";
|
|
4
|
-
export { default as
|
|
4
|
+
export { default as ContractRead } from "./ContractRead";
|
package/dist/hooks/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as
|
|
1
|
+
import{jsx as e,Fragment as n,jsxs as r}from"react/jsx-runtime";import{configureChains as o,createClient as c,useAccount as t,useConnect as i,useDisconnect as s,WagmiConfig as a,useProvider as d,useContract as l,useNetwork as h,useSwitchNetwork as u,usePrepareContractWrite as p,useContractWrite as m,useContractRead as f}from"wagmi";import w,{useState as y,useEffect as b,useCallback as v}from"react";import*as g from"wagmi/chains";import{publicProvider as k}from"wagmi/providers/public";import{jsonRpcProvider as C}from"wagmi/providers/jsonRpc";import{etherscanAddressURL as N,truncateEthAddress as S}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";export*from"@hybrd/types";function P(r){const{provider:a,webSocketProvider:d}=o(r.chains,r.providers),l=c({autoConnect:!0,provider:a,webSocketProvider:d});return{client:l,hooks:{useWallet:()=>{const{address:e,isConnected:n}=t(),{isLoading:r,connectAsync:o}=i(),{disconnectAsync:c}=s();return{account:e,isLoading:r,isConnected:n,connect:()=>{o({connector:l.connector})},disconnect:()=>{c()}}}},Provider:({children:r})=>e(n,{children:r})}}const _=[g.mainnet,g.goerli,g.polygon,g.polygonMumbai,g.arbitrum,g.arbitrumGoerli,g.optimism,g.optimismGoerli,g.baseGoerli,g.localhost],L=w.createContext({client:void 0,chains:void 0,hooks:{useWallet:()=>({account:void 0,isLoading:!0,isConnected:void 0,connect:async()=>{throw new Error("No wallet provider found")},disconnect:async()=>{throw new Error("No wallet provider found")}})}});function x(e){const{hybridKey:n}=e,r=[];return r.push(function({apiKey:e}){return C({rpc:n=>{if("localhost"===n.network)return{http:"http://localhost:8545",webSocket:"ws://localhost:8545"};const r=n?.network||"mainnet";return{http:process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP||process.env.HYBRID_RPC_HTTP||`https://rpc.hybrid.dev/${r}/${e||""}`,webSocket:process.env.NEXT_PUBLIC_HYBRID_RPC_WS||process.env.HYBRID_RPC_WS||`wss://rpc.hybrid.dev/${r}/${e||""}`}}})}({apiKey:n})),r.push(k()),r}function E(n){const{children:r,chains:o=_,wallet:c=P}=n,{client:t,hooks:i,Provider:s}=c({chains:o,providers:x(n)}),d={client:t,hooks:i,chains:o};return e(L.Provider,{value:d,children:e(a,{client:t,children:e(s,{children:r})})})}function R(e){const{address:n,contract:r}=e,o=r?.chainId,c=d({chainId:o}),[t,i]=y(!0),[s,a]=y(),[h,u]=y(),p=l(r);return b((()=>{r||(i(!1),a(!1),u(!0)),p&&p.connect(c).balanceOf(n).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{a(e),u(!e)})).catch((e=>{console.error(e),a(!1),u(!0)})).finally((()=>i(!1)))}),[n,r]),{isLoading:t,address:n,allow:s,deny:h}}function T(){const{hooks:e}=w.useContext(L);return e.useWallet()}function W(n){const{className:o,chainId:c}=n,{address:i,isConnected:s}=t(),{connect:a}=T(),{chain:l}=h(),u=function(e){const[n,r]=y(),o=d({chainId:1});return b((()=>{e&&o.lookupAddress(e).then(r)}),[e,o]),n}(i);return r("p",{className:I(o,"flex space-x-3 items-center justify-cente"),children:[!s&&e("button",{onClick:()=>a(),children:"Connect Wallet"}),s&&r("span",{className:"",children:["connected as"," ",e("a",{href:N(i,c||l.id),className:I(o,"underline"),target:"_blank",rel:"noreferrer",children:u||S(i)})]})]})}const B=n=>{const{isError:r,isLoading:o,isSuccess:c,children:t,...i}=n;return e("button",{disabled:o||c||r,...i,children:o?"Sending ...":c?"Success":r?"Error":t})},H=n=>{const{render:r=B,contract:o,prepare:c,timeout:t,...i}=n,[s,a]=y(!1),[d,l]=y(!1),[f,w]=y(!1),b=T(),{chain:g}=h(),{switchNetwork:k}=u(),{config:C}=p({address:o.address,abi:o.abi,...c}),{writeAsync:N}=m(C),S=()=>{a(!1),l(!1),w(!1)},I=v((()=>(a(!0),N().then((e=>e.wait())).then((()=>{l(!0)})).catch((e=>{console.error(e),w(!0)})).finally((()=>{a(!1),t&&setTimeout((()=>{S()}),t)})))),[N,S]);return b.isConnected?e(r,g?.id!==o?.chainId&&k?{...i,isLoading:!1,isSuccess:!1,isError:!1,onClick:()=>k(o?.chainId),children:"Switch Network"}:{...i,isLoading:s,isSuccess:d,isError:f,onClick:()=>I(),children:"Send Transaction"}):e(r,{...i,isLoading:!1,isSuccess:!1,isError:!1,onClick:b.connect,style:{backgroundColor:"red",cursor:"pointer"},children:"Connect Wallet"})},Y=({className:n,style:r,children:o,contract:c,loading:i=e("p",{children:"Loading"}),deny:s=e("p",{children:"You must own a token to view this content"})})=>{const{address:a}=t(),{isLoading:d,allow:l}=R({address:a,contract:c});return d?e("span",{className:n,style:r,children:i}):l?e("div",{className:n,style:r,children:o}):e("span",{className:n,style:r,children:s})},A=e=>e.toString(),D=n=>e("span",{...n}),$=n=>{const{as:r=D,contract:o,prepare:c,render:t=A,...i}=n,s=o?.chainId,a=f({address:o.address,abi:o.abi,chainId:s,...c});return e(r,{...i,children:t(a)})};export{W as ConnectedAs,$ as ContractRead,H as ContractWrite,Y as TokenGate,E as Web3Provider,R as useTokenGating,T as useWallet};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\"\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\"\nimport type { WalletConnection } from \"@hybrd/types\"\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n )\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n })\n\n const useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\n chains,\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\n// I really want to support an HOC its cleaner in some cases.\n//\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\n}\n","import type {\n TransactionReceipt,\n TransactionResponse,\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract(deployedContract)\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice,\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint,\n }\n}\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract(deployedContract)\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny,\n }\n}\n","import { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [address, provider])\n\n return ens\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { connect } = useWallet()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>,\n}: Props) => {\n const { address } = useAccount()\n const { connect } = useWallet()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n const contract = useContract(deployedContract)\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/hybridProvider.tsx","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/ContractWrite.tsx","../src/components/TokenGate.tsx","../src/components/ContractRead.tsx"],"sourcesContent":["import React from \"react\"\nimport {\n configureChains,\n createClient,\n Client,\n useConnect,\n useDisconnect,\n useAccount,\n} from \"wagmi\"\nimport type { WalletConnection } from \"@hybrd/types\"\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n )\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n })\n\n const useWallet = () => {\n const { address, isConnected } = useAccount()\n const { isLoading, connectAsync } = useConnect()\n const { disconnectAsync } = useDisconnect()\n\n return {\n account: address,\n isLoading,\n isConnected,\n connect: () => {\n connectAsync({ connector: client.connector })\n },\n disconnect: () => {\n disconnectAsync()\n },\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\nimport * as Chains from \"wagmi/chains\"\n\nimport DefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nconst DEFAULT_CHAINS = [\n Chains.mainnet,\n Chains.goerli,\n //\n Chains.polygon,\n Chains.polygonMumbai,\n //\n Chains.arbitrum,\n Chains.arbitrumGoerli,\n //\n Chains.optimism,\n Chains.optimismGoerli,\n //\n // Chains.goerli, # when deployed\n Chains.baseGoerli,\n //\n Chains.localhost,\n]\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n account: undefined,\n isLoading: true,\n isConnected: undefined,\n connect: async () => {\n throw new Error(\"No wallet provider found\")\n },\n disconnect: async () => {\n throw new Error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = DEFAULT_CHAINS,\n wallet: createWalletConnector = DefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\n chains,\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\n// I really want to support an HOC its cleaner in some cases.\n//\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\n}\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract(deployedContract)\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny,\n }\n}\n","import { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [address, provider])\n\n return ens\n}\n","import {\n useContractWrite,\n useNetwork,\n usePrepareContractWrite,\n useSwitchNetwork,\n} from \"wagmi\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\nimport { useCallback, useState } from \"react\"\n\ntype ButtonProps = {\n isError: boolean\n isLoading: boolean\n isSuccess: boolean\n} & React.HTMLAttributes<HTMLButtonElement>\n\ntype ContractWriteProps = {\n contract: DeployedContract\n prepare: Omit<Parameters<typeof usePrepareContractWrite>, \"abi\" | \"address\">\n render?: (props: ButtonProps) => JSX.Element\n timeout?: number\n} & React.HTMLAttributes<HTMLButtonElement>\n\nconst DefaultButton = (props: ButtonProps) => {\n const { isError, isLoading, isSuccess, children, ...rest } = props\n\n return (\n <button disabled={isLoading || isSuccess || isError} {...rest}>\n {isLoading\n ? \"Sending ...\"\n : isSuccess\n ? \"Success\"\n : isError\n ? \"Error\"\n : children}\n </button>\n )\n}\n\nconst ContractWrite = (props: ContractWriteProps) => {\n const {\n render: Button = DefaultButton,\n contract,\n prepare,\n timeout,\n ...rest\n } = props\n\n const [isLoading, setLoading] = useState(false)\n const [isSuccess, setSuccess] = useState(false)\n const [isError, setError] = useState(false)\n\n const wallet = useWallet()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { config } = usePrepareContractWrite({\n address: contract.address,\n abi: contract.abi,\n ...prepare,\n })\n\n const { writeAsync } = useContractWrite(config)\n\n const reset = () => {\n setLoading(false)\n setSuccess(false)\n setError(false)\n }\n\n const call = useCallback(() => {\n setLoading(true)\n return writeAsync()\n .then((res) => {\n return res.wait()\n })\n .then(() => {\n setSuccess(true)\n })\n .catch((err) => {\n console.error(err)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n\n if (timeout)\n setTimeout(() => {\n reset()\n }, timeout)\n })\n }, [writeAsync, reset])\n\n if (!wallet.isConnected) {\n return (\n <Button\n {...rest}\n isLoading={false}\n isSuccess={false}\n isError={false}\n onClick={wallet.connect}\n style={{ backgroundColor: \"red\", cursor: \"pointer\" }}\n >\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n {...rest}\n isLoading={false}\n isSuccess={false}\n isError={false}\n onClick={() => switchNetwork(contract?.chainId)}\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button\n {...rest}\n isLoading={isLoading}\n isSuccess={isSuccess}\n isError={isError}\n onClick={() => call()}\n >\n Send Transaction\n </Button>\n )\n}\n\nexport default ContractWrite\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype Props = {\n className?: string\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content</p>,\n}: Props) => {\n const { address } = useAccount()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useContractRead } from \"wagmi\"\n\ntype RenderProps = {\n isError: boolean\n isLoading: boolean\n isSuccess: boolean\n}\n\ntype ContractReadProps = {\n contract: DeployedContract\n prepare: Omit<Parameters<typeof useContractRead>, \"abi\" | \"address\">\n render?: (props: RenderProps) => JSX.Element\n as?: React.ElementType\n} & React.HTMLAttributes<HTMLSpanElement>\n\nconst defaultRender = (val) => val.toString()\nconst Span = (props) => <span {...props} />\n\nconst ContractRead = (props: ContractReadProps) => {\n const {\n as: As = Span,\n contract,\n prepare,\n render = defaultRender,\n ...rest\n } = props\n const chainId = contract?.chainId\n\n const read = useContractRead({\n address: contract.address,\n abi: contract.abi,\n chainId,\n ...prepare,\n })\n\n return <As {...rest}>{render(read)}</As>\n}\n\nexport default ContractRead\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","hooks","useWallet","address","isConnected","useAccount","isLoading","connectAsync","useConnect","disconnectAsync","useDisconnect","account","connect","connector","disconnect","Provider","children","_jsx","_Fragment","DEFAULT_CHAINS","Chains","mainnet","goerli","polygon","polygonMumbai","arbitrum","arbitrumGoerli","optimism","optimismGoerli","baseGoerli","localhost","Web3Context","React","createContext","undefined","async","Error","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","wallet","createWalletConnector","contextValue","value","WagmiConfig","useTokenGating","contract","deployedContract","chainId","useProvider","setLoading","useState","allow","setAllow","deny","setDeny","useContract","useEffect","balanceOf","then","res","toNumber","bal","catch","err","console","error","finally","useContext","ConnectedAs","className","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","DefaultButton","isError","isSuccess","rest","disabled","ContractWrite","render","Button","prepare","timeout","setSuccess","setError","switchNetwork","useSwitchNetwork","usePrepareContractWrite","abi","writeAsync","useContractWrite","reset","call","useCallback","wait","setTimeout","style","backgroundColor","cursor","TokenGate","loading","loadingComponent","denyComponent","defaultRender","val","toString","Span","ContractRead","as","As","read","useContractRead"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{jsx as e,Fragment as
|
|
1
|
+
import{jsx as e,Fragment as n,jsxs as r}from"react/jsx-runtime";import{configureChains as o,createClient as c,useAccount as t,useConnect as i,useDisconnect as s,WagmiConfig as a,useProvider as d,useContract as l,useNetwork as h,useSwitchNetwork as u,usePrepareContractWrite as p,useContractWrite as m,useContractRead as f}from"wagmi";import w,{useState as y,useEffect as b,useCallback as v}from"react";import*as g from"wagmi/chains";import{publicProvider as k}from"wagmi/providers/public";import{jsonRpcProvider as C}from"wagmi/providers/jsonRpc";import{etherscanAddressURL as N,truncateEthAddress as S}from"@hybrd/utils";export*from"@hybrd/utils";import I from"clsx";export*from"@hybrd/types";function P(r){const{provider:a,webSocketProvider:d}=o(r.chains,r.providers),l=c({autoConnect:!0,provider:a,webSocketProvider:d});return{client:l,hooks:{useWallet:()=>{const{address:e,isConnected:n}=t(),{isLoading:r,connectAsync:o}=i(),{disconnectAsync:c}=s();return{account:e,isLoading:r,isConnected:n,connect:()=>{o({connector:l.connector})},disconnect:()=>{c()}}}},Provider:({children:r})=>e(n,{children:r})}}const _=[g.mainnet,g.goerli,g.polygon,g.polygonMumbai,g.arbitrum,g.arbitrumGoerli,g.optimism,g.optimismGoerli,g.baseGoerli,g.localhost],L=w.createContext({client:void 0,chains:void 0,hooks:{useWallet:()=>({account:void 0,isLoading:!0,isConnected:void 0,connect:async()=>{throw new Error("No wallet provider found")},disconnect:async()=>{throw new Error("No wallet provider found")}})}});function x(e){const{hybridKey:n}=e,r=[];return r.push(function({apiKey:e}){return C({rpc:n=>{if("localhost"===n.network)return{http:"http://localhost:8545",webSocket:"ws://localhost:8545"};const r=n?.network||"mainnet";return{http:process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP||process.env.HYBRID_RPC_HTTP||`https://rpc.hybrid.dev/${r}/${e||""}`,webSocket:process.env.NEXT_PUBLIC_HYBRID_RPC_WS||process.env.HYBRID_RPC_WS||`wss://rpc.hybrid.dev/${r}/${e||""}`}}})}({apiKey:n})),r.push(k()),r}function E(n){const{children:r,chains:o=_,wallet:c=P}=n,{client:t,hooks:i,Provider:s}=c({chains:o,providers:x(n)}),d={client:t,hooks:i,chains:o};return e(L.Provider,{value:d,children:e(a,{client:t,children:e(s,{children:r})})})}function R(e){const{address:n,contract:r}=e,o=r?.chainId,c=d({chainId:o}),[t,i]=y(!0),[s,a]=y(),[h,u]=y(),p=l(r);return b((()=>{r||(i(!1),a(!1),u(!0)),p&&p.connect(c).balanceOf(n).then((e=>e.toNumber())).then((e=>e>0)).then((e=>{a(e),u(!e)})).catch((e=>{console.error(e),a(!1),u(!0)})).finally((()=>i(!1)))}),[n,r]),{isLoading:t,address:n,allow:s,deny:h}}function T(){const{hooks:e}=w.useContext(L);return e.useWallet()}function W(n){const{className:o,chainId:c}=n,{address:i,isConnected:s}=t(),{connect:a}=T(),{chain:l}=h(),u=function(e){const[n,r]=y(),o=d({chainId:1});return b((()=>{e&&o.lookupAddress(e).then(r)}),[e,o]),n}(i);return r("p",{className:I(o,"flex space-x-3 items-center justify-cente"),children:[!s&&e("button",{onClick:()=>a(),children:"Connect Wallet"}),s&&r("span",{className:"",children:["connected as"," ",e("a",{href:N(i,c||l.id),className:I(o,"underline"),target:"_blank",rel:"noreferrer",children:u||S(i)})]})]})}const B=n=>{const{isError:r,isLoading:o,isSuccess:c,children:t,...i}=n;return e("button",{disabled:o||c||r,...i,children:o?"Sending ...":c?"Success":r?"Error":t})},H=n=>{const{render:r=B,contract:o,prepare:c,timeout:t,...i}=n,[s,a]=y(!1),[d,l]=y(!1),[f,w]=y(!1),b=T(),{chain:g}=h(),{switchNetwork:k}=u(),{config:C}=p({address:o.address,abi:o.abi,...c}),{writeAsync:N}=m(C),S=()=>{a(!1),l(!1),w(!1)},I=v((()=>(a(!0),N().then((e=>e.wait())).then((()=>{l(!0)})).catch((e=>{console.error(e),w(!0)})).finally((()=>{a(!1),t&&setTimeout((()=>{S()}),t)})))),[N,S]);return b.isConnected?e(r,g?.id!==o?.chainId&&k?{...i,isLoading:!1,isSuccess:!1,isError:!1,onClick:()=>k(o?.chainId),children:"Switch Network"}:{...i,isLoading:s,isSuccess:d,isError:f,onClick:()=>I(),children:"Send Transaction"}):e(r,{...i,isLoading:!1,isSuccess:!1,isError:!1,onClick:b.connect,style:{backgroundColor:"red",cursor:"pointer"},children:"Connect Wallet"})},Y=({className:n,style:r,children:o,contract:c,loading:i=e("p",{children:"Loading"}),deny:s=e("p",{children:"You must own a token to view this content"})})=>{const{address:a}=t(),{isLoading:d,allow:l}=R({address:a,contract:c});return d?e("span",{className:n,style:r,children:i}):l?e("div",{className:n,style:r,children:o}):e("span",{className:n,style:r,children:s})},A=e=>e.toString(),D=n=>e("span",{...n}),$=n=>{const{as:r=D,contract:o,prepare:c,render:t=A,...i}=n,s=o?.chainId,a=f({address:o.address,abi:o.abi,chainId:s,...c});return e(r,{...i,children:t(a)})};export{W as ConnectedAs,$ as ContractRead,H as ContractWrite,Y as TokenGate,E as Web3Provider,R as useTokenGating,T as useWallet};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/hybridProvider.tsx","../src/hooks/useMinting.ts","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/DefaultButton.tsx","../src/components/MintButton.tsx","../src/components/TokenGate.tsx","../src/components/TotalSupply.tsx","../src/hooks/internal/useAsyncMemo.ts"],"sourcesContent":["import React from \"react\"\nimport { configureChains, createClient, Client, useConnect } from \"wagmi\"\nimport type { WalletConnection } from \"@hybrd/types\"\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n )\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n })\n\n const useWallet = () => {\n const { connect } = useConnect()\n return {\n connect: () => connect({ connector: client.connector }),\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain, mainnet, goerli } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\n\nimport createDefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n connect: () => {\n console.error(\"No wallet provider found\")\n },\n disconnect: () => {\n console.error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = [mainnet, goerli],\n wallet: createWalletConnector = createDefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\n chains,\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\n// I really want to support an HOC its cleaner in some cases.\n//\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\n}\n","import type {\n TransactionReceipt,\n TransactionResponse,\n} from \"@ethersproject/providers\"\nimport { BigNumber } from \"ethers\"\nimport { useCallback, useState } from \"react\"\nimport { useContract, useSigner } from \"wagmi\"\n\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype UseMinting = {\n isMinting: boolean\n isSuccess: boolean\n isError: boolean\n mint: (amount: number) => Promise<TransactionReceipt | undefined>\n}\n\ntype MintOpts = {\n value?: BigNumber | string\n gasPrice?: BigNumber | number\n}\n\ntype Props = {\n contract: DeployedContract\n}\n\nexport const useMinting = (props: Props): UseMinting => {\n const { contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const { data: signer } = useSigner({ chainId })\n\n const [isMinting, setMinting] = useState<boolean>(false)\n const [isSuccess, setSuccess] = useState<boolean>(false)\n const [isError, setError] = useState<boolean>(false)\n\n const contract = useContract(deployedContract)\n\n const mint = useCallback(\n async (amount: number, opts: MintOpts = {}) => {\n if (!contract) return\n setMinting(true)\n\n // For localhost, we need to set the gas price manually\n // const gasPrice = chainId === 1337 ? await signer.getGasPrice() : null\n const { value = BigNumber.from(\"0\"), gasPrice } = opts\n\n return contract\n .connect(signer)\n .mint(amount, {\n value,\n gasPrice,\n })\n .then((tx: TransactionResponse) => tx.wait())\n .then((reciept: TransactionReceipt) => {\n setSuccess(true)\n setTimeout(() => setSuccess(false), 3000)\n return reciept\n })\n .catch((err: Error) => {\n console.error(err)\n setError(true)\n setTimeout(() => setError(false), 1000)\n })\n .finally(() => setMinting(false))\n },\n [signer, contract, chainId]\n )\n\n return {\n isMinting,\n isSuccess,\n isError,\n mint,\n }\n}\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract(deployedContract)\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny,\n }\n}\n","import { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [address, provider])\n\n return ens\n}\n","import clsx from \"clsx\"\nimport styles from \"./DefaultButton.module.css\"\n\nexport type DefaultButtonProps = {\n className?: string\n style?: React.CSSProperties\n intent?: \"default\" | \"success\" | \"error\"\n onClick?: () => void\n children: React.ReactNode\n disabled?: boolean\n}\n\nconst INTENTS = {\n default: styles.DefaultButtonBase,\n success: styles.DefaultButtonSuccess,\n error: styles.DefaultButtonError\n}\n\nconst DefaultButton = (props: DefaultButtonProps) => {\n const {\n // className = \"px-8 py-3 transition-all cursor-pointer duration-250 hover:scale-[1.05] rounded-xl font-bold\",\n className = styles.DefaultButton,\n style,\n intent = \"default\",\n onClick,\n children,\n disabled\n } = props\n\n return (\n <button\n className={clsx(\n className,\n INTENTS[intent],\n disabled && styles.DefaultButtonDisabled\n )}\n onClick={onClick}\n style={style}\n >\n {children}\n </button>\n )\n}\n\nexport default DefaultButton\n","import { useMinting } from \"../hooks/useMinting\"\nimport { useNetwork, useSigner, useSwitchNetwork } from \"wagmi\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\n\ntype MintButtonProps = {\n className?: string\n contract: DeployedContract\n button?: React.FC<DefaultButtonProps>\n amount?: number\n}\n\nconst MintButton = (props: MintButtonProps) => {\n const {\n amount = 1,\n button: Button = DefaultButton,\n className,\n contract,\n } = props\n\n const { connect } = useWallet()\n\n const { data: signer } = useSigner()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { isMinting, isSuccess, isError, mint } = useMinting({ contract })\n\n if (isMinting) {\n return (\n <Button disabled className={className}>\n Minting\n </Button>\n )\n }\n\n if (isSuccess) {\n return (\n <Button disabled className={className} intent=\"success\">\n Minted\n </Button>\n )\n }\n\n if (isError) {\n return (\n <Button disabled className={className} intent=\"error\">\n Error Occurred\n </Button>\n )\n }\n\n if (!signer) {\n // todo - want to switch this to a generalized interface from our wallet connection API\n // const connector = connectors[0]\n return (\n <Button className={className} onClick={connect}>\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n onClick={() => switchNetwork(contract?.chainId)}\n className={className}\n intent=\"error\"\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button className={className} onClick={() => mint(amount)}>\n Mint Now\n </Button>\n )\n}\n\nexport default MintButton\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport DefaultButton, { DefaultButtonProps } from \"./DefaultButton\"\nimport { useWallet } from \"../hooks\"\n\ntype Props = {\n className?: string\n button?: React.FC<DefaultButtonProps>\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n button: Button = DefaultButton,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content.</p>,\n}: Props) => {\n const { address } = useAccount()\n const { connect } = useWallet()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (!address) {\n return (\n <Button className={className} style={style} onClick={() => connect()}>\n Connect Wallet\n </Button>\n )\n }\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useBlockNumber, useContract, useProvider } from \"wagmi\"\nimport { useAsyncMemo } from \"../hooks/internal/useAsyncMemo\"\nimport { BigNumber } from \"ethers\"\n\ntype TotalSupplyProps = {\n className?: string\n contract: DeployedContract\n}\n\nconst TotalSupply = (props: TotalSupplyProps) => {\n const { className, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n const { data: block } = useBlockNumber({ watch: true })\n const contract = useContract(deployedContract)\n\n const totalSupply: number = useAsyncMemo(() => {\n if (!contract) return\n return contract\n .connect(provider)\n .totalSupply()\n .then((res: BigNumber) => res.toNumber())\n }, [contract, block])\n\n return <span className={className}>{totalSupply}</span>\n}\n\nexport default TotalSupply\n","import { DependencyList, useEffect, useState } from \"react\"\n\ntype Factory<T> = () => Promise<T | undefined | null>\n\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList\n): T | undefined\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial: T\n): T\nexport function useAsyncMemo<T>(\n factory: Factory<T>,\n deps: DependencyList,\n initial?: T\n) {\n const [val, setVal] = useState<T | undefined>(initial)\n\n useEffect(() => {\n let cancel = false\n const promise = factory()\n if (promise === undefined || promise === null) return\n\n promise\n .then((val) => {\n if (!cancel) {\n setVal(val)\n }\n })\n .catch((error) => {\n console.error(`Error in useAsyncMemo: ${error}`)\n })\n\n return () => {\n cancel = true\n }\n }, deps)\n\n return val\n}\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","hooks","useWallet","connect","useConnect","connector","Provider","children","_jsx","_Fragment","Web3Context","React","createContext","undefined","console","error","disconnect","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","mainnet","goerli","wallet","createWalletConnector","createDefaultWalletConnector","contextValue","value","WagmiConfig","useMinting","contract","deployedContract","chainId","data","signer","useSigner","isMinting","setMinting","useState","isSuccess","setSuccess","isError","setError","useContract","mint","useCallback","async","amount","opts","BigNumber","from","gasPrice","then","tx","wait","reciept","setTimeout","catch","err","finally","useTokenGating","address","useProvider","isLoading","setLoading","allow","setAllow","deny","setDeny","useEffect","balanceOf","res","toNumber","bal","useContext","ConnectedAs","className","isConnected","useAccount","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","INTENTS","default","styles","DefaultButtonBase","success","DefaultButtonSuccess","DefaultButtonError","DefaultButton","style","intent","disabled","DefaultButtonDisabled","MintButton","button","Button","switchNetwork","useSwitchNetwork","TokenGate","loading","loadingComponent","denyComponent","TotalSupply","block","useBlockNumber","watch","totalSupply","factory","deps","initial","val","setVal","cancel","promise","useAsyncMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/providers/DefaultWalletConnector.tsx","../src/providers/Web3Provider.tsx","../src/providers/hybridProvider.tsx","../src/hooks/useTokenGating.ts","../src/hooks/useWallet.ts","../src/components/ConnectedAs.tsx","../src/hooks/internal/useEnsName.tsx","../src/components/ContractWrite.tsx","../src/components/TokenGate.tsx","../src/components/ContractRead.tsx"],"sourcesContent":["import React from \"react\"\nimport {\n configureChains,\n createClient,\n Client,\n useConnect,\n useDisconnect,\n useAccount,\n} from \"wagmi\"\nimport type { WalletConnection } from \"@hybrd/types\"\n\nexport default function DefaultWalletConnector(config) {\n const { provider, webSocketProvider } = configureChains(\n config.chains,\n config.providers\n )\n\n const client = createClient({\n autoConnect: true,\n // connectors,\n provider,\n webSocketProvider,\n })\n\n const useWallet = () => {\n const { address, isConnected } = useAccount()\n const { isLoading, connectAsync } = useConnect()\n const { disconnectAsync } = useDisconnect()\n\n return {\n account: address,\n isLoading,\n isConnected,\n connect: () => {\n connectAsync({ connector: client.connector })\n },\n disconnect: () => {\n disconnectAsync()\n },\n }\n }\n\n return {\n client: client as Client,\n hooks: {\n useWallet,\n },\n Provider: ({ children }: { children: React.ReactNode }) => <>{children}</>,\n } as WalletConnection\n}\n","import { WagmiConfig, Client, Chain } from \"wagmi\"\n\nimport React from \"react\"\nimport {\n ProviderConfig,\n WalletConnector,\n WalletConnectionHooks,\n} from \"@hybrd/types\"\nimport * as Chains from \"wagmi/chains\"\n\nimport DefaultWalletConnector from \"./DefaultWalletConnector\"\nimport { publicProvider } from \"wagmi/providers/public\"\nimport { hybridProvider } from \"./hybridProvider\"\n\nexport function useWeb3() {\n return React.useContext(Web3Context)\n}\n\nconst DEFAULT_CHAINS = [\n Chains.mainnet,\n Chains.goerli,\n //\n Chains.polygon,\n Chains.polygonMumbai,\n //\n Chains.arbitrum,\n Chains.arbitrumGoerli,\n //\n Chains.optimism,\n Chains.optimismGoerli,\n //\n // Chains.goerli, # when deployed\n Chains.baseGoerli,\n //\n Chains.localhost,\n]\n\nexport const Web3Context = React.createContext<{\n client: Client\n chains: Chain[]\n hooks: WalletConnectionHooks\n}>({\n client: undefined,\n chains: undefined,\n hooks: {\n useWallet: () => ({\n account: undefined,\n isLoading: true,\n isConnected: undefined,\n connect: async () => {\n throw new Error(\"No wallet provider found\")\n },\n disconnect: async () => {\n throw new Error(\"No wallet provider found\")\n },\n }),\n },\n})\n\nfunction buildProviders(config: ProviderConfig) {\n const { hybridKey } = config\n const providers = []\n\n providers.push(\n hybridProvider({\n apiKey: hybridKey,\n })\n )\n\n providers.push(publicProvider())\n\n return providers\n}\n\nexport function Web3Provider(\n props: {\n children: React.ReactNode\n chains?: Chain[]\n wallet?: WalletConnector\n } & ProviderConfig\n) {\n const {\n children,\n chains = DEFAULT_CHAINS,\n wallet: createWalletConnector = DefaultWalletConnector,\n } = props\n\n const { client, hooks, Provider } = createWalletConnector({\n chains,\n providers: buildProviders(props),\n })\n\n const contextValue = {\n client,\n hooks,\n chains,\n }\n\n return (\n <Web3Context.Provider value={contextValue}>\n <WagmiConfig client={client}>\n <Provider>{children}</Provider>\n </WagmiConfig>\n </Web3Context.Provider>\n )\n}\n\n// I really want to support an HOC its cleaner in some cases.\n//\n// export const withHybrid = (InputComponent, config: Config = {}) => {\n// return function WithHybrid(props) {\n// return (\n// <Web3Provider {...config}>\n// <InputComponent {...props} />\n// </Web3Provider>\n// )\n// }\n// }\n","import { providers } from \"ethers\"\n\nimport type { Chain, ChainProviderFn } from \"wagmi\"\nimport { jsonRpcProvider } from \"wagmi/providers/jsonRpc\"\n\nexport type HybridProviderConfig = {\n apiKey: string\n}\n\nexport function hybridProvider<TChain extends Chain = Chain>({\n apiKey,\n}: HybridProviderConfig): ChainProviderFn<\n TChain,\n providers.JsonRpcProvider,\n providers.WebSocketProvider\n> {\n return jsonRpcProvider({\n rpc: (chain) => {\n if (chain.network === \"localhost\") {\n return {\n http: \"http://localhost:8545\",\n webSocket: \"ws://localhost:8545\",\n }\n }\n\n const chainName = chain?.network || \"mainnet\"\n const http =\n process.env.NEXT_PUBLIC_HYBRID_RPC_HTTP ||\n process.env.HYBRID_RPC_HTTP ||\n `https://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n const webSocket =\n process.env.NEXT_PUBLIC_HYBRID_RPC_WS ||\n process.env.HYBRID_RPC_WS ||\n `wss://rpc.hybrid.dev/${chainName}/${apiKey || \"\"}`\n\n return {\n http,\n webSocket,\n }\n },\n })\n}\n","import { DeployedContract } from \"@hybrd/types\"\nimport { BigNumber } from \"ethers\"\nimport { useEffect, useState } from \"react\"\nimport { useContract, useProvider } from \"wagmi\"\n\ntype UseTokenGating = {\n isLoading: boolean\n address: string\n allow: boolean\n deny: boolean\n}\n\nexport function useTokenGating(props: {\n contract: DeployedContract\n address: `0x${string}`\n}): UseTokenGating {\n const { address, contract: deployedContract } = props\n const chainId = deployedContract?.chainId\n const provider = useProvider({ chainId })\n\n const [isLoading, setLoading] = useState(true)\n const [allow, setAllow] = useState<boolean>()\n const [deny, setDeny] = useState<boolean>()\n\n const contract = useContract(deployedContract)\n\n useEffect(() => {\n if (!deployedContract) {\n setLoading(false)\n setAllow(false)\n setDeny(true)\n }\n\n if (!contract) return\n contract\n .connect(provider)\n .balanceOf(address)\n .then((res: BigNumber) => res.toNumber())\n .then((bal) => bal > 0)\n .then((allow) => {\n setAllow(allow)\n setDeny(!allow)\n })\n .catch((err: Error) => {\n console.error(err)\n setAllow(false)\n setDeny(true)\n })\n .finally(() => setLoading(false))\n }, [address, deployedContract])\n\n return {\n isLoading: isLoading,\n address,\n allow,\n deny,\n }\n}\n","import { useWeb3 } from \"../providers/Web3Provider\"\nimport type { UseWallet } from \"@hybrd/types\"\n\nexport function useWallet(): UseWallet {\n const { hooks } = useWeb3()\n return hooks.useWallet()\n}\n","import { etherscanAddressURL, truncateEthAddress } from \"@hybrd/utils\"\nimport clsx from \"clsx\"\nimport { useEnsName } from \"../hooks/internal\"\nimport { useAccount, useNetwork } from \"wagmi\"\nimport { useWallet } from \"../hooks\"\n\nexport default function ConnectedAs(props: {\n className?: string\n chainId?: number\n}) {\n const { className, chainId } = props\n const { address, isConnected } = useAccount()\n const { connect } = useWallet()\n const { chain: network } = useNetwork()\n const ens = useEnsName(address)\n\n return (\n <p className={clsx(className, \"flex space-x-3 items-center justify-cente\")}>\n {!isConnected && (\n <button onClick={() => connect()}>Connect Wallet</button>\n )}\n\n {isConnected && (\n <span className=\"\">\n connected as{\" \"}\n <a\n href={etherscanAddressURL(address, chainId || network.id)}\n className={clsx(className, \"underline\")}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {ens || truncateEthAddress(address as string)}\n </a>\n </span>\n )}\n </p>\n )\n}\n","import { useProvider } from \"wagmi\"\nimport { useEffect, useState } from \"react\"\n\n/**\n * The wagmi useEnsName does not respect the chainId property.\n */\nexport function useEnsName(address: `0x${string}`) {\n const [ens, setENS] = useState<string | null>()\n const provider = useProvider({ chainId: 1 })\n\n useEffect(() => {\n if (!address) return\n provider.lookupAddress(address).then(setENS)\n }, [address, provider])\n\n return ens\n}\n","import {\n useContractWrite,\n useNetwork,\n usePrepareContractWrite,\n useSwitchNetwork,\n} from \"wagmi\"\nimport { DeployedContract } from \"@hybrd/types\"\nimport { useWallet } from \"../hooks\"\nimport { useCallback, useState } from \"react\"\n\ntype ButtonProps = {\n isError: boolean\n isLoading: boolean\n isSuccess: boolean\n} & React.HTMLAttributes<HTMLButtonElement>\n\ntype ContractWriteProps = {\n contract: DeployedContract\n prepare: Omit<Parameters<typeof usePrepareContractWrite>, \"abi\" | \"address\">\n render?: (props: ButtonProps) => JSX.Element\n timeout?: number\n} & React.HTMLAttributes<HTMLButtonElement>\n\nconst DefaultButton = (props: ButtonProps) => {\n const { isError, isLoading, isSuccess, children, ...rest } = props\n\n return (\n <button disabled={isLoading || isSuccess || isError} {...rest}>\n {isLoading\n ? \"Sending ...\"\n : isSuccess\n ? \"Success\"\n : isError\n ? \"Error\"\n : children}\n </button>\n )\n}\n\nconst ContractWrite = (props: ContractWriteProps) => {\n const {\n render: Button = DefaultButton,\n contract,\n prepare,\n timeout,\n ...rest\n } = props\n\n const [isLoading, setLoading] = useState(false)\n const [isSuccess, setSuccess] = useState(false)\n const [isError, setError] = useState(false)\n\n const wallet = useWallet()\n const { chain: network } = useNetwork()\n const { switchNetwork } = useSwitchNetwork()\n\n const { config } = usePrepareContractWrite({\n address: contract.address,\n abi: contract.abi,\n ...prepare,\n })\n\n const { writeAsync } = useContractWrite(config)\n\n const reset = () => {\n setLoading(false)\n setSuccess(false)\n setError(false)\n }\n\n const call = useCallback(() => {\n setLoading(true)\n return writeAsync()\n .then((res) => {\n return res.wait()\n })\n .then(() => {\n setSuccess(true)\n })\n .catch((err) => {\n console.error(err)\n setError(true)\n })\n .finally(() => {\n setLoading(false)\n\n if (timeout)\n setTimeout(() => {\n reset()\n }, timeout)\n })\n }, [writeAsync, reset])\n\n if (!wallet.isConnected) {\n return (\n <Button\n {...rest}\n isLoading={false}\n isSuccess={false}\n isError={false}\n onClick={wallet.connect}\n style={{ backgroundColor: \"red\", cursor: \"pointer\" }}\n >\n Connect Wallet\n </Button>\n )\n }\n\n if (network?.id !== contract?.chainId && switchNetwork) {\n return (\n <Button\n {...rest}\n isLoading={false}\n isSuccess={false}\n isError={false}\n onClick={() => switchNetwork(contract?.chainId)}\n >\n Switch Network\n </Button>\n )\n }\n\n return (\n <Button\n {...rest}\n isLoading={isLoading}\n isSuccess={isSuccess}\n isError={isError}\n onClick={() => call()}\n >\n Send Transaction\n </Button>\n )\n}\n\nexport default ContractWrite\n","import React from \"react\"\nimport { useAccount } from \"wagmi\"\nimport { useTokenGating } from \"../hooks/useTokenGating\"\nimport { DeployedContract } from \"@hybrd/types\"\n\ntype Props = {\n className?: string\n style?: React.CSSProperties\n children: React.ReactNode\n contract: DeployedContract\n loading?: React.ReactNode\n deny?: React.ReactNode\n}\n\nconst TokenGate: React.FC<Props> = ({\n className,\n style,\n children,\n contract,\n loading: loadingComponent = <p>Loading</p>,\n deny: denyComponent = <p>You must own a token to view this content</p>,\n}: Props) => {\n const { address } = useAccount()\n\n const { isLoading, allow } = useTokenGating({ address, contract })\n\n if (isLoading) {\n return (\n <span className={className} style={style}>\n {loadingComponent}\n </span>\n )\n }\n\n if (allow) {\n return (\n <div className={className} style={style}>\n {children}\n </div>\n )\n }\n\n return (\n <span className={className} style={style}>\n {denyComponent}\n </span>\n )\n}\n\nexport default TokenGate\n","import { DeployedContract } from \"@hybrd/types\"\nimport { useContractRead } from \"wagmi\"\n\ntype RenderProps = {\n isError: boolean\n isLoading: boolean\n isSuccess: boolean\n}\n\ntype ContractReadProps = {\n contract: DeployedContract\n prepare: Omit<Parameters<typeof useContractRead>, \"abi\" | \"address\">\n render?: (props: RenderProps) => JSX.Element\n as?: React.ElementType\n} & React.HTMLAttributes<HTMLSpanElement>\n\nconst defaultRender = (val) => val.toString()\nconst Span = (props) => <span {...props} />\n\nconst ContractRead = (props: ContractReadProps) => {\n const {\n as: As = Span,\n contract,\n prepare,\n render = defaultRender,\n ...rest\n } = props\n const chainId = contract?.chainId\n\n const read = useContractRead({\n address: contract.address,\n abi: contract.abi,\n chainId,\n ...prepare,\n })\n\n return <As {...rest}>{render(read)}</As>\n}\n\nexport default ContractRead\n"],"names":["DefaultWalletConnector","config","provider","webSocketProvider","configureChains","chains","providers","client","createClient","autoConnect","hooks","useWallet","address","isConnected","useAccount","isLoading","connectAsync","useConnect","disconnectAsync","useDisconnect","account","connect","connector","disconnect","Provider","children","_jsx","_Fragment","DEFAULT_CHAINS","Chains","mainnet","goerli","polygon","polygonMumbai","arbitrum","arbitrumGoerli","optimism","optimismGoerli","baseGoerli","localhost","Web3Context","React","createContext","undefined","async","Error","buildProviders","hybridKey","push","apiKey","jsonRpcProvider","rpc","chain","network","http","webSocket","chainName","process","env","NEXT_PUBLIC_HYBRID_RPC_HTTP","HYBRID_RPC_HTTP","NEXT_PUBLIC_HYBRID_RPC_WS","HYBRID_RPC_WS","hybridProvider","publicProvider","Web3Provider","props","wallet","createWalletConnector","contextValue","value","WagmiConfig","useTokenGating","contract","deployedContract","chainId","useProvider","setLoading","useState","allow","setAllow","deny","setDeny","useContract","useEffect","balanceOf","then","res","toNumber","bal","catch","err","console","error","finally","useContext","ConnectedAs","className","useNetwork","ens","setENS","lookupAddress","useEnsName","_jsxs","clsx","onClick","href","etherscanAddressURL","id","target","rel","truncateEthAddress","DefaultButton","isError","isSuccess","rest","disabled","ContractWrite","render","Button","prepare","timeout","setSuccess","setError","switchNetwork","useSwitchNetwork","usePrepareContractWrite","abi","writeAsync","useContractWrite","reset","call","useCallback","wait","setTimeout","style","backgroundColor","cursor","TokenGate","loading","loadingComponent","denyComponent","defaultRender","val","toString","Span","ContractRead","as","As","read","useContractRead"],"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","children":[{"uid":"cc2f-35","name":"DefaultWalletConnector.tsx"},{"uid":"cc2f-37","name":"Web3Provider.tsx"},{"uid":"cc2f-39","name":"hybridProvider.tsx"}]},{"name":"hooks","children":[{"uid":"cc2f-41","name":"useTokenGating.ts"},{"uid":"cc2f-43","name":"useWallet.ts"},{"name":"internal/useEnsName.tsx","uid":"cc2f-47"}]},{"name":"components","children":[{"uid":"cc2f-45","name":"ConnectedAs.tsx"},{"uid":"cc2f-49","name":"ContractWrite.tsx"},{"uid":"cc2f-51","name":"TokenGate.tsx"},{"uid":"cc2f-53","name":"ContractRead.tsx"}]}]}]}],"isRoot":true},"nodeParts":{"cc2f-35":{"renderedLength":942,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-34"},"cc2f-37":{"renderedLength":1613,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-36"},"cc2f-39":{"renderedLength":841,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-38"},"cc2f-41":{"renderedLength":1136,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-40"},"cc2f-43":{"renderedLength":87,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-42"},"cc2f-45":{"renderedLength":727,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-44"},"cc2f-47":{"renderedLength":354,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-46"},"cc2f-49":{"renderedLength":2280,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-48"},"cc2f-51":{"renderedLength":661,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-50"},"cc2f-53":{"renderedLength":461,"gzipLength":0,"brotliLength":0,"metaUid":"cc2f-52"}},"nodeMetas":{"cc2f-34":{"id":"/src/providers/DefaultWalletConnector.tsx","moduleParts":{"index.js":"cc2f-35"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-60"}],"importedBy":[{"uid":"cc2f-36"}]},"cc2f-36":{"id":"/src/providers/Web3Provider.tsx","moduleParts":{"index.js":"cc2f-37"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-60"},{"uid":"cc2f-61"},{"uid":"cc2f-62"},{"uid":"cc2f-34"},{"uid":"cc2f-63"},{"uid":"cc2f-38"}],"importedBy":[{"uid":"cc2f-54"},{"uid":"cc2f-42"}]},"cc2f-38":{"id":"/src/providers/hybridProvider.tsx","moduleParts":{"index.js":"cc2f-39"},"imported":[{"uid":"cc2f-64"}],"importedBy":[{"uid":"cc2f-36"}]},"cc2f-40":{"id":"/src/hooks/useTokenGating.ts","moduleParts":{"index.js":"cc2f-41"},"imported":[{"uid":"cc2f-61"},{"uid":"cc2f-60"}],"importedBy":[{"uid":"cc2f-56"},{"uid":"cc2f-50"}]},"cc2f-42":{"id":"/src/hooks/useWallet.ts","moduleParts":{"index.js":"cc2f-43"},"imported":[{"uid":"cc2f-36"}],"importedBy":[{"uid":"cc2f-56"}]},"cc2f-44":{"id":"/src/components/ConnectedAs.tsx","moduleParts":{"index.js":"cc2f-45"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-58"},{"uid":"cc2f-65"},{"uid":"cc2f-66"},{"uid":"cc2f-60"},{"uid":"cc2f-56"}],"importedBy":[{"uid":"cc2f-55"}]},"cc2f-46":{"id":"/src/hooks/internal/useEnsName.tsx","moduleParts":{"index.js":"cc2f-47"},"imported":[{"uid":"cc2f-60"},{"uid":"cc2f-61"}],"importedBy":[{"uid":"cc2f-66"}]},"cc2f-48":{"id":"/src/components/ContractWrite.tsx","moduleParts":{"index.js":"cc2f-49"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-60"},{"uid":"cc2f-56"},{"uid":"cc2f-61"}],"importedBy":[{"uid":"cc2f-55"}]},"cc2f-50":{"id":"/src/components/TokenGate.tsx","moduleParts":{"index.js":"cc2f-51"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-60"},{"uid":"cc2f-40"}],"importedBy":[{"uid":"cc2f-55"}]},"cc2f-52":{"id":"/src/components/ContractRead.tsx","moduleParts":{"index.js":"cc2f-53"},"imported":[{"uid":"cc2f-59"},{"uid":"cc2f-60"}],"importedBy":[{"uid":"cc2f-55"}]},"cc2f-54":{"id":"/src/index.ts","moduleParts":{},"imported":[{"uid":"cc2f-36"},{"uid":"cc2f-55"},{"uid":"cc2f-56"},{"uid":"cc2f-57"},{"uid":"cc2f-58"}],"importedBy":[],"isEntry":true},"cc2f-55":{"id":"/src/components/index.ts","moduleParts":{},"imported":[{"uid":"cc2f-44"},{"uid":"cc2f-48"},{"uid":"cc2f-50"},{"uid":"cc2f-52"}],"importedBy":[{"uid":"cc2f-54"}]},"cc2f-56":{"id":"/src/hooks/index.ts","moduleParts":{},"imported":[{"uid":"cc2f-40"},{"uid":"cc2f-42"}],"importedBy":[{"uid":"cc2f-54"},{"uid":"cc2f-44"},{"uid":"cc2f-48"}]},"cc2f-57":{"id":"@hybrd/types","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-54"}],"isExternal":true},"cc2f-58":{"id":"@hybrd/utils","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-54"},{"uid":"cc2f-44"}],"isExternal":true},"cc2f-59":{"id":"react/jsx-runtime","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-36"},{"uid":"cc2f-34"},{"uid":"cc2f-44"},{"uid":"cc2f-48"},{"uid":"cc2f-50"},{"uid":"cc2f-52"}],"isExternal":true},"cc2f-60":{"id":"wagmi","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-36"},{"uid":"cc2f-34"},{"uid":"cc2f-44"},{"uid":"cc2f-48"},{"uid":"cc2f-50"},{"uid":"cc2f-52"},{"uid":"cc2f-40"},{"uid":"cc2f-46"}],"isExternal":true},"cc2f-61":{"id":"react","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-36"},{"uid":"cc2f-48"},{"uid":"cc2f-40"},{"uid":"cc2f-67"},{"uid":"cc2f-46"}],"isExternal":true},"cc2f-62":{"id":"wagmi/chains","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-36"}],"isExternal":true},"cc2f-63":{"id":"wagmi/providers/public","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-36"}],"isExternal":true},"cc2f-64":{"id":"wagmi/providers/jsonRpc","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-38"}],"isExternal":true},"cc2f-65":{"id":"clsx","moduleParts":{},"imported":[],"importedBy":[{"uid":"cc2f-44"}],"isExternal":true},"cc2f-66":{"id":"/src/hooks/internal/index.ts","moduleParts":{},"imported":[{"uid":"cc2f-67"},{"uid":"cc2f-46"}],"importedBy":[{"uid":"cc2f-44"}]},"cc2f-67":{"id":"/src/hooks/internal/useAsyncMemo.ts","moduleParts":{},"imported":[{"uid":"cc2f-61"}],"importedBy":[{"uid":"cc2f-66"}]}},"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,8 +6175,3 @@ var drawChart = (function (exports) {
|
|
|
6175
6175
|
</body>
|
|
6176
6176
|
</html>
|
|
6177
6177
|
|
|
6178
|
-
>*/
|
|
6179
|
-
</script>
|
|
6180
|
-
</body>
|
|
6181
|
-
</html>
|
|
6182
|
-
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hybrid",
|
|
3
3
|
"author": "IanH <ian@ianh.xyz>",
|
|
4
|
-
"version": "0.7.
|
|
4
|
+
"version": "0.7.6",
|
|
5
5
|
"description": "Solidity + TypeScript Framework for Web3 Development",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"hybrid",
|
|
@@ -21,10 +21,6 @@
|
|
|
21
21
|
"types": "./dist/index.d.ts",
|
|
22
22
|
"default": "./dist/index.js"
|
|
23
23
|
},
|
|
24
|
-
"./client": {
|
|
25
|
-
"types": "./client/index.d.ts",
|
|
26
|
-
"default": "./client/index.js"
|
|
27
|
-
},
|
|
28
24
|
"./style.css": "./dist/style.css"
|
|
29
25
|
},
|
|
30
26
|
"bin": {
|
|
@@ -58,10 +54,10 @@
|
|
|
58
54
|
},
|
|
59
55
|
"dependencies": {
|
|
60
56
|
"@ethersproject/providers": "^5.7.1",
|
|
61
|
-
"@hybrd/cli": "^0.7.
|
|
62
|
-
"@hybrd/contracts": "^0.7.
|
|
63
|
-
"@hybrd/types": "^0.7.
|
|
64
|
-
"@hybrd/utils": "^0.7.
|
|
57
|
+
"@hybrd/cli": "^0.7.6",
|
|
58
|
+
"@hybrd/contracts": "^0.7.6",
|
|
59
|
+
"@hybrd/types": "^0.7.6",
|
|
60
|
+
"@hybrd/utils": "^0.7.6",
|
|
65
61
|
"@testing-library/react-hooks": "^8.0.1",
|
|
66
62
|
"abitype": "^0.7.1",
|
|
67
63
|
"axios": "^1.2.2",
|
|
@@ -114,5 +110,5 @@
|
|
|
114
110
|
"react-dom": ">=17",
|
|
115
111
|
"wagmi": "^0.12.8"
|
|
116
112
|
},
|
|
117
|
-
"gitHead": "
|
|
113
|
+
"gitHead": "88a2c6205a0c528a756fa4595ddd95796409b12e"
|
|
118
114
|
}
|
package/client/index.d.ts
DELETED
package/client/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Deployments } from "/.hybrid/client"
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
export type DefaultButtonProps = {
|
|
3
|
-
className?: string;
|
|
4
|
-
style?: React.CSSProperties;
|
|
5
|
-
intent?: "default" | "success" | "error";
|
|
6
|
-
onClick?: () => void;
|
|
7
|
-
children: React.ReactNode;
|
|
8
|
-
disabled?: boolean;
|
|
9
|
-
};
|
|
10
|
-
declare const DefaultButton: (props: DefaultButtonProps) => JSX.Element;
|
|
11
|
-
export default DefaultButton;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import { DefaultButtonProps } from "./DefaultButton";
|
|
3
|
-
import { DeployedContract } from "@hybrd/types";
|
|
4
|
-
type MintButtonProps = {
|
|
5
|
-
className?: string;
|
|
6
|
-
contract: DeployedContract;
|
|
7
|
-
button?: React.FC<DefaultButtonProps>;
|
|
8
|
-
amount?: number;
|
|
9
|
-
};
|
|
10
|
-
declare const MintButton: (props: MintButtonProps) => JSX.Element;
|
|
11
|
-
export default MintButton;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import { DeployedContract } from "@hybrd/types";
|
|
3
|
-
type TotalSupplyProps = {
|
|
4
|
-
className?: string;
|
|
5
|
-
contract: DeployedContract;
|
|
6
|
-
};
|
|
7
|
-
declare const TotalSupply: (props: TotalSupplyProps) => JSX.Element;
|
|
8
|
-
export default TotalSupply;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { TransactionReceipt } from "@ethersproject/providers";
|
|
2
|
-
import { DeployedContract } from "@hybrd/types";
|
|
3
|
-
type UseMinting = {
|
|
4
|
-
isMinting: boolean;
|
|
5
|
-
isSuccess: boolean;
|
|
6
|
-
isError: boolean;
|
|
7
|
-
mint: (amount: number) => Promise<TransactionReceipt | undefined>;
|
|
8
|
-
};
|
|
9
|
-
type Props = {
|
|
10
|
-
contract: DeployedContract;
|
|
11
|
-
};
|
|
12
|
-
export declare const useMinting: (props: Props) => UseMinting;
|
|
13
|
-
export {};
|
package/dist/style.css
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
.DefaultButton-module_DefaultButton__Px-Zc{border-radius:.75rem;cursor:pointer;font-weight:700;padding:.75rem 2rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.DefaultButton-module_DefaultButton__Px-Zc:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.DefaultButton-module_DefaultButtonBase__KRytO{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(29 80 250/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.DefaultButton-module_DefaultButtonSuccess__eaosU{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(83 221 180/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.DefaultButton-module_DefaultButtonError__B7CKv{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(240 33 70/var(--tw-bg-opacity));color:rgb(255 255 255/var(--tw-text-opacity))}.DefaultButton-module_DefaultButtonDisabled__-PIdK{--tw-brightness:brightness(.75);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}
|
|
2
|
-
/*# sourceMappingURL=style.css.map */
|
package/dist/style.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["DefaultButton.module.css"],"names":[],"mappings":"AACE,2CAAA,oBAAsF,CAAtF,cAAsF,CAAtF,eAAsF,CAAtF,mBAAsF,CAAtF,wBAAA,CAAA,uBAAsF,CAAtF,kDAAsF,CAAtF,iDAAA,iBAAsF,CAAtF,iBAAsF,CAAtF,6LAAsF,CAItF,+CAAA,iBAA6B,CAA7B,mBAA6B,CAA7B,oDAA6B,CAA7B,6CAA6B,CAI7B,kDAAA,iBAA8B,CAA9B,mBAA8B,CAA9B,qDAA8B,CAA9B,6CAA8B,CAI9B,gDAAA,iBAA4B,CAA5B,mBAA4B,CAA5B,oDAA4B,CAA5B,6CAA4B,CAI5B,mDAAA,+BAAoB,CAApB,gLAAoB","file":"style.css","sourcesContent":[".DefaultButton {\n @apply px-8 py-3 transition-all cursor-pointer hover:scale-[1.05] rounded-xl font-bold;\n}\n\n.DefaultButtonBase {\n @apply text-white bg-blue-500;\n}\n\n.DefaultButtonSuccess {\n @apply text-white bg-green-500;\n}\n\n.DefaultButtonError {\n @apply text-white bg-red-500;\n}\n\n.DefaultButtonDisabled {\n @apply brightness-75;\n}\n"]}
|