From 8c2792a60ae996508a5de93f3fb86380ca8151a2 Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Tue, 12 Nov 2024 03:36:09 +0200 Subject: [PATCH 1/7] add ABI + helpers --- .../commonProtocol/abi/LPBondingCurve.ts | 343 ++++++++++++++++++ .../services/commonProtocol/contestHelper.ts | 19 +- .../commonProtocol/contractHelpers.ts | 17 + .../commonProtocol/launchpadHelpers.ts | 19 + 4 files changed, 380 insertions(+), 18 deletions(-) create mode 100644 libs/model/src/services/commonProtocol/abi/LPBondingCurve.ts diff --git a/libs/model/src/services/commonProtocol/abi/LPBondingCurve.ts b/libs/model/src/services/commonProtocol/abi/LPBondingCurve.ts new file mode 100644 index 00000000000..77ffade18ca --- /dev/null +++ b/libs/model/src/services/commonProtocol/abi/LPBondingCurve.ts @@ -0,0 +1,343 @@ +export const LPBondingCurveAbi = [ + { + type: 'constructor', + inputs: [ + { + name: '_protocolFeeDestination', + type: 'address', + internalType: 'address', + }, + { name: '_launchpad', type: 'address', internalType: 'address' }, + { + name: '_protocolFeePercent', + type: 'uint256', + internalType: 'uint256', + }, + { name: '_LPCurveManager', type: 'address', internalType: 'address' }, + { + name: '_curveActionHook', + type: 'address', + internalType: 'address', + }, + ], + stateMutability: 'nonpayable', + }, + { + type: 'function', + name: 'LPCurveManager', + inputs: [], + outputs: [{ name: '', type: 'address', internalType: 'address' }], + stateMutability: 'view', + }, + { + type: 'function', + name: '_getFloatingTokenSupply', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: '_getTotalTokenSupply', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: '_isFunded', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'bool', internalType: 'bool' }], + stateMutability: 'view', + }, + { + type: 'function', + name: '_launchpadLiquidity', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: '_poolLiquidity', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'buyToken', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + { + name: 'minAmountOut', + type: 'uint256', + internalType: 'uint256', + }, + ], + outputs: [{ name: '', type: 'bool', internalType: 'bool' }], + stateMutability: 'payable', + }, + { + type: 'function', + name: 'curveActionHook', + inputs: [], + outputs: [ + { name: '', type: 'address', internalType: 'contract ICurveActionHook' }, + ], + stateMutability: 'view', + }, + { + type: 'function', + name: 'getPrice', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + { + name: 'amountIn', + type: 'uint256', + internalType: 'uint256', + }, + { name: 'isBuy', type: 'bool', internalType: 'bool' }, + ], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'launchpad', + inputs: [], + outputs: [{ name: '', type: 'address', internalType: 'address' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'liquidity', + inputs: [{ name: '', type: 'address', internalType: 'address' }], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'protocolFeeDestination', + inputs: [], + outputs: [{ name: '', type: 'address', internalType: 'address' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'protocolFeePercent', + inputs: [], + outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }], + stateMutability: 'view', + }, + { + type: 'function', + name: 'registerToken', + inputs: [ + { + name: 'params', + type: 'tuple', + internalType: 'struct LPBondingCurve.RegisterTokenParams', + components: [ + { name: '_tokenAddress', type: 'address', internalType: 'address' }, + { + name: '_curveId', + type: 'uint256', + internalType: 'uint256', + }, + { name: '_scalar', type: 'uint256', internalType: 'uint256' }, + { + name: '_reserveRatio', + type: 'uint32', + internalType: 'uint32', + }, + { name: 'totalSupply', type: 'uint256', internalType: 'uint256' }, + { + name: 'holders', + type: 'address[]', + internalType: 'address[]', + }, + { name: 'shares', type: 'uint256[]', internalType: 'uint256[]' }, + { + name: 'LPHook', + type: 'address', + internalType: 'address', + }, + ], + }, + ], + outputs: [], + stateMutability: 'payable', + }, + { + type: 'function', + name: 'sellToken', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + { + name: 'amount', + type: 'uint256', + internalType: 'uint256', + }, + { name: 'minAmountOut', type: 'uint256', internalType: 'uint256' }, + ], + outputs: [], + stateMutability: 'payable', + }, + { + type: 'function', + name: 'tokens', + inputs: [{ name: '', type: 'address', internalType: 'address' }], + outputs: [ + { name: 'launchpadLiquidity', type: 'uint256', internalType: 'uint256' }, + { + name: 'poolLiquidity', + type: 'uint256', + internalType: 'uint256', + }, + { name: 'curveId', type: 'uint256', internalType: 'uint256' }, + { + name: 'scalar', + type: 'uint256', + internalType: 'uint256', + }, + { name: 'reserveRatio', type: 'uint32', internalType: 'uint32' }, + { + name: 'LPhook', + type: 'address', + internalType: 'address', + }, + { name: 'funded', type: 'bool', internalType: 'bool' }, + ], + stateMutability: 'view', + }, + { + type: 'function', + name: 'transferLiquidity', + inputs: [ + { name: 'tokenAddress', type: 'address', internalType: 'address' }, + { + name: 'minAmountOut', + type: 'uint256', + internalType: 'uint256', + }, + ], + outputs: [], + stateMutability: 'payable', + }, + { + type: 'event', + name: 'LiquidityTransferred', + inputs: [ + { + name: 'tokenAddress', + type: 'address', + indexed: true, + internalType: 'address', + }, + { + name: 'LPHook', + type: 'address', + indexed: false, + internalType: 'address', + }, + { + name: 'tokensTransferred', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + { + name: 'liquidityTransferred', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'TokenRegistered', + inputs: [ + { + name: 'token', + type: 'address', + indexed: false, + internalType: 'address', + }, + { + name: 'curveId', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + { + name: 'totalSupply', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + ], + anonymous: false, + }, + { + type: 'event', + name: 'Trade', + inputs: [ + { + name: 'trader', + type: 'address', + indexed: false, + internalType: 'address', + }, + { + name: 'namespace', + type: 'address', + indexed: false, + internalType: 'address', + }, + { + name: 'isBuy', + type: 'bool', + indexed: false, + internalType: 'bool', + }, + { + name: 'communityTokenAmount', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + { + name: 'ethAmount', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + { + name: 'protocolEthAmount', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + { + name: 'floatingSupply', + type: 'uint256', + indexed: false, + internalType: 'uint256', + }, + ], + anonymous: false, + }, +]; diff --git a/libs/model/src/services/commonProtocol/contestHelper.ts b/libs/model/src/services/commonProtocol/contestHelper.ts index f874536dfdb..3a7dc42fb8a 100644 --- a/libs/model/src/services/commonProtocol/contestHelper.ts +++ b/libs/model/src/services/commonProtocol/contestHelper.ts @@ -3,9 +3,9 @@ import { commonProtocol } from '@hicommonwealth/shared'; import { Mutex } from 'async-mutex'; import Web3, { PayableCallOptions } from 'web3'; import { AbiItem } from 'web3-utils'; -import { config } from '../../config'; import { contestABI } from './abi/contestAbi'; import { feeManagerABI } from './abi/feeManagerAbi'; +import { createWeb3Provider } from './contractHelpers'; const nonceMutex = new Mutex(); @@ -31,23 +31,6 @@ export type ContestScores = { contestBalance: string; }; -/** - * A helper for creating the web3 provider via an RPC, including private key import - * @param rpc the rpc of the network to use helper with - * @returns - */ -// eslint-disable-next-line @typescript-eslint/require-await -const createWeb3Provider = async (rpc: string): Promise => { - if (!config.WEB3.PRIVATE_KEY) throw new AppError('WEB3 private key not set!'); - const web3 = new Web3(rpc); - const account = web3.eth.accounts.privateKeyToAccount( - config.WEB3.PRIVATE_KEY, - ); - web3.eth.accounts.wallet.add(account); - web3.eth.defaultAccount = account.address; - return web3; -}; - /** * Adds content to an active contest. Includes validation of contest state * @param rpcNodeUrl the rpc node url diff --git a/libs/model/src/services/commonProtocol/contractHelpers.ts b/libs/model/src/services/commonProtocol/contractHelpers.ts index 9dc14182e75..6e4894e4983 100644 --- a/libs/model/src/services/commonProtocol/contractHelpers.ts +++ b/libs/model/src/services/commonProtocol/contractHelpers.ts @@ -6,6 +6,7 @@ import { } from '@hicommonwealth/shared'; import Web3 from 'web3'; import { AbiItem } from 'web3-utils'; +import { config } from '../../config'; import { Balances, TokenAttributes, getBalances } from '../tokenBalanceCache'; import { contestABI } from './abi/contestAbi'; @@ -140,3 +141,19 @@ export const getTokenAttributes = async ( decimals: parseInt(String(decimals)), }; }; + +/** + * A helper for creating the web3 provider via an RPC, including private key import + * @param rpc the rpc of the network to use helper with + * @returns + */ +export const createWeb3Provider = async (rpc: string): Promise => { + if (!config.WEB3.PRIVATE_KEY) throw new AppError('WEB3 private key not set!'); + const web3 = new Web3(rpc); + const account = web3.eth.accounts.privateKeyToAccount( + config.WEB3.PRIVATE_KEY, + ); + web3.eth.accounts.wallet.add(account); + web3.eth.defaultAccount = account.address; + return web3; +}; diff --git a/libs/model/src/services/commonProtocol/launchpadHelpers.ts b/libs/model/src/services/commonProtocol/launchpadHelpers.ts index 5b16f29d736..7ccf98ca44d 100644 --- a/libs/model/src/services/commonProtocol/launchpadHelpers.ts +++ b/libs/model/src/services/commonProtocol/launchpadHelpers.ts @@ -1,4 +1,7 @@ +import { commonProtocol } from '@hicommonwealth/shared'; import Web3 from 'web3'; +import { LPBondingCurveAbi } from './abi/LPBondingCurve'; +import { createWeb3Provider } from './contractHelpers'; export async function getLaunchpadTradeTransaction({ rpc, @@ -43,3 +46,19 @@ export async function getLaunchpadTradeTransaction({ }, }; } + +export async function transferLiquidityToUniswap({ + rpc, + tokenAddress, +}: { + rpc: string; + tokenAddress: string; +}) { + const web3 = await createWeb3Provider(rpc); + const contract = new web3.eth.Contract(LPBondingCurveAbi, tokenAddress); + await commonProtocol.transferLiquidity( + contract, + tokenAddress, + web3.eth.defaultAccount!, + ); +} From 08feb867a09c86c5a85fcc27280db2df440b287a Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Tue, 12 Nov 2024 10:39:55 +0200 Subject: [PATCH 2/7] getTokenHelper + updated logic to transfer liquidity --- .../src/services/commonProtocol/index.ts | 2 ++ .../commonProtocol/launchpadHelpers.ts | 32 ++++++++++++++++++- libs/shared/src/commonProtocol/chainConfig.ts | 2 +- .../chainEventCreated/handleLaunchpadTrade.ts | 28 ++++++++++++++-- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/libs/model/src/services/commonProtocol/index.ts b/libs/model/src/services/commonProtocol/index.ts index 7334e588ee1..2006ede5509 100644 --- a/libs/model/src/services/commonProtocol/index.ts +++ b/libs/model/src/services/commonProtocol/index.ts @@ -4,9 +4,11 @@ import * as wallet from './aaWallet'; import * as stake from './communityStakeConfigValidator'; import * as contest from './contestHelper'; import * as contract from './contractHelpers'; +import * as launchpad from './launchpadHelpers'; // export modules as objects so they can be stubbed in tests export const communityStakeConfigValidator = { ...stake }; export const contractHelpers = { ...contract }; export const contestHelper = { ...contest }; export const aaWallet = { ...wallet }; +export const launchpadHelpers = { ...launchpad }; diff --git a/libs/model/src/services/commonProtocol/launchpadHelpers.ts b/libs/model/src/services/commonProtocol/launchpadHelpers.ts index 7ccf98ca44d..5f5de28d243 100644 --- a/libs/model/src/services/commonProtocol/launchpadHelpers.ts +++ b/libs/model/src/services/commonProtocol/launchpadHelpers.ts @@ -49,16 +49,46 @@ export async function getLaunchpadTradeTransaction({ export async function transferLiquidityToUniswap({ rpc, + lpBondingCurveAddress, tokenAddress, }: { rpc: string; + lpBondingCurveAddress: string; tokenAddress: string; }) { const web3 = await createWeb3Provider(rpc); - const contract = new web3.eth.Contract(LPBondingCurveAbi, tokenAddress); + const contract = new web3.eth.Contract( + LPBondingCurveAbi, + lpBondingCurveAddress, + ); await commonProtocol.transferLiquidity( contract, tokenAddress, web3.eth.defaultAccount!, ); } + +export async function getToken({ + rpc, + lpBondingCurveAddress, + tokenAddress, +}: { + rpc: string; + lpBondingCurveAddress: string; + tokenAddress: string; +}): Promise<{ + launchpadLiquidity: bigint; + poolLiquidity: bigint; + curveId: bigint; + scalar: bigint; + reserveRation: bigint; + LPhook: string; + funded: boolean; +}> { + const web3 = new Web3(rpc); + const contract = new web3.eth.Contract( + LPBondingCurveAbi, + lpBondingCurveAddress, + ); + return await contract.methods.tokens(tokenAddress).call(); +} diff --git a/libs/shared/src/commonProtocol/chainConfig.ts b/libs/shared/src/commonProtocol/chainConfig.ts index 18e45ae6839..471dd3cde9c 100644 --- a/libs/shared/src/commonProtocol/chainConfig.ts +++ b/libs/shared/src/commonProtocol/chainConfig.ts @@ -35,7 +35,7 @@ export const factoryContracts: { factory: '0xD8a357847cABA76133D5f2cB51317D3C74609710', communityStake: '0xd097926d8765A7717206559E7d19EECCbBa68c18', launchpad: '0xe1aa28e217a6a6bf39f74455ddd4d24aa4fa0aec', - lpBondingCurve: '0xaEA78B289A769DA4dde967262b5076ea8FE56607', + lpBondingCurve: '0x094Dd77FbF7E50126D1dc7a8cb9CDa713ab50D4a', tokenCommunityManager: '0x5dF8A174D95D01e5508B1f3d3F691af226eC8888', chainId: 84532, }, diff --git a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts index 6e88163e63e..13356aacea3 100644 --- a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts +++ b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts @@ -1,5 +1,6 @@ import { events, LaunchpadTrade } from '@hicommonwealth/core'; -import { models } from '@hicommonwealth/model'; +import { commonProtocol, models } from '@hicommonwealth/model'; +import { commonProtocol as sharedCommonProtocol } from '@hicommonwealth/shared'; import { BigNumber } from 'ethers'; import Web3 from 'web3'; import { z } from 'zod'; @@ -64,5 +65,28 @@ export async function handleLaunchpadTrade( }); } - // TODO: check that liquidity has been transferred if above threshold + const lpBondingCurveAddress = + sharedCommonProtocol.factoryContracts[ + chainNode!.eth_chain_id as sharedCommonProtocol.ValidChains + ].lpBondingCurve!; + + // TODO: update 1n to the launchpadLiquidity stored on Token model + if (!token.is_locked && BigNumber.from(floatingSupply).toBigInt() === 1n) { + const onChainTokenData = await commonProtocol.launchpadHelpers.getToken({ + rpc: chainNode.private_url!, + tokenAddress, + lpBondingCurveAddress, + }); + + if (!onChainTokenData.funded) { + await commonProtocol.launchpadHelpers.transferLiquidityToUniswap({ + rpc: chainNode.private_url!, + tokenAddress, + lpBondingCurveAddress, + }); + } + + token.is_locked = true; + await token.save(); + } } From 52cf9052977fdc212aa478881b5124c19de0945b Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Wed, 13 Nov 2024 15:33:27 +0200 Subject: [PATCH 3/7] fix --- .../policies/chainEventCreated/handleLaunchpadTrade.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts index 13356aacea3..8323fac5671 100644 --- a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts +++ b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts @@ -71,7 +71,10 @@ export async function handleLaunchpadTrade( ].lpBondingCurve!; // TODO: update 1n to the launchpadLiquidity stored on Token model - if (!token.is_locked && BigNumber.from(floatingSupply).toBigInt() === 1n) { + if ( + !token.liquidity_transferred && + BigNumber.from(floatingSupply).toBigInt() === 1n + ) { const onChainTokenData = await commonProtocol.launchpadHelpers.getToken({ rpc: chainNode.private_url!, tokenAddress, @@ -86,7 +89,7 @@ export async function handleLaunchpadTrade( }); } - token.is_locked = true; + token.liquidity_transferred = true; await token.save(); } } From f6836294d8f7387b14006e411091cf63d26a11ee Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Thu, 14 Nov 2024 12:57:46 +0200 Subject: [PATCH 4/7] fix comparison --- .../policies/chainEventCreated/handleLaunchpadTrade.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts index 8323fac5671..2a85ee792f0 100644 --- a/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts +++ b/packages/commonwealth/server/workers/commonwealthConsumer/policies/chainEventCreated/handleLaunchpadTrade.ts @@ -70,10 +70,10 @@ export async function handleLaunchpadTrade( chainNode!.eth_chain_id as sharedCommonProtocol.ValidChains ].lpBondingCurve!; - // TODO: update 1n to the launchpadLiquidity stored on Token model if ( !token.liquidity_transferred && - BigNumber.from(floatingSupply).toBigInt() === 1n + BigNumber.from(floatingSupply).toBigInt() === + BigInt(token.launchpad_liquidity) ) { const onChainTokenData = await commonProtocol.launchpadHelpers.getToken({ rpc: chainNode.private_url!, From e22933d32dbc2e587c0587c2216f727c1107b4c8 Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Thu, 14 Nov 2024 13:06:20 +0200 Subject: [PATCH 5/7] type/build fix --- libs/model/src/services/commonProtocol/index.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/model/src/services/commonProtocol/index.ts b/libs/model/src/services/commonProtocol/index.ts index 2006ede5509..2daddbed880 100644 --- a/libs/model/src/services/commonProtocol/index.ts +++ b/libs/model/src/services/commonProtocol/index.ts @@ -7,8 +7,8 @@ import * as contract from './contractHelpers'; import * as launchpad from './launchpadHelpers'; // export modules as objects so they can be stubbed in tests -export const communityStakeConfigValidator = { ...stake }; -export const contractHelpers = { ...contract }; -export const contestHelper = { ...contest }; -export const aaWallet = { ...wallet }; -export const launchpadHelpers = { ...launchpad }; +export const communityStakeConfigValidator = stake; +export const contractHelpers = contract; +export const contestHelper = contest; +export const aaWallet = wallet; +export const launchpadHelpers = launchpad; From 1c62b384b209b26d43ff881e429525fa2c86cef2 Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Thu, 14 Nov 2024 14:05:41 +0200 Subject: [PATCH 6/7] type/build fix --- .../services/commonProtocol/contestHelper.ts | 2 +- .../commonProtocol/contractHelpers.ts | 18 +---------------- .../src/services/commonProtocol/index.ts | 11 +++++----- .../commonProtocol/launchpadHelpers.ts | 2 +- .../src/services/commonProtocol/utils.ts | 20 +++++++++++++++++++ 5 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 libs/model/src/services/commonProtocol/utils.ts diff --git a/libs/model/src/services/commonProtocol/contestHelper.ts b/libs/model/src/services/commonProtocol/contestHelper.ts index 3a7dc42fb8a..2b4ef56fbda 100644 --- a/libs/model/src/services/commonProtocol/contestHelper.ts +++ b/libs/model/src/services/commonProtocol/contestHelper.ts @@ -5,7 +5,7 @@ import Web3, { PayableCallOptions } from 'web3'; import { AbiItem } from 'web3-utils'; import { contestABI } from './abi/contestAbi'; import { feeManagerABI } from './abi/feeManagerAbi'; -import { createWeb3Provider } from './contractHelpers'; +import { createWeb3Provider } from './utils'; const nonceMutex = new Mutex(); diff --git a/libs/model/src/services/commonProtocol/contractHelpers.ts b/libs/model/src/services/commonProtocol/contractHelpers.ts index 6e4894e4983..b0623255578 100644 --- a/libs/model/src/services/commonProtocol/contractHelpers.ts +++ b/libs/model/src/services/commonProtocol/contractHelpers.ts @@ -6,7 +6,7 @@ import { } from '@hicommonwealth/shared'; import Web3 from 'web3'; import { AbiItem } from 'web3-utils'; -import { config } from '../../config'; + import { Balances, TokenAttributes, getBalances } from '../tokenBalanceCache'; import { contestABI } from './abi/contestAbi'; @@ -141,19 +141,3 @@ export const getTokenAttributes = async ( decimals: parseInt(String(decimals)), }; }; - -/** - * A helper for creating the web3 provider via an RPC, including private key import - * @param rpc the rpc of the network to use helper with - * @returns - */ -export const createWeb3Provider = async (rpc: string): Promise => { - if (!config.WEB3.PRIVATE_KEY) throw new AppError('WEB3 private key not set!'); - const web3 = new Web3(rpc); - const account = web3.eth.accounts.privateKeyToAccount( - config.WEB3.PRIVATE_KEY, - ); - web3.eth.accounts.wallet.add(account); - web3.eth.defaultAccount = account.address; - return web3; -}; diff --git a/libs/model/src/services/commonProtocol/index.ts b/libs/model/src/services/commonProtocol/index.ts index 2daddbed880..a5a776de4c6 100644 --- a/libs/model/src/services/commonProtocol/index.ts +++ b/libs/model/src/services/commonProtocol/index.ts @@ -6,9 +6,8 @@ import * as contest from './contestHelper'; import * as contract from './contractHelpers'; import * as launchpad from './launchpadHelpers'; -// export modules as objects so they can be stubbed in tests -export const communityStakeConfigValidator = stake; -export const contractHelpers = contract; -export const contestHelper = contest; -export const aaWallet = wallet; -export const launchpadHelpers = launchpad; +export const communityStakeConfigValidator = { ...stake }; +export const contractHelpers = { ...contract }; +export const contestHelper = { ...contest }; +export const aaWallet = { ...wallet }; +export const launchpadHelpers = { ...launchpad }; diff --git a/libs/model/src/services/commonProtocol/launchpadHelpers.ts b/libs/model/src/services/commonProtocol/launchpadHelpers.ts index 2c10be7c5f4..211537810b1 100644 --- a/libs/model/src/services/commonProtocol/launchpadHelpers.ts +++ b/libs/model/src/services/commonProtocol/launchpadHelpers.ts @@ -8,7 +8,7 @@ import { commonProtocol } from '@hicommonwealth/shared'; import { Web3 } from 'web3'; import { LPBondingCurveAbi } from './abi/LPBondingCurve'; import { erc20Abi } from './abi/erc20'; -import { createWeb3Provider } from './contractHelpers'; +import { createWeb3Provider } from './utils'; const log = logger(import.meta); diff --git a/libs/model/src/services/commonProtocol/utils.ts b/libs/model/src/services/commonProtocol/utils.ts new file mode 100644 index 00000000000..4672668b620 --- /dev/null +++ b/libs/model/src/services/commonProtocol/utils.ts @@ -0,0 +1,20 @@ +import { ServerError } from '@hicommonwealth/core'; +import Web3 from 'web3'; +import { config } from '../../config'; + +/** + * A helper for creating the web3 provider via an RPC, including private key import + * @param rpc the rpc of the network to use helper with + * @returns + */ +export const createWeb3Provider = async (rpc: string): Promise => { + if (!config.WEB3.PRIVATE_KEY) + throw new ServerError('WEB3 private key not set!'); + const web3 = new Web3(rpc); + const account = web3.eth.accounts.privateKeyToAccount( + config.WEB3.PRIVATE_KEY, + ); + web3.eth.accounts.wallet.add(account); + web3.eth.defaultAccount = account.address; + return web3; +}; From 555619e017ba3fbe6535760d09268429ae6e9180 Mon Sep 17 00:00:00 2001 From: Timothee Legros Date: Thu, 14 Nov 2024 14:12:11 +0200 Subject: [PATCH 7/7] lint --- libs/model/src/services/commonProtocol/utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/model/src/services/commonProtocol/utils.ts b/libs/model/src/services/commonProtocol/utils.ts index 4672668b620..6db5f74029a 100644 --- a/libs/model/src/services/commonProtocol/utils.ts +++ b/libs/model/src/services/commonProtocol/utils.ts @@ -7,6 +7,7 @@ import { config } from '../../config'; * @param rpc the rpc of the network to use helper with * @returns */ +// eslint-disable-next-line @typescript-eslint/require-await export const createWeb3Provider = async (rpc: string): Promise => { if (!config.WEB3.PRIVATE_KEY) throw new ServerError('WEB3 private key not set!');