From 4427c56df1101aa4df3fbfed5d587d6bcdc1e03f Mon Sep 17 00:00:00 2001 From: MSG <59928086+MSghais@users.noreply.github.com> Date: Wed, 18 Dec 2024 17:18:45 +0100 Subject: [PATCH] Feat/mvp beta soon please (#383) * start launch token bonding curve selection and test + changes * clean and fix script * try deploy launch * deploy new launch contract * fixing few things * start add enum for launch token bonding type * issue docker still here, not generated prisma * start change hooks launchpad and ui --- Dockerfile.data-backend.railway | 5 +- apps/data-backend/package.json | 1 + apps/indexer/init.sql | 12 +- apps/mobile/src/context/TokenCreateModal.tsx | 2 +- .../src/hooks/launchpad/useCreateToken.ts | 33 +- .../src/hooks/launchpad/useLaunchToken.ts | 26 +- .../LaunchTokenPump/FormLaunchToken.tsx | 93 ++- .../src/modules/LaunchTokenPump/styles.ts | 1 + .../src/modules/TokenCreatedModal/styles.ts | 1 + apps/mobile/src/types/keys.ts | 8 +- apps/nestjs-indexer/src/common/constants.ts | 4 +- .../src/indexer/name-service.indexer.ts | 2 +- .../.snfoundry_cache/.prev_tests_failed | 12 +- .../launchpad/src/launchpad/launchpad.cairo | 99 +-- .../cairo/launchpad/src/launchpad/unrug.cairo | 274 ++++---- .../launchpad/src/tests/launchpad_tests.cairo | 591 +++++++++++++++--- .../launchpad/src/tests/liquidity_tests.cairo | 3 +- .../launchpad/src/tests/unrug_tests.cairo | 64 +- .../launchpad/src/tokens/memecoin_v2.cairo | 7 +- packages/common/src/contracts.ts | 21 +- scripts/.env.exemple | 8 +- scripts/deploy/launchpad.ts | 7 +- scripts/deploy/unrug_liquidity.ts | 122 ++++ scripts/package.json | 1 + scripts/utils/launchpad.ts | 69 +- scripts/utils/unrug_liquidity.ts | 223 +++++++ 26 files changed, 1295 insertions(+), 394 deletions(-) create mode 100644 scripts/deploy/unrug_liquidity.ts create mode 100644 scripts/utils/unrug_liquidity.ts diff --git a/Dockerfile.data-backend.railway b/Dockerfile.data-backend.railway index ce9c88f5f..b9be9cf5f 100644 --- a/Dockerfile.data-backend.railway +++ b/Dockerfile.data-backend.railway @@ -123,11 +123,10 @@ RUN pnpm run build:indexer-prisma RUN pnpm --filter indexer-prisma build # Build the data-backend package -# Build indexer-prisma and owned prisma # RUN pnpm --filter data-backend build:all_repo # RUN pnpm --filter data-backend build:all -RUN pnpm --filter data-backend build:prisma -RUN pnpm --filter data-backend build +# RUN pnpm --filter data-backend build:prisma +# RUN pnpm --filter data-backend build # Use a smaller production base image FROM node:20-alpine AS production diff --git a/apps/data-backend/package.json b/apps/data-backend/package.json index 2adbb529b..9a3f72dc5 100644 --- a/apps/data-backend/package.json +++ b/apps/data-backend/package.json @@ -17,6 +17,7 @@ "prisma:generate": "npx prisma generate", "prisma:push": "npx prisma db push", "prisma:setup": "npx prisma generate && npx prisma db pull", + "prisma:setup_push": "npx prisma generate && npx prisma db push", "format": "prettier --write \"src/**/*.{ts,tsx}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx}\"", "ts:check": "tsc --noEmit" diff --git a/apps/indexer/init.sql b/apps/indexer/init.sql index bc9550428..c47285e2c 100644 --- a/apps/indexer/init.sql +++ b/apps/indexer/init.sql @@ -15,7 +15,8 @@ create table token_launch( threshold_liquidity TEXT, price TEXT, _cursor BIGINT, - time_stamp TEXT + time_stamp TEXT, + total_token_holded TEXT, ); create table token_deploy( @@ -133,7 +134,6 @@ create table username_changed( block_number BIGINT, block_timestamp TIMESTAMP, transaction_hash TEXT PRIMARY KEY, - name TEXT, old_name TEXT, paid TEXT, @@ -150,7 +150,6 @@ create table renew_subscription( block_number BIGINT, block_timestamp TIMESTAMP, transaction_hash TEXT PRIMARY KEY, - name TEXT, old_name TEXT, paid TEXT, @@ -165,5 +164,10 @@ create table shares_token_user( id TEXT, owner TEXT, token_address TEXT, - amount_owned TEXT + total_token_holded TEXT, + amount_owned TEXT, + time_stamp DATE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + _cursor BIGINT + ); diff --git a/apps/mobile/src/context/TokenCreateModal.tsx b/apps/mobile/src/context/TokenCreateModal.tsx index 46380f933..c4d1a58fd 100644 --- a/apps/mobile/src/context/TokenCreateModal.tsx +++ b/apps/mobile/src/context/TokenCreateModal.tsx @@ -35,7 +35,7 @@ export const TokenCreateModalProvider: React.FC = ({chi if (!account?.address) { setStarknetAddress(undefined); } - }, [account]); + }, [account, account?.address]); const show = useCallback( (event?: NDKEvent, starknetAddress?: string, action?: KeyModalAction) => { setEvent(event); diff --git a/apps/mobile/src/hooks/launchpad/useCreateToken.ts b/apps/mobile/src/hooks/launchpad/useCreateToken.ts index 2285364ef..f27941b00 100644 --- a/apps/mobile/src/hooks/launchpad/useCreateToken.ts +++ b/apps/mobile/src/hooks/launchpad/useCreateToken.ts @@ -1,8 +1,9 @@ -import {LAUNCHPAD_ADDRESS} from 'common'; -import {AccountInterface, cairo, CallData, constants} from 'starknet'; +import { LAUNCHPAD_ADDRESS } from 'common'; +import { AccountInterface, cairo, CairoCustomEnum, CallData, constants } from 'starknet'; // import { LAUNCHPAD_ADDRESS, UNRUGGABLE_FACTORY_ADDRESS } from "../../constants/contracts"; -import {formatFloatToUint256} from '../../utils/format'; +import { formatFloatToUint256 } from '../../utils/format'; +import { BondingType } from '../../types/keys'; export type DeployTokenFormValues = { recipient?: string; @@ -11,6 +12,7 @@ export type DeployTokenFormValues = { initialSupply: number | undefined; contract_address_salt: string | undefined; is_unruggable?: boolean; + bonding_type?: BondingType }; export const useCreateToken = () => { @@ -27,6 +29,9 @@ export const useCreateToken = () => { const initial_supply = formatFloatToUint256(data?.initialSupply ?? 100_000_000); console.log('initial supply', initial_supply); + + + const deployCall = { contractAddress: LAUNCHPAD_ADDRESS[constants.StarknetChainId.SN_SEPOLIA], entrypoint: 'create_token', @@ -38,6 +43,7 @@ export const useCreateToken = () => { // initialSupply: cairo.uint256(data?.initialSupply ?? 100_000_000), contract_address_salt: new Date().getTime(), is_unruggable: cairo.felt(String(data?.is_unruggable)), + // bonding_type:bondingEnum // contract_address_salt:CONTRACT_ADDRESS_SALT_DEFAULT + Math.random() + Math.random() / 1000 // contract_address_salt:cairo.felt(Math.random()) }), @@ -64,6 +70,26 @@ export const useCreateToken = () => { // : '0x36d8be2991d685af817ef9d127ffb00fbb98a88d910195b04ec4559289a99f6'; const initial_supply = formatFloatToUint256(data?.initialSupply ?? 100_000_000); + let bondingEnum = new CairoCustomEnum({ Linear: {} }); + console.log('bondingEnum', bondingEnum); + let bonding = data?.bonding_type + + console.log('bonding', bonding); + + + if (data.bonding_type) { + console.log('bondingEnum', bondingEnum); + bondingEnum = new CairoCustomEnum({ bonding }); + + /** TODO finish corret formatin like above depends on the selected value */ + // if (data?.bonding_type == BondingType.Linear) { + // bondingEnum = new CairoCustomEnum({ Linear: {} }); + // } + // else { + // bondingEnum = new CairoCustomEnum({ Exponential: {} }); + // } + + } console.log('initial supply', initial_supply); const deployCall = { @@ -76,6 +102,7 @@ export const useCreateToken = () => { contract_address_salt: new Date().getTime(), // is_unruggable: data?.is_unruggable is_unruggable: cairo.felt(String(data?.is_unruggable)), + bonding_type: bondingEnum }), }; diff --git a/apps/mobile/src/hooks/launchpad/useLaunchToken.ts b/apps/mobile/src/hooks/launchpad/useLaunchToken.ts index c54f25216..21ddec536 100644 --- a/apps/mobile/src/hooks/launchpad/useLaunchToken.ts +++ b/apps/mobile/src/hooks/launchpad/useLaunchToken.ts @@ -1,19 +1,21 @@ -import {useNetwork} from '@starknet-react/core'; +import { useNetwork } from '@starknet-react/core'; // import { LAUNCHPAD_ADDRESS} from '../../constants/contracts'; -import {LAUNCHPAD_ADDRESS} from 'common'; -import {AccountInterface, CallData, constants, RpcProvider} from 'starknet'; +import { LAUNCHPAD_ADDRESS } from 'common'; +import { AccountInterface, CallData, constants, RpcProvider, CairoCustomEnum } from 'starknet'; // import { CairoOption, CairoOptionVariant } from 'starknet'; -import {STRK} from '../../constants/tokens'; -import {formatFloatToUint256} from '../../utils/format'; +import { STRK } from '../../constants/tokens'; +import { formatFloatToUint256 } from '../../utils/format'; +import { BondingType } from '../../types/keys'; export const useLaunchToken = () => { const chain = useNetwork(); const chainId = chain?.chain?.id; - const provider = new RpcProvider({nodeUrl: process.env.EXPO_PUBLIC_PROVIDER_URL}); + const provider = new RpcProvider({ nodeUrl: process.env.EXPO_PUBLIC_PROVIDER_URL }); const handleLaunchCoin = async ( account?: AccountInterface, coin_address?: string, contractAddress?: string, + bonding_type?:BondingType ) => { try { if (!account) return; @@ -28,11 +30,21 @@ export const useLaunchToken = () => { console.log('read asset'); if (!account) return; + // const orderToSend: BondingType = { Linear: {} }; + // const myCustomEnum = new CairoCustomEnum({ Linear: {} }); + let bondingEnum = new CairoCustomEnum({Linear:{} }); + if(bonding_type){ + bondingEnum = new CairoCustomEnum({bonding_type}); + } + // const orderToSend: BondingType = { Linear }; + // const myCustomEnum = new CairoCustomEnum({ Response: orderToSend }); + // const myCustomEnum = new CairoCustomEnum({ Response: orderToSend }); const launchDeployCall = { contractAddress: addressContract, entrypoint: 'launch_token', calldata: CallData.compile({ coin_address: coin_address, + bonding_type: bondingEnum // ekubo_pool:CairoOptionVariant.None }), }; @@ -47,5 +59,5 @@ export const useLaunchToken = () => { } }; - return {handleLaunchCoin}; + return { handleLaunchCoin }; }; diff --git a/apps/mobile/src/modules/LaunchTokenPump/FormLaunchToken.tsx b/apps/mobile/src/modules/LaunchTokenPump/FormLaunchToken.tsx index d8b27229b..24722315d 100644 --- a/apps/mobile/src/modules/LaunchTokenPump/FormLaunchToken.tsx +++ b/apps/mobile/src/modules/LaunchTokenPump/FormLaunchToken.tsx @@ -1,19 +1,21 @@ -import {NDKEvent} from '@nostr-dev-kit/ndk'; -import {useAccount} from '@starknet-react/core'; -import {useQueryClient} from '@tanstack/react-query'; -import {useProfile} from 'afk_nostr_sdk'; +import { NDKEvent } from '@nostr-dev-kit/ndk'; +import { useAccount } from '@starknet-react/core'; +import { useQueryClient } from '@tanstack/react-query'; +import { useProfile } from 'afk_nostr_sdk'; // import { useAuth } from '../../store/auth'; -import {useAuth} from 'afk_nostr_sdk'; -import {Formik, FormikProps} from 'formik'; -import {useRef, useState} from 'react'; -import {ScrollView, View} from 'react-native'; - -import {Button, SquareInput, Text} from '../../components'; -import {useStyles, useWaitConnection} from '../../hooks'; -import {DeployTokenFormValues, useCreateToken} from '../../hooks/launchpad/useCreateToken'; -import {useToast, useWalletModal} from '../../hooks/modals'; +import { useAuth } from 'afk_nostr_sdk'; +import { Formik, FormikProps } from 'formik'; +import { useRef, useState } from 'react'; +import { ScrollView, View } from 'react-native'; + +import { Button, SquareInput, Text } from '../../components'; +import { useStyles, useWaitConnection } from '../../hooks'; +import { DeployTokenFormValues, useCreateToken } from '../../hooks/launchpad/useCreateToken'; +import { useToast, useWalletModal } from '../../hooks/modals'; import stylesheet from '../../screens/CreateChannel/styles'; -import {TipSuccessModalProps} from '../TipSuccessModal'; +import { TipSuccessModalProps } from '../TipSuccessModal'; +import { Picker } from '@react-native-picker/picker'; +import { BondingType } from '../../types/keys'; const UsernameInputLeft = ( @@ -40,12 +42,12 @@ export const FormLaunchToken: React.FC = () => { const walletModal = useWalletModal(); const styles = useStyles(stylesheet); const publicKey = useAuth((state) => state.publicKey); - const profile = useProfile({publicKey}); + const profile = useProfile({ publicKey }); const queryClient = useQueryClient(); - const {showToast} = useToast(); + const { showToast } = useToast(); const account = useAccount(); const waitConnection = useWaitConnection(); - const {deployToken, deployTokenAndLaunch} = useCreateToken(); + const { deployToken, deployTokenAndLaunch } = useCreateToken(); const [type, setType] = useState(TypeCreate.CREATE); const initialFormValues: FormValues = { @@ -78,29 +80,40 @@ export const FormLaunchToken: React.FC = () => { if (!result) return; } - const data: DeployTokenFormValues = { - recipient: account?.address, - name: values.name, - symbol: values.symbol, - initialSupply: values?.initialSupply, - contract_address_salt: values.contract_address_salt, - is_unruggable: values.is_unruggable, - }; if (!account || !account?.account) return; console.log('test deploy'); let tx; if (type == TypeCreate.CREATE) { + + const data: DeployTokenFormValues = { + recipient: account?.address, + name: values.name, + symbol: values.symbol, + initialSupply: values?.initialSupply, + contract_address_salt: values.contract_address_salt, + is_unruggable: values.is_unruggable, + }; tx = await deployToken(account?.account, data); } else { + + const data: DeployTokenFormValues = { + recipient: account?.address, + name: values.name, + symbol: values.symbol, + initialSupply: values?.initialSupply, + contract_address_salt: values.contract_address_salt, + is_unruggable: values.is_unruggable, + bonding_type: values.bonding_type + }; tx = await deployTokenAndLaunch(account?.account, data); } if (tx) { - showToast({type: 'success', title: 'Token launch created successfully'}); + showToast({ type: 'success', title: 'Token launch created successfully' }); } } catch (error) { - showToast({type: 'error', title: 'Failed to create token and launch'}); + showToast({ type: 'error', title: 'Failed to create token and launch' }); } }; @@ -116,7 +129,7 @@ export const FormLaunchToken: React.FC = () => { onSubmit={onFormSubmit} validate={validateForm} > - {({handleChange, handleBlur, values, errors}) => ( + {({ handleChange, handleBlur, values, errors }) => ( = () => { error={errors.initialSupply?.toString()} /> + + + Only Linear is available atm. + + { + handleChange('bonding_type') + // values.bonding_type= BondingType {itemValue} + }} + > + {Object.values(BondingType).map((bonding) => ( + + ))} + + + +