@ubi.fun/sdk 0.1.0

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 (191) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +279 -0
  3. package/dist/abi/AddressFeeSplitManager.d.cts +938 -0
  4. package/dist/abi/AddressFeeSplitManager.d.ts +939 -0
  5. package/dist/abi/AddressFeeSplitManager.d.ts.map +1 -0
  6. package/dist/abi/BidWall.d.cts +739 -0
  7. package/dist/abi/BidWall.d.ts +740 -0
  8. package/dist/abi/BidWall.d.ts.map +1 -0
  9. package/dist/abi/FairLaunch.d.cts +535 -0
  10. package/dist/abi/FairLaunch.d.ts +536 -0
  11. package/dist/abi/FairLaunch.d.ts.map +1 -0
  12. package/dist/abi/FeeEscrow.d.cts +281 -0
  13. package/dist/abi/FeeEscrow.d.ts +282 -0
  14. package/dist/abi/FeeEscrow.d.ts.map +1 -0
  15. package/dist/abi/Flaunch.d.cts +775 -0
  16. package/dist/abi/Flaunch.d.ts +776 -0
  17. package/dist/abi/Flaunch.d.ts.map +1 -0
  18. package/dist/abi/FlaunchPositionManager.d.cts +2170 -0
  19. package/dist/abi/FlaunchPositionManager.d.ts +2171 -0
  20. package/dist/abi/FlaunchPositionManager.d.ts.map +1 -0
  21. package/dist/abi/FlaunchZap.d.cts +300 -0
  22. package/dist/abi/FlaunchZap.d.ts +301 -0
  23. package/dist/abi/FlaunchZap.d.ts.map +1 -0
  24. package/dist/abi/InitialPrice.d.cts +252 -0
  25. package/dist/abi/InitialPrice.d.ts +253 -0
  26. package/dist/abi/InitialPrice.d.ts.map +1 -0
  27. package/dist/abi/Memecoin.d.cts +680 -0
  28. package/dist/abi/Memecoin.d.ts +681 -0
  29. package/dist/abi/Memecoin.d.ts.map +1 -0
  30. package/dist/abi/Multicall.d.cts +332 -0
  31. package/dist/abi/Multicall.d.ts +333 -0
  32. package/dist/abi/Multicall.d.ts.map +1 -0
  33. package/dist/abi/PoolManager.d.cts +1056 -0
  34. package/dist/abi/PoolManager.d.ts +1057 -0
  35. package/dist/abi/PoolManager.d.ts.map +1 -0
  36. package/dist/abi/PoolSwap.d.cts +89 -0
  37. package/dist/abi/PoolSwap.d.ts +90 -0
  38. package/dist/abi/PoolSwap.d.ts.map +1 -0
  39. package/dist/abi/Quoter.d.cts +485 -0
  40. package/dist/abi/Quoter.d.ts +486 -0
  41. package/dist/abi/Quoter.d.ts.map +1 -0
  42. package/dist/abi/ReferralEscrow.d.cts +459 -0
  43. package/dist/abi/ReferralEscrow.d.ts +460 -0
  44. package/dist/abi/ReferralEscrow.d.ts.map +1 -0
  45. package/dist/abi/TreasuryManager.d.cts +325 -0
  46. package/dist/abi/TreasuryManager.d.ts +326 -0
  47. package/dist/abi/TreasuryManager.d.ts.map +1 -0
  48. package/dist/abi/TreasuryManagerFactory.d.cts +433 -0
  49. package/dist/abi/TreasuryManagerFactory.d.ts +434 -0
  50. package/dist/abi/TreasuryManagerFactory.d.ts.map +1 -0
  51. package/dist/abi/UniversalRewardsDistributor.d.cts +191 -0
  52. package/dist/abi/UniversalRewardsDistributor.d.ts +192 -0
  53. package/dist/abi/UniversalRewardsDistributor.d.ts.map +1 -0
  54. package/dist/abi/XHandleClaims.d.cts +383 -0
  55. package/dist/abi/XHandleClaims.d.ts +384 -0
  56. package/dist/abi/XHandleClaims.d.ts.map +1 -0
  57. package/dist/abi/index.cjs +13541 -0
  58. package/dist/abi/index.cjs.map +1 -0
  59. package/dist/abi/index.d.cts +18 -0
  60. package/dist/abi/index.d.ts +19 -0
  61. package/dist/abi/index.d.ts.map +1 -0
  62. package/dist/abi/index.js +13522 -0
  63. package/dist/abi/index.js.map +1 -0
  64. package/dist/addresses/index.cjs +90 -0
  65. package/dist/addresses/index.cjs.map +1 -0
  66. package/dist/addresses/index.js +70 -0
  67. package/dist/addresses/index.js.map +1 -0
  68. package/dist/addresses.d.cts +48 -0
  69. package/dist/addresses.d.ts +49 -0
  70. package/dist/addresses.d.ts.map +1 -0
  71. package/dist/clients/BidWallClient.d.cts +44 -0
  72. package/dist/clients/BidWallClient.d.ts +45 -0
  73. package/dist/clients/BidWallClient.d.ts.map +1 -0
  74. package/dist/clients/FairLaunchClient.d.cts +47 -0
  75. package/dist/clients/FairLaunchClient.d.ts +48 -0
  76. package/dist/clients/FairLaunchClient.d.ts.map +1 -0
  77. package/dist/clients/FeeEscrowClient.d.cts +40 -0
  78. package/dist/clients/FeeEscrowClient.d.ts +41 -0
  79. package/dist/clients/FeeEscrowClient.d.ts.map +1 -0
  80. package/dist/clients/FlaunchClient.d.cts +35 -0
  81. package/dist/clients/FlaunchClient.d.ts +36 -0
  82. package/dist/clients/FlaunchClient.d.ts.map +1 -0
  83. package/dist/clients/FlaunchPositionManagerClient.d.cts +117 -0
  84. package/dist/clients/FlaunchPositionManagerClient.d.ts +118 -0
  85. package/dist/clients/FlaunchPositionManagerClient.d.ts.map +1 -0
  86. package/dist/clients/FlaunchZapClient.d.cts +127 -0
  87. package/dist/clients/FlaunchZapClient.d.ts +128 -0
  88. package/dist/clients/FlaunchZapClient.d.ts.map +1 -0
  89. package/dist/clients/InitialPriceClient.d.cts +32 -0
  90. package/dist/clients/InitialPriceClient.d.ts +33 -0
  91. package/dist/clients/InitialPriceClient.d.ts.map +1 -0
  92. package/dist/clients/MemecoinClient.d.cts +66 -0
  93. package/dist/clients/MemecoinClient.d.ts +67 -0
  94. package/dist/clients/MemecoinClient.d.ts.map +1 -0
  95. package/dist/clients/MulticallClient.d.cts +15 -0
  96. package/dist/clients/MulticallClient.d.ts +16 -0
  97. package/dist/clients/MulticallClient.d.ts.map +1 -0
  98. package/dist/clients/PoolManagerClient.d.cts +50 -0
  99. package/dist/clients/PoolManagerClient.d.ts +51 -0
  100. package/dist/clients/PoolManagerClient.d.ts.map +1 -0
  101. package/dist/clients/PoolSwapClient.d.cts +37 -0
  102. package/dist/clients/PoolSwapClient.d.ts +38 -0
  103. package/dist/clients/PoolSwapClient.d.ts.map +1 -0
  104. package/dist/clients/QuoterClient.d.cts +58 -0
  105. package/dist/clients/QuoterClient.d.ts +59 -0
  106. package/dist/clients/QuoterClient.d.ts.map +1 -0
  107. package/dist/clients/ReferralEscrowClient.d.cts +39 -0
  108. package/dist/clients/ReferralEscrowClient.d.ts +40 -0
  109. package/dist/clients/ReferralEscrowClient.d.ts.map +1 -0
  110. package/dist/clients/TreasuryManagerClient.d.cts +71 -0
  111. package/dist/clients/TreasuryManagerClient.d.ts +72 -0
  112. package/dist/clients/TreasuryManagerClient.d.ts.map +1 -0
  113. package/dist/clients/TreasuryManagerFactoryClient.d.cts +15 -0
  114. package/dist/clients/TreasuryManagerFactoryClient.d.ts +16 -0
  115. package/dist/clients/TreasuryManagerFactoryClient.d.ts.map +1 -0
  116. package/dist/clients/UniversalRewardsDistributorClient.d.cts +45 -0
  117. package/dist/clients/UniversalRewardsDistributorClient.d.ts +46 -0
  118. package/dist/clients/UniversalRewardsDistributorClient.d.ts.map +1 -0
  119. package/dist/clients/XHandleClaimsClient.d.cts +64 -0
  120. package/dist/clients/XHandleClaimsClient.d.ts +65 -0
  121. package/dist/clients/XHandleClaimsClient.d.ts.map +1 -0
  122. package/dist/helpers/chainIdToChain.d.cts +113 -0
  123. package/dist/helpers/chainIdToChain.d.ts +114 -0
  124. package/dist/helpers/chainIdToChain.d.ts.map +1 -0
  125. package/dist/helpers/hex.d.cts +3 -0
  126. package/dist/helpers/hex.d.ts +4 -0
  127. package/dist/helpers/hex.d.ts.map +1 -0
  128. package/dist/helpers/index.cjs +196 -0
  129. package/dist/helpers/index.cjs.map +1 -0
  130. package/dist/helpers/index.d.cts +3 -0
  131. package/dist/helpers/index.d.ts +4 -0
  132. package/dist/helpers/index.d.ts.map +1 -0
  133. package/dist/helpers/index.js +184 -0
  134. package/dist/helpers/index.js.map +1 -0
  135. package/dist/helpers/ipfs.d.cts +56 -0
  136. package/dist/helpers/ipfs.d.ts +57 -0
  137. package/dist/helpers/ipfs.d.ts.map +1 -0
  138. package/dist/hooks/FlaunchPositionManagerHooks.d.cts +28 -0
  139. package/dist/hooks/FlaunchPositionManagerHooks.d.ts +29 -0
  140. package/dist/hooks/FlaunchPositionManagerHooks.d.ts.map +1 -0
  141. package/dist/hooks/index.cjs +73 -0
  142. package/dist/hooks/index.cjs.map +1 -0
  143. package/dist/hooks/index.d.cts +1 -0
  144. package/dist/hooks/index.d.ts +2 -0
  145. package/dist/hooks/index.d.ts.map +1 -0
  146. package/dist/hooks/index.js +70 -0
  147. package/dist/hooks/index.js.map +1 -0
  148. package/dist/index.cjs +16808 -0
  149. package/dist/index.cjs.map +1 -0
  150. package/dist/index.d.cts +31 -0
  151. package/dist/index.d.ts +32 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +16718 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/index.umd.cjs +2 -0
  156. package/dist/index.umd.cjs.map +1 -0
  157. package/dist/sdk/FlaunchSDK.d.cts +520 -0
  158. package/dist/sdk/FlaunchSDK.d.ts +521 -0
  159. package/dist/sdk/FlaunchSDK.d.ts.map +1 -0
  160. package/dist/sdk/calldata.d.cts +65 -0
  161. package/dist/sdk/calldata.d.ts +66 -0
  162. package/dist/sdk/calldata.d.ts.map +1 -0
  163. package/dist/sdk/drift.d.cts +20 -0
  164. package/dist/sdk/drift.d.ts +21 -0
  165. package/dist/sdk/drift.d.ts.map +1 -0
  166. package/dist/sdk/factory.d.cts +20 -0
  167. package/dist/sdk/factory.d.ts +21 -0
  168. package/dist/sdk/factory.d.ts.map +1 -0
  169. package/dist/types.d.cts +56 -0
  170. package/dist/types.d.ts +57 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/utils/index.cjs +455 -0
  173. package/dist/utils/index.cjs.map +1 -0
  174. package/dist/utils/index.d.cts +4 -0
  175. package/dist/utils/index.d.ts +5 -0
  176. package/dist/utils/index.d.ts.map +1 -0
  177. package/dist/utils/index.js +431 -0
  178. package/dist/utils/index.js.map +1 -0
  179. package/dist/utils/parseSwap.d.cts +45 -0
  180. package/dist/utils/parseSwap.d.ts +46 -0
  181. package/dist/utils/parseSwap.d.ts.map +1 -0
  182. package/dist/utils/slippage.d.cts +11 -0
  183. package/dist/utils/slippage.d.ts +12 -0
  184. package/dist/utils/slippage.d.ts.map +1 -0
  185. package/dist/utils/swap.d.cts +49 -0
  186. package/dist/utils/swap.d.ts +50 -0
  187. package/dist/utils/swap.d.ts.map +1 -0
  188. package/dist/utils/univ4.d.cts +78 -0
  189. package/dist/utils/univ4.d.ts +79 -0
  190. package/dist/utils/univ4.d.ts.map +1 -0
  191. package/package.json +161 -0
@@ -0,0 +1,196 @@
1
+ 'use strict';
2
+
3
+ var viem = require('viem');
4
+ var axios = require('axios');
5
+
6
+ const bytes32ToUint256 = (value) => {
7
+ return viem.hexToBigInt(value);
8
+ };
9
+ const uint256ToBytes32 = (value) => {
10
+ return viem.pad(
11
+ viem.encodeAbiParameters([{ type: "uint256", name: "value" }], [value]),
12
+ { size: 32, dir: "right" }
13
+ );
14
+ };
15
+
16
+ const ARC_MAINNET_CHAIN_ID = 5042;
17
+ const ARC_TESTNET_CHAIN_ID = 5042002;
18
+ const ApiBaseUrl = {
19
+ [ARC_MAINNET_CHAIN_ID]: "https://api.ubi.fun",
20
+ [ARC_TESTNET_CHAIN_ID]: "https://api-dev.ubi.fun"
21
+ };
22
+
23
+ const IPFS_GATEWAYS = ["https://ipfs.io/ipfs/", "https://dweb.link/ipfs/"];
24
+ let currentGatewayIndex = 0;
25
+ const resolveIPFS = (value) => {
26
+ if (value.startsWith("ipfs://")) {
27
+ const cid = value.slice(7);
28
+ const gateway = IPFS_GATEWAYS[currentGatewayIndex];
29
+ currentGatewayIndex = (currentGatewayIndex + 1) % IPFS_GATEWAYS.length;
30
+ return `${gateway}${cid}`;
31
+ }
32
+ return value;
33
+ };
34
+ const resolveIPFSCandidates = (value) => {
35
+ if (value.startsWith("ipfs://")) {
36
+ const cid = value.slice(7);
37
+ return IPFS_GATEWAYS.map((gateway) => `${gateway}${cid}`);
38
+ }
39
+ return [value];
40
+ };
41
+ const METADATA_FETCH_TIMEOUT_MS = 15e3;
42
+ const METADATA_MAX_REDIRECTS = 3;
43
+ const METADATA_MAX_BYTES = 5 * 1024 * 1024;
44
+ const fetchTokenUriMetadata = async (url) => {
45
+ if (!/^https?:\/\//i.test(url)) {
46
+ throw new Error(`Unsupported tokenURI protocol: ${url.slice(0, 64)}`);
47
+ }
48
+ const response = await axios.get(url, {
49
+ timeout: METADATA_FETCH_TIMEOUT_MS,
50
+ maxRedirects: METADATA_MAX_REDIRECTS,
51
+ maxContentLength: METADATA_MAX_BYTES,
52
+ maxBodyLength: METADATA_MAX_BYTES
53
+ });
54
+ return response.data;
55
+ };
56
+ const fetchTokenUriMetadataWithFallback = async (urls) => {
57
+ let lastError;
58
+ for (const url of urls) {
59
+ try {
60
+ return await fetchTokenUriMetadata(url);
61
+ } catch (error) {
62
+ lastError = error;
63
+ }
64
+ }
65
+ throw lastError;
66
+ };
67
+ const decodeBase64Image = (base64Image) => {
68
+ const base64Data = base64Image.split(",")[1] || base64Image;
69
+ const byteCharacters = atob(base64Data);
70
+ const bytes = new Uint8Array(byteCharacters.length);
71
+ for (let i = 0; i < byteCharacters.length; i++) {
72
+ bytes[i] = byteCharacters.charCodeAt(i);
73
+ }
74
+ let mimeType = "image/png";
75
+ if (base64Image.startsWith("data:")) {
76
+ mimeType = base64Image.split(";")[0].split(":")[1];
77
+ }
78
+ return { bytes, mimeType };
79
+ };
80
+ const uploadToUbiApi = async (params) => {
81
+ const { bytes, mimeType } = decodeBase64Image(params.base64Image);
82
+ const formData = new FormData();
83
+ formData.append(
84
+ "image",
85
+ new Blob([bytes], { type: mimeType }),
86
+ `image.${mimeType.split("/")[1] ?? "png"}`
87
+ );
88
+ formData.append("name", params.name);
89
+ formData.append("symbol", params.symbol);
90
+ formData.append("description", params.description);
91
+ if (params.websiteUrl) {
92
+ formData.append("website", params.websiteUrl);
93
+ }
94
+ if (params.discordUrl) {
95
+ formData.append("discord", params.discordUrl);
96
+ }
97
+ if (params.twitterUrl) {
98
+ formData.append("twitter", params.twitterUrl);
99
+ }
100
+ if (params.telegramUrl) {
101
+ formData.append("telegram", params.telegramUrl);
102
+ }
103
+ try {
104
+ const response = await axios.post(`${params.apiUrl}/upload`, formData);
105
+ return {
106
+ tokenUri: response.data.tokenUri,
107
+ image: response.data.image
108
+ };
109
+ } catch (error) {
110
+ if (axios.isAxiosError(error)) {
111
+ throw new Error(
112
+ `Failed to upload token metadata: ${error.response?.data?.error || error.message}`
113
+ );
114
+ }
115
+ throw error;
116
+ }
117
+ };
118
+ const generateTokenUri = async (name, symbol, params) => {
119
+ const apiUrl = ApiBaseUrl[params.chainId];
120
+ if (!apiUrl) {
121
+ throw new Error(
122
+ `No ubi.fun API for chain ${params.chainId}; pin the metadata yourself and pass flaunch({ tokenUri })`
123
+ );
124
+ }
125
+ const { tokenUri } = await uploadToUbiApi({
126
+ apiUrl,
127
+ name,
128
+ symbol,
129
+ base64Image: params.metadata.base64Image,
130
+ description: params.metadata.description,
131
+ websiteUrl: params.metadata.websiteUrl,
132
+ discordUrl: params.metadata.discordUrl,
133
+ twitterUrl: params.metadata.twitterUrl,
134
+ telegramUrl: params.metadata.telegramUrl
135
+ });
136
+ return tokenUri;
137
+ };
138
+
139
+ const arc = viem.defineChain({
140
+ id: ARC_MAINNET_CHAIN_ID,
141
+ name: "Arc",
142
+ nativeCurrency: {
143
+ name: "USD Coin",
144
+ symbol: "USDC",
145
+ decimals: 18
146
+ },
147
+ rpcUrls: {
148
+ default: {
149
+ http: ["https://rpc.blockdaemon.mainnet.arc.io"]
150
+ }
151
+ },
152
+ blockExplorers: {
153
+ default: {
154
+ name: "Arc Explorer",
155
+ url: "https://explorer.arc.io"
156
+ }
157
+ }
158
+ });
159
+ const arcTestnet = viem.defineChain({
160
+ id: ARC_TESTNET_CHAIN_ID,
161
+ name: "Arc Testnet",
162
+ testnet: true,
163
+ nativeCurrency: {
164
+ name: "USD Coin",
165
+ symbol: "USDC",
166
+ decimals: 18
167
+ },
168
+ rpcUrls: {
169
+ default: {
170
+ http: ["https://arc-testnet.drpc.org", "https://rpc.testnet.arc.network"]
171
+ }
172
+ },
173
+ blockExplorers: {
174
+ default: {
175
+ name: "Arcscan",
176
+ url: "https://testnet.arcscan.app"
177
+ }
178
+ }
179
+ });
180
+ const chainIdToChain = {
181
+ [arc.id]: arc,
182
+ [arcTestnet.id]: arcTestnet
183
+ };
184
+
185
+ exports.arc = arc;
186
+ exports.arcTestnet = arcTestnet;
187
+ exports.bytes32ToUint256 = bytes32ToUint256;
188
+ exports.chainIdToChain = chainIdToChain;
189
+ exports.fetchTokenUriMetadata = fetchTokenUriMetadata;
190
+ exports.fetchTokenUriMetadataWithFallback = fetchTokenUriMetadataWithFallback;
191
+ exports.generateTokenUri = generateTokenUri;
192
+ exports.resolveIPFS = resolveIPFS;
193
+ exports.resolveIPFSCandidates = resolveIPFSCandidates;
194
+ exports.uint256ToBytes32 = uint256ToBytes32;
195
+ exports.uploadToUbiApi = uploadToUbiApi;
196
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/helpers/hex.ts","../../src/addresses.ts","../../src/helpers/ipfs.ts","../../src/helpers/chainIdToChain.ts"],"sourcesContent":["import { encodeAbiParameters, Hex, hexToBigInt, pad } from \"viem\";\n\nexport const bytes32ToUint256 = (value: Hex) => {\n return hexToBigInt(value);\n};\n\nexport const uint256ToBytes32 = (value: bigint) => {\n return pad(\n encodeAbiParameters([{ type: \"uint256\", name: \"value\" }], [value]),\n { size: 32, dir: \"right\" }\n );\n};\n","import { Addresses } from \"./types\";\n\n/**\n * ubi.fun deployments on Arc (Circle).\n *\n * Source of truth: deployments/arc-mainnet-5042.json and\n * deployments/arc-testnet-5042002.json in the contracts repo, mirrored by the\n * committed frontend registry. The cash / native asset on Arc is native USDC\n * (6 decimals through its ERC20 interface) at\n * 0x3600000000000000000000000000000000000000: the position manager's\n * \"nativeToken\" slot IS this USDC, and every pool pairs a coin against it.\n * There is no flETH, no WETH wrapping, and no unwrap step on this chain.\n */\nexport const ARC_MAINNET_CHAIN_ID = 5042;\nexport const ARC_TESTNET_CHAIN_ID = 5042002;\n\n/** Arc native USDC (ERC20 interface, 6 decimals). The cash side of every pool. */\nexport const USDC_ADDRESS =\n \"0x3600000000000000000000000000000000000000\" as const;\n\n/**\n * The pool \"native token\": Arc native USDC on both networks. Kept as an\n * Addresses map so client code stays chain-keyed like every other contract.\n */\nexport const NativeTokenAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: USDC_ADDRESS,\n [ARC_TESTNET_CHAIN_ID]: USDC_ADDRESS,\n};\n\nexport const FlaunchZapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe07F7cA66EC795592385018Dd998F0B50b8A2834\",\n [ARC_TESTNET_CHAIN_ID]: \"0x3fd667aaa89519772bb44e984de408bfcd40e285\",\n};\n\n// SDK \"FlaunchPositionManager\" maps to our deployment \"PositionManager\".\nexport const FlaunchPositionManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC780c0f4aAc690908854D351b8bFda2812daeFDc\",\n [ARC_TESTNET_CHAIN_ID]: \"0x88af0b76752ff31aa351cea2cc2e43a1b7c32fdc\",\n};\n\nexport const FlaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x93E5A7565008db9688BA5211Fa552d8b108B9c75\",\n [ARC_TESTNET_CHAIN_ID]: \"0x55a0e1a458f1c13023dbd6b204e2a439c3b44663\",\n};\n\nexport const FairLaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xdCDADa707264d9e2B0E8c2feC467860C97434Bd4\",\n [ARC_TESTNET_CHAIN_ID]: \"0xd2ea5591fe0b5820b6de33afbc3b468d070038ea\",\n};\n\n// SDK \"BidWall\" maps to our deployment \"BurningBidWall\" (a modified BidWall).\nexport const BidWallAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC5DD30802fefab789Cd9b1e835Bd7301a8D23F8A\",\n [ARC_TESTNET_CHAIN_ID]: \"0x04f947e5fc0ac42836f880d45705af7483a2c4c0\",\n};\n\n/** Referrer-aware swap router: the supported way to trade ubi.fun pools. */\nexport const PoolSwapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x3A61B6E86fde5Fc657a48819837F346C7E2Fffa7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x396d41eb4d110d64491d01cd186548fdc82b1b4a\",\n};\n\nexport const TreasuryManagerFactoryAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xE25C132F379DB49C463328eF427E28DBCbD3a2F0\",\n [ARC_TESTNET_CHAIN_ID]: \"0x093c10b780f7cf8fca9aa7dbc83a64cddf55215f\",\n};\n\n// The approved AddressFeeSplitManager IMPLEMENTATION (factory deploys clones).\nexport const AddressFeeSplitManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xde10818344f5ab75ecfA772887cE5751D6Cb91C7\",\n [ARC_TESTNET_CHAIN_ID]: \"0xA7d182B81aF7B40b6d09Da88A12a4f7ad770e162\",\n};\n\n/** Creator revenue escrow: balances accrue here, claimed as USDC (unwrap=false). */\nexport const FeeEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x678f0D1C045e820Ec1d4806749f2629e1035550e\",\n [ARC_TESTNET_CHAIN_ID]: \"0x59b3269aaf9db83bd3029c84d8b5226fa5702f78\",\n};\n\n/** Referrer rewards escrow: 5% of every swap fee routed with your address. */\nexport const ReferralEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf25B9ceAba005CcCb0cefC4e323e6e519F111eB3\",\n [ARC_TESTNET_CHAIN_ID]: \"0x51b6a4759f9c9a681349c857f6fd912cdfeb8fef\",\n};\n\n/** X-handle earnings registry: per-handle CREATE2 escrows + attested claims. */\nexport const XHandleClaimsAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xfC38298590893c39E46D319aEd9EC3bf6CB17A3E\",\n [ARC_TESTNET_CHAIN_ID]: \"0x6fE2b9e1Da493E4584e742C03e1926a4CD8AC2A1\",\n};\n\n/**\n * Morpho UniversalRewardsDistributor paying the daily USDC holder pool\n * (24% of every swap fee). Claims are Merkle-proofed cumulative amounts.\n */\nexport const UniversalRewardsDistributorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x66003091e723778d7D3285BB6c24ff3F0Ddcc7F7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x7a8e9dA46db2be8436c4404476b40F07a31A6d95\",\n};\n\n/** Uniswap v4 PoolManager (canonical deployment on mainnet, ours on testnet). */\nexport const PoolManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x8366a39CC670B4001A1121B8F6A443A643e40951\",\n [ARC_TESTNET_CHAIN_ID]: \"0x5fb24c800133a0930280788c5eb3468764154309\",\n};\n\nexport const QuoterAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x4595D3CD7A6D98d83A719934e829db5076fF1d0d\",\n [ARC_TESTNET_CHAIN_ID]: \"0xf517623f178Ba90e5b3299cb121D38F5A0733ac4\",\n};\n\n/** Base URL of the ubi.fun read/upload API serving each network. */\nexport const ApiBaseUrl: { [chainId: number]: string } = {\n [ARC_MAINNET_CHAIN_ID]: \"https://api.ubi.fun\",\n [ARC_TESTNET_CHAIN_ID]: \"https://api-dev.ubi.fun\",\n};\n","import axios from \"axios\";\nimport { IPFSParams } from \"../types\";\nimport { ApiBaseUrl } from \"../addresses\";\n\n// List of public IPFS gateways to cycle through\nconst IPFS_GATEWAYS = [\"https://ipfs.io/ipfs/\", \"https://dweb.link/ipfs/\"];\n\n// Counter to track the current gateway index\nlet currentGatewayIndex = 0;\n\nexport const resolveIPFS = (value: string): string => {\n if (value.startsWith(\"ipfs://\")) {\n const cid = value.slice(7);\n // Get the next gateway and increment the counter\n const gateway = IPFS_GATEWAYS[currentGatewayIndex];\n // Update the counter, cycling back to 0 when we reach the end\n currentGatewayIndex = (currentGatewayIndex + 1) % IPFS_GATEWAYS.length;\n return `${gateway}${cid}`;\n }\n return value;\n};\n\n/**\n * Every gateway URL an ipfs:// value can resolve to, so a fetch can fail over\n * when a public gateway rejects the request (they rate limit aggressively).\n * Non-IPFS values resolve to themselves.\n */\nexport const resolveIPFSCandidates = (value: string): string[] => {\n if (value.startsWith(\"ipfs://\")) {\n const cid = value.slice(7);\n return IPFS_GATEWAYS.map((gateway) => `${gateway}${cid}`);\n }\n return [value];\n};\n\n/**\n * Bounds for fetching coin metadata from a resolved tokenURI. The URI is\n * attacker-controlled onchain data, so cap the request rather than handing\n * axios an unbounded one.\n */\nconst METADATA_FETCH_TIMEOUT_MS = 15_000;\nconst METADATA_MAX_REDIRECTS = 3;\nconst METADATA_MAX_BYTES = 5 * 1024 * 1024;\n\n/**\n * Fetches token metadata from a resolved tokenURI over HTTP(S).\n *\n * @remarks\n * Applies a timeout, a redirect cap, and a response-size cap, and rejects\n * non-HTTP(S) protocols. It does NOT defend against SSRF: a coin's tokenURI\n * is arbitrary onchain data, so in a server context it can point at private\n * or link-local addresses. When calling this from a server with untrusted\n * coin addresses, route it through your own vetted fetch or egress policy\n * (see `setIPFSResolver` to swap the resolver, and the README).\n */\nexport const fetchTokenUriMetadata = async (url: string): Promise<any> => {\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Unsupported tokenURI protocol: ${url.slice(0, 64)}`);\n }\n const response = await axios.get(url, {\n timeout: METADATA_FETCH_TIMEOUT_MS,\n maxRedirects: METADATA_MAX_REDIRECTS,\n maxContentLength: METADATA_MAX_BYTES,\n maxBodyLength: METADATA_MAX_BYTES,\n });\n return response.data;\n};\n\n/**\n * Fetches token metadata trying each candidate URL in order, so an ipfs://\n * tokenURI survives one public gateway refusing the request. Throws the last\n * error when every candidate fails.\n */\nexport const fetchTokenUriMetadataWithFallback = async (\n urls: string[]\n): Promise<any> => {\n let lastError: unknown;\n for (const url of urls) {\n try {\n return await fetchTokenUriMetadata(url);\n } catch (error) {\n lastError = error;\n }\n }\n throw lastError;\n};\n\n/** Decodes a base64 (optionally data-URL) image into bytes + mime type. */\nconst decodeBase64Image = (\n base64Image: string\n): { bytes: Uint8Array; mimeType: string } => {\n const base64Data = base64Image.split(\",\")[1] || base64Image;\n const byteCharacters = atob(base64Data);\n const bytes = new Uint8Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n bytes[i] = byteCharacters.charCodeAt(i);\n }\n\n let mimeType = \"image/png\"; // default\n if (base64Image.startsWith(\"data:\")) {\n mimeType = base64Image.split(\";\")[0].split(\":\")[1];\n }\n\n return { bytes, mimeType };\n};\n\n/**\n * Pins a token image + metadata through the ubi.fun API upload endpoint (the\n * same path the app uses: POST {apiUrl}/upload) and returns the tokenUri.\n * IP rate limited; 5MB image cap.\n */\nexport const uploadToUbiApi = async (params: {\n apiUrl: string;\n name: string;\n symbol: string;\n base64Image: string;\n description: string;\n websiteUrl?: string;\n discordUrl?: string;\n twitterUrl?: string;\n telegramUrl?: string;\n}): Promise<{ tokenUri: string; image: string }> => {\n const { bytes, mimeType } = decodeBase64Image(params.base64Image);\n\n const formData = new FormData();\n formData.append(\n \"image\",\n new Blob([bytes as BlobPart], { type: mimeType }),\n `image.${mimeType.split(\"/\")[1] ?? \"png\"}`\n );\n formData.append(\"name\", params.name);\n formData.append(\"symbol\", params.symbol);\n formData.append(\"description\", params.description);\n if (params.websiteUrl) {\n formData.append(\"website\", params.websiteUrl);\n }\n if (params.discordUrl) {\n formData.append(\"discord\", params.discordUrl);\n }\n if (params.twitterUrl) {\n formData.append(\"twitter\", params.twitterUrl);\n }\n if (params.telegramUrl) {\n formData.append(\"telegram\", params.telegramUrl);\n }\n\n try {\n const response = await axios.post(`${params.apiUrl}/upload`, formData);\n return {\n tokenUri: response.data.tokenUri,\n image: response.data.image,\n };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new Error(\n `Failed to upload token metadata: ${\n error.response?.data?.error || error.message\n }`\n );\n }\n throw error;\n }\n};\n\n/**\n * Pins the token image + metadata through the ubi.fun API and returns the\n * `ipfs://` tokenUri to pass into a flaunch call.\n *\n * To host metadata yourself (any provider, any storage), skip this entirely:\n * upload however you like, then pass the resulting URI straight to\n * `flaunch({ tokenUri })`.\n */\nexport const generateTokenUri = async (\n name: string,\n symbol: string,\n params: IPFSParams & { chainId: number }\n) => {\n const apiUrl = ApiBaseUrl[params.chainId];\n if (!apiUrl) {\n throw new Error(\n `No ubi.fun API for chain ${params.chainId}; pin the metadata yourself and pass flaunch({ tokenUri })`\n );\n }\n\n const { tokenUri } = await uploadToUbiApi({\n apiUrl,\n name,\n symbol,\n base64Image: params.metadata.base64Image,\n description: params.metadata.description,\n websiteUrl: params.metadata.websiteUrl,\n discordUrl: params.metadata.discordUrl,\n twitterUrl: params.metadata.twitterUrl,\n telegramUrl: params.metadata.telegramUrl,\n });\n\n return tokenUri;\n};\n","import { Chain, defineChain } from \"viem\";\nimport { ARC_MAINNET_CHAIN_ID, ARC_TESTNET_CHAIN_ID } from \"../addresses\";\n\n/**\n * Arc (Circle) chain definitions for viem. Gas is paid in USDC: msg.value is\n * 18-decimal native USDC while the ERC20 interface at 0x3600... is the same\n * asset at 6 decimals.\n *\n * Arc mainnet is in its private phase: provider endpoints (including this\n * default) reject public traffic until Circle opens access, so pass your own\n * transport url. Once the network opens, public RPCs will be plentiful.\n */\nexport const arc = defineChain({\n id: ARC_MAINNET_CHAIN_ID,\n name: \"Arc\",\n nativeCurrency: {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.blockdaemon.mainnet.arc.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Arc Explorer\",\n url: \"https://explorer.arc.io\",\n },\n },\n});\n\nexport const arcTestnet = defineChain({\n id: ARC_TESTNET_CHAIN_ID,\n name: \"Arc Testnet\",\n testnet: true,\n nativeCurrency: {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://arc-testnet.drpc.org\", \"https://rpc.testnet.arc.network\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Arcscan\",\n url: \"https://testnet.arcscan.app\",\n },\n },\n});\n\nexport const chainIdToChain: {\n [key: number]: Chain;\n} = {\n [arc.id]: arc,\n [arcTestnet.id]: arcTestnet,\n};\n"],"names":["hexToBigInt","pad","encodeAbiParameters","defineChain"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./hex.cjs";
2
+ export * from "./ipfs.cjs";
3
+ export * from "./chainIdToChain.cjs";
@@ -0,0 +1,4 @@
1
+ export * from "./hex.js";
2
+ export * from "./ipfs.js";
3
+ export * from "./chainIdToChain.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,184 @@
1
+ import { hexToBigInt, pad, encodeAbiParameters, defineChain } from 'viem';
2
+ import axios from 'axios';
3
+
4
+ const bytes32ToUint256 = (value) => {
5
+ return hexToBigInt(value);
6
+ };
7
+ const uint256ToBytes32 = (value) => {
8
+ return pad(
9
+ encodeAbiParameters([{ type: "uint256", name: "value" }], [value]),
10
+ { size: 32, dir: "right" }
11
+ );
12
+ };
13
+
14
+ const ARC_MAINNET_CHAIN_ID = 5042;
15
+ const ARC_TESTNET_CHAIN_ID = 5042002;
16
+ const ApiBaseUrl = {
17
+ [ARC_MAINNET_CHAIN_ID]: "https://api.ubi.fun",
18
+ [ARC_TESTNET_CHAIN_ID]: "https://api-dev.ubi.fun"
19
+ };
20
+
21
+ const IPFS_GATEWAYS = ["https://ipfs.io/ipfs/", "https://dweb.link/ipfs/"];
22
+ let currentGatewayIndex = 0;
23
+ const resolveIPFS = (value) => {
24
+ if (value.startsWith("ipfs://")) {
25
+ const cid = value.slice(7);
26
+ const gateway = IPFS_GATEWAYS[currentGatewayIndex];
27
+ currentGatewayIndex = (currentGatewayIndex + 1) % IPFS_GATEWAYS.length;
28
+ return `${gateway}${cid}`;
29
+ }
30
+ return value;
31
+ };
32
+ const resolveIPFSCandidates = (value) => {
33
+ if (value.startsWith("ipfs://")) {
34
+ const cid = value.slice(7);
35
+ return IPFS_GATEWAYS.map((gateway) => `${gateway}${cid}`);
36
+ }
37
+ return [value];
38
+ };
39
+ const METADATA_FETCH_TIMEOUT_MS = 15e3;
40
+ const METADATA_MAX_REDIRECTS = 3;
41
+ const METADATA_MAX_BYTES = 5 * 1024 * 1024;
42
+ const fetchTokenUriMetadata = async (url) => {
43
+ if (!/^https?:\/\//i.test(url)) {
44
+ throw new Error(`Unsupported tokenURI protocol: ${url.slice(0, 64)}`);
45
+ }
46
+ const response = await axios.get(url, {
47
+ timeout: METADATA_FETCH_TIMEOUT_MS,
48
+ maxRedirects: METADATA_MAX_REDIRECTS,
49
+ maxContentLength: METADATA_MAX_BYTES,
50
+ maxBodyLength: METADATA_MAX_BYTES
51
+ });
52
+ return response.data;
53
+ };
54
+ const fetchTokenUriMetadataWithFallback = async (urls) => {
55
+ let lastError;
56
+ for (const url of urls) {
57
+ try {
58
+ return await fetchTokenUriMetadata(url);
59
+ } catch (error) {
60
+ lastError = error;
61
+ }
62
+ }
63
+ throw lastError;
64
+ };
65
+ const decodeBase64Image = (base64Image) => {
66
+ const base64Data = base64Image.split(",")[1] || base64Image;
67
+ const byteCharacters = atob(base64Data);
68
+ const bytes = new Uint8Array(byteCharacters.length);
69
+ for (let i = 0; i < byteCharacters.length; i++) {
70
+ bytes[i] = byteCharacters.charCodeAt(i);
71
+ }
72
+ let mimeType = "image/png";
73
+ if (base64Image.startsWith("data:")) {
74
+ mimeType = base64Image.split(";")[0].split(":")[1];
75
+ }
76
+ return { bytes, mimeType };
77
+ };
78
+ const uploadToUbiApi = async (params) => {
79
+ const { bytes, mimeType } = decodeBase64Image(params.base64Image);
80
+ const formData = new FormData();
81
+ formData.append(
82
+ "image",
83
+ new Blob([bytes], { type: mimeType }),
84
+ `image.${mimeType.split("/")[1] ?? "png"}`
85
+ );
86
+ formData.append("name", params.name);
87
+ formData.append("symbol", params.symbol);
88
+ formData.append("description", params.description);
89
+ if (params.websiteUrl) {
90
+ formData.append("website", params.websiteUrl);
91
+ }
92
+ if (params.discordUrl) {
93
+ formData.append("discord", params.discordUrl);
94
+ }
95
+ if (params.twitterUrl) {
96
+ formData.append("twitter", params.twitterUrl);
97
+ }
98
+ if (params.telegramUrl) {
99
+ formData.append("telegram", params.telegramUrl);
100
+ }
101
+ try {
102
+ const response = await axios.post(`${params.apiUrl}/upload`, formData);
103
+ return {
104
+ tokenUri: response.data.tokenUri,
105
+ image: response.data.image
106
+ };
107
+ } catch (error) {
108
+ if (axios.isAxiosError(error)) {
109
+ throw new Error(
110
+ `Failed to upload token metadata: ${error.response?.data?.error || error.message}`
111
+ );
112
+ }
113
+ throw error;
114
+ }
115
+ };
116
+ const generateTokenUri = async (name, symbol, params) => {
117
+ const apiUrl = ApiBaseUrl[params.chainId];
118
+ if (!apiUrl) {
119
+ throw new Error(
120
+ `No ubi.fun API for chain ${params.chainId}; pin the metadata yourself and pass flaunch({ tokenUri })`
121
+ );
122
+ }
123
+ const { tokenUri } = await uploadToUbiApi({
124
+ apiUrl,
125
+ name,
126
+ symbol,
127
+ base64Image: params.metadata.base64Image,
128
+ description: params.metadata.description,
129
+ websiteUrl: params.metadata.websiteUrl,
130
+ discordUrl: params.metadata.discordUrl,
131
+ twitterUrl: params.metadata.twitterUrl,
132
+ telegramUrl: params.metadata.telegramUrl
133
+ });
134
+ return tokenUri;
135
+ };
136
+
137
+ const arc = defineChain({
138
+ id: ARC_MAINNET_CHAIN_ID,
139
+ name: "Arc",
140
+ nativeCurrency: {
141
+ name: "USD Coin",
142
+ symbol: "USDC",
143
+ decimals: 18
144
+ },
145
+ rpcUrls: {
146
+ default: {
147
+ http: ["https://rpc.blockdaemon.mainnet.arc.io"]
148
+ }
149
+ },
150
+ blockExplorers: {
151
+ default: {
152
+ name: "Arc Explorer",
153
+ url: "https://explorer.arc.io"
154
+ }
155
+ }
156
+ });
157
+ const arcTestnet = defineChain({
158
+ id: ARC_TESTNET_CHAIN_ID,
159
+ name: "Arc Testnet",
160
+ testnet: true,
161
+ nativeCurrency: {
162
+ name: "USD Coin",
163
+ symbol: "USDC",
164
+ decimals: 18
165
+ },
166
+ rpcUrls: {
167
+ default: {
168
+ http: ["https://arc-testnet.drpc.org", "https://rpc.testnet.arc.network"]
169
+ }
170
+ },
171
+ blockExplorers: {
172
+ default: {
173
+ name: "Arcscan",
174
+ url: "https://testnet.arcscan.app"
175
+ }
176
+ }
177
+ });
178
+ const chainIdToChain = {
179
+ [arc.id]: arc,
180
+ [arcTestnet.id]: arcTestnet
181
+ };
182
+
183
+ export { arc, arcTestnet, bytes32ToUint256, chainIdToChain, fetchTokenUriMetadata, fetchTokenUriMetadataWithFallback, generateTokenUri, resolveIPFS, resolveIPFSCandidates, uint256ToBytes32, uploadToUbiApi };
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/helpers/hex.ts","../../src/addresses.ts","../../src/helpers/ipfs.ts","../../src/helpers/chainIdToChain.ts"],"sourcesContent":["import { encodeAbiParameters, Hex, hexToBigInt, pad } from \"viem\";\n\nexport const bytes32ToUint256 = (value: Hex) => {\n return hexToBigInt(value);\n};\n\nexport const uint256ToBytes32 = (value: bigint) => {\n return pad(\n encodeAbiParameters([{ type: \"uint256\", name: \"value\" }], [value]),\n { size: 32, dir: \"right\" }\n );\n};\n","import { Addresses } from \"./types\";\n\n/**\n * ubi.fun deployments on Arc (Circle).\n *\n * Source of truth: deployments/arc-mainnet-5042.json and\n * deployments/arc-testnet-5042002.json in the contracts repo, mirrored by the\n * committed frontend registry. The cash / native asset on Arc is native USDC\n * (6 decimals through its ERC20 interface) at\n * 0x3600000000000000000000000000000000000000: the position manager's\n * \"nativeToken\" slot IS this USDC, and every pool pairs a coin against it.\n * There is no flETH, no WETH wrapping, and no unwrap step on this chain.\n */\nexport const ARC_MAINNET_CHAIN_ID = 5042;\nexport const ARC_TESTNET_CHAIN_ID = 5042002;\n\n/** Arc native USDC (ERC20 interface, 6 decimals). The cash side of every pool. */\nexport const USDC_ADDRESS =\n \"0x3600000000000000000000000000000000000000\" as const;\n\n/**\n * The pool \"native token\": Arc native USDC on both networks. Kept as an\n * Addresses map so client code stays chain-keyed like every other contract.\n */\nexport const NativeTokenAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: USDC_ADDRESS,\n [ARC_TESTNET_CHAIN_ID]: USDC_ADDRESS,\n};\n\nexport const FlaunchZapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe07F7cA66EC795592385018Dd998F0B50b8A2834\",\n [ARC_TESTNET_CHAIN_ID]: \"0x3fd667aaa89519772bb44e984de408bfcd40e285\",\n};\n\n// SDK \"FlaunchPositionManager\" maps to our deployment \"PositionManager\".\nexport const FlaunchPositionManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC780c0f4aAc690908854D351b8bFda2812daeFDc\",\n [ARC_TESTNET_CHAIN_ID]: \"0x88af0b76752ff31aa351cea2cc2e43a1b7c32fdc\",\n};\n\nexport const FlaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x93E5A7565008db9688BA5211Fa552d8b108B9c75\",\n [ARC_TESTNET_CHAIN_ID]: \"0x55a0e1a458f1c13023dbd6b204e2a439c3b44663\",\n};\n\nexport const FairLaunchAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xdCDADa707264d9e2B0E8c2feC467860C97434Bd4\",\n [ARC_TESTNET_CHAIN_ID]: \"0xd2ea5591fe0b5820b6de33afbc3b468d070038ea\",\n};\n\n// SDK \"BidWall\" maps to our deployment \"BurningBidWall\" (a modified BidWall).\nexport const BidWallAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xC5DD30802fefab789Cd9b1e835Bd7301a8D23F8A\",\n [ARC_TESTNET_CHAIN_ID]: \"0x04f947e5fc0ac42836f880d45705af7483a2c4c0\",\n};\n\n/** Referrer-aware swap router: the supported way to trade ubi.fun pools. */\nexport const PoolSwapAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x3A61B6E86fde5Fc657a48819837F346C7E2Fffa7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x396d41eb4d110d64491d01cd186548fdc82b1b4a\",\n};\n\nexport const TreasuryManagerFactoryAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xE25C132F379DB49C463328eF427E28DBCbD3a2F0\",\n [ARC_TESTNET_CHAIN_ID]: \"0x093c10b780f7cf8fca9aa7dbc83a64cddf55215f\",\n};\n\n// The approved AddressFeeSplitManager IMPLEMENTATION (factory deploys clones).\nexport const AddressFeeSplitManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xde10818344f5ab75ecfA772887cE5751D6Cb91C7\",\n [ARC_TESTNET_CHAIN_ID]: \"0xA7d182B81aF7B40b6d09Da88A12a4f7ad770e162\",\n};\n\n/** Creator revenue escrow: balances accrue here, claimed as USDC (unwrap=false). */\nexport const FeeEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x678f0D1C045e820Ec1d4806749f2629e1035550e\",\n [ARC_TESTNET_CHAIN_ID]: \"0x59b3269aaf9db83bd3029c84d8b5226fa5702f78\",\n};\n\n/** Referrer rewards escrow: 5% of every swap fee routed with your address. */\nexport const ReferralEscrowAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf25B9ceAba005CcCb0cefC4e323e6e519F111eB3\",\n [ARC_TESTNET_CHAIN_ID]: \"0x51b6a4759f9c9a681349c857f6fd912cdfeb8fef\",\n};\n\n/** X-handle earnings registry: per-handle CREATE2 escrows + attested claims. */\nexport const XHandleClaimsAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xfC38298590893c39E46D319aEd9EC3bf6CB17A3E\",\n [ARC_TESTNET_CHAIN_ID]: \"0x6fE2b9e1Da493E4584e742C03e1926a4CD8AC2A1\",\n};\n\n/**\n * Morpho UniversalRewardsDistributor paying the daily USDC holder pool\n * (24% of every swap fee). Claims are Merkle-proofed cumulative amounts.\n */\nexport const UniversalRewardsDistributorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x66003091e723778d7D3285BB6c24ff3F0Ddcc7F7\",\n [ARC_TESTNET_CHAIN_ID]: \"0x7a8e9dA46db2be8436c4404476b40F07a31A6d95\",\n};\n\n/** Uniswap v4 PoolManager (canonical deployment on mainnet, ours on testnet). */\nexport const PoolManagerAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x8366a39CC670B4001A1121B8F6A443A643e40951\",\n [ARC_TESTNET_CHAIN_ID]: \"0x5fb24c800133a0930280788c5eb3468764154309\",\n};\n\nexport const QuoterAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x4595D3CD7A6D98d83A719934e829db5076fF1d0d\",\n [ARC_TESTNET_CHAIN_ID]: \"0xf517623f178Ba90e5b3299cb121D38F5A0733ac4\",\n};\n\n/** Base URL of the ubi.fun read/upload API serving each network. */\nexport const ApiBaseUrl: { [chainId: number]: string } = {\n [ARC_MAINNET_CHAIN_ID]: \"https://api.ubi.fun\",\n [ARC_TESTNET_CHAIN_ID]: \"https://api-dev.ubi.fun\",\n};\n","import axios from \"axios\";\nimport { IPFSParams } from \"../types\";\nimport { ApiBaseUrl } from \"../addresses\";\n\n// List of public IPFS gateways to cycle through\nconst IPFS_GATEWAYS = [\"https://ipfs.io/ipfs/\", \"https://dweb.link/ipfs/\"];\n\n// Counter to track the current gateway index\nlet currentGatewayIndex = 0;\n\nexport const resolveIPFS = (value: string): string => {\n if (value.startsWith(\"ipfs://\")) {\n const cid = value.slice(7);\n // Get the next gateway and increment the counter\n const gateway = IPFS_GATEWAYS[currentGatewayIndex];\n // Update the counter, cycling back to 0 when we reach the end\n currentGatewayIndex = (currentGatewayIndex + 1) % IPFS_GATEWAYS.length;\n return `${gateway}${cid}`;\n }\n return value;\n};\n\n/**\n * Every gateway URL an ipfs:// value can resolve to, so a fetch can fail over\n * when a public gateway rejects the request (they rate limit aggressively).\n * Non-IPFS values resolve to themselves.\n */\nexport const resolveIPFSCandidates = (value: string): string[] => {\n if (value.startsWith(\"ipfs://\")) {\n const cid = value.slice(7);\n return IPFS_GATEWAYS.map((gateway) => `${gateway}${cid}`);\n }\n return [value];\n};\n\n/**\n * Bounds for fetching coin metadata from a resolved tokenURI. The URI is\n * attacker-controlled onchain data, so cap the request rather than handing\n * axios an unbounded one.\n */\nconst METADATA_FETCH_TIMEOUT_MS = 15_000;\nconst METADATA_MAX_REDIRECTS = 3;\nconst METADATA_MAX_BYTES = 5 * 1024 * 1024;\n\n/**\n * Fetches token metadata from a resolved tokenURI over HTTP(S).\n *\n * @remarks\n * Applies a timeout, a redirect cap, and a response-size cap, and rejects\n * non-HTTP(S) protocols. It does NOT defend against SSRF: a coin's tokenURI\n * is arbitrary onchain data, so in a server context it can point at private\n * or link-local addresses. When calling this from a server with untrusted\n * coin addresses, route it through your own vetted fetch or egress policy\n * (see `setIPFSResolver` to swap the resolver, and the README).\n */\nexport const fetchTokenUriMetadata = async (url: string): Promise<any> => {\n if (!/^https?:\\/\\//i.test(url)) {\n throw new Error(`Unsupported tokenURI protocol: ${url.slice(0, 64)}`);\n }\n const response = await axios.get(url, {\n timeout: METADATA_FETCH_TIMEOUT_MS,\n maxRedirects: METADATA_MAX_REDIRECTS,\n maxContentLength: METADATA_MAX_BYTES,\n maxBodyLength: METADATA_MAX_BYTES,\n });\n return response.data;\n};\n\n/**\n * Fetches token metadata trying each candidate URL in order, so an ipfs://\n * tokenURI survives one public gateway refusing the request. Throws the last\n * error when every candidate fails.\n */\nexport const fetchTokenUriMetadataWithFallback = async (\n urls: string[]\n): Promise<any> => {\n let lastError: unknown;\n for (const url of urls) {\n try {\n return await fetchTokenUriMetadata(url);\n } catch (error) {\n lastError = error;\n }\n }\n throw lastError;\n};\n\n/** Decodes a base64 (optionally data-URL) image into bytes + mime type. */\nconst decodeBase64Image = (\n base64Image: string\n): { bytes: Uint8Array; mimeType: string } => {\n const base64Data = base64Image.split(\",\")[1] || base64Image;\n const byteCharacters = atob(base64Data);\n const bytes = new Uint8Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n bytes[i] = byteCharacters.charCodeAt(i);\n }\n\n let mimeType = \"image/png\"; // default\n if (base64Image.startsWith(\"data:\")) {\n mimeType = base64Image.split(\";\")[0].split(\":\")[1];\n }\n\n return { bytes, mimeType };\n};\n\n/**\n * Pins a token image + metadata through the ubi.fun API upload endpoint (the\n * same path the app uses: POST {apiUrl}/upload) and returns the tokenUri.\n * IP rate limited; 5MB image cap.\n */\nexport const uploadToUbiApi = async (params: {\n apiUrl: string;\n name: string;\n symbol: string;\n base64Image: string;\n description: string;\n websiteUrl?: string;\n discordUrl?: string;\n twitterUrl?: string;\n telegramUrl?: string;\n}): Promise<{ tokenUri: string; image: string }> => {\n const { bytes, mimeType } = decodeBase64Image(params.base64Image);\n\n const formData = new FormData();\n formData.append(\n \"image\",\n new Blob([bytes as BlobPart], { type: mimeType }),\n `image.${mimeType.split(\"/\")[1] ?? \"png\"}`\n );\n formData.append(\"name\", params.name);\n formData.append(\"symbol\", params.symbol);\n formData.append(\"description\", params.description);\n if (params.websiteUrl) {\n formData.append(\"website\", params.websiteUrl);\n }\n if (params.discordUrl) {\n formData.append(\"discord\", params.discordUrl);\n }\n if (params.twitterUrl) {\n formData.append(\"twitter\", params.twitterUrl);\n }\n if (params.telegramUrl) {\n formData.append(\"telegram\", params.telegramUrl);\n }\n\n try {\n const response = await axios.post(`${params.apiUrl}/upload`, formData);\n return {\n tokenUri: response.data.tokenUri,\n image: response.data.image,\n };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n throw new Error(\n `Failed to upload token metadata: ${\n error.response?.data?.error || error.message\n }`\n );\n }\n throw error;\n }\n};\n\n/**\n * Pins the token image + metadata through the ubi.fun API and returns the\n * `ipfs://` tokenUri to pass into a flaunch call.\n *\n * To host metadata yourself (any provider, any storage), skip this entirely:\n * upload however you like, then pass the resulting URI straight to\n * `flaunch({ tokenUri })`.\n */\nexport const generateTokenUri = async (\n name: string,\n symbol: string,\n params: IPFSParams & { chainId: number }\n) => {\n const apiUrl = ApiBaseUrl[params.chainId];\n if (!apiUrl) {\n throw new Error(\n `No ubi.fun API for chain ${params.chainId}; pin the metadata yourself and pass flaunch({ tokenUri })`\n );\n }\n\n const { tokenUri } = await uploadToUbiApi({\n apiUrl,\n name,\n symbol,\n base64Image: params.metadata.base64Image,\n description: params.metadata.description,\n websiteUrl: params.metadata.websiteUrl,\n discordUrl: params.metadata.discordUrl,\n twitterUrl: params.metadata.twitterUrl,\n telegramUrl: params.metadata.telegramUrl,\n });\n\n return tokenUri;\n};\n","import { Chain, defineChain } from \"viem\";\nimport { ARC_MAINNET_CHAIN_ID, ARC_TESTNET_CHAIN_ID } from \"../addresses\";\n\n/**\n * Arc (Circle) chain definitions for viem. Gas is paid in USDC: msg.value is\n * 18-decimal native USDC while the ERC20 interface at 0x3600... is the same\n * asset at 6 decimals.\n *\n * Arc mainnet is in its private phase: provider endpoints (including this\n * default) reject public traffic until Circle opens access, so pass your own\n * transport url. Once the network opens, public RPCs will be plentiful.\n */\nexport const arc = defineChain({\n id: ARC_MAINNET_CHAIN_ID,\n name: \"Arc\",\n nativeCurrency: {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.blockdaemon.mainnet.arc.io\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Arc Explorer\",\n url: \"https://explorer.arc.io\",\n },\n },\n});\n\nexport const arcTestnet = defineChain({\n id: ARC_TESTNET_CHAIN_ID,\n name: \"Arc Testnet\",\n testnet: true,\n nativeCurrency: {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://arc-testnet.drpc.org\", \"https://rpc.testnet.arc.network\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Arcscan\",\n url: \"https://testnet.arcscan.app\",\n },\n },\n});\n\nexport const chainIdToChain: {\n [key: number]: Chain;\n} = {\n [arc.id]: arc,\n [arcTestnet.id]: arcTestnet,\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { IPFSParams } from "../types.cjs";
2
+ export declare const resolveIPFS: (value: string) => string;
3
+ /**
4
+ * Every gateway URL an ipfs:// value can resolve to, so a fetch can fail over
5
+ * when a public gateway rejects the request (they rate limit aggressively).
6
+ * Non-IPFS values resolve to themselves.
7
+ */
8
+ export declare const resolveIPFSCandidates: (value: string) => string[];
9
+ /**
10
+ * Fetches token metadata from a resolved tokenURI over HTTP(S).
11
+ *
12
+ * @remarks
13
+ * Applies a timeout, a redirect cap, and a response-size cap, and rejects
14
+ * non-HTTP(S) protocols. It does NOT defend against SSRF: a coin's tokenURI
15
+ * is arbitrary onchain data, so in a server context it can point at private
16
+ * or link-local addresses. When calling this from a server with untrusted
17
+ * coin addresses, route it through your own vetted fetch or egress policy
18
+ * (see `setIPFSResolver` to swap the resolver, and the README).
19
+ */
20
+ export declare const fetchTokenUriMetadata: (url: string) => Promise<any>;
21
+ /**
22
+ * Fetches token metadata trying each candidate URL in order, so an ipfs://
23
+ * tokenURI survives one public gateway refusing the request. Throws the last
24
+ * error when every candidate fails.
25
+ */
26
+ export declare const fetchTokenUriMetadataWithFallback: (urls: string[]) => Promise<any>;
27
+ /**
28
+ * Pins a token image + metadata through the ubi.fun API upload endpoint (the
29
+ * same path the app uses: POST {apiUrl}/upload) and returns the tokenUri.
30
+ * IP rate limited; 5MB image cap.
31
+ */
32
+ export declare const uploadToUbiApi: (params: {
33
+ apiUrl: string;
34
+ name: string;
35
+ symbol: string;
36
+ base64Image: string;
37
+ description: string;
38
+ websiteUrl?: string;
39
+ discordUrl?: string;
40
+ twitterUrl?: string;
41
+ telegramUrl?: string;
42
+ }) => Promise<{
43
+ tokenUri: string;
44
+ image: string;
45
+ }>;
46
+ /**
47
+ * Pins the token image + metadata through the ubi.fun API and returns the
48
+ * `ipfs://` tokenUri to pass into a flaunch call.
49
+ *
50
+ * To host metadata yourself (any provider, any storage), skip this entirely:
51
+ * upload however you like, then pass the resulting URI straight to
52
+ * `flaunch({ tokenUri })`.
53
+ */
54
+ export declare const generateTokenUri: (name: string, symbol: string, params: IPFSParams & {
55
+ chainId: number;
56
+ }) => Promise<string>;
@@ -0,0 +1,57 @@
1
+ import { IPFSParams } from "../types.js";
2
+ export declare const resolveIPFS: (value: string) => string;
3
+ /**
4
+ * Every gateway URL an ipfs:// value can resolve to, so a fetch can fail over
5
+ * when a public gateway rejects the request (they rate limit aggressively).
6
+ * Non-IPFS values resolve to themselves.
7
+ */
8
+ export declare const resolveIPFSCandidates: (value: string) => string[];
9
+ /**
10
+ * Fetches token metadata from a resolved tokenURI over HTTP(S).
11
+ *
12
+ * @remarks
13
+ * Applies a timeout, a redirect cap, and a response-size cap, and rejects
14
+ * non-HTTP(S) protocols. It does NOT defend against SSRF: a coin's tokenURI
15
+ * is arbitrary onchain data, so in a server context it can point at private
16
+ * or link-local addresses. When calling this from a server with untrusted
17
+ * coin addresses, route it through your own vetted fetch or egress policy
18
+ * (see `setIPFSResolver` to swap the resolver, and the README).
19
+ */
20
+ export declare const fetchTokenUriMetadata: (url: string) => Promise<any>;
21
+ /**
22
+ * Fetches token metadata trying each candidate URL in order, so an ipfs://
23
+ * tokenURI survives one public gateway refusing the request. Throws the last
24
+ * error when every candidate fails.
25
+ */
26
+ export declare const fetchTokenUriMetadataWithFallback: (urls: string[]) => Promise<any>;
27
+ /**
28
+ * Pins a token image + metadata through the ubi.fun API upload endpoint (the
29
+ * same path the app uses: POST {apiUrl}/upload) and returns the tokenUri.
30
+ * IP rate limited; 5MB image cap.
31
+ */
32
+ export declare const uploadToUbiApi: (params: {
33
+ apiUrl: string;
34
+ name: string;
35
+ symbol: string;
36
+ base64Image: string;
37
+ description: string;
38
+ websiteUrl?: string;
39
+ discordUrl?: string;
40
+ twitterUrl?: string;
41
+ telegramUrl?: string;
42
+ }) => Promise<{
43
+ tokenUri: string;
44
+ image: string;
45
+ }>;
46
+ /**
47
+ * Pins the token image + metadata through the ubi.fun API and returns the
48
+ * `ipfs://` tokenUri to pass into a flaunch call.
49
+ *
50
+ * To host metadata yourself (any provider, any storage), skip this entirely:
51
+ * upload however you like, then pass the resulting URI straight to
52
+ * `flaunch({ tokenUri })`.
53
+ */
54
+ export declare const generateTokenUri: (name: string, symbol: string, params: IPFSParams & {
55
+ chainId: number;
56
+ }) => Promise<string>;
57
+ //# sourceMappingURL=ipfs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../src/helpers/ipfs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAStC,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAU3C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,KAAG,MAAM,EAM3D,CAAC;AAWF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,GAAG,CAWpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAC5C,MAAM,MAAM,EAAE,KACb,OAAO,CAAC,GAAG,CAUb,CAAC;AAqBF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,QAAQ;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,KAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyC9C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,QAAQ,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,oBAsBzC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { BuySwapLog, PoolCreatedLogs, SellSwapLog } from "../clients/FlaunchPositionManagerClient.cjs";
2
+ import { ReadFlaunchSDK } from "../sdk/FlaunchSDK.cjs";
3
+ import { Address } from "viem";
4
+ /**
5
+ * Hook to watch and track pool creation events (new coin launches)
6
+ * @param flaunch - Instance of ReadFlaunchSDK to interact with the contract
7
+ * @param startBlockNumber - Optional block number to start watching events from
8
+ * @returns Object containing:
9
+ * - logs: Array of pool creation events in reverse chronological order
10
+ * - isFetchingFromStart: Boolean indicating if initial historical events are being fetched
11
+ */
12
+ export declare function usePoolCreatedEvents(flaunch: ReadFlaunchSDK, startBlockNumber?: bigint): {
13
+ logs: PoolCreatedLogs;
14
+ isFetchingFromStart: boolean;
15
+ };
16
+ /**
17
+ * Hook to watch and track swap events (buys/sells) for a specific coin
18
+ * @param flaunch - Instance of ReadFlaunchSDK to interact with the contract
19
+ * @param coinAddress - Address of the coin to watch swaps for
20
+ * @param startBlockNumber - Optional block number to start watching events from
21
+ * @returns Object containing:
22
+ * - logs: Array of swap events (both buys and sells) in reverse chronological order
23
+ * - isFetchingFromStart: Boolean indicating if initial historical events are being fetched
24
+ */
25
+ export declare function usePoolSwapEvents(flaunch: ReadFlaunchSDK, coinAddress: Address, startBlockNumber?: bigint): {
26
+ logs: (BuySwapLog | SellSwapLog)[];
27
+ isFetchingFromStart: boolean;
28
+ };
@@ -0,0 +1,29 @@
1
+ import { BuySwapLog, PoolCreatedLogs, SellSwapLog } from "../clients/FlaunchPositionManagerClient.js";
2
+ import { ReadFlaunchSDK } from "../sdk/FlaunchSDK.js";
3
+ import { Address } from "viem";
4
+ /**
5
+ * Hook to watch and track pool creation events (new coin launches)
6
+ * @param flaunch - Instance of ReadFlaunchSDK to interact with the contract
7
+ * @param startBlockNumber - Optional block number to start watching events from
8
+ * @returns Object containing:
9
+ * - logs: Array of pool creation events in reverse chronological order
10
+ * - isFetchingFromStart: Boolean indicating if initial historical events are being fetched
11
+ */
12
+ export declare function usePoolCreatedEvents(flaunch: ReadFlaunchSDK, startBlockNumber?: bigint): {
13
+ logs: PoolCreatedLogs;
14
+ isFetchingFromStart: boolean;
15
+ };
16
+ /**
17
+ * Hook to watch and track swap events (buys/sells) for a specific coin
18
+ * @param flaunch - Instance of ReadFlaunchSDK to interact with the contract
19
+ * @param coinAddress - Address of the coin to watch swaps for
20
+ * @param startBlockNumber - Optional block number to start watching events from
21
+ * @returns Object containing:
22
+ * - logs: Array of swap events (both buys and sells) in reverse chronological order
23
+ * - isFetchingFromStart: Boolean indicating if initial historical events are being fetched
24
+ */
25
+ export declare function usePoolSwapEvents(flaunch: ReadFlaunchSDK, coinAddress: Address, startBlockNumber?: bigint): {
26
+ logs: (BuySwapLog | SellSwapLog)[];
27
+ isFetchingFromStart: boolean;
28
+ };
29
+ //# sourceMappingURL=FlaunchPositionManagerHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlaunchPositionManagerHooks.d.ts","sourceRoot":"","sources":["../../src/hooks/FlaunchPositionManagerHooks.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACZ,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,gBAAgB,CAAC,EAAE,MAAM;;;EAyC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,OAAO,EACpB,gBAAgB,CAAC,EAAE,MAAM;;;EA0C1B"}