@ubi.fun/sdk 0.1.1 → 0.2.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.
- package/README.md +33 -0
- package/dist/abi/DividendVault.d.cts +670 -0
- package/dist/abi/DividendVault.d.ts +671 -0
- package/dist/abi/DividendVault.d.ts.map +1 -0
- package/dist/abi/HolderShareFeeCalculator.d.cts +287 -0
- package/dist/abi/HolderShareFeeCalculator.d.ts +288 -0
- package/dist/abi/HolderShareFeeCalculator.d.ts.map +1 -0
- package/dist/abi/IndexerSubscriber.d.cts +221 -0
- package/dist/abi/IndexerSubscriber.d.ts +222 -0
- package/dist/abi/IndexerSubscriber.d.ts.map +1 -0
- package/dist/abi/MemecoinDividends.d.cts +1021 -0
- package/dist/abi/MemecoinDividends.d.ts +1022 -0
- package/dist/abi/MemecoinDividends.d.ts.map +1 -0
- package/dist/abi/index.cjs +6447 -3585
- package/dist/abi/index.cjs.map +1 -1
- package/dist/abi/index.d.cts +4 -0
- package/dist/abi/index.d.ts +4 -0
- package/dist/abi/index.d.ts.map +1 -1
- package/dist/abi/index.js +6444 -3586
- package/dist/abi/index.js.map +1 -1
- package/dist/addresses/index.cjs +17 -0
- package/dist/addresses/index.cjs.map +1 -1
- package/dist/addresses/index.js +14 -1
- package/dist/addresses/index.js.map +1 -1
- package/dist/addresses.d.cts +25 -0
- package/dist/addresses.d.ts +25 -0
- package/dist/addresses.d.ts.map +1 -1
- package/dist/clients/DividendVaultClient.d.cts +32 -0
- package/dist/clients/DividendVaultClient.d.ts +33 -0
- package/dist/clients/DividendVaultClient.d.ts.map +1 -0
- package/dist/clients/FlaunchPositionManagerClient.d.cts +18 -0
- package/dist/clients/FlaunchPositionManagerClient.d.ts +18 -0
- package/dist/clients/FlaunchPositionManagerClient.d.ts.map +1 -1
- package/dist/clients/FlaunchZapClient.d.cts +41 -0
- package/dist/clients/FlaunchZapClient.d.ts +41 -0
- package/dist/clients/FlaunchZapClient.d.ts.map +1 -1
- package/dist/clients/IndexerSubscriberClient.d.cts +46 -0
- package/dist/clients/IndexerSubscriberClient.d.ts +47 -0
- package/dist/clients/IndexerSubscriberClient.d.ts.map +1 -0
- package/dist/clients/MemecoinDividendsClient.d.cts +23 -0
- package/dist/clients/MemecoinDividendsClient.d.ts +24 -0
- package/dist/clients/MemecoinDividendsClient.d.ts.map +1 -0
- package/dist/helpers/index.cjs.map +1 -1
- package/dist/helpers/index.js.map +1 -1
- package/dist/index.cjs +11710 -8366
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11687 -8368
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/dist/sdk/FlaunchSDK.d.cts +47 -1
- package/dist/sdk/FlaunchSDK.d.ts +47 -1
- package/dist/sdk/FlaunchSDK.d.ts.map +1 -1
- package/dist/utils/creatorVaults.d.cts +64 -0
- package/dist/utils/creatorVaults.d.ts +65 -0
- package/dist/utils/creatorVaults.d.ts.map +1 -0
- package/dist/utils/index.cjs +64 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +55 -2
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexerSubscriberClient.d.ts","sourceRoot":"","sources":["../../src/clients/IndexerSubscriberClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,SAAS,EAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC;AAE/D;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,SAAgB,QAAQ,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;IAE7D;;;;OAIG;gBACS,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,KAAqB;IAW1D;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE;;;;;;IAM3C;;OAEG;IACG,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAIrE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReadContract, type Address, type Drift, type ReadWriteContract, type ReadWriteAdapter } from "@delvtech/drift";
|
|
2
|
+
import { MemecoinDividendsAbi } from "../abi/MemecoinDividends.cjs";
|
|
3
|
+
export type MemecoinDividendsABI = typeof MemecoinDividendsAbi;
|
|
4
|
+
/** Read client for the holder dividends of a creator vault token (6-decimal USDC amounts). */
|
|
5
|
+
export declare class ReadMemecoinDividends {
|
|
6
|
+
readonly contract: ReadContract<MemecoinDividendsABI>;
|
|
7
|
+
constructor(address: Address, drift?: Drift);
|
|
8
|
+
/** USDC the holder can withdraw now. */
|
|
9
|
+
withdrawableDividendOf(holder: Address): Promise<bigint>;
|
|
10
|
+
/** USDC still dripping out over the current 24-hour window. */
|
|
11
|
+
dividendsDripping(): Promise<bigint>;
|
|
12
|
+
/** USDC committed to holders so far, still dripping included. */
|
|
13
|
+
totalDividendsDistributed(): Promise<bigint>;
|
|
14
|
+
}
|
|
15
|
+
/** Write client for the holder dividends of a creator vault token. */
|
|
16
|
+
export declare class ReadWriteMemecoinDividends extends ReadMemecoinDividends {
|
|
17
|
+
contract: ReadWriteContract<MemecoinDividendsABI>;
|
|
18
|
+
constructor(address: Address, drift?: Drift<ReadWriteAdapter>);
|
|
19
|
+
/** Withdraws the caller's dividends. */
|
|
20
|
+
withdrawDividend(): Promise<`0x${string}`>;
|
|
21
|
+
/** Pays a holder their dividends (anyone can call; the USDC always goes to the holder). */
|
|
22
|
+
withdrawDividendFor(holder: Address): Promise<`0x${string}`>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ReadContract, type Address, type Drift, type ReadWriteContract, type ReadWriteAdapter } from "@delvtech/drift";
|
|
2
|
+
import { MemecoinDividendsAbi } from "../abi/MemecoinDividends.js";
|
|
3
|
+
export type MemecoinDividendsABI = typeof MemecoinDividendsAbi;
|
|
4
|
+
/** Read client for the holder dividends of a creator vault token (6-decimal USDC amounts). */
|
|
5
|
+
export declare class ReadMemecoinDividends {
|
|
6
|
+
readonly contract: ReadContract<MemecoinDividendsABI>;
|
|
7
|
+
constructor(address: Address, drift?: Drift);
|
|
8
|
+
/** USDC the holder can withdraw now. */
|
|
9
|
+
withdrawableDividendOf(holder: Address): Promise<bigint>;
|
|
10
|
+
/** USDC still dripping out over the current 24-hour window. */
|
|
11
|
+
dividendsDripping(): Promise<bigint>;
|
|
12
|
+
/** USDC committed to holders so far, still dripping included. */
|
|
13
|
+
totalDividendsDistributed(): Promise<bigint>;
|
|
14
|
+
}
|
|
15
|
+
/** Write client for the holder dividends of a creator vault token. */
|
|
16
|
+
export declare class ReadWriteMemecoinDividends extends ReadMemecoinDividends {
|
|
17
|
+
contract: ReadWriteContract<MemecoinDividendsABI>;
|
|
18
|
+
constructor(address: Address, drift?: Drift<ReadWriteAdapter>);
|
|
19
|
+
/** Withdraws the caller's dividends. */
|
|
20
|
+
withdrawDividend(): Promise<`0x${string}`>;
|
|
21
|
+
/** Pays a holder their dividends (anyone can call; the USDC always goes to the holder). */
|
|
22
|
+
withdrawDividendFor(holder: Address): Promise<`0x${string}`>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=MemecoinDividendsClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemecoinDividendsClient.d.ts","sourceRoot":"","sources":["../../src/clients/MemecoinDividendsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC;AAE/D,8FAA8F;AAC9F,qBAAa,qBAAqB;IAChC,SAAgB,QAAQ,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC;gBAEjD,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,KAAqB;IAU1D,wCAAwC;IAClC,sBAAsB,CAAC,MAAM,EAAE,OAAO;IAK5C,+DAA+D;IACzD,iBAAiB;IAKvB,iEAAiE;IAC3D,yBAAyB;CAIhC;AAED,sEAAsE;AACtE,qBAAa,0BAA2B,SAAQ,qBAAqB;IAC3D,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAE9C,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,KAAK,CAAC,gBAAgB,CAAiB;IAI5E,wCAAwC;IACxC,gBAAgB;IAIhB,2FAA2F;IAC3F,mBAAmB,CAAC,MAAM,EAAE,OAAO;CAGpC"}
|
|
@@ -1 +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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"}
|
|
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/**\n * Creator vaults (docs/CREATOR-VAULTS.md in the contracts repo): the approved DividendVault\n * IMPLEMENTATION every new launch clones, and the HolderShareFeeCalculator. Empty until the\n * contracts are deployed; once the calculator is the PositionManager's fee calculator, every\n * launch must attach a vault (`flaunchWithVault`).\n */\nexport const DividendVaultAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xA9E566b548D5D0203e4d00bc3dFdB4BC38883514\",\n};\nexport const HolderShareFeeCalculatorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe5737916951Fe20235Bddef5a65af5d18406f92E\",\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/**\n * Uniswap v4 StateView (canonical periphery view over PoolManager storage).\n *\n * MAINNET ONLY. Arc testnet runs our own PoolManager instance, and no StateView\n * was deployed against it, so there is no testnet entry. The SDK does not\n * depend on StateView on either network: `ReadPoolManager` reads slot0,\n * liquidity, positions and tick data straight from PoolManager storage with\n * `extsload`, using the same slot derivations as Uniswap's StateLibrary. Use\n * that path if you need one code path across both chains.\n */\nexport const StateViewAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b\",\n};\n\n/**\n * IndexerSubscriber: on-chain reverse index PoolId -> (flaunch, memecoin,\n * memecoinTreasury, tokenId). Attached to the PositionManager's Notifier, so it\n * is populated at pool initialisation. See contracts/IndexerSubscriber.sol.\n */\nexport const IndexerSubscriberAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x2c68B21C9f8b899a662A71dd188C1c919D578a9F\",\n [ARC_TESTNET_CHAIN_ID]: \"0xe6d8164d67c60ff860e1a0d90636f5f65b665be7\",\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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"}
|
|
@@ -1 +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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"}
|
|
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/**\n * Creator vaults (docs/CREATOR-VAULTS.md in the contracts repo): the approved DividendVault\n * IMPLEMENTATION every new launch clones, and the HolderShareFeeCalculator. Empty until the\n * contracts are deployed; once the calculator is the PositionManager's fee calculator, every\n * launch must attach a vault (`flaunchWithVault`).\n */\nexport const DividendVaultAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xA9E566b548D5D0203e4d00bc3dFdB4BC38883514\",\n};\nexport const HolderShareFeeCalculatorAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xe5737916951Fe20235Bddef5a65af5d18406f92E\",\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/**\n * Uniswap v4 StateView (canonical periphery view over PoolManager storage).\n *\n * MAINNET ONLY. Arc testnet runs our own PoolManager instance, and no StateView\n * was deployed against it, so there is no testnet entry. The SDK does not\n * depend on StateView on either network: `ReadPoolManager` reads slot0,\n * liquidity, positions and tick data straight from PoolManager storage with\n * `extsload`, using the same slot derivations as Uniswap's StateLibrary. Use\n * that path if you need one code path across both chains.\n */\nexport const StateViewAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0xf3334192d15450cdd385c8b70e03f9a6bd9e673b\",\n};\n\n/**\n * IndexerSubscriber: on-chain reverse index PoolId -> (flaunch, memecoin,\n * memecoinTreasury, tokenId). Attached to the PositionManager's Notifier, so it\n * is populated at pool initialisation. See contracts/IndexerSubscriber.sol.\n */\nexport const IndexerSubscriberAddress: Addresses = {\n [ARC_MAINNET_CHAIN_ID]: \"0x2c68B21C9f8b899a662A71dd188C1c919D578a9F\",\n [ARC_TESTNET_CHAIN_ID]: \"0xe6d8164d67c60ff860e1a0d90636f5f65b665be7\",\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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"}
|