diff --git a/packages/core/src/constants/contracts.ts b/packages/core/src/constants/contracts.ts index cc2ae2de..10486eb8 100644 --- a/packages/core/src/constants/contracts.ts +++ b/packages/core/src/constants/contracts.ts @@ -5,17 +5,17 @@ import JediswapPair from '../abis/JediswapPair.json' import Multicall from '../abis/Multicall.json' export const TOKEN_CLASS_HASH = { - [constants.StarknetChainId.SN_SEPOLIA]: '0x05ba9aea47a8dd7073ab82b9e91721bdb3a2c1b259cffd68669da1454faa80ac', + [constants.StarknetChainId.SN_SEPOLIA]: '0x063ee878d3559583ceae80372c6088140e1180d9893aa65fbefc81f45ddaaa17', [constants.StarknetChainId.SN_MAIN]: '0x063ee878d3559583ceae80372c6088140e1180d9893aa65fbefc81f45ddaaa17', } export const FACTORY_ADDRESSES = { - [constants.StarknetChainId.SN_SEPOLIA]: '0x076c3112e95994507c44c72b8dfb7f8d568a370d2f7c2d918ed9f55327671385', + [constants.StarknetChainId.SN_SEPOLIA]: '0x06b5096ba5a3c30e231e7b74ca565594d167a0a22d71cce0ebf9ae2b06584097', [constants.StarknetChainId.SN_MAIN]: '0x01a46467a9246f45c8c340f1f155266a26a71c07bd55d36e8d1c7d0d438a2dbc', } export const EKUBO_POSITIONS_ADDRESSES = { - [constants.StarknetChainId.SN_SEPOLIA]: '0x073fa8432bf59f8ed535f29acfd89a7020758bda7be509e00dfed8a9fde12ddc', + [constants.StarknetChainId.SN_SEPOLIA]: '0x06a2aee84bb0ed5dded4384ddd0e40e9c1372b818668375ab8e3ec08807417e5', [constants.StarknetChainId.SN_MAIN]: '0x02e0af29598b407c8716b17f6d2795eca1b471413fa03fb145a5e33722184067', } diff --git a/packages/core/src/utils/contract.ts b/packages/core/src/utils/contract.ts index 494d47cb..0dba429c 100644 --- a/packages/core/src/utils/contract.ts +++ b/packages/core/src/utils/contract.ts @@ -20,7 +20,7 @@ export async function multiCallContract( entrypoint: Entrypoint.AGGREGATE, calldata: [calldata.length, ...calldata.flat()], }) - const raw = rawResult.result.slice(2) + const raw = rawResult.slice(2) const result: string[][] = [] let idx = 0 diff --git a/packages/sdk/.env.example b/packages/sdk/.env.example new file mode 100644 index 00000000..31aeba19 --- /dev/null +++ b/packages/sdk/.env.example @@ -0,0 +1,2 @@ +ACCOUNT_ADDRESS= +ACCOUNT_PRIVATE_KEY= \ No newline at end of file diff --git a/packages/sdk/README.md b/packages/sdk/README.md new file mode 100644 index 00000000..af5de57e --- /dev/null +++ b/packages/sdk/README.md @@ -0,0 +1,141 @@ +# Unruggable SDK + +A TypeScript SDK for creating and managing Unruggable Memecoins on Starknet. This SDK provides a simple interface for deploying memecoin tokens and launching them on various AMMs. + +## Installation + +```bash +npm install unruggable-sdk +# or +yarn add unruggable-sdk +``` + +## Features + +- Create new memecoin tokens +- Launch tokens on Ekubo AMM +- Launch tokens on Standard AMM (JediSwap) +- Collect Ekubo fees +- Built-in address validation and amount normalization +- TypeScript support with comprehensive type definitions + +## Quick start + +```typescript +import { createMemecoin, launchOnEkubo } from 'unruggable-sdk'; +import { constants } from "starknet"; + +// Configure the SDK +const config = { + starknetProvider: yourProvider, + starknetChainId: constants.StarknetChainId.SN_MAIN, +}; + +// Create a new memecoin +const createResult = await createMemecoin(config, { + name: 'My Memecoin', + symbol: 'MMC', + initialSupply: '1000000000', + owner: ownerAddress, + starknetAccount: account, +}); + +// Launch on Ekubo +const launchResult = await launchOnEkubo(config, { + memecoinAddress: createResult.tokenAddress, + currencyAddress: ethAddress, + startingMarketCap: '1000000', + fees: '3.5', + holdLimit: '2.5', + antiBotPeriodInSecs: 300, + starknetAccount: account, +}); +``` + +## API Reference + +### Configuration + +The SDK requires a configuration object with the following properties: + +```typescript +interface Config { + starknetProvider: any; // Your Starknet provider + starknetChainId: string; // Starknet chain ID +} +``` + +### Functions +#### createMemecoin +Creates a new memecoin token on Starknet. + +```typescript +async function createMemecoin( + config: Config, + parameters: { + name: string; + symbol: string; + initialSupply: string; + owner: string; + starknetAccount: any; + } +): Promise<{ + transactionHash: string; + tokenAddress: string; +}>; +``` + +#### launchOnEkubo +Launches a memecoin on the Ekubo AMM. + +```typescript +async function launchOnEkubo( + config: Config, + parameters: { + memecoinAddress: string; + currencyAddress: string; + startingMarketCap: string; + fees: string; + holdLimit: string; + antiBotPeriodInSecs: number; + starknetAccount: any; + } +): Promise<{ + transactionHash: string; +}>; +``` + +#### launchOnStandardAMM +Launches a memecoin on JediSwap or StarkDefi + +```typescript +async function launchOnStandardAMM( + config: Config, + parameters: { + memecoinAddress: string; + currencyAddress: string; + startingMarketCap: string; + holdLimit: string; + antiBotPeriodInSecs: number; + liquidityLockPeriod: number; + starknetAccount: any; + } +): Promise<{ + transactionHash: string; +}>; +``` + +#### collectEkuboFees +Collects accumulated fees from Ekubo pool. + +```typescript +async function collectEkuboFees( + config: Config, + parameters: { + memecoinAddress: string; + starknetAccount: any; + } +): Promise<{ + transactionHash: string; +} | null>; +``` diff --git a/packages/sdk/eslintrc.js b/packages/sdk/eslintrc.js new file mode 100644 index 00000000..50575e97 --- /dev/null +++ b/packages/sdk/eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['../../.eslintrc.js', '@uniswap/eslint-config/node'], +} diff --git a/packages/sdk/examples/create.ts b/packages/sdk/examples/create.ts new file mode 100644 index 00000000..f136b0cd --- /dev/null +++ b/packages/sdk/examples/create.ts @@ -0,0 +1,48 @@ +import { createMemecoin, Config, launchOnEkubo } from '../src' +import { RpcProvider, Account, constants } from 'starknet' +import { ETH_ADDRESSES } from 'core/constants' +;(async () => { + const starknetProvider = new RpcProvider({ nodeUrl: 'https://starknet-mainnet.public.blastapi.io' }) + + const starknetChainId = constants.StarknetChainId.SN_MAIN + + const config: Config = { + starknetProvider, + starknetChainId, + } + + const starknetAccount = new Account( + starknetProvider, + process.env.ACCOUNT_ADDRESS || '', + process.env.ACCOUNT_PRIVATE_KEY || '', + ) + + const result = await createMemecoin(config, { + initialSupply: '1', + name: 'R5MI', + owner: '0x0416ba0f3d21eda5a87d05d0acc827075792132697e9ed973f4390808790a11a', + starknetAccount, + symbol: 'R5MI', + }) + + if (result) { + const { tokenAddress, transactionHash } = result + console.log(`Creating memecoin... Transaction hash: ${transactionHash} - Token Address: ${tokenAddress}`) + await starknetProvider.waitForTransaction(transactionHash) + + const launchResult = await launchOnEkubo(config, { + memecoinAddress: tokenAddress, + starknetAccount, + antiBotPeriodInSecs: 0, + fees: '0.3', + holdLimit: '1', + startingMarketCap: '100000', + currencyAddress: ETH_ADDRESSES[starknetChainId], + teamAllocations: [], + }) + + if (launchResult) { + console.log(`Launching on Ekubo... Transaction hash: ${launchResult.transactionHash}`) + } + } +})() diff --git a/packages/sdk/package.json b/packages/sdk/package.json new file mode 100644 index 00000000..3d3374cd --- /dev/null +++ b/packages/sdk/package.json @@ -0,0 +1,55 @@ +{ + "name": "unruggable-sdk", + "version": "0.1.0", + "license": "MIT", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "module": "dist/index.mjs", + "repository": { + "type": "git", + "url": "git+https://github.com/keep-starknet-strange/unruggable.meme.git" + }, + "homepage": "https://www.unruggable.meme/", + "publishConfig": { + "access": "public" + }, + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js", + "browser": "./dist/index.global.js", + "types": "./dist/index.d.ts" + } + }, + "scripts": { + "example": "yarn with-env tsx ./examples/create.ts", + "with-env": "dotenv -e .env --", + "start": "tsup --watch", + "build": "tsup --clean true", + "test": "vitest run", + "test:watch": "vitest watch", + "lint": "eslint . --max-warnings=0 --ignore-path ../../.eslintignore", + "lint:fix": "eslint src --fix", + "prepare": "npm run build", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@uniswap/sdk-core": "^4.2.0", + "core": "*", + "moment": "^2.30.1", + "starknet": "6.11.0" + }, + "peerDependencies": { + "starknet": ">=5.0.0" + }, + "devDependencies": { + "@uniswap/eslint-config": "^1.2.0", + "dotenv-cli": "^7.4.3", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "prettier": "^3.2.5", + "tsup": "^8.0.2", + "typescript": "^5.4.5", + "vitest": "^1.5.0" + } +} diff --git a/packages/sdk/src/constants.ts b/packages/sdk/src/constants.ts new file mode 100644 index 00000000..6f9ea99b --- /dev/null +++ b/packages/sdk/src/constants.ts @@ -0,0 +1,3 @@ +export const PERCENTAGE_INPUT_PRECISION = 2 + +export const STARKNET_MAX_BLOCK_TIME = 3600 * 2 // 2h diff --git a/packages/sdk/src/factory.ts b/packages/sdk/src/factory.ts new file mode 100644 index 00000000..8948bbbc --- /dev/null +++ b/packages/sdk/src/factory.ts @@ -0,0 +1,142 @@ +import { Factory, constants as coreConstants } from 'core' +import { getChecksumAddress } from 'starknet' +import moment from 'moment' + +import { CollectEkuboFeesParameters, Config, CreateMemecoinParameters, LaunchParameters } from './types' +import { convertPercentageStringToPercent, normalizeAmountString, validateStarknetAddress } from './utils' +import { STARKNET_MAX_BLOCK_TIME } from './constants' + +/** + * Initializes a new Factory instance with the provided configuration. + * + * @param {Config} config - The configuration object containing the Starknet provider and chain ID. + * @returns {Factory} A new Factory instance. + */ +function getFactory(config: Config): Factory { + return new Factory({ provider: config.starknetProvider, chainId: config.starknetChainId }) +} + +/** + * Retrieves a meme coin instance from the factory by its address. + * + * @param {Factory} factory - The factory instance to use for retrieval. + * @param {string} memecoinAddress - The address of the meme coin to retrieve. + * @returns {Promise} A promise that resolves to the meme coin instance if found, or throws an error if not found. + */ +async function getMemecoin(factory: Factory, memecoinAddress: string) { + if (!validateStarknetAddress(memecoinAddress)) { + throw new Error('Invalid Starknet address') + } + const memecoin = await factory.getMemecoin(memecoinAddress) + if (!memecoin) { + throw new Error(`Memecoin with address ${memecoinAddress} not found`) + } + return memecoin +} + +/** + * Creates a new meme coin on the Starknet network. + * + * @param {Config} config - The configuration object containing the Starknet provider. + * @param {CreateMemecoinParameters} parameters - The parameters for creating the meme coin. + * @returns {Promise<{transactionHash: string, tokenAddress: string}>} A promise that resolves to an object containing the transaction hash and the token address. + */ +export async function createMemecoin(config: Config, parameters: CreateMemecoinParameters) { + const factory = getFactory(config) + try { + const data = { + initialSupply: parameters.initialSupply, + name: parameters.name, + owner: parameters.owner, + symbol: parameters.symbol, + } + const { calls, tokenAddress } = factory.getDeployCalldata(data) + const response = await parameters.starknetAccount.execute(calls) + return { transactionHash: response.transaction_hash, tokenAddress } + } catch (error) { + console.error('Error creating meme coin:', error) + throw new Error(`Failed to create meme coin: ${error.message}`) + } +} + +/** + * Initiates the launch of a meme coin on an Ekubo pool. + * + * @param {Config} config - The configuration object containing the Starknet provider. + * @param {LaunchParameters} parameters - The parameters for launching the meme coin on Ekubo. + * @returns {Promise<{transactionHash: string}>} A promise that resolves to an object containing the transaction hash. + */ +export async function launchOnEkubo(config: Config, parameters: LaunchParameters) { + const factory = getFactory(config) + const memecoin = await getMemecoin(factory, parameters.memecoinAddress) + const quoteToken = coreConstants.QUOTE_TOKENS[config.starknetChainId][getChecksumAddress(parameters.currencyAddress)] + + const { calls } = await factory.getEkuboLaunchCalldata(memecoin, { + amm: coreConstants.AMM.EKUBO, + antiBotPeriod: parameters.antiBotPeriodInSecs * 60, + fees: convertPercentageStringToPercent(parameters.fees), + holdLimit: convertPercentageStringToPercent(parameters.holdLimit), + quoteToken, + startingMarketCap: normalizeAmountString(parameters.startingMarketCap), + teamAllocations: parameters.teamAllocations, + }) + + try { + const response = await parameters.starknetAccount.execute(calls) + return { transactionHash: response.transaction_hash } + } catch (error) { + console.error('Error launching on Ekubo:', error) + throw new Error(`Failed to launch on Ekubo: ${error.message}`) + } +} + +export async function launchOnStandardAMM(config: Config, parameters: LaunchParameters) { + const factory = getFactory(config) + const memecoin = await getMemecoin(factory, parameters.memecoinAddress) + const quoteToken = coreConstants.QUOTE_TOKENS[config.starknetChainId][getChecksumAddress(parameters.currencyAddress)] + + const { calls } = await factory.getStandardAMMLaunchCalldata(memecoin, { + amm: coreConstants.AMM.JEDISWAP, + antiBotPeriod: parameters.antiBotPeriodInSecs * 60, + holdLimit: convertPercentageStringToPercent(parameters.holdLimit), + quoteToken, + startingMarketCap: normalizeAmountString(parameters.startingMarketCap), + teamAllocations: parameters.teamAllocations, + liquidityLockPeriod: + parameters.liquidityLockPeriod === coreConstants.MAX_LIQUIDITY_LOCK_PERIOD // liquidity lock until + ? coreConstants.LIQUIDITY_LOCK_FOREVER_TIMESTAMP + : moment().add(moment.duration(parameters.liquidityLockPeriod, 'months')).unix() + STARKNET_MAX_BLOCK_TIME, + }) + + try { + const response = await parameters.starknetAccount.execute(calls) + return { transactionHash: response.transaction_hash } + } catch (error) { + console.error('Error launching on Standard AMM:', error) + throw new Error(`Failed to launch on Standard AMM: ${error.message}`) + } +} + +/** + * Collects Ekubo fees + * + * @param {Config} config - The configuration object containing the StarkNet provider and chain ID. + * @param {CollectEkuboFeesParameters} parameters - The parameters for collecting Ekubo fees, including the Starknet account and memecoin address. + * @returns {Promise<{transactionHash: string}>} A promise that resolves to an object containing the transaction hash if successful, or null if failed. + */ +export async function collectEkuboFees(config: Config, parameters: CollectEkuboFeesParameters) { + const factory = getFactory(config) + const memecoin = await getMemecoin(factory, parameters.memecoinAddress) + + const result = await factory.getCollectEkuboFeesCalldata(memecoin) + if (result) { + try { + const response = await parameters.starknetAccount.execute(result.calls) + return { transactionHash: response.transaction_hash } + } catch (error) { + console.error('Error collecting Ekubo fees:', error) + throw new Error(`Failed to collect Ekubo fees: ${error.message}`) + } + } + return null +} diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts new file mode 100644 index 00000000..97a7b599 --- /dev/null +++ b/packages/sdk/src/index.ts @@ -0,0 +1,2 @@ +export * from './factory' +export * from './types' diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts new file mode 100644 index 00000000..3165b3c9 --- /dev/null +++ b/packages/sdk/src/types.ts @@ -0,0 +1,34 @@ +import { AccountInterface, ProviderInterface, constants } from 'starknet' + +export interface Config { + starknetChainId: constants.StarknetChainId + starknetProvider: ProviderInterface +} + +export interface CreateMemecoinParameters { + starknetAccount: AccountInterface + name: string + symbol: string + owner: string + initialSupply: string +} + +export interface LaunchParameters { + starknetAccount: AccountInterface + memecoinAddress: string + startingMarketCap: string + holdLimit: string + fees: string + antiBotPeriodInSecs: number + liquidityLockPeriod?: number + currencyAddress: string + teamAllocations: { + address: string + amount: number | string + }[] +} + +export interface CollectEkuboFeesParameters { + starknetAccount: AccountInterface + memecoinAddress: string +} diff --git a/packages/sdk/src/utils.ts b/packages/sdk/src/utils.ts new file mode 100644 index 00000000..09a55dd6 --- /dev/null +++ b/packages/sdk/src/utils.ts @@ -0,0 +1,15 @@ +import { Percent } from '@uniswap/sdk-core' +import { PERCENTAGE_INPUT_PRECISION } from './constants' + +export const convertPercentageStringToPercent = (percentString: string): Percent => { + const precisionMultiplier = 10 ** PERCENTAGE_INPUT_PRECISION + return new Percent(+percentString * precisionMultiplier, 100 * precisionMultiplier) +} + +export const normalizeAmountString = (amountString: string): string => amountString.replace(/,/g, '') + +export function validateStarknetAddress(address: string): boolean { + // Wallets like to omit leading zeroes, so we cannot check for a fixed length. + // On the other hand, we don't want users to mistakenly enter an Ethereum address. + return /^0x[0-9a-fA-F]{50,64}$/.test(address) +} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json new file mode 100644 index 00000000..94823183 --- /dev/null +++ b/packages/sdk/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "baseUrl": "." + }, + "include": ["src/**/*", "examples/**/*"], + "exclude": ["node_modules"] +} diff --git a/packages/sdk/tsup.config.ts b/packages/sdk/tsup.config.ts new file mode 100644 index 00000000..84bbf821 --- /dev/null +++ b/packages/sdk/tsup.config.ts @@ -0,0 +1,29 @@ +/* eslint-disable import/no-unused-modules */ +import { defineConfig, Options } from 'tsup' + +const getConfig = (config: Options): Options[] => { + return [ + { + ...config, + format: ['cjs', 'esm'], + platform: 'node', + dts: true, + }, + { + ...config, + format: ['iife'], + platform: 'browser', + }, + ] +} + +export default defineConfig([ + // Default entrypoint + ...getConfig({ + entry: ['src/index.ts'], + outDir: 'dist', + sourcemap: true, + clean: false, + globalName: 'sdk.core', + }), +]) diff --git a/packages/sdk/vite.config.ts b/packages/sdk/vite.config.ts new file mode 100644 index 00000000..7a4e600b --- /dev/null +++ b/packages/sdk/vite.config.ts @@ -0,0 +1,7 @@ +/// +import { defineConfig } from 'vitest/config' + +// eslint-disable-next-line import/no-unused-modules +export default defineConfig({ + test: {}, +}) diff --git a/yarn.lock b/yarn.lock index 6e0517b9..d414c4d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3064,6 +3064,13 @@ dependencies: "@noble/hashes" "1.3.3" +"@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" @@ -3074,6 +3081,16 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@^1.4.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" + integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3590,6 +3607,11 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" +"@starknet-io/types-js@^0.7.7": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8" + integrity sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ== + "@starknet-react/chains@^0.1.0", "@starknet-react/chains@^0.1.7": version "0.1.7" resolved "https://registry.yarnpkg.com/@starknet-react/chains/-/chains-0.1.7.tgz#58503379e2ffabe33b4f6e0f2aef775e84745a4d" @@ -5020,7 +5042,7 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abi-wan-kanabi@^2.2.3: +abi-wan-kanabi@^2.2.2, abi-wan-kanabi@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.3.tgz#d1c410325aac866f31f3d589279a87b341e5641f" integrity sha512-JlqiAl9CPvTm5kKG0QXmVCWNWoC/XyRMOeT77cQlbxXWllgjf6SqUmaNqFon72C2o5OSZids+5FvLdsw6dvWaw== @@ -7492,6 +7514,21 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dotenv-cli@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-7.4.3.tgz#3f54cbf57d463896cf82e391a5c1598bf92ac9fd" + integrity sha512-lf1E+TL1xFeoOHy2hSO3kLkx3KX8CDi17ccn5z5dVCnk2PuWqUKAnBVgQmhfS0BPuzFbptTEHVcIKFsGF0NAcg== + dependencies: + cross-spawn "^7.0.3" + dotenv "^16.3.0" + dotenv-expand "^10.0.0" + minimist "^1.2.6" + +dotenv-expand@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" @@ -7502,7 +7539,7 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^16.4.5: +dotenv@^16.3.0, dotenv@^16.4.5: version "16.4.5" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== @@ -8941,6 +8978,13 @@ get-starknet-core@^3.1.0: resolved "https://registry.yarnpkg.com/get-starknet-core/-/get-starknet-core-3.2.0.tgz#44cabcbd573262340d575cb6b9a38e469a8029ed" integrity sha512-SZhxtLlKoPKLZ2H3l9WIU7CiNmkL3qLWGksALmvZdAXa/9PykYfLtvIB5B8A2UZMpf2ojTZlWLfuo1KhgmVobA== +get-starknet-core@^4.0.0-next.3: + version "4.0.0" + resolved "https://registry.yarnpkg.com/get-starknet-core/-/get-starknet-core-4.0.0.tgz#9a81101b3a4e54e090f76492b566abaa3b5865c7" + integrity sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ== + dependencies: + "@starknet-io/types-js" "^0.7.7" + get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -15436,6 +15480,25 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8" integrity sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ== +starknet@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.11.0.tgz#5d7e868e913777e9bf64323e59ed8be86437f291" + integrity sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "^1.4.0" + "@scure/base" "~1.1.3" + "@scure/starknet" "~1.0.0" + abi-wan-kanabi "^2.2.2" + fetch-cookie "^3.0.0" + get-starknet-core "^4.0.0-next.3" + isomorphic-fetch "^3.0.0" + lossless-json "^4.0.1" + pako "^2.0.4" + starknet-types-07 "npm:@starknet-io/types-js@^0.7.7" + ts-mixer "^6.0.3" + url-join "^4.0.1" + starknet@^5.24.3: version "5.24.3" resolved "https://registry.yarnpkg.com/starknet/-/starknet-5.24.3.tgz#1d8a84047783ea122a6cf4f2dac59bfa6d628154"