eth-hooks2
Version:
A set of hooks to turbocharge buidling
1,281 lines (1,271 loc) • 54.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var chunkMLDFKDMQ_js = require('./chunk-MLDFKDMQ.js');
var chunkSYGGHKPN_js = require('./chunk-SYGGHKPN.js');
var chunk6CZGM7JT_js = require('./chunk-6CZGM7JT.js');
var ethers = require('ethers');
var mergeAnything = require('merge-anything');
var react = require('react');
var reactQuery = require('react-query');
var tsInvariant = require('ts-invariant');
var create = require('zustand');
var useDebounce = require('use-debounce');
var usehooksTs = require('usehooks-ts');
var providers = require('@ethersproject/providers');
var abstractConnector = require('@web3-react/abstract-connector');
var core = require('@web3-react/core');
var cts = require('web3modal');
var jsxDevRuntime = require('react/jsx-dev-runtime');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var create__default = /*#__PURE__*/_interopDefaultLegacy(create);
var cts__namespace = /*#__PURE__*/_interopNamespace(cts);
var extractHardhatContracts = (configJson) => {
var _a2;
const parse = chunkSYGGHKPN_js.deployedHardhatContractsJsonSchema.safeParse(configJson);
if (!parse.success) {
console.error("Invalid deployment hardhat_contracts.json TDeployedHardhatContractsJson", parse.error);
}
const contractData = {};
for (const chainIdStr in configJson) {
const chainId = parseInt(chainIdStr);
if (chainId == null || isNaN(chainId))
continue;
const deployedDataByNetwork = (_a2 = Object.values(configJson[chainId]).filter(
(f) => parseInt(f == null ? void 0 : f.chainId) === chainId
)) == null ? void 0 : _a2[0];
if ((deployedDataByNetwork == null ? void 0 : deployedDataByNetwork.chainId) != null) {
for (const contractName in deployedDataByNetwork.contracts) {
const config = {
[chainId]: { address: deployedDataByNetwork.contracts[contractName].address, chainId }
};
const abi = deployedDataByNetwork.contracts[contractName].abi;
if (abi && (abi == null ? void 0 : abi.length) > 0) {
contractData[contractName] = mergeAnything.merge(contractData[contractName] ?? {}, { abi });
}
contractData[contractName] = mergeAnything.merge({ ...contractData[contractName] }, { config });
}
}
}
return contractData;
};
var extractExternalContracts = (configJson) => {
const parse = chunkSYGGHKPN_js.externalContractAddressMap.safeParse(configJson);
if (!parse.success) {
console.error("Invalid TExternalContractsAddressMap", parse.error);
}
const contractData = {};
for (const chainIdStr in configJson) {
const chainId = parseInt(chainIdStr);
if (chainId == null || isNaN(chainId))
continue;
for (const contractName in configJson[chainId]) {
const config = {
[chainId]: { address: configJson[chainId][contractName], chainId }
};
contractData[contractName] = mergeAnything.merge({ ...contractData[contractName] ?? {} }, { config });
}
}
return contractData;
};
var extractForgeBroadcastContracts = (configJson) => {
const parse = chunkSYGGHKPN_js.forgeDeploymentBroadcastCollectionSchema.safeParse(configJson);
if (!parse.success) {
console.error("Invalid forge boradcast json TForgeBroadcastJson", parse.error);
}
const contractData = {};
for (const chainIdStr in configJson) {
const chainId = parseInt(chainIdStr);
if (chainId == null || isNaN(chainId))
continue;
const contractDeployments = configJson[chainId].transactions.filter((f) => f.transactionType === "CREATE").map((m) => {
const td = {
contractName: m.contractName.replace("Deploy", "").replace("deploy", ""),
address: m.contractAddress
};
return td;
});
const contractNameList = contractDeployments.map((m) => m.contractName);
contractNameList.forEach((contractName) => {
var _a2;
const data = contractDeployments.filter((f) => f.contractName === contractName);
if (data.length === 0) {
console.error("Contract deployments NOT found for contract", contractName, `chainId: ${chainId}`);
} else if (data.length > 1) {
console.error(
"Multiple contract deployments found for contract on the same chainId",
contractName,
`chainId: ${chainId}`
);
}
console.log("output data", data[0]);
const config = {
[chainId]: { address: (_a2 = data == null ? void 0 : data[0]) == null ? void 0 : _a2.address, chainId }
};
contractData[contractName] = mergeAnything.merge({ ...contractData[contractName] ?? {} }, { config });
});
}
return contractData;
};
var createConnectorForHardhatContract = (contractName, typechainFactory, deployedHardhatContractJson) => {
const info = extractHardhatContracts(deployedHardhatContractJson)[contractName];
if (info == null || info.abi == null) {
throw new Error(
`Contract ${contractName} not found in deployed contracts (hardhat_config.json). Check your hardhat deploy scripts and hardhat_config.json`
);
}
return {
contractName,
connect: typechainFactory.connect,
abi: (info == null ? void 0 : info.abi) ?? typechainFactory.abi ?? [],
config: {
...info.config
}
};
};
var createConnectorForFoundryContract = (contractName, typechainFactory, forgeBroadcastJson) => {
const info = extractForgeBroadcastContracts(forgeBroadcastJson)[contractName];
if (info == null || typechainFactory.abi == null) {
throw new Error(
`Contract ${contractName} not found in deployed contracts (foundry_config.json). Check your foundry deploy script`
);
}
return {
contractName,
connect: typechainFactory.connect,
abi: typechainFactory.abi ?? [],
config: {
...info.config
}
};
};
var createConnectorForExternalContract = (contractName, typechainFactory, deployedContractJson) => {
const info = extractExternalContracts(deployedContractJson)[contractName];
if (info == null) {
throw new Error(
`Contract ${contractName} not found in external contract map. Check that contractName: address map is correct. This is required by eth-sdk`
);
}
return {
contractName,
connect: typechainFactory.connect,
abi: typechainFactory.abi ?? [],
config: {
...info.config
}
};
};
var createConnectorForExternalAbi = (contractName, config, abi, connectFunc = void 0) => {
const deploymentConfig = { ...config };
for (const k in deploymentConfig) {
deploymentConfig[k].chainId = parseInt(k);
}
if (connectFunc) {
return {
contractName,
connect: connectFunc,
abi,
config: deploymentConfig
};
} else {
const defaultConnectFunction = (address, signerOrProvider) => {
const baseContract = new ethers.BaseContract(address, abi, signerOrProvider);
baseContract.contractName = contractName;
return baseContract;
};
return {
contractName,
connect: defaultConnectFunction,
abi,
config: deploymentConfig
};
}
};
var contractsContextFactory = (loadAppContractConnectors) => {
const defaultAppContractsContext = () => {
return {
contractConnectors: {},
contractsByName: {},
contractsByChainId: {}
};
};
const initalizeState = (appContractConnectorList) => {
const state = defaultAppContractsContext();
state.contractConnectors = appContractConnectorList;
return state;
};
const cloneContextState = (state) => {
const newState = defaultAppContractsContext();
newState.contractConnectors = { ...state.contractConnectors };
newState.contractsByName = { ...state.contractsByName };
newState.contractsByChainId = { ...state.contractsByChainId };
return newState;
};
const sortContractsByChainId = (contractsByName) => {
let contractsByChainId = {};
const names = Object.keys(contractsByName);
names.forEach((name) => {
const chainIds = Object.keys(contractsByName[name]).map(Number);
chainIds.forEach((chainId) => {
const data = {
[chainId]: { [name]: contractsByName[name][chainId] }
};
const temp = mergeAnything.merge(contractsByChainId, data);
contractsByChainId = temp;
});
});
return contractsByChainId;
};
const sortContractsByName = (contractsByChainId) => {
let contractsByName = {};
const chainIds = Object.keys(contractsByChainId).map(Number);
chainIds.forEach((chainId) => {
const names = Object.keys(contractsByChainId[chainId]);
names.forEach((name) => {
const data = {
[name]: { [chainId]: contractsByChainId[chainId][name] }
};
const temp = mergeAnything.merge(contractsByName, data);
contractsByName = temp;
});
});
return contractsByName;
};
const removeInvalidContractsAction = (state, ethersAdaptor) => {
if ((ethersAdaptor == null ? void 0 : ethersAdaptor.chainId) != null) {
const newState = cloneContextState(state);
const chainId = ethersAdaptor.chainId;
delete newState.contractsByChainId[chainId];
newState.contractsByName = sortContractsByName(newState.contractsByChainId);
return newState;
}
return state;
};
const connectToContractWithAdaptorAction = (connector, adaptor) => {
var _a2, _b;
if (adaptor == null || !chunkMLDFKDMQ_js.isValidEthersAdaptor(adaptor)) {
console.warn("No valid ethers adaptor provided. Skipping contract connection");
return void 0;
}
const { signer, provider } = adaptor;
const signerOrProvider = signer ?? provider;
const chainId = adaptor.chainId;
const contractAddress = (_b = (_a2 = connector == null ? void 0 : connector.config) == null ? void 0 : _a2[chainId]) == null ? void 0 : _b.address;
if (contractAddress != null && signerOrProvider != null) {
const contract = connector.connect(connector.config[chainId].address, signerOrProvider);
if (contract != null) {
return contract;
}
}
if (connector.config[chainId] != null) {
console.warn("ContractConnector requires signer with the same chainId to connect contract");
}
console.log(
`Couldn't connect to contract ${connector == null ? void 0 : connector.contractName}: signer chainId: ${chainId}, config: ${JSON.stringify(
connector == null ? void 0 : connector.config
)}.`
);
console.log("\u{1F645}\u{1F3FD}\u200D\u2642\uFE0F Please make sure the correct network is connected and the contract is deployed.");
return void 0;
};
const connectToAllContractsAction = (state, ethersAdaptor) => {
if (ethersAdaptor == null || !chunkMLDFKDMQ_js.isValidEthersAdaptor(ethersAdaptor)) {
tsInvariant.invariant.log("connectToAllContracts: Invalid ethers adaptor");
return removeInvalidContractsAction(state, ethersAdaptor);
}
const newState = cloneContextState(state);
const { chainId, signer, provider } = ethersAdaptor;
const providerOrSigner = signer ?? provider;
for (const contractName in newState.contractConnectors) {
const connector = newState.contractConnectors[contractName];
if (chainId && connector.config[chainId] != null && providerOrSigner != null) {
const contract = connectToContractWithAdaptorAction(connector, ethersAdaptor);
const data = { [contractName]: { [chainId]: contract } };
newState.contractsByName = mergeAnything.merge(newState.contractsByName, data);
}
}
newState.contractsByChainId = sortContractsByChainId(newState.contractsByName);
return newState;
};
const connectToContractAction = (state, contractName, ethersAdaptor) => {
if (ethersAdaptor == null || !chunkMLDFKDMQ_js.isValidEthersAdaptor(ethersAdaptor)) {
tsInvariant.invariant.log("connectToAllContracts: Invalid ethers adaptor");
return removeInvalidContractsAction(state, ethersAdaptor);
}
const newState = cloneContextState(state);
const { chainId } = ethersAdaptor;
const contractConnector = newState.contractConnectors[contractName];
if (chainId && contractConnector.config[chainId] != null) {
const contract = connectToContractWithAdaptorAction(contractConnector, ethersAdaptor);
newState.contractsByName[contractConnector.contractName] = {};
const temp = newState.contractsByName[contractConnector.contractName];
temp[chainId] = contract;
newState.contractsByChainId = sortContractsByChainId(newState.contractsByName);
}
return newState;
};
const setContractConnectorsAction = (contractConnectors) => {
const newState = initalizeState(contractConnectors);
return newState;
};
const useContractsAppStore = create__default["default"]()((set) => ({
contractState: void 0,
setContractState: (contractState) => set((store) => {
store.contractState = contractState;
return store;
}),
connectToAllContracts: (ethersAdaptor) => set((store) => {
if (store.contractState) {
const contractState = connectToAllContractsAction(store.contractState, ethersAdaptor);
store.contractState = contractState;
}
return store;
}),
connectToContract: (contractName, ethersAdaptor) => set((store) => {
if (store.contractState) {
const contractState = connectToContractAction(store.contractState, contractName, ethersAdaptor);
store.contractState = contractState;
}
return store;
}),
setContractConnectors: (contractConnectors) => set((store) => {
const contractState = setContractConnectorsAction(contractConnectors);
store.contractState = contractState;
return store;
})
}));
const useAppContracts = (contractName, chainId) => {
var _a2, _b, _c;
const contractsState = useContractsAppStore((state) => state.contractState);
const ethersContext = useEthersAppContext();
const contract = (_b = (_a2 = contractsState == null ? void 0 : contractsState.contractsByName) == null ? void 0 : _a2[contractName]) == null ? void 0 : _b[chainId ?? -1];
const contractConnector = (_c = contractsState == null ? void 0 : contractsState.contractConnectors) == null ? void 0 : _c[contractName];
const chainIdRef = react.useRef(-1);
if (contract == null && (ethersContext == null ? void 0 : ethersContext.chainId) != null && (contractConnector == null ? void 0 : contractConnector.abi) != null && chainId === chainIdRef.current) {
console.warn(`\u26A0\uFE0F Contract ${contractName} not found on chain ${chainId}.`);
console.warn(
`\u{1F64B}\u{1F3FD}\u200D\u2642\uFE0F 1. Did you setup the contract in the config ? 2. Did you call useLoadAppContracts with an adaptor that has the correct chainId ?`
);
chainIdRef.current = chainId;
}
if (contract) {
return contract;
}
return void 0;
};
const useLoadAppContracts = () => {
const queryClient = reactQuery.useQueryClient();
const setContractConnectors = useContractsAppStore((state) => state.setContractConnectors);
const load = react.useCallback(() => {
if (loadAppContractConnectors != null) {
const connectors = loadAppContractConnectors();
if (connectors != null) {
setContractConnectors(connectors);
chunkMLDFKDMQ_js.invalidateCache(queryClient, chunkSYGGHKPN_js.keyNamespace.contracts);
}
}
}, []);
react.useEffect(() => {
void load();
}, [load]);
};
const useConnectAppContracts = (adaptor) => {
const queryClient = reactQuery.useQueryClient();
const connectToAllContracts = useContractsAppStore((state) => state.connectToAllContracts);
const validAdaptorState = chunkMLDFKDMQ_js.isValidEthersAdaptor(adaptor);
const connect = react.useCallback(() => {
if ((adaptor == null ? void 0 : adaptor.chainId) != null) {
connectToAllContracts(adaptor);
chunkMLDFKDMQ_js.invalidateCache(queryClient, chunkSYGGHKPN_js.keyNamespace.contracts);
}
}, [adaptor == null ? void 0 : adaptor.provider, adaptor == null ? void 0 : adaptor.signer, adaptor == null ? void 0 : adaptor.chainId, adaptor == null ? void 0 : adaptor.account, validAdaptorState]);
react.useEffect(() => {
void connect();
}, [connect]);
};
return {
useContractsAppStore,
useAppContracts,
useLoadAppContracts,
useConnectAppContracts
};
};
var useEthersAppStore = create__default["default"]()((set) => ({
blockNumberState: {},
setBlockNumber: (blocknumber, chainId) => set((state) => {
state.blockNumberState[chainId] = blocknumber;
return state;
})
}));
var useEthersUpdater = (update, blockNumber, options, allowBlockNumberUpdate = true) => {
chunkMLDFKDMQ_js.checkUpdateOptions(options);
const updateNumberRef = react.useRef(void 0);
const blockNumberFilter = blockNumber ? Math.floor(blockNumber / (options.blockNumberInterval ?? 1)) : void 0;
if (allowBlockNumberUpdate) {
if (!options.refetchInterval && blockNumberFilter !== updateNumberRef.current) {
updateNumberRef.current = blockNumberFilter;
void update();
}
}
};
// src/hooks/useAreSignerEqual.ts
var queryKey = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useAreSignerEqual" };
var useAreSignerEqual = (signer1, signer2, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [{ ...queryKey }, { singer1Key: chunkMLDFKDMQ_js.providerKey(signer1), signer2Key: chunkMLDFKDMQ_js.providerKey(signer2) }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
if (chunkMLDFKDMQ_js.signerHasNetwork(signer1)) {
const chainId1 = await (signer1 == null ? void 0 : signer1.getChainId());
const chainId2 = await (signer2 == null ? void 0 : signer2.getChainId());
const address1 = await (signer1 == null ? void 0 : signer1.getAddress());
const address2 = await (signer2 == null ? void 0 : signer2.getAddress());
const isEqual = address1 === address2 && chainId1 === chainId2 && address1 !== void 0 && chainId1 !== void 0;
return isEqual;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
return [data, refetch, status];
};
var queryKey2 = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useBalance" };
var zero = ethers.BigNumber.from(0);
var useBalance = (addresses, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions(), override = chunkMLDFKDMQ_js.mergeDefaultOverride()) => {
const ethersContext = useEthersAppContext(override.alternateContextKey);
const { provider } = chunkMLDFKDMQ_js.ethersOverride(ethersContext, override);
const keys = [{ ...queryKey2, ...chunkMLDFKDMQ_js.providerKey(provider) }, { addresses }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (keys2) => {
const { addresses: addresses2 } = keys2.queryKey[1];
if (provider && addresses2) {
if (Array.isArray(addresses2)) {
const result2 = {};
await chunkMLDFKDMQ_js.asyncForEach(addresses2, async (address) => {
const balance = await provider.getBalance(address);
result2[address] = balance;
});
return result2;
} else {
const address = addresses2;
const newBalance = await provider.getBalance(address);
return newBalance;
}
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options),
isDataEqual: (oldResult, newResult) => (oldResult == null ? void 0 : oldResult._hex) === (newResult == null ? void 0 : newResult._hex)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
let result;
if (Array.isArray(addresses)) {
result = data ?? {};
} else {
result = data ?? zero;
}
return [result, refetch, status];
};
var queryKey3 = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useBlockNumber" };
var useBlockNumber = (provider, callback, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [
{
...queryKey3,
...chunkMLDFKDMQ_js.providerKey(provider)
}
];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
if (provider) {
const nextBlockNumber = await (provider == null ? void 0 : provider.getBlockNumber());
return nextBlockNumber;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
react.useEffect(() => {
var _a2;
if (provider) {
const listener = (blockNumberLocal) => {
void refetch();
if (callback != null) {
try {
void callback(blockNumberLocal);
} catch (e) {
console.warn("useBlockNumber callback failed", e);
}
}
};
(_a2 = provider == null ? void 0 : provider.addListener) == null ? void 0 : _a2.call(provider, "block", listener);
if (data == null) {
void refetch();
}
return () => {
var _a3;
(_a3 = provider == null ? void 0 : provider.removeListener) == null ? void 0 : _a3.call(provider, "block", listener);
};
}
}, [callback, provider, refetch]);
return [data ?? 0, refetch, status];
};
var storageKey = "scaffold-eth-burner-privateKey";
var isValidPk = (pk) => {
return (pk == null ? void 0 : pk.length) === 64 || (pk == null ? void 0 : pk.length) === 66;
};
var saveBurnerKeyToStorage = (incomingPK) => {
if (isValidPk(incomingPK)) {
const rawPK = incomingPK;
window.history.pushState({}, "", "/");
const currentPrivateKey = window.localStorage.getItem(storageKey);
if (currentPrivateKey && currentPrivateKey !== rawPK) {
window.localStorage.setItem(`${storageKey}_backup${Date.now()}`, currentPrivateKey);
console.log("\u{1F511} ...Saved Private Key");
}
window.localStorage.setItem(`${storageKey}`, rawPK.toString());
}
};
var loadBurnerKeyFromStorage = () => {
const currentPrivateKey = window.localStorage.getItem(storageKey);
return currentPrivateKey;
};
var useBurnerSigner = (localProvider) => {
var _a2;
const [privateKeyValue, setPrivateKey] = react.useState();
const walletRef = react.useRef();
const creatingBurnerRef = react.useRef(false);
const [signer] = useDebounce.useDebounce(walletRef.current, 200, {
trailing: true,
equalityFn: (a, b) => (a == null ? void 0 : a.address) === (b == null ? void 0 : b.address) && a != null && b != null
});
const account = (_a2 = walletRef.current) == null ? void 0 : _a2.address;
const setValue = (value) => {
try {
setPrivateKey(value);
window.localStorage.setItem(storageKey, value);
} catch (error) {
console.log(error);
}
};
react.useEffect(() => {
const storedKey = window.localStorage.getItem(storageKey);
if (!storedKey) {
console.log("generating a new key");
const newWallet = ethers.ethers.Wallet.createRandom();
const newKey = newWallet.privateKey;
setValue(newKey);
} else {
setValue(storedKey);
}
}, []);
react.useEffect(() => {
if (privateKeyValue && localProvider) {
const wallet = new ethers.ethers.Wallet(privateKeyValue);
const newSigner = wallet.connect(localProvider);
walletRef.current = newSigner;
}
}, [privateKeyValue, localProvider]);
const saveToStorage = react.useCallback(() => {
console.log("\u{1F511} Incoming Private Key...");
if (privateKeyValue != null) {
saveBurnerKeyToStorage(privateKeyValue);
}
}, [privateKeyValue]);
const generateBurnerSigner = react.useCallback(() => {
if (localProvider && !creatingBurnerRef.current) {
creatingBurnerRef.current = true;
console.log("\u{1F511} Create new burner wallet...");
const wallet = ethers.Wallet.createRandom();
setPrivateKey((_v) => {
console.log("\u{1F4DD} ...Set key");
creatingBurnerRef.current = false;
return wallet.privateKey;
});
} else {
console.log("\u26A0 Could not create burner wallet");
}
}, [localProvider]);
const loadOrGenerateBurner = react.useCallback(() => {
if (setPrivateKey != null) {
const pk = loadBurnerKeyFromStorage();
if (pk && isValidPk(pk)) {
console.log("\u{1F511} ...Loaded Private Key");
setPrivateKey(pk);
} else {
generateBurnerSigner();
}
}
}, [generateBurnerSigner]);
const getBurnerPrivateKey = () => {
return privateKeyValue;
};
return {
signer,
account,
saveBurner: saveToStorage,
loadOrGenerateBurner,
generateBurnerSigner,
getBurnerPrivateKey
};
};
var queryKey4 = { namespace: chunkSYGGHKPN_js.keyNamespace.contracts, key: "useContractExistsAtAddress" };
var useContractExistsAtAddress = (contract, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [{ ...queryKey4, ...chunkMLDFKDMQ_js.contractKey(contract) }, { contractAddress: contract == null ? void 0 : contract.address }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (keys2) => {
const { contractAddress } = keys2.queryKey[1];
if (contractAddress != null && ethers.utils.isAddress(contractAddress) && (contract == null ? void 0 : contract.provider) != null) {
const bytecode = await contract.provider.getCode(contractAddress);
return bytecode !== "0x";
}
return false;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
return [data ?? false, refetch, status];
};
var queryKey5 = { namespace: chunkSYGGHKPN_js.keyNamespace.contracts, key: "useContractReader" };
var useContractReader = (contract, contractFunc, args, funcEventFilter, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [
{
...queryKey5,
...chunkMLDFKDMQ_js.contractFuncKey(contract, contractFunc)
},
{ args: args ?? [], funcEventFilter }
];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (keys2) => {
const { args: args2 } = keys2.queryKey[1];
if (contractFunc != null && contract != null) {
const result = await contractFunc(...args2);
return result;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
react.useEffect(() => {
if (funcEventFilter != null) {
const listener = () => {
void refetch();
};
try {
contract == null ? void 0 : contract.on(funcEventFilter, listener);
return () => {
contract == null ? void 0 : contract.off(funcEventFilter, listener);
};
} catch (e) {
console.log(e);
}
}
}, [contract, funcEventFilter, refetch]);
const blockNumber = useBlockNumberContext();
const allowBlockNumberIntervalUpdate = funcEventFilter == null;
useEthersUpdater(refetch, blockNumber, options, allowBlockNumberIntervalUpdate);
return [data, refetch, status];
};
var queryKey6 = {
namespace: chunkSYGGHKPN_js.keyNamespace.network,
key: "useGetEthersAdaptorFromProviderOrSigners"
};
var useEthersAdaptorFromProviderOrSigners = (providerOrSigner, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [{ ...queryKey6, ...chunkMLDFKDMQ_js.providerKey(providerOrSigner) }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
const result = await chunkMLDFKDMQ_js.parseProviderOrSigner(providerOrSigner);
return result;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options),
isDataEqual: (oldData, newData) => chunkMLDFKDMQ_js.isAdaptorEqual(oldData, newData)
}
);
const validAdaptorState = chunkMLDFKDMQ_js.isValidEthersAdaptor(data);
react.useEffect(() => {
var _a2;
if (data != null && !validAdaptorState) {
console.log("not valid");
if (data.provider) {
void data.provider.getNetwork().then(() => refetch()).catch();
} else if (data.signer && data.account) {
void ((_a2 = data.signer.provider) == null ? void 0 : _a2.getNetwork().then(() => refetch()).catch());
}
}
}, [data, refetch, validAdaptorState]);
return [data, refetch, status];
};
var queryKey7 = { namespace: chunkSYGGHKPN_js.keyNamespace.contracts, key: "useEventListener" };
var useEventListener = (contract, eventFilter, startBlock, toBlock = void 0, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions(chunkSYGGHKPN_js.const_blockNumberIntervalMedium)) => {
const keys = [
{
...queryKey7,
...chunkMLDFKDMQ_js.contractKey(contract)
},
{
eventFilter,
startBlock,
toBlock
}
];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (keys2) => {
{
const { eventFilter: eventFilter_, startBlock: startBlock_, toBlock: toBlock_ } = keys2.queryKey[1];
const result = await (contract == null ? void 0 : contract.queryFilter(eventFilter_, startBlock_, toBlock_));
return result ?? [];
}
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
react.useEffect(() => {
if (eventFilter != null) {
const listener = () => {
void refetch();
};
try {
contract == null ? void 0 : contract.on(eventFilter, listener);
return () => {
contract == null ? void 0 : contract.off(eventFilter, listener);
};
} catch (e) {
console.log(e);
}
}
}, [contract, eventFilter, refetch]);
return [data ?? [], refetch, status];
};
var queryKey8 = { namespace: chunkSYGGHKPN_js.keyNamespace.state, key: "useGasPrice" };
var useGasPrice = (chainId, speed, currentNetworkInfo, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions(), override = chunkMLDFKDMQ_js.mergeDefaultOverride()) => {
const ethersContext = useEthersAppContext(override.alternateContextKey);
const { provider } = chunkMLDFKDMQ_js.ethersOverride(ethersContext, override);
const keys = [
{ ...queryKey8, ...chunkMLDFKDMQ_js.providerKey(provider) },
{ chainId, speed, currentNetworkInfo }
];
const { data, refetch, isError, status } = reactQuery.useQuery(
keys,
async (keys2) => {
const { chainId: chainId2, speed: speed2, currentNetworkInfo: currentNetworkInfo2 } = keys2.queryKey[1];
if (!chainId2) {
return void 0;
} else if (chainId2 === 1) {
if (navigator == null ? void 0 : navigator.onLine) {
const gweiFactor = 10;
const response = await fetch("https://ethgasstation.info/json/ethgasAPI.json");
const result2 = response.json() ?? {};
let newGasPrice = result2[speed2] / gweiFactor;
if (!newGasPrice)
newGasPrice = result2["fast"] / gweiFactor;
return newGasPrice;
}
} else if (provider) {
const fee = await provider.getFeeData();
const price = fee.gasPrice ?? fee.maxFeePerGas;
if (price && (price == null ? void 0 : price.toBigInt()) > 0) {
const result2 = parseInt(ethers.utils.formatUnits(price, "gwei")) ?? 0;
return result2;
}
}
if (currentNetworkInfo2 == null ? void 0 : currentNetworkInfo2.gasPrice) {
return currentNetworkInfo2.gasPrice;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
const result = isError ? void 0 : data;
const [gasPriceDebounced] = useDebounce.useDebounce(result, 250, { trailing: true });
return [gasPriceDebounced, refetch, status];
};
var queryKey9 = {
namespace: chunkSYGGHKPN_js.keyNamespace.signer,
key: "useNonce"
};
var useNonce = (address, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions(), override = chunkMLDFKDMQ_js.mergeDefaultOverride()) => {
const ethersContext = useEthersAppContext(override.alternateContextKey);
const { provider } = chunkMLDFKDMQ_js.ethersOverride(ethersContext, override);
const keys = [{ ...queryKey9, ...chunkMLDFKDMQ_js.providerKey(provider) }, { address }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (keys2) => {
const { address: address2 } = keys2.queryKey[1];
if (address2) {
const nextNonce = await (provider == null ? void 0 : provider.getTransactionCount(address2));
return nextNonce ?? 0;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
return [data ?? 0, refetch, status];
};
var queryKey10 = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useSignerAddress" };
var useSignerAddress = (signer, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions()) => {
const keys = [{ ...queryKey10, ...chunkMLDFKDMQ_js.providerKey(signer) }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
if (signer) {
const result = await signer.getAddress();
return result;
}
return void 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
return [data, refetch, status];
};
var queryKey11 = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useSignerChainId" };
var useSignerChainId = (signer, options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions({ ...chunkSYGGHKPN_js.const_blockNumberIntervalMedium })) => {
const keys = [{ ...queryKey11, ...chunkMLDFKDMQ_js.providerKey(signer) }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
const chainId = await (signer == null ? void 0 : signer.getChainId());
return chainId;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
const blockNumber = useBlockNumberContext();
useEthersUpdater(refetch, blockNumber, options);
return [data, refetch, status];
};
var queryKey12 = { namespace: chunkSYGGHKPN_js.keyNamespace.signer, key: "useTimestamp" };
var useTimestamp = (options = chunkMLDFKDMQ_js.mergeDefaultUpdateOptions(), override = chunkMLDFKDMQ_js.mergeDefaultOverride()) => {
const blockNumber = useBlockNumberContext();
const ethersContext = useEthersAppContext(override.alternateContextKey);
const { provider } = chunkMLDFKDMQ_js.ethersOverride(ethersContext, override);
const keys = [{ ...queryKey12, ...chunkMLDFKDMQ_js.providerKey(provider) }];
const { data, refetch, status } = reactQuery.useQuery(
keys,
async (_keys) => {
const blockNumber2 = await (provider == null ? void 0 : provider.getBlockNumber());
if (blockNumber2 != null) {
const block = await (provider == null ? void 0 : provider.getBlock(blockNumber2));
if ((block == null ? void 0 : block.timestamp) != null) {
return block.timestamp;
}
}
return 0;
},
{
...chunkMLDFKDMQ_js.processQueryOptions(options)
}
);
useEthersUpdater(refetch, blockNumber, options);
return [data ?? 0, refetch, status];
};
var useCheckIsMounted = () => {
const data = usehooksTs.useIsMounted();
if (data()) {
console.log("is mounted");
} else {
console.log("not mounted");
}
};
// src/context/ethers-app/useBlockNumberContext.tsx
var useBlockNumberContext = (chainId, override) => {
const ethersContext = useEthersAppContext(override == null ? void 0 : override.alternateContextKey);
const blockNumberState = useEthersAppStore((state) => state.blockNumberState);
const setBlockNumber = useEthersAppStore((state) => state.setBlockNumber);
let result = void 0;
[result] = useBlockNumber(ethersContext.provider);
react.useEffect(() => {
if (ethersContext.chainId && result != null && result !== blockNumberState[ethersContext.chainId]) {
setBlockNumber(result, ethersContext.chainId);
}
}, [blockNumberState, ethersContext.chainId, result, setBlockNumber]);
if (chainId && chainId !== ethersContext.chainId) {
if (blockNumberState[chainId] == null)
tsInvariant.invariant.log(
"blockNumberState[chainId] in the store is null, make sure to have a provider for this chain",
chainId
);
result = blockNumberState[chainId] ?? 0;
}
return result;
};
// src/context/ethers-app/connectors/connectorErrors.ts
var connectorErrorText = {
NoStaticJsonRPCProviderFoundError: "Could not find a static json-rpc provider. Is it running?",
NoEthereumProviderFoundError: "No web3 provider found",
CouldNotActivateError: "Could not activate the web3 provider",
UserClosedModalError: "Did not log in, the user did not select a web3 provider"
};
var UserClosedModalError = class extends Error {
constructor() {
super();
this.name = this.constructor.name;
this.message = `EthersModalConnector: ${connectorErrorText.UserClosedModalError}.`;
}
};
var CouldNotActivateError = class extends Error {
constructor(error) {
super();
this.name = this.constructor.name;
this.message = `EthersModalConnector: ${connectorErrorText.CouldNotActivateError}. ${error ?? ""}`;
}
};
var NoEthereumProviderFoundError = class extends Error {
constructor() {
super();
this.name = this.constructor.name;
this.message = `EthersModalConnector: ${connectorErrorText.NoEthereumProviderFoundError}.`;
}
};
var NoStaticJsonRPCProviderFoundError = class extends Error {
constructor(error) {
super();
this.name = this.constructor.name;
this.message = `EthersModalConnector: ${connectorErrorText.NoStaticJsonRPCProviderFoundError}. ${error ?? ""}`;
}
};
var _a;
var Web3Modal = ((_a = cts__namespace.default) == null ? void 0 : _a.default) ?? cts__namespace.default;
// src/context/ethers-app/connectors/EthersModalConnector.ts
var _EthersModalConnector = class extends abstractConnector.AbstractConnector {
_options;
_providerBase;
_ethersProvider;
_web3Modal;
_id;
_debug = false;
_config;
_signer;
_theme;
get config() {
return this._config;
}
hasCachedProvider() {
var _a2;
return !!((_a2 = this._web3Modal) == null ? void 0 : _a2.cachedProvider);
}
constructor(web3modalOptions, config = { reloadOnNetworkChange: false, immutableProvider: false }, id, debug = false) {
super();
this._options = web3modalOptions;
this._id = id;
this._debug = debug;
this._config = config;
this._theme = web3modalOptions.theme ?? "light";
this.handleChainChanged = this.handleChainChanged.bind(this);
this.handleAccountsChanged = this.handleAccountsChanged.bind(this);
this.handleDisconnect = this.handleDisconnect.bind(this);
this.handleClose = this.handleClose.bind(this);
}
log(...args) {
if (this._debug) {
console.log("\u{1F50C} ", args);
}
}
maybeReload() {
if (window && this._config.reloadOnNetworkChange) {
window.location.reload();
}
}
setEthersProvider() {
if (this.isEthersProvider()) {
this._ethersProvider = this._providerBase;
} else {
this._ethersProvider = new providers.Web3Provider(this._providerBase, this._config.immutableProvider ? "any" : void 0);
}
}
handleChainChanged(chainId) {
var _a2;
this.log(`Handling chain changed to ${chainId}! updating providers`);
this._signer = void 0;
(_a2 = this.emitUpdate) == null ? void 0 : _a2.call(this, { chainId, provider: this._providerBase });
this.setEthersProvider();
void this.getSignerFromAccount();
this.maybeReload();
}
handleAccountsChanged(accounts) {
var _a2, _b;
this.log(`Handling accounts changed`, accounts);
if (accounts.length === 0) {
(_a2 = this.emitDeactivate) == null ? void 0 : _a2.call(this);
} else {
const newAccount = accounts[0];
void this.setSignerFromAccount(newAccount);
(_b = this.emitUpdate) == null ? void 0 : _b.call(this, { account: accounts[0] });
}
}
handleDisconnect(code, reason) {
this.log(`Handling disconnected event`, code, reason);
this.deactivate();
}
handleClose(code, reason) {
this.log("Handling 'close' event", code, reason);
this.deactivate();
}
loadWeb3Modal() {
if (!this._web3Modal) {
this._web3Modal = new Web3Modal({ ...this._options, theme: this._theme });
}
}
async activate() {
var _a2, _b, _c;
try {
this.loadWeb3Modal();
if (this._web3Modal) {
if (this._options.cacheProvider === false || !this.checkValidCachedProvider()) {
this.resetModal();
}
_EthersModalConnector.isModalOpening = true;
console.log("Open provider modal");
await this._web3Modal.updateTheme(this._theme);
if (this._id) {
this._providerBase = await this._web3Modal.connectTo(this._id);
} else {
this._providerBase = await this._web3Modal.connect();
}
this._providerBase.on("chainChanged", this.handleChainChanged);
this._providerBase.on("accountsChanged", this.handleAccountsChanged);
this._providerBase.on("disconnect", this.handleDisconnect);
this._providerBase.on("close", this.handleClose);
this.setEthersProvider();
}
const account = ((_a2 = this._providerBase) == null ? void 0 : _a2.selectedAddress) ?? await this.getAccount();
let chainId = ((_b = this._providerBase) == null ? void 0 : _b.networkVersion) ?? ethers.BigNumber.from(((_c = this._providerBase) == null ? void 0 : _c.chainId) ?? 0).toNumber();
if (chainId === 0) {
chainId = await this.getChainId();
}
this.setSignerFromAccount(account);
_EthersModalConnector.isModalOpening = false;
return { provider: this._providerBase, account, chainId };
} catch (error) {
this.resetModal();
if (typeof error === "string" && ((error == null ? void 0 : error.includes(chunkSYGGHKPN_js.const_web3DialogClosedByUser)) || (error == null ? void 0 : error.includes(chunkSYGGHKPN_js.const_web3DialogUserRejected)))) {
tsInvariant.invariant.log(error);
this.deactivate();
throw new UserClosedModalError();
} else if (error instanceof NoStaticJsonRPCProviderFoundError) {
tsInvariant.invariant.warn(`EthersModalConnector: ${connectorErrorText.NoStaticJsonRPCProviderFoundError}`);
throw error;
} else if (error instanceof NoEthereumProviderFoundError) {
tsInvariant.invariant.warn(`EthersModalConnector: ${connectorErrorText.NoEthereumProviderFoundError}`);
throw error;
} else {
tsInvariant.invariant.warn(`EthersModalConnector: ${connectorErrorText.CouldNotActivateError}`, error, this._providerBase);
throw new CouldNotActivateError(error);
}
}
}
isEthersProvider() {
return chunkMLDFKDMQ_js.isEthersProvider(this._providerBase);
}
deactivate() {
var _a2, _b, _c, _d, _e, _f, _g;
(_a2 = this.emitDeactivate) == null ? void 0 : _a2.call(this);
(_b = this._providerBase) == null ? void 0 : _b.removeListener("disconnect", this.handleDisconnect);
(_c = this._providerBase) == null ? void 0 : _c.removeListener("chainChanged", this.handleChainChanged);
(_d = this._providerBase) == null ? void 0 : _d.removeListener("accountsChanged", this.handleAccountsChanged);
(_e = this._providerBase) == null ? void 0 : _e.removeListener("close", this.handleClose);
const provider = this._providerBase;
(_f = provider == null ? void 0 : provider.disconnect) == null ? void 0 : _f.call(provider);
(_g = provider == null ? void 0 : provider.close) == null ? void 0 : _g.call(provider);
this.maybeReload();
}
getProvider() {
return Promise.resolve(this._ethersProvider);
}
async getChainId() {
var _a2, _b;
return Promise.resolve(((_b = (_a2 = this._ethersProvider) == null ? void 0 : _a2.network) == null ? void 0 : _b.chainId) ?? 0);
}
async setSignerFromAccount(account) {
var _a2, _b;
if (account && ethers.utils.isAddress(account) && await ((_a2 = this._signer) == null ? void 0 : _a2.getAddress()) !== account) {
this._signer = (_b = this._ethersProvider) == null ? void 0 : _b.getSigner(account);
}
}
async getAccount() {
var _a2;
if (this._signer) {
const account2 = await this._signer.getAddress();
if (ethers.utils.isAddress(account2))
return account2;
}
const accounts = await ((_a2 = this._ethersProvider) == null ? void 0 : _a2.listAccounts());
const account = (accounts == null ? void 0 : accounts[0]) ?? null;
await this.setSignerFromAccount(account);
return Promise.resolve((accounts == null ? void 0 : accounts[0]) ?? null);
}
getSigner() {
return this._signer;
}
async getSignerFromAccount() {
var _a2;
const account = await this.getAccount();
await this.setSignerFromAccount(account);
(_a2 = this.emitUpdate) == null ? void 0 : _a2.call(this, { account });
}
async changeSigner(signer) {
var _a2, _b;
const account = await signer.getAddress();
if (ethers.utils.isAddress(account) && this.validState()) {
this._signer = signer;
this.handleAccountsChanged([account]);
console.log(`changeSigner: provider chainId ${await this.getChainId()}`);
console.log(`new signer chainId ${((_b = await ((_a2 = signer.provider) == null ? void 0 : _a2.getNetwork())) == null ? void 0 : _b.chainId) ?? ""}`);
}
}
validState() {
return this._providerBase != null && this._ethersProvider != null && this._web3Modal != null;
}
resetModal() {
var _a2;
if (this._web3Modal) {
this._web3Modal.clearCachedProvider();
this._providerBase = void 0;
this._ethersProvider = void 0;
this._signer = void 0;
(_a2 = this.emitUpdate) == null ? void 0 : _a2.call(this, { account: void 0, provider: void 0, chainId: void 0 });
}
}
setModalTheme(theme) {
this._theme = theme;
}
checkValidCachedProvider() {
if (_EthersModalConnector.isModalOpening) {
return false;
}
const modal = this._web3Modal;
if (modal != null) {
if (!modal.getUserOptions().find((f) => f.id === modal.cachedProvider)) {
return false;
}
}
return true;
}
};
var EthersModalConnector = _EthersModalConnector;
chunk6CZGM7JT_js.__publicField(EthersModalConnector, "isModalOpening", false);
var defaultQueryClient = new reactQuery.QueryClient();
var useEthersAppContext = (contextKey) => {
if (contextKey === "primary")
console.warn("Do not explicitly use primary contextKey, pass in undefined instead");
const { connector, activate, library, account, deactivate, chainId, ...context } = core.useWeb3React(contextKey);
if (!(connector instanceof EthersModalConnector || connector instanceof abstractConnector.AbstractConnector) && connector != null) {
throw "Connector is not a EthersModalConnector";
}
const ethersConnector = connector;
const openModal = react.useCallback(
(ethersModalConnector, onError) => {
if (context.active) {
deactivate();
}
if (ethersModalConnector == null) {
tsInvariant.invariant.error("A valid ethersModalConnector was not provided");
}
if (ethersModalConnector != null) {
const onActivateError = (error) => {
var _a2;
try {
(_a2 = connector == null ? void 0 : connector.deactivate) == null ? void 0 : _a2.call(connector);
console.warn(error);
onError == null ? void 0 : onError(error);
} catch {
}
};
void activate(ethersModalConnector, onActivateError);
}
},
[context.active, deactivate, activate, connector]
);
const disconnectModal = react.useCallback(
(onSuccess) => {
ethersConnector.resetModal();
deactivate();
onSuccess == null ? void 0 : onSuccess();
},
[deactivate, ethersConnector]
);
const result = {
connector: ethersConnector,
provider: library,
activate,
deactivate,
library,
account: account ?? void 0,
signer: ethersConnector == null ? void 0 : ethersConnector.getSigner(),
chainId,
changeSigner: ethersConnector == null ? void 0 : ethersConnector.changeSigner.bind(ethersConnector),
openModal,
disconnectModal,
setModalTheme: ethersConnector == null ? void 0 : ethersConnector.setModalTheme.bind(ethersConnector),
...context
};
return result;
};
var useEthersContext = (contextKey) => {
return useEthersAppContext(contextKey);
};
var getEthersAppProviderLibrary = (provider, connector) => {
if (provider == null) {
throw new NoEthereumProviderFoundError();
}
let anyNetwork = void 0;
if (connector && connector instanceof EthersModalConnector) {
anyNetwork = connector.config.immutableProvider ? "any" : void 0;
}
if (chunkMLDFKDMQ_js.isEthersProvider(provider)) {
return provider;
} else {
return new providers.Web3Provider(provider, anyNetwork);
}
};
var EthersAppContext = (props) => {
if (prop