@avalabs/avacloud-waas-react 1.0.10 → 1.0.14-nightly.20250704

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/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
@@ -22,6 +32,7 @@ var index_exports = {};
22
32
  __export(index_exports, {
23
33
  AvaCloudWalletProvider: () => AvaCloudWalletProvider,
24
34
  ExportView: () => ExportView,
35
+ GaslessProvider: () => GaslessProvider,
25
36
  LoginButton: () => LoginButton,
26
37
  ReceiveView: () => ReceiveView,
27
38
  SendView: () => SendView,
@@ -32,9 +43,13 @@ __export(index_exports, {
32
43
  WalletButton: () => WalletButton,
33
44
  WalletCard: () => WalletCard,
34
45
  WalletDisplay: () => WalletDisplay,
46
+ avaCloudWallet: () => avaCloudWallet,
35
47
  useAuth: () => useAuth,
36
48
  useAvaCloudWallet: () => useAvaCloudWallet,
49
+ useBlockchain: () => useBlockchain,
37
50
  useChainId: () => useChainId,
51
+ useGaslessTransaction: () => useGaslessTransaction,
52
+ useGlacier: () => useGlacier,
38
53
  usePostMessage: () => usePostMessage,
39
54
  useSignMessage: () => useSignMessage,
40
55
  useSignTransaction: () => useSignTransaction,
@@ -1600,7 +1615,7 @@ var queryClient = new import_react_query2.QueryClient({
1600
1615
  }
1601
1616
  });
1602
1617
  function getCubistEnv(environment) {
1603
- return environment === "gamma" || environment === "development" ? import_cubesigner_sdk.envs.gamma : import_cubesigner_sdk.envs.prod;
1618
+ return environment === "production" ? import_cubesigner_sdk.envs.prod : import_cubesigner_sdk.envs.gamma;
1604
1619
  }
1605
1620
  function ViemProviderWrapper({ children, chainId }) {
1606
1621
  const { data: blockchain } = useBlockchain(chainId.toString());
@@ -1627,6 +1642,10 @@ function AvaCloudWalletProvider({
1627
1642
  onAuthError,
1628
1643
  onWalletUpdate
1629
1644
  }) {
1645
+ const { setChainId } = useChainId();
1646
+ (0, import_react9.useEffect)(() => {
1647
+ setChainId(chainId);
1648
+ }, [chainId, setChainId]);
1630
1649
  const authServiceUrl = env === "development" ? "http://localhost:3000" : env === "staging" ? "https://ac-auth-service-env-staging-ava-labs.vercel.app" : "https://ac-auth-service.vercel.app";
1631
1650
  const environment = env;
1632
1651
  const [isAuthenticated, setIsAuthenticated] = (0, import_react9.useState)(false);
@@ -1692,7 +1711,7 @@ function AvaCloudWalletProvider({
1692
1711
  }
1693
1712
  try {
1694
1713
  const resp = await import_cubesigner_sdk2.CubeSignerClient.createOidcSession(
1695
- getCubistEnv(environment),
1714
+ getCubistEnv(environment === "production" ? "prod" : "gamma"),
1696
1715
  orgConfig.walletProviderOrgID,
1697
1716
  accessToken,
1698
1717
  ["sign:*", "manage:*", "export:*"],
@@ -4524,10 +4543,451 @@ function useUserWallets() {
4524
4543
  isLoading
4525
4544
  };
4526
4545
  }
4546
+
4547
+ // src/wagmi/connector.ts
4548
+ var import_core = require("@wagmi/core");
4549
+ var import_viem5 = require("viem");
4550
+ function avaCloudWallet() {
4551
+ return (0, import_core.createConnector)((config) => ({
4552
+ id: "avaCloudWallet",
4553
+ name: "AvaCloud Wallet",
4554
+ type: "injected",
4555
+ async connect() {
4556
+ const { walletClient } = useViem();
4557
+ if (!walletClient) {
4558
+ throw new Error("AvaCloud Wallet not connected");
4559
+ }
4560
+ const accounts = await this.getAccounts();
4561
+ const chainId = await this.getChainId();
4562
+ config.emitter.emit("connect", { accounts, chainId });
4563
+ return { accounts, chainId };
4564
+ },
4565
+ async disconnect() {
4566
+ config.emitter.emit("disconnect");
4567
+ },
4568
+ async getAccounts() {
4569
+ const { walletClient } = useViem();
4570
+ if (!(walletClient == null ? void 0 : walletClient.account)) {
4571
+ throw new Error("AvaCloud Wallet not connected or account not found.");
4572
+ }
4573
+ return [walletClient.account.address];
4574
+ },
4575
+ async getChainId() {
4576
+ const { chainId } = useViem();
4577
+ return chainId;
4578
+ },
4579
+ async getProvider() {
4580
+ const { publicClient } = useViem();
4581
+ if (!publicClient) {
4582
+ throw new Error("Public client not found.");
4583
+ }
4584
+ return publicClient;
4585
+ },
4586
+ async isAuthorized() {
4587
+ const { walletClient } = useViem();
4588
+ return !!walletClient;
4589
+ },
4590
+ onAccountsChanged(accounts) {
4591
+ if (accounts.length === 0) {
4592
+ this.disconnect();
4593
+ } else {
4594
+ config.emitter.emit("change", {
4595
+ accounts: accounts.map((x) => (0, import_viem5.getAddress)(x))
4596
+ });
4597
+ }
4598
+ },
4599
+ onChainChanged(chain) {
4600
+ const chainId = Number(chain);
4601
+ config.emitter.emit("change", { chainId });
4602
+ },
4603
+ onDisconnect() {
4604
+ config.emitter.emit("disconnect");
4605
+ }
4606
+ }));
4607
+ }
4608
+
4609
+ // src/providers/GaslessProvider.tsx
4610
+ var import_react27 = require("react");
4611
+ var import_jsx_runtime24 = require("react/jsx-runtime");
4612
+ function validateGaslessConfig(config) {
4613
+ if (!config || typeof config !== "object") {
4614
+ return "Invalid gasless configuration: expected an object";
4615
+ }
4616
+ const requiredFields = [
4617
+ { field: "relayerUrl", description: "Relayer RPC URL" },
4618
+ { field: "subnetRpcUrl", description: "Subnet RPC URL" },
4619
+ { field: "forwarderAddress", description: "Forwarder contract address" },
4620
+ { field: "domainName", description: "EIP-712 domain name" },
4621
+ { field: "domainVersion", description: "EIP-712 domain version" },
4622
+ { field: "requestType", description: "Request type name" }
4623
+ ];
4624
+ const missingFields = requiredFields.filter(({ field }) => !config[field]);
4625
+ if (missingFields.length > 0) {
4626
+ const missing = missingFields.map(({ field, description }) => `${field} (${description})`).join(", ");
4627
+ return `Missing required gasless configuration fields: ${missing}`;
4628
+ }
4629
+ try {
4630
+ new URL(config.relayerUrl);
4631
+ } catch (e) {
4632
+ return `Invalid relayer URL format: ${config.relayerUrl}`;
4633
+ }
4634
+ try {
4635
+ new URL(config.subnetRpcUrl);
4636
+ } catch (e) {
4637
+ return `Invalid subnet RPC URL format: ${config.subnetRpcUrl}`;
4638
+ }
4639
+ if (!config.forwarderAddress.match(/^0x[a-fA-F0-9]{40}$/)) {
4640
+ return `Invalid forwarder address format: ${config.forwarderAddress}. Expected a valid Ethereum address.`;
4641
+ }
4642
+ return null;
4643
+ }
4644
+ var GaslessContext = (0, import_react27.createContext)(null);
4645
+ function GaslessProvider({ children, config, fetchParams }) {
4646
+ const [state, setState] = (0, import_react27.useState)({
4647
+ isLoading: false,
4648
+ error: null,
4649
+ config: null
4650
+ });
4651
+ const { authServiceUrl, environment } = useAvaCloudWallet();
4652
+ (0, import_react27.useEffect)(() => {
4653
+ if (config) {
4654
+ const validationError = validateGaslessConfig(config);
4655
+ if (validationError) {
4656
+ setState({
4657
+ isLoading: false,
4658
+ error: new Error(validationError),
4659
+ config: null
4660
+ });
4661
+ } else {
4662
+ setState({ isLoading: false, error: null, config });
4663
+ }
4664
+ return;
4665
+ }
4666
+ if (!fetchParams) {
4667
+ setState({
4668
+ isLoading: false,
4669
+ error: new Error(
4670
+ "GaslessProvider requires either a `config` prop or `fetchParams` prop. Please provide pre-fetched configuration or parameters to fetch it."
4671
+ ),
4672
+ config: null
4673
+ });
4674
+ return;
4675
+ }
4676
+ const { orgId, subnetId } = fetchParams;
4677
+ if (!orgId || !subnetId) {
4678
+ setState({
4679
+ isLoading: false,
4680
+ error: new Error(
4681
+ `Invalid fetchParams: both orgId and subnetId are required. Received: orgId="${orgId}", subnetId="${subnetId}"`
4682
+ ),
4683
+ config: null
4684
+ });
4685
+ return;
4686
+ }
4687
+ const fetchConfig = async () => {
4688
+ setState((prev) => ({ ...prev, isLoading: true, error: null }));
4689
+ try {
4690
+ const url = `${authServiceUrl}/api/gasless-config?orgId=${encodeURIComponent(
4691
+ orgId
4692
+ )}&subnetId=${encodeURIComponent(subnetId)}&environment=${environment}`;
4693
+ const resp = await fetch(url);
4694
+ if (!resp.ok) {
4695
+ let errorMessage = `Failed to fetch gasless configuration (HTTP ${resp.status})`;
4696
+ try {
4697
+ const errorData = await resp.json();
4698
+ if (errorData.error) {
4699
+ errorMessage = errorData.error;
4700
+ if (errorData.details) {
4701
+ errorMessage += `: ${errorData.details}`;
4702
+ }
4703
+ }
4704
+ } catch (e) {
4705
+ if (resp.status === 404) {
4706
+ errorMessage = "Gas relayer configuration not found. Please ensure the gas relayer is set up for your organization and subnet in AvaCloud.";
4707
+ } else if (resp.status === 400) {
4708
+ errorMessage = "Invalid request parameters. Please check your orgId and subnetId.";
4709
+ } else if (resp.status === 500) {
4710
+ errorMessage = "Server error while fetching gasless configuration. Please try again later or contact support.";
4711
+ }
4712
+ }
4713
+ throw new Error(errorMessage);
4714
+ }
4715
+ const cfg = await resp.json();
4716
+ const validationError = validateGaslessConfig(cfg);
4717
+ if (validationError) {
4718
+ throw new Error(
4719
+ `Invalid gasless configuration received from server: ${validationError}. This may indicate an issue with your AvaCloud gas relayer setup.`
4720
+ );
4721
+ }
4722
+ setState({ isLoading: false, error: null, config: cfg });
4723
+ } catch (err) {
4724
+ let error;
4725
+ if (err instanceof Error) {
4726
+ error = err;
4727
+ } else if (err && typeof err === "object" && "message" in err) {
4728
+ error = new Error(String(err.message));
4729
+ } else {
4730
+ error = new Error("An unexpected error occurred while fetching gasless configuration");
4731
+ }
4732
+ setState({ isLoading: false, error, config: null });
4733
+ }
4734
+ };
4735
+ fetchConfig();
4736
+ }, [config, fetchParams, authServiceUrl, environment]);
4737
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(GaslessContext.Provider, { value: state, children });
4738
+ }
4739
+
4740
+ // src/hooks/useGaslessTransaction.ts
4741
+ var import_react28 = require("react");
4742
+ var ethers = __toESM(require("ethers"));
4743
+ var import_axios = __toESM(require("axios"));
4744
+ var import_cubesigner_sdk6 = require("@cubist-labs/cubesigner-sdk");
4745
+ var FORWARDER_GET_NONCE_ABI = [
4746
+ {
4747
+ inputs: [
4748
+ {
4749
+ internalType: "address",
4750
+ name: "from",
4751
+ type: "address"
4752
+ }
4753
+ ],
4754
+ name: "getNonce",
4755
+ outputs: [
4756
+ {
4757
+ internalType: "uint256",
4758
+ name: "",
4759
+ type: "uint256"
4760
+ }
4761
+ ],
4762
+ stateMutability: "view",
4763
+ type: "function"
4764
+ }
4765
+ ];
4766
+ function useGaslessTransaction({ gaslessConfig, contractAddress: defaultContractAddress, abi: defaultAbi }) {
4767
+ const [state, setState] = (0, import_react28.useState)({
4768
+ isLoading: false,
4769
+ error: null,
4770
+ txHash: null
4771
+ });
4772
+ const config = gaslessConfig;
4773
+ const { wallet, cubistClient } = useAvaCloudWallet();
4774
+ useViem();
4775
+ const reset = (0, import_react28.useCallback)(() => {
4776
+ setState({
4777
+ isLoading: false,
4778
+ error: null,
4779
+ txHash: null
4780
+ });
4781
+ }, []);
4782
+ const validateConfig = (0, import_react28.useCallback)((config2) => {
4783
+ if (!config2) {
4784
+ return "Gasless configuration is not available. Please ensure GaslessProvider is properly configured.";
4785
+ }
4786
+ const requiredFields = [
4787
+ { field: "relayerUrl", description: "Relayer RPC URL" },
4788
+ { field: "subnetRpcUrl", description: "Subnet RPC URL" },
4789
+ { field: "forwarderAddress", description: "Forwarder contract address" },
4790
+ { field: "domainName", description: "EIP-712 domain name" },
4791
+ { field: "domainVersion", description: "EIP-712 domain version" }
4792
+ ];
4793
+ if (!config2.requestType) {
4794
+ config2.requestType = "Message";
4795
+ }
4796
+ for (const { field, description } of requiredFields) {
4797
+ if (!config2[field]) {
4798
+ return `Missing required gasless configuration field: ${field} (${description}). Please check your AvaCloud gas relayer setup.`;
4799
+ }
4800
+ }
4801
+ try {
4802
+ new URL(config2.relayerUrl);
4803
+ } catch (e) {
4804
+ return `Invalid relayer URL: ${config2.relayerUrl}. Expected a valid HTTP/HTTPS URL.`;
4805
+ }
4806
+ try {
4807
+ new URL(config2.subnetRpcUrl);
4808
+ } catch (e) {
4809
+ return `Invalid subnet RPC URL: ${config2.subnetRpcUrl}. Expected a valid HTTP/HTTPS URL.`;
4810
+ }
4811
+ if (!config2.forwarderAddress.match(/^0x[a-fA-F0-9]{40}$/)) {
4812
+ return `Invalid forwarder address: ${config2.forwarderAddress}. Expected a valid Ethereum address.`;
4813
+ }
4814
+ return null;
4815
+ }, []);
4816
+ const sendGaslessTransaction = (0, import_react28.useCallback)(async ({
4817
+ functionName,
4818
+ args = [],
4819
+ abi: overrideAbi,
4820
+ contractAddress: overrideContractAddress
4821
+ }) => {
4822
+ const contractAddress = overrideContractAddress != null ? overrideContractAddress : defaultContractAddress;
4823
+ const abi = overrideAbi != null ? overrideAbi : defaultAbi;
4824
+ if (!contractAddress || !abi) {
4825
+ setState((prev) => ({ ...prev, error: "Contract address and ABI are required. Please provide them either when initializing the hook or when calling sendGaslessTransaction." }));
4826
+ return;
4827
+ }
4828
+ const configError = validateConfig(config);
4829
+ if (configError) {
4830
+ setState((prev) => ({ ...prev, error: configError }));
4831
+ return;
4832
+ }
4833
+ if (!config) {
4834
+ setState((prev) => ({
4835
+ ...prev,
4836
+ error: "Gasless configuration is not available. Please ensure you pass a valid config object when initializing useGaslessTransaction."
4837
+ }));
4838
+ return;
4839
+ }
4840
+ if (!(wallet == null ? void 0 : wallet.address)) {
4841
+ setState((prev) => ({ ...prev, error: "Wallet not connected. Please connect your wallet before sending transactions." }));
4842
+ return;
4843
+ }
4844
+ if (!cubistClient) {
4845
+ setState((prev) => ({ ...prev, error: "Authentication client not initialized. Please ensure you are properly authenticated." }));
4846
+ return;
4847
+ }
4848
+ if (!contractAddress.match(/^0x[a-fA-F0-9]{40}$/)) {
4849
+ setState((prev) => ({ ...prev, error: `Invalid contract address: ${contractAddress}. Expected a valid Ethereum address.` }));
4850
+ return;
4851
+ }
4852
+ setState((prev) => ({ ...prev, isLoading: true, error: null }));
4853
+ try {
4854
+ const provider = new ethers.providers.JsonRpcProvider(config.subnetRpcUrl);
4855
+ const forwarder = new ethers.Contract(config.forwarderAddress, FORWARDER_GET_NONCE_ABI, provider);
4856
+ const targetContract = new ethers.Contract(contractAddress, abi, provider);
4857
+ const gas = await targetContract.estimateGas[functionName](...args);
4858
+ const forwarderNonce = await forwarder.getNonce(wallet.address);
4859
+ const data = targetContract.interface.encodeFunctionData(functionName, args);
4860
+ const types = {
4861
+ EIP712Domain: [
4862
+ { name: "name", type: "string" },
4863
+ { name: "version", type: "string" },
4864
+ { name: "chainId", type: "uint256" },
4865
+ { name: "verifyingContract", type: "address" }
4866
+ ],
4867
+ [config.requestType]: [
4868
+ { name: "from", type: "address" },
4869
+ { name: "to", type: "address" },
4870
+ { name: "value", type: "uint256" },
4871
+ { name: "gas", type: "uint256" },
4872
+ { name: "nonce", type: "uint256" },
4873
+ { name: "data", type: "bytes" },
4874
+ { name: "validUntilTime", type: "uint256" }
4875
+ ]
4876
+ };
4877
+ if (config.suffix) {
4878
+ const suffixParts = config.suffix.match(/^(\w+)\s+(.+)\)$/);
4879
+ if (suffixParts) {
4880
+ const [, suffixType, suffixName] = suffixParts;
4881
+ types[config.requestType].push({
4882
+ name: suffixName,
4883
+ type: suffixType
4884
+ });
4885
+ }
4886
+ }
4887
+ const nonceHex = forwarderNonce.toHexString();
4888
+ const message = {
4889
+ from: wallet.address,
4890
+ to: contractAddress,
4891
+ value: "0x0",
4892
+ gas: gas.toHexString(),
4893
+ nonce: nonceHex,
4894
+ data,
4895
+ validUntilTime: "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
4896
+ };
4897
+ if (config.suffix) {
4898
+ const suffixParts = config.suffix.match(/^(\w+)\s+(.+)\)$/);
4899
+ if (suffixParts) {
4900
+ const [, , suffixName] = suffixParts;
4901
+ message[suffixName] = Buffer.from(config.suffix, "utf8");
4902
+ }
4903
+ }
4904
+ const domain = {
4905
+ name: config.domainName,
4906
+ version: config.domainVersion,
4907
+ chainId: (await provider.getNetwork()).chainId,
4908
+ verifyingContract: config.forwarderAddress
4909
+ };
4910
+ const digest = ethers.utils._TypedDataEncoder.hash(domain, {
4911
+ [config.requestType]: types[config.requestType]
4912
+ }, message);
4913
+ const key = await cubistClient.org().getKeyByMaterialId(import_cubesigner_sdk6.Secp256k1.Evm, wallet.address);
4914
+ const sigResp = await key.signBlob({
4915
+ message_base64: Buffer.from(digest.slice(2), "hex").toString("base64")
4916
+ });
4917
+ const signatureData = sigResp.data().signature;
4918
+ const signature = signatureData.startsWith("0x") ? signatureData : `0x${signatureData}`;
4919
+ const typedRequest = {
4920
+ domain,
4921
+ types: {
4922
+ [config.requestType]: types[config.requestType]
4923
+ },
4924
+ primaryType: config.requestType,
4925
+ message
4926
+ };
4927
+ const txPayload = {
4928
+ forwardRequest: typedRequest,
4929
+ metadata: {
4930
+ signature: signature.substring(2)
4931
+ // strip 0x
4932
+ }
4933
+ };
4934
+ const rawTx = "0x" + Buffer.from(JSON.stringify(txPayload), "utf8").toString("hex");
4935
+ const requestBody = {
4936
+ id: 1,
4937
+ jsonrpc: "2.0",
4938
+ method: "eth_sendRawTransaction",
4939
+ params: [rawTx]
4940
+ };
4941
+ const resp = await import_axios.default.post(config.relayerUrl, requestBody, {
4942
+ headers: {
4943
+ "Content-Type": "application/json"
4944
+ }
4945
+ });
4946
+ const txHash = resp.data.result;
4947
+ setState((prev) => ({ ...prev, txHash }));
4948
+ await provider.waitForTransaction(txHash);
4949
+ } catch (err) {
4950
+ let errorMessage = "Failed to send gasless transaction";
4951
+ if (err instanceof Error) {
4952
+ if (err.message.includes("estimateGas")) {
4953
+ errorMessage = `Failed to estimate gas for function "${functionName}". Please verify the function exists and parameters are correct.`;
4954
+ } else if (err.message.includes("getNonce")) {
4955
+ errorMessage = "Failed to fetch nonce from forwarder contract. Please verify the forwarder address is correct and deployed.";
4956
+ } else if (err.message.includes("getKeyByMaterialId")) {
4957
+ errorMessage = "Failed to retrieve signing key. Please ensure your wallet is properly initialized.";
4958
+ } else if (err.message.includes("signBlob")) {
4959
+ errorMessage = "Failed to sign transaction. Please check your authentication status.";
4960
+ } else if (err.message.includes("Network Error") || err.message.includes("ECONNREFUSED")) {
4961
+ errorMessage = "Network error: Unable to connect to relayer service. Please check your internet connection and relayer URL.";
4962
+ } else if (err.message.includes("404")) {
4963
+ errorMessage = "Relayer endpoint not found. Please verify the relayer URL is correct.";
4964
+ } else if (err.message.includes("500") || err.message.includes("502") || err.message.includes("503")) {
4965
+ errorMessage = "Relayer service error. The gas relayer service may be temporarily unavailable.";
4966
+ } else if (err.message.includes("insufficient funds")) {
4967
+ errorMessage = "The relayer has insufficient funds to sponsor this transaction. Please contact support.";
4968
+ } else {
4969
+ errorMessage = `Transaction failed: ${err.message}`;
4970
+ }
4971
+ }
4972
+ setState((prev) => ({
4973
+ ...prev,
4974
+ error: errorMessage
4975
+ }));
4976
+ } finally {
4977
+ setState((prev) => ({ ...prev, isLoading: false }));
4978
+ }
4979
+ }, [config, wallet == null ? void 0 : wallet.address, cubistClient, validateConfig, defaultAbi, defaultContractAddress]);
4980
+ return {
4981
+ ...state,
4982
+ sendGaslessTransaction,
4983
+ reset
4984
+ };
4985
+ }
4527
4986
  // Annotate the CommonJS export names for ESM import in node:
4528
4987
  0 && (module.exports = {
4529
4988
  AvaCloudWalletProvider,
4530
4989
  ExportView,
4990
+ GaslessProvider,
4531
4991
  LoginButton,
4532
4992
  ReceiveView,
4533
4993
  SendView,
@@ -4538,9 +4998,13 @@ function useUserWallets() {
4538
4998
  WalletButton,
4539
4999
  WalletCard,
4540
5000
  WalletDisplay,
5001
+ avaCloudWallet,
4541
5002
  useAuth,
4542
5003
  useAvaCloudWallet,
5004
+ useBlockchain,
4543
5005
  useChainId,
5006
+ useGaslessTransaction,
5007
+ useGlacier,
4544
5008
  usePostMessage,
4545
5009
  useSignMessage,
4546
5010
  useSignTransaction,