@b3dotfun/sdk 0.0.8-alpha.0 → 0.0.8-alpha.1

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.
Files changed (91) hide show
  1. package/dist/cjs/anyspend/abis/bondKit.d.ts +35 -0
  2. package/dist/cjs/anyspend/abis/bondKit.js +29 -0
  3. package/dist/cjs/anyspend/index.d.ts +3 -3
  4. package/dist/cjs/anyspend/index.js +3 -3
  5. package/dist/cjs/anyspend/index.native.d.ts +2 -2
  6. package/dist/cjs/anyspend/index.native.js +2 -2
  7. package/dist/cjs/anyspend/react/components/AnySpendBondKit.d.ts +2 -0
  8. package/dist/cjs/anyspend/react/components/AnySpendBondKit.js +184 -0
  9. package/dist/cjs/anyspend/react/components/AnySpendBuySpin.js +0 -4
  10. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +1 -1
  11. package/dist/cjs/anyspend/react/components/AnyspendSignatureMint.d.ts +1 -1
  12. package/dist/cjs/anyspend/react/components/AnyspendSignatureMint.js +8 -4
  13. package/dist/cjs/anyspend/react/components/{AnySpendNFTButton.d.ts → common/AnySpendNFTButton.d.ts} +1 -1
  14. package/dist/cjs/anyspend/react/components/{AnySpendNFTButton.js → common/AnySpendNFTButton.js} +2 -2
  15. package/dist/cjs/anyspend/react/components/index.d.ts +2 -1
  16. package/dist/cjs/anyspend/react/components/index.js +5 -3
  17. package/dist/cjs/anyspend/react/hooks/useSigMint.d.ts +1 -1
  18. package/dist/cjs/anyspend/types/bondKit.d.ts +12 -0
  19. package/dist/cjs/anyspend/types/signatureMint.js +2 -0
  20. package/dist/cjs/global-account/react/components/B3DynamicModal.js +4 -0
  21. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +24 -2
  22. package/dist/esm/anyspend/abis/bondKit.d.ts +35 -0
  23. package/dist/esm/anyspend/abis/bondKit.js +26 -0
  24. package/dist/esm/anyspend/index.d.ts +3 -3
  25. package/dist/esm/anyspend/index.js +3 -3
  26. package/dist/esm/anyspend/index.native.d.ts +2 -2
  27. package/dist/esm/anyspend/index.native.js +2 -2
  28. package/dist/esm/anyspend/react/components/AnySpendBondKit.d.ts +2 -0
  29. package/dist/esm/anyspend/react/components/AnySpendBondKit.js +181 -0
  30. package/dist/esm/anyspend/react/components/AnySpendBuySpin.js +0 -4
  31. package/dist/esm/anyspend/react/components/AnySpendCustom.js +1 -1
  32. package/dist/esm/anyspend/react/components/AnyspendSignatureMint.d.ts +1 -1
  33. package/dist/esm/anyspend/react/components/AnyspendSignatureMint.js +7 -3
  34. package/dist/esm/anyspend/react/components/{AnySpendNFTButton.d.ts → common/AnySpendNFTButton.d.ts} +1 -1
  35. package/dist/esm/anyspend/react/components/{AnySpendNFTButton.js → common/AnySpendNFTButton.js} +2 -2
  36. package/dist/esm/anyspend/react/components/index.d.ts +2 -1
  37. package/dist/esm/anyspend/react/components/index.js +2 -1
  38. package/dist/esm/anyspend/react/hooks/useSigMint.d.ts +1 -1
  39. package/dist/esm/anyspend/types/bondKit.d.ts +12 -0
  40. package/dist/esm/anyspend/types/signatureMint.js +1 -0
  41. package/dist/esm/global-account/react/components/B3DynamicModal.js +5 -1
  42. package/dist/esm/global-account/react/stores/useModalStore.d.ts +24 -2
  43. package/dist/styles/index.css +1 -1
  44. package/dist/types/anyspend/abis/bondKit.d.ts +35 -0
  45. package/dist/types/anyspend/index.d.ts +3 -3
  46. package/dist/types/anyspend/index.native.d.ts +2 -2
  47. package/dist/types/anyspend/react/components/AnySpendBondKit.d.ts +2 -0
  48. package/dist/types/anyspend/react/components/AnyspendSignatureMint.d.ts +1 -1
  49. package/dist/types/anyspend/react/components/index.d.ts +2 -1
  50. package/dist/types/anyspend/react/hooks/useSigMint.d.ts +1 -1
  51. package/dist/types/anyspend/types/bondKit.d.ts +12 -0
  52. package/dist/types/global-account/react/stores/useModalStore.d.ts +24 -2
  53. package/package.json +2 -1
  54. package/src/anyspend/abis/bondKit.ts +26 -0
  55. package/src/anyspend/index.native.ts +2 -2
  56. package/src/anyspend/index.ts +3 -3
  57. package/src/anyspend/react/components/AnySpendBondKit.tsx +351 -0
  58. package/src/anyspend/react/components/AnySpendBuySpin.tsx +0 -5
  59. package/src/anyspend/react/components/AnySpendCustom.tsx +3 -1
  60. package/src/anyspend/react/components/AnyspendSignatureMint.tsx +19 -7
  61. package/src/anyspend/react/components/index.ts +2 -1
  62. package/src/anyspend/react/hooks/useSigMint.tsx +1 -1
  63. package/src/anyspend/types/bondKit.ts +12 -0
  64. package/src/global-account/react/components/B3DynamicModal.tsx +6 -1
  65. package/src/global-account/react/stores/useModalStore.ts +26 -2
  66. /package/dist/cjs/anyspend/abis/{abi-usdc-base.d.ts → abiUsdcBase.d.ts} +0 -0
  67. /package/dist/cjs/anyspend/abis/{abi-usdc-base.js → abiUsdcBase.js} +0 -0
  68. /package/dist/cjs/anyspend/abis/{erc20-staking.d.ts → erc20Staking.d.ts} +0 -0
  69. /package/dist/cjs/anyspend/abis/{erc20-staking.js → erc20Staking.js} +0 -0
  70. /package/dist/cjs/anyspend/abis/{signature-minting.d.ts → signatureMinting.d.ts} +0 -0
  71. /package/dist/cjs/anyspend/abis/{signature-minting.js → signatureMinting.js} +0 -0
  72. /package/dist/cjs/anyspend/types/{signature-mint.js → bondKit.js} +0 -0
  73. /package/dist/cjs/anyspend/types/{signature-mint.d.ts → signatureMint.d.ts} +0 -0
  74. /package/dist/esm/anyspend/abis/{abi-usdc-base.d.ts → abiUsdcBase.d.ts} +0 -0
  75. /package/dist/esm/anyspend/abis/{abi-usdc-base.js → abiUsdcBase.js} +0 -0
  76. /package/dist/esm/anyspend/abis/{erc20-staking.d.ts → erc20Staking.d.ts} +0 -0
  77. /package/dist/esm/anyspend/abis/{erc20-staking.js → erc20Staking.js} +0 -0
  78. /package/dist/esm/anyspend/abis/{signature-minting.d.ts → signatureMinting.d.ts} +0 -0
  79. /package/dist/esm/anyspend/abis/{signature-minting.js → signatureMinting.js} +0 -0
  80. /package/dist/esm/anyspend/types/{signature-mint.js → bondKit.js} +0 -0
  81. /package/dist/esm/anyspend/types/{signature-mint.d.ts → signatureMint.d.ts} +0 -0
  82. /package/dist/types/anyspend/abis/{abi-usdc-base.d.ts → abiUsdcBase.d.ts} +0 -0
  83. /package/dist/types/anyspend/abis/{erc20-staking.d.ts → erc20Staking.d.ts} +0 -0
  84. /package/dist/types/anyspend/abis/{signature-minting.d.ts → signatureMinting.d.ts} +0 -0
  85. /package/dist/types/anyspend/react/components/{AnySpendNFTButton.d.ts → common/AnySpendNFTButton.d.ts} +0 -0
  86. /package/dist/types/anyspend/types/{signature-mint.d.ts → signatureMint.d.ts} +0 -0
  87. /package/src/anyspend/abis/{abi-usdc-base.ts → abiUsdcBase.ts} +0 -0
  88. /package/src/anyspend/abis/{erc20-staking.ts → erc20Staking.ts} +0 -0
  89. /package/src/anyspend/abis/{signature-minting.ts → signatureMinting.ts} +0 -0
  90. /package/src/anyspend/react/components/{AnySpendNFTButton.tsx → common/AnySpendNFTButton.tsx} +0 -0
  91. /package/src/anyspend/types/{signature-mint.ts → signatureMint.ts} +0 -0
@@ -0,0 +1,35 @@
1
+ export declare const ABI_bondKit: readonly [{
2
+ readonly inputs: readonly [{
3
+ readonly internalType: "address";
4
+ readonly name: "_recipient";
5
+ readonly type: "address";
6
+ }, {
7
+ readonly internalType: "uint256";
8
+ readonly name: "_minTokensOut";
9
+ readonly type: "uint256";
10
+ }];
11
+ readonly name: "buyFor";
12
+ readonly outputs: readonly [];
13
+ readonly stateMutability: "payable";
14
+ readonly type: "function";
15
+ }, {
16
+ readonly inputs: readonly [];
17
+ readonly name: "name";
18
+ readonly outputs: readonly [{
19
+ readonly internalType: "string";
20
+ readonly name: "";
21
+ readonly type: "string";
22
+ }];
23
+ readonly stateMutability: "view";
24
+ readonly type: "function";
25
+ }, {
26
+ readonly inputs: readonly [];
27
+ readonly name: "symbol";
28
+ readonly outputs: readonly [{
29
+ readonly internalType: "string";
30
+ readonly name: "";
31
+ readonly type: "string";
32
+ }];
33
+ readonly stateMutability: "view";
34
+ readonly type: "function";
35
+ }];
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ABI_bondKit = void 0;
4
+ exports.ABI_bondKit = [
5
+ {
6
+ inputs: [
7
+ { internalType: "address", name: "_recipient", type: "address" },
8
+ { internalType: "uint256", name: "_minTokensOut", type: "uint256" },
9
+ ],
10
+ name: "buyFor",
11
+ outputs: [],
12
+ stateMutability: "payable",
13
+ type: "function",
14
+ },
15
+ {
16
+ inputs: [],
17
+ name: "name",
18
+ outputs: [{ internalType: "string", name: "", type: "string" }],
19
+ stateMutability: "view",
20
+ type: "function",
21
+ },
22
+ {
23
+ inputs: [],
24
+ name: "symbol",
25
+ outputs: [{ internalType: "string", name: "", type: "string" }],
26
+ stateMutability: "view",
27
+ type: "function",
28
+ },
29
+ ];
@@ -1,7 +1,7 @@
1
1
  export * from "./types";
2
2
  export * from "./types/metadata";
3
3
  export * from "./types/relay";
4
- export * from "./types/signature-mint";
4
+ export * from "./types/signatureMint";
5
5
  export * from "./types/token";
6
6
  export * from "./utils/address";
7
7
  export * from "./utils/chain";
@@ -11,5 +11,5 @@ export * from "./utils/number";
11
11
  export * from "./utils/string";
12
12
  export * from "./utils/token";
13
13
  export * from "./constants";
14
- export * from "./abis/abi-usdc-base";
15
- export * from "./abis/erc20-staking";
14
+ export * from "./abis/abiUsdcBase";
15
+ export * from "./abis/erc20Staking";
@@ -18,7 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  __exportStar(require("./types"), exports);
19
19
  __exportStar(require("./types/metadata"), exports);
20
20
  __exportStar(require("./types/relay"), exports);
21
- __exportStar(require("./types/signature-mint"), exports);
21
+ __exportStar(require("./types/signatureMint"), exports);
22
22
  __exportStar(require("./types/token"), exports);
23
23
  // Utils
24
24
  __exportStar(require("./utils/address"), exports);
@@ -31,5 +31,5 @@ __exportStar(require("./utils/token"), exports);
31
31
  // Constants
32
32
  __exportStar(require("./constants"), exports);
33
33
  // Abis
34
- __exportStar(require("./abis/abi-usdc-base"), exports);
35
- __exportStar(require("./abis/erc20-staking"), exports);
34
+ __exportStar(require("./abis/abiUsdcBase"), exports);
35
+ __exportStar(require("./abis/erc20Staking"), exports);
@@ -9,5 +9,5 @@ export * from "./utils/number";
9
9
  export * from "./utils/string";
10
10
  export * from "./utils/token";
11
11
  export * from "./constants";
12
- export * from "./abis/abi-usdc-base";
13
- export * from "./abis/erc20-staking";
12
+ export * from "./abis/abiUsdcBase";
13
+ export * from "./abis/erc20Staking";
@@ -31,5 +31,5 @@ __exportStar(require("./utils/token"), exports);
31
31
  // Constants
32
32
  __exportStar(require("./constants"), exports);
33
33
  // Abis
34
- __exportStar(require("./abis/abi-usdc-base"), exports);
35
- __exportStar(require("./abis/erc20-staking"), exports);
34
+ __exportStar(require("./abis/abiUsdcBase"), exports);
35
+ __exportStar(require("./abis/erc20Staking"), exports);
@@ -0,0 +1,2 @@
1
+ import { AnySpendBondKitProps } from "../../../global-account/react/stores/useModalStore";
2
+ export declare function AnySpendBondKit({ mode, recipientAddress, contractAddress, minTokensOut, imageUrl, onSuccess, }: AnySpendBondKitProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnySpendBondKit = AnySpendBondKit;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const bondkit_1 = require("@b3dotfun/bondkit");
6
+ const anyspend_1 = require("../../../anyspend");
7
+ const react_1 = require("../../../global-account/react");
8
+ const supported_1 = require("../../../shared/constants/chains/supported");
9
+ const framer_motion_1 = require("framer-motion");
10
+ const react_2 = require("react");
11
+ const viem_1 = require("viem");
12
+ const bondKit_1 = require("../../abis/bondKit");
13
+ const AnySpendCustom_1 = require("./AnySpendCustom");
14
+ // Debounce utility function
15
+ function debounce(func, wait) {
16
+ let timeout;
17
+ return (...args) => {
18
+ clearTimeout(timeout);
19
+ timeout = setTimeout(() => func(...args), wait);
20
+ };
21
+ }
22
+ // Format number with commas
23
+ function formatNumberWithCommas(x) {
24
+ const parts = x.split(".");
25
+ parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
26
+ return parts.join(".");
27
+ }
28
+ function AnySpendBondKit({ mode = "modal", recipientAddress, contractAddress, minTokensOut = "0", imageUrl, onSuccess, }) {
29
+ const hasMounted = (0, react_1.useHasMounted)();
30
+ const [showAmountPrompt, setShowAmountPrompt] = (0, react_2.useState)(true);
31
+ const [ethAmount, setEthAmount] = (0, react_2.useState)("");
32
+ const [isAmountValid, setIsAmountValid] = (0, react_2.useState)(false);
33
+ const [validationError, setValidationError] = (0, react_2.useState)("");
34
+ const [tokenName, setTokenName] = (0, react_2.useState)("");
35
+ const [tokenSymbol, setTokenSymbol] = (0, react_2.useState)("");
36
+ const [quote, setQuote] = (0, react_2.useState)(null);
37
+ const [isLoadingQuote, setIsLoadingQuote] = (0, react_2.useState)(false);
38
+ // Create BondKit client
39
+ const bondkitTokenClient = (0, react_2.useMemo)(() => {
40
+ if (!contractAddress)
41
+ return null;
42
+ try {
43
+ const client = new bondkit_1.BondkitToken(contractAddress);
44
+ client.connect();
45
+ return client;
46
+ }
47
+ catch (error) {
48
+ console.error("Error creating bondkit client", error);
49
+ return null;
50
+ }
51
+ }, [contractAddress]);
52
+ // Create a public client for reading contract data
53
+ const basePublicClient = (0, viem_1.createPublicClient)({
54
+ chain: supported_1.baseMainnet,
55
+ transport: (0, viem_1.http)(),
56
+ });
57
+ // Fetch token name from contract
58
+ (0, react_2.useEffect)(() => {
59
+ async function fetchTokenName() {
60
+ try {
61
+ const [name, symbol] = await Promise.all([
62
+ basePublicClient.readContract({
63
+ address: contractAddress,
64
+ abi: bondKit_1.ABI_bondKit,
65
+ functionName: "name",
66
+ }),
67
+ basePublicClient.readContract({
68
+ address: contractAddress,
69
+ abi: bondKit_1.ABI_bondKit,
70
+ functionName: "symbol",
71
+ }),
72
+ ]);
73
+ setTokenName(name);
74
+ setTokenSymbol(symbol);
75
+ }
76
+ catch (error) {
77
+ console.error("Error fetching token name:", error);
78
+ setTokenName("BondKit Token");
79
+ setTokenSymbol("BOND");
80
+ }
81
+ }
82
+ if (contractAddress) {
83
+ fetchTokenName();
84
+ }
85
+ }, [contractAddress, basePublicClient]);
86
+ // Get native token data for the chain
87
+ const { data: tokenData, isError: isTokenError, isLoading, } = (0, react_1.useTokenData)(supported_1.baseMainnet.id, "0x0000000000000000000000000000000000000000");
88
+ // Convert token data to AnySpend Token type
89
+ const dstToken = (0, react_2.useMemo)(() => {
90
+ if (!tokenData)
91
+ return null;
92
+ return {
93
+ address: tokenData.address,
94
+ chainId: supported_1.baseMainnet.id,
95
+ name: tokenData.name,
96
+ symbol: tokenData.symbol,
97
+ decimals: tokenData.decimals,
98
+ metadata: {
99
+ logoURI: tokenData.logoURI,
100
+ },
101
+ };
102
+ }, [tokenData]);
103
+ // Debounced quote fetching
104
+ const debouncedGetQuote = (0, react_2.useMemo)(() => debounce(async (val) => {
105
+ if (!val || Number(val) <= 0 || !bondkitTokenClient) {
106
+ setQuote(null);
107
+ return;
108
+ }
109
+ try {
110
+ setIsLoadingQuote(true);
111
+ const parsedAmount = (0, viem_1.parseEther)(val);
112
+ const buyQuote = await bondkitTokenClient.getAmountOfTokensToBuy(parsedAmount);
113
+ setQuote(buyQuote ? (0, viem_1.formatEther)(buyQuote) : null);
114
+ }
115
+ catch (error) {
116
+ console.error("Error getting buy quote:", error);
117
+ setQuote(null);
118
+ }
119
+ finally {
120
+ setIsLoadingQuote(false);
121
+ }
122
+ }, 500), [bondkitTokenClient]);
123
+ const validateAndSetAmount = (value) => {
124
+ // Allow empty input
125
+ if (value === "") {
126
+ setEthAmount("");
127
+ setIsAmountValid(false);
128
+ setValidationError("");
129
+ setQuote(null);
130
+ return;
131
+ }
132
+ // Only allow numbers and one decimal point
133
+ if (!/^\d*\.?\d*$/.test(value)) {
134
+ return;
135
+ }
136
+ // Prevent multiple decimal points
137
+ if ((value.match(/\./g) || []).length > 1) {
138
+ return;
139
+ }
140
+ // Prevent more than 18 decimal places (ETH precision)
141
+ const parts = value.split(".");
142
+ if (parts[1] && parts[1].length > 18) {
143
+ return;
144
+ }
145
+ setEthAmount(value);
146
+ };
147
+ const header = () => ((0, jsx_runtime_1.jsx)("div", { className: "w-full px-6 py-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex w-full flex-col items-center space-y-6", children: [(0, jsx_runtime_1.jsxs)("h2", { className: "text-[28px] font-bold", children: [tokenName, " (", tokenSymbol, ")"] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex w-full flex-col items-center space-y-2", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-[28px] font-bold", children: [ethAmount, " ETH"] }), quote && ((0, jsx_runtime_1.jsxs)("span", { className: "text-lg", children: ["\u2248 ", formatNumberWithCommas(parseFloat(quote).toFixed(4)), " ", tokenSymbol] }))] })] }) }));
148
+ // Show loading state while fetching token data
149
+ if (isLoading) {
150
+ return ((0, jsx_runtime_1.jsx)(react_1.StyleRoot, { children: (0, jsx_runtime_1.jsx)("div", { className: "b3-root b3-modal bg-b3-react-background flex w-full flex-col items-center p-8", children: (0, jsx_runtime_1.jsx)("p", { className: "text-as-primary/70 text-center text-sm", children: "Loading payment information..." }) }) }));
151
+ }
152
+ // If we don't have token data after loading, show error state
153
+ if (!dstToken || isTokenError) {
154
+ return ((0, jsx_runtime_1.jsx)(react_1.StyleRoot, { children: (0, jsx_runtime_1.jsx)("div", { className: "b3-root b3-modal bg-b3-react-background flex w-full flex-col items-center p-8", children: (0, jsx_runtime_1.jsxs)("p", { className: "text-as-red text-center text-sm", children: ["Failed to fetch native token information for chain ", supported_1.baseMainnet.id, ". Please try again."] }) }) }));
155
+ }
156
+ if (showAmountPrompt) {
157
+ return ((0, jsx_runtime_1.jsx)(react_1.StyleRoot, { children: (0, jsx_runtime_1.jsxs)("div", { className: "bg-b3-react-background flex w-full flex-col items-center", children: [(0, jsx_runtime_1.jsxs)("div", { className: "w-full px-4 pb-2 pt-4", children: [(0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: false, animate: {
158
+ opacity: hasMounted ? 1 : 0,
159
+ y: hasMounted ? 0 : 20,
160
+ filter: hasMounted ? "blur(0px)" : "blur(10px)",
161
+ }, transition: { duration: 0.3, delay: 0, ease: "easeInOut" }, className: "mb-4 flex justify-center", children: imageUrl && ((0, jsx_runtime_1.jsxs)("div", { className: "relative size-16", children: [(0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 scale-95 rounded-[50%] bg-gradient-to-br from-blue-500/20 to-purple-600/20 blur-xl" }), (0, jsx_runtime_1.jsxs)(react_1.GlareCardRounded, { className: "overflow-hidden rounded-full border-none bg-gradient-to-br from-blue-500/10 to-purple-600/10 backdrop-blur-sm", children: [(0, jsx_runtime_1.jsx)("img", { alt: "token preview", className: "size-full rounded-lg object-cover", src: imageUrl }), (0, jsx_runtime_1.jsx)("div", { className: "absolute inset-0 rounded-[50%] border border-white/20" })] })] })) }), (0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: false, animate: {
162
+ opacity: hasMounted ? 1 : 0,
163
+ y: hasMounted ? 0 : 20,
164
+ filter: hasMounted ? "blur(0px)" : "blur(10px)",
165
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "text-center", children: (0, jsx_runtime_1.jsxs)("h2", { className: "font-sf-rounded text-as-primary mb-4 text-2xl font-bold", children: ["Buy ", tokenName] }) })] }), (0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: false, animate: {
166
+ opacity: hasMounted ? 1 : 0,
167
+ y: hasMounted ? 0 : 20,
168
+ filter: hasMounted ? "blur(0px)" : "blur(10px)",
169
+ }, transition: { duration: 0.3, delay: 0.2, ease: "easeInOut" }, className: "bg-b3-react-background w-full p-6", children: (0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-between", children: (0, jsx_runtime_1.jsx)("p", { className: "text-as-primary/70 text-sm font-medium", children: "Amount in ETH" }) }), (0, jsx_runtime_1.jsx)("div", { className: "relative", children: (0, jsx_runtime_1.jsx)(react_1.Input, { type: "text", inputMode: "decimal", placeholder: "0.1", value: ethAmount, onChange: e => validateAndSetAmount(e.target.value), className: `h-14 px-4 text-lg ${!isAmountValid && ethAmount ? "border-as-red" : "border-b3-react-border"}` }) }), !isAmountValid && ethAmount && (0, jsx_runtime_1.jsx)("p", { className: "text-as-red text-sm", children: validationError }), (0, jsx_runtime_1.jsxs)("div", { className: "bg-as-on-surface-2/30 rounded-lg border border-white/10 p-4 backdrop-blur-sm", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-primary/70 text-sm font-medium", children: "Total Cost:" }), (0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-2", children: (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary text-lg font-bold", children: [ethAmount || "0", " ETH"] }) })] }), isLoadingQuote ? ((0, jsx_runtime_1.jsx)("div", { className: "mt-2 text-center", children: (0, jsx_runtime_1.jsx)("span", { className: "text-as-primary/70 text-sm", children: "Calculating tokens..." }) })) : quote ? ((0, jsx_runtime_1.jsxs)("div", { className: "mt-2 flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-primary/70 text-sm font-medium", children: "You'll receive:" }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary text-sm font-medium", children: ["\u2248 ", formatNumberWithCommas(parseFloat(quote).toFixed(4)), " ", tokenSymbol] })] })) : null] }), (0, jsx_runtime_1.jsx)(react_1.Button, { onClick: () => {
170
+ if (isAmountValid && ethAmount) {
171
+ setShowAmountPrompt(false);
172
+ }
173
+ }, disabled: !isAmountValid || !ethAmount || isLoadingQuote, className: "bg-as-brand hover:bg-as-brand/90 text-as-primary mt-4 h-14 w-full rounded-xl text-lg font-medium", children: "Continue" })] }) })] }) }));
174
+ }
175
+ const encodedData = (0, viem_1.encodeFunctionData)({
176
+ abi: bondKit_1.ABI_bondKit,
177
+ functionName: "buyFor",
178
+ args: [recipientAddress, BigInt(minTokensOut)],
179
+ });
180
+ return ((0, jsx_runtime_1.jsx)(AnySpendCustom_1.AnySpendCustom, { isMainnet: true, mode: mode, recipientAddress: recipientAddress, orderType: anyspend_1.OrderType.Custom, dstChainId: supported_1.baseMainnet.id, dstToken: dstToken, dstAmount: (0, viem_1.parseEther)(ethAmount).toString(), contractAddress: contractAddress, encodedData: encodedData, metadata: {
181
+ type: anyspend_1.OrderType.Custom,
182
+ action: "BondKit Buy",
183
+ }, header: header, onSuccess: onSuccess, showRecipient: true }));
184
+ }
@@ -66,8 +66,6 @@ const SPIN_WHEEL_ABI = [
66
66
  ];
67
67
  function getWheelStatus(wheelInfo) {
68
68
  const now = BigInt(Math.floor(Date.now() / 1000));
69
- console.log("@@anyspend-buy-spin:now:", now);
70
- console.log("@@anyspend-buy-spin:wheelInfo:", wheelInfo);
71
69
  if (now < wheelInfo.startTime_) {
72
70
  return "not_started";
73
71
  }
@@ -81,7 +79,6 @@ function getWheelStatus(wheelInfo) {
81
79
  }
82
80
  function generateEncodedDataForBuyEntriesAndSpin(user, quantity) {
83
81
  (0, invariant_1.default)(BigInt(quantity) > 0, "Quantity must be greater than zero");
84
- console.log("@@anyspend-buy-spin:encoded-data:", { user, quantity });
85
82
  const encodedData = (0, viem_1.encodeFunctionData)({
86
83
  abi: SPIN_WHEEL_ABI,
87
84
  functionName: "buyEntriesAndSpin",
@@ -159,7 +156,6 @@ function AnySpendBuySpin({ isMainnet = true, loadOrder, mode = "modal", spinwhee
159
156
  try {
160
157
  setIsLoadingConfig(true);
161
158
  setConfigError("");
162
- console.log("@@anyspend-buy-spin:fetch-config:", { spinwheelContractAddress, chainId });
163
159
  const [config, entryModuleAddress, wheelInfo] = await Promise.all([
164
160
  basePublicClient.readContract({
165
161
  address: spinwheelContractAddress,
@@ -390,7 +390,7 @@ function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", recipient
390
390
  opacity: hasMounted ? 1 : 0,
391
391
  y: hasMounted ? 0 : 20,
392
392
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
393
- }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Price" }), (0, jsx_runtime_1.jsxs)("h2", { className: (0, utils_1.cn)("text-as-primary text-2xl font-semibold"), children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] }), recipientSection, (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: false, animate: {
393
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { className: "font-medium", children: ["Total ", (0, jsx_runtime_1.jsx)("span", { className: "text-sm text-gray-500", children: "(with fee)" })] }), (0, jsx_runtime_1.jsxs)("h2", { className: (0, utils_1.cn)("text-as-primary text-2xl font-semibold"), children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] }), recipientSection, (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(framer_motion_1.motion.div, { initial: false, animate: {
394
394
  opacity: hasMounted ? 1 : 0,
395
395
  y: hasMounted ? 0 : 20,
396
396
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
@@ -1,4 +1,4 @@
1
- import { GenerateSigMintResponse } from "../../types/signature-mint";
1
+ import { GenerateSigMintResponse } from "../../types/signatureMint";
2
2
  export declare function AnyspendSignatureMint({ loadOrder, mode, signatureData, imageUrl, onSuccess, }: {
3
3
  loadOrder?: string;
4
4
  mode?: "modal" | "page";
@@ -10,7 +10,7 @@ const react_1 = require("../../../global-account/react");
10
10
  const debug_1 = __importDefault(require("../../../shared/utils/debug"));
11
11
  const react_2 = require("react");
12
12
  const viem_1 = require("viem");
13
- const signature_minting_1 = require("../../abis/signature-minting");
13
+ const signatureMinting_1 = require("../../abis/signatureMinting");
14
14
  const AnySpendCustom_1 = require("./AnySpendCustom");
15
15
  // Helper function to determine if URL is a video
16
16
  function isVideoURL(url) {
@@ -36,7 +36,7 @@ function generateEncodedDataForSignatureMint(signatureData) {
36
36
  uid: payload.uid,
37
37
  };
38
38
  const encodedData = (0, viem_1.encodeFunctionData)({
39
- abi: [signature_minting_1.ABI_SIGNATURE_MINTING[0]],
39
+ abi: [signatureMinting_1.ABI_SIGNATURE_MINTING[0]],
40
40
  functionName: "mintWithSignature",
41
41
  args: [mintRequest, signature],
42
42
  });
@@ -45,7 +45,7 @@ function generateEncodedDataForSignatureMint(signatureData) {
45
45
  function AnyspendSignatureMint({ loadOrder, mode = "modal", signatureData, imageUrl, onSuccess, }) {
46
46
  const hasMounted = (0, react_1.useHasMounted)();
47
47
  // Get token data
48
- const { data: tokenData, isError: isTokenError } = (0, react_1.useTokenData)(signatureData.collection.chainId, signatureData.collection.signatureRequestBody?.currency);
48
+ const { data: tokenData, isError: isTokenError, isLoading, } = (0, react_1.useTokenData)(signatureData.collection.chainId, signatureData.collection.signatureRequestBody?.currency);
49
49
  // Convert token data to AnySpend Token type
50
50
  const dstToken = (0, react_2.useMemo)(() => {
51
51
  if (!tokenData)
@@ -64,7 +64,11 @@ function AnyspendSignatureMint({ loadOrder, mode = "modal", signatureData, image
64
64
  const mediaUrl = imageUrl || signatureData.payload.metadata.image || "https://cdn.b3.fun/nft-placeholder.png";
65
65
  const isVideo = isVideoURL(mediaUrl);
66
66
  const header = () => ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "relative mx-auto size-32", children: isVideo ? ((0, jsx_runtime_1.jsxs)("video", { autoPlay: true, loop: true, muted: true, playsInline: true, className: "size-full rounded-lg object-cover", children: [(0, jsx_runtime_1.jsx)("source", { src: mediaUrl, type: `video/${mediaUrl.split(".").pop()}` }), "Your browser does not support the video tag."] })) : ((0, jsx_runtime_1.jsx)("img", { alt: "nft preview", className: "size-full rounded-lg object-cover", src: mediaUrl })) }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-[-60px] w-full rounded-t-lg bg-white", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-[60px] w-full" }), (0, jsx_runtime_1.jsx)("div", { className: "mb-1 flex w-full flex-col items-center gap-2 p-5", children: (0, jsx_runtime_1.jsxs)("span", { className: "font-sf-rounded text-2xl font-semibold", children: [signatureData.payload.metadata.name || "Mint NFT", " ", Number(signatureData.payload.quantity) > 1 ? `(${signatureData.payload.quantity}x)` : ""] }) })] })] }));
67
- // If we don't have token data, show error state
67
+ // Show loading state while fetching token data
68
+ if (isLoading) {
69
+ return ((0, jsx_runtime_1.jsx)(react_1.StyleRoot, { children: (0, jsx_runtime_1.jsx)("div", { className: "b3-root b3-modal bg-b3-react-background flex w-full flex-col items-center p-8", children: (0, jsx_runtime_1.jsx)("p", { className: "text-as-primary/70 text-center text-sm", children: "Loading payment token information..." }) }) }));
70
+ }
71
+ // If we don't have token data after loading, show error state
68
72
  if (!dstToken || isTokenError) {
69
73
  return ((0, jsx_runtime_1.jsx)(react_1.StyleRoot, { children: (0, jsx_runtime_1.jsx)("div", { className: "b3-root b3-modal bg-b3-react-background flex w-full flex-col items-center p-8", children: (0, jsx_runtime_1.jsxs)("p", { className: "text-as-red text-center text-sm", children: ["Failed to fetch payment token information for ", signatureData.collection.signatureRequestBody?.currency, " on chain ", signatureData.collection.chainId, ". Please try again."] }) }) }));
70
74
  }
@@ -1,4 +1,4 @@
1
- import { NftContract } from "../../../anyspend/types";
1
+ import { NftContract } from "../../../../anyspend/types";
2
2
  type AnySpendNFTButtonProps = {
3
3
  nftContract?: NftContract;
4
4
  recipientAddress?: string;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AnySpendNFTButton = AnySpendNFTButton;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const constants_1 = require("../../../anyspend/constants");
6
- const react_1 = require("../../../global-account/react");
5
+ const constants_1 = require("../../../../anyspend/constants");
6
+ const react_1 = require("../../../../global-account/react");
7
7
  function AnySpendNFTButton({ nftContract = constants_1.DEFAULT_NFT_CONTRACT, recipientAddress }) {
8
8
  const { setB3ModalOpen, setB3ModalContentType } = (0, react_1.useModalStore)();
9
9
  const handleClick = () => {
@@ -1,11 +1,12 @@
1
1
  export { AnySpend } from "./AnySpend";
2
+ export { AnySpendBondKit } from "./AnySpendBondKit";
2
3
  export { AnySpendBuySpin } from "./AnySpendBuySpin";
3
4
  export { AnySpendCustom } from "./AnySpendCustom";
4
5
  export { AnySpendNFT } from "./AnySpendNFT";
5
- export { AnySpendNFTButton } from "./AnySpendNFTButton";
6
6
  export { AnyspendSignatureMint } from "./AnyspendSignatureMint";
7
7
  export { AnySpendStakeB3 } from "./AnySpendStakeB3";
8
8
  export { AnySpendTournament } from "./AnySpendTournament";
9
+ export { AnySpendNFTButton } from "./common/AnySpendNFTButton";
9
10
  export { ChainTokenIcon } from "./common/ChainTokenIcon";
10
11
  export { OrderDetails } from "./common/OrderDetails";
11
12
  export { OrderHistory } from "./common/OrderHistory";
@@ -1,23 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebviewOnrampPayment = exports.WebviewOnrampOrderStatus = exports.TokenBalance = exports.OrderTokenAmount = exports.OrderToken = exports.OrderStatus = exports.OrderHistoryItem = exports.OrderHistory = exports.OrderDetails = exports.ChainTokenIcon = exports.AnySpendTournament = exports.AnySpendStakeB3 = exports.AnyspendSignatureMint = exports.AnySpendNFTButton = exports.AnySpendNFT = exports.AnySpendCustom = exports.AnySpendBuySpin = exports.AnySpend = void 0;
3
+ exports.WebviewOnrampPayment = exports.WebviewOnrampOrderStatus = exports.TokenBalance = exports.OrderTokenAmount = exports.OrderToken = exports.OrderStatus = exports.OrderHistoryItem = exports.OrderHistory = exports.OrderDetails = exports.ChainTokenIcon = exports.AnySpendNFTButton = exports.AnySpendTournament = exports.AnySpendStakeB3 = exports.AnyspendSignatureMint = exports.AnySpendNFT = exports.AnySpendCustom = exports.AnySpendBuySpin = exports.AnySpendBondKit = exports.AnySpend = void 0;
4
4
  // Components
5
5
  var AnySpend_1 = require("./AnySpend");
6
6
  Object.defineProperty(exports, "AnySpend", { enumerable: true, get: function () { return AnySpend_1.AnySpend; } });
7
+ var AnySpendBondKit_1 = require("./AnySpendBondKit");
8
+ Object.defineProperty(exports, "AnySpendBondKit", { enumerable: true, get: function () { return AnySpendBondKit_1.AnySpendBondKit; } });
7
9
  var AnySpendBuySpin_1 = require("./AnySpendBuySpin");
8
10
  Object.defineProperty(exports, "AnySpendBuySpin", { enumerable: true, get: function () { return AnySpendBuySpin_1.AnySpendBuySpin; } });
9
11
  var AnySpendCustom_1 = require("./AnySpendCustom");
10
12
  Object.defineProperty(exports, "AnySpendCustom", { enumerable: true, get: function () { return AnySpendCustom_1.AnySpendCustom; } });
11
13
  var AnySpendNFT_1 = require("./AnySpendNFT");
12
14
  Object.defineProperty(exports, "AnySpendNFT", { enumerable: true, get: function () { return AnySpendNFT_1.AnySpendNFT; } });
13
- var AnySpendNFTButton_1 = require("./AnySpendNFTButton");
14
- Object.defineProperty(exports, "AnySpendNFTButton", { enumerable: true, get: function () { return AnySpendNFTButton_1.AnySpendNFTButton; } });
15
15
  var AnyspendSignatureMint_1 = require("./AnyspendSignatureMint");
16
16
  Object.defineProperty(exports, "AnyspendSignatureMint", { enumerable: true, get: function () { return AnyspendSignatureMint_1.AnyspendSignatureMint; } });
17
17
  var AnySpendStakeB3_1 = require("./AnySpendStakeB3");
18
18
  Object.defineProperty(exports, "AnySpendStakeB3", { enumerable: true, get: function () { return AnySpendStakeB3_1.AnySpendStakeB3; } });
19
19
  var AnySpendTournament_1 = require("./AnySpendTournament");
20
20
  Object.defineProperty(exports, "AnySpendTournament", { enumerable: true, get: function () { return AnySpendTournament_1.AnySpendTournament; } });
21
+ var AnySpendNFTButton_1 = require("./common/AnySpendNFTButton");
22
+ Object.defineProperty(exports, "AnySpendNFTButton", { enumerable: true, get: function () { return AnySpendNFTButton_1.AnySpendNFTButton; } });
21
23
  // Common Components
22
24
  var ChainTokenIcon_1 = require("./common/ChainTokenIcon");
23
25
  Object.defineProperty(exports, "ChainTokenIcon", { enumerable: true, get: function () { return ChainTokenIcon_1.ChainTokenIcon; } });
@@ -1,4 +1,4 @@
1
- import { FindByAddressParams, GenerateSigMintParams, IsMintEligibleParams } from "../../types/signature-mint";
1
+ import { FindByAddressParams, GenerateSigMintParams, IsMintEligibleParams } from "../../types/signatureMint";
2
2
  /**
3
3
  * Hook to generate signature for minting
4
4
  */
@@ -0,0 +1,12 @@
1
+ export interface bondKitBuyForParams {
2
+ recipientAddress: string;
3
+ contractAddress: string;
4
+ chainId: number;
5
+ minTokensOut: string;
6
+ ethAmount: string;
7
+ imageUrl?: string;
8
+ tokenName?: string;
9
+ loadOrder?: string;
10
+ mode?: "modal" | "page";
11
+ onSuccess?: (txHash?: string) => void;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -29,6 +29,7 @@ function B3DynamicModal() {
29
29
  "anySpendOrderHistory",
30
30
  "signInWithB3",
31
31
  "anySpendSignatureMint",
32
+ "AnySpendBondKit",
32
33
  ].find(type => contentType?.type === type)) {
33
34
  contentClass += " max-h-[90dvh] overflow-y-auto no-scrollbar w-full";
34
35
  }
@@ -39,6 +40,7 @@ function B3DynamicModal() {
39
40
  "anySpendStakeB3",
40
41
  "anySpendBuySpin",
41
42
  "anySpendSignatureMint",
43
+ "AnySpendBondKit",
42
44
  ].find(type => contentType?.type === type)) {
43
45
  // Due to the dynamic of (Pay with crypto),(Pay with fiat), we want the height fixed to 90dvh but still scrollable.
44
46
  // NOTE: Just leave it here in case we want the fixed height
@@ -80,6 +82,8 @@ function B3DynamicModal() {
80
82
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendBuySpin, { ...contentType, mode: "modal" });
81
83
  case "anySpendSignatureMint":
82
84
  return (0, jsx_runtime_1.jsx)(react_1.AnyspendSignatureMint, { ...contentType, mode: "modal" });
85
+ case "anySpendBondKit":
86
+ return (0, jsx_runtime_1.jsx)(react_1.AnySpendBondKit, { ...contentType });
83
87
  // Add other modal types here
84
88
  default:
85
89
  return null;
@@ -1,6 +1,6 @@
1
1
  import { Token, Tournament } from "../../../anyspend";
2
2
  import { NftContract } from "../../../anyspend/types";
3
- import { GenerateSigMintResponse } from "../../../anyspend/types/signature-mint";
3
+ import { GenerateSigMintResponse } from "../../../anyspend/types/signatureMint";
4
4
  import { AllowedStrategy } from "../../../global-account/react";
5
5
  import { PermissionsConfig } from "../../../global-account/types/permissions";
6
6
  import { Address, Chain } from "thirdweb";
@@ -251,10 +251,32 @@ export interface AnySpendSignatureMintProps extends BaseModalProps {
251
251
  /** Callback function called when minting is successful */
252
252
  onSuccess?: (txHash?: string) => void;
253
253
  }
254
+ /**
255
+ * Props for the AnySpend bondKit modal
256
+ * Handles bondKit token purchases
257
+ */
258
+ export interface AnySpendBondKitProps extends BaseModalProps {
259
+ /** Mode of the modal */
260
+ mode?: "modal" | "page";
261
+ /** Modal type identifier */
262
+ type: "anySpendBondKit";
263
+ /** Recipient address to receive the tokens */
264
+ recipientAddress: string;
265
+ /** bondKit contract address */
266
+ contractAddress: string;
267
+ /** Minimum tokens to receive */
268
+ minTokensOut?: string;
269
+ /** Optional image URL for token preview */
270
+ imageUrl?: string;
271
+ /** Token name to display */
272
+ tokenName?: string;
273
+ /** Callback function called when purchase is successful */
274
+ onSuccess?: (txHash?: string) => void;
275
+ }
254
276
  /**
255
277
  * Union type of all possible modal content types
256
278
  */
257
- export type ModalContentType = SignInWithB3ModalProps | RequestPermissionsModalProps | ManageAccountModalProps | AnySpendModalProps | AnyspendOrderDetailsProps | AnySpendNftProps | AnySpendJoinTournamentProps | AnySpendFundTournamentProps | TransakProps | AnySpendOrderHistoryProps | AnySpendStakeB3Props | AnySpendBuySpinProps | AnySpendSignatureMintProps;
279
+ export type ModalContentType = SignInWithB3ModalProps | RequestPermissionsModalProps | ManageAccountModalProps | AnySpendModalProps | AnyspendOrderDetailsProps | AnySpendNftProps | AnySpendJoinTournamentProps | AnySpendFundTournamentProps | TransakProps | AnySpendOrderHistoryProps | AnySpendStakeB3Props | AnySpendBuySpinProps | AnySpendSignatureMintProps | AnySpendBondKitProps;
258
280
  /**
259
281
  * State interface for the modal store
260
282
  */
@@ -0,0 +1,35 @@
1
+ export declare const ABI_bondKit: readonly [{
2
+ readonly inputs: readonly [{
3
+ readonly internalType: "address";
4
+ readonly name: "_recipient";
5
+ readonly type: "address";
6
+ }, {
7
+ readonly internalType: "uint256";
8
+ readonly name: "_minTokensOut";
9
+ readonly type: "uint256";
10
+ }];
11
+ readonly name: "buyFor";
12
+ readonly outputs: readonly [];
13
+ readonly stateMutability: "payable";
14
+ readonly type: "function";
15
+ }, {
16
+ readonly inputs: readonly [];
17
+ readonly name: "name";
18
+ readonly outputs: readonly [{
19
+ readonly internalType: "string";
20
+ readonly name: "";
21
+ readonly type: "string";
22
+ }];
23
+ readonly stateMutability: "view";
24
+ readonly type: "function";
25
+ }, {
26
+ readonly inputs: readonly [];
27
+ readonly name: "symbol";
28
+ readonly outputs: readonly [{
29
+ readonly internalType: "string";
30
+ readonly name: "";
31
+ readonly type: "string";
32
+ }];
33
+ readonly stateMutability: "view";
34
+ readonly type: "function";
35
+ }];
@@ -0,0 +1,26 @@
1
+ export const ABI_bondKit = [
2
+ {
3
+ inputs: [
4
+ { internalType: "address", name: "_recipient", type: "address" },
5
+ { internalType: "uint256", name: "_minTokensOut", type: "uint256" },
6
+ ],
7
+ name: "buyFor",
8
+ outputs: [],
9
+ stateMutability: "payable",
10
+ type: "function",
11
+ },
12
+ {
13
+ inputs: [],
14
+ name: "name",
15
+ outputs: [{ internalType: "string", name: "", type: "string" }],
16
+ stateMutability: "view",
17
+ type: "function",
18
+ },
19
+ {
20
+ inputs: [],
21
+ name: "symbol",
22
+ outputs: [{ internalType: "string", name: "", type: "string" }],
23
+ stateMutability: "view",
24
+ type: "function",
25
+ },
26
+ ];