diff --git a/js/packages/common/src/contexts/accounts.tsx b/js/packages/common/src/contexts/accounts.tsx index 6678cc7..487389d 100644 --- a/js/packages/common/src/contexts/accounts.tsx +++ b/js/packages/common/src/contexts/accounts.tsx @@ -16,7 +16,6 @@ import { useUserAccounts } from '../hooks/useUserAccounts'; import { WRAPPED_SOL_MINT, programIds, - LEND_HOST_FEE_ADDRESS, } from '../utils/ids'; const AccountsContext = React.createContext(null); @@ -425,8 +424,6 @@ export function AccountsProvider({ children = null as any }) { if (!connection || !publicKey) { setTokenAccounts([]); } else { - precacheUserTokenAccounts(connection, LEND_HOST_FEE_ADDRESS); - precacheUserTokenAccounts(connection, publicKey).then(() => { setTokenAccounts(selectUserAccounts()); }); diff --git a/js/packages/common/src/contexts/connection.tsx b/js/packages/common/src/contexts/connection.tsx index b28c276..08198d9 100644 --- a/js/packages/common/src/contexts/connection.tsx +++ b/js/packages/common/src/contexts/connection.tsx @@ -60,14 +60,11 @@ export const ENDPOINTS = [ ]; const DEFAULT = ENDPOINTS[0].endpoint; -const DEFAULT_SLIPPAGE = 0.25; interface ConnectionConfig { connection: Connection; sendConnection: Connection; endpoint: string; - slippage: number; - setSlippage: (val: number) => void; env: ENV; setEndpoint: (val: string) => void; tokens: TokenInfo[]; @@ -77,8 +74,6 @@ interface ConnectionConfig { const ConnectionContext = React.createContext({ endpoint: DEFAULT, setEndpoint: () => {}, - slippage: DEFAULT_SLIPPAGE, - setSlippage: (val: number) => {}, connection: new Connection(DEFAULT, 'recent'), sendConnection: new Connection(DEFAULT, 'recent'), env: ENDPOINTS[0].name, @@ -92,11 +87,6 @@ export function ConnectionProvider({ children = undefined as any }) { ENDPOINTS[0].endpoint, ); - const [slippage, setSlippage] = useLocalStorageState( - 'slippage', - DEFAULT_SLIPPAGE.toString(), - ); - const connection = useMemo( () => new Connection(endpoint, 'recent'), [endpoint], @@ -176,8 +166,6 @@ export function ConnectionProvider({ children = undefined as any }) { value={{ endpoint, setEndpoint, - slippage: parseFloat(slippage), - setSlippage: val => setSlippage(val.toString()), connection, sendConnection, tokens, @@ -209,11 +197,6 @@ export function useConnectionConfig() { }; } -export function useSlippageConfig() { - const { slippage, setSlippage } = useContext(ConnectionContext); - return { slippage, setSlippage }; -} - export const getErrorForTransaction = async ( connection: Connection, txid: string, diff --git a/js/packages/common/src/utils/ids.ts b/js/packages/common/src/utils/ids.ts index b525b93..25b27be 100644 --- a/js/packages/common/src/utils/ids.ts +++ b/js/packages/common/src/utils/ids.ts @@ -1,9 +1,12 @@ import { PublicKey } from '@solana/web3.js'; import { TokenSwapLayout, TokenSwapLayoutV1 } from '../models/tokenSwap'; -export const STORE = new PublicKey( - '7KwpjEy7KBpZTBErE3niBUNxWGAQTPo9kZzkgEoP6dfR', -); +export const STORE_OWNER_ADDRESS = process.env + .REACT_APP_STORE_OWNER_ADDRESS_ADDRESS + ? new PublicKey(`${process.env.REACT_APP_STORE_OWNER_ADDRESS_ADDRESS}`) + : // DEFAULT STORE FRONT OWNER FOR METAPLEX + undefined; +console.debug(`Store owner address: ${STORE_OWNER_ADDRESS?.toBase58()}`); export const WRAPPED_SOL_MINT = new PublicKey( 'So11111111111111111111111111111111111111112', @@ -12,10 +15,6 @@ export let TOKEN_PROGRAM_ID = new PublicKey( 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', ); -export let LENDING_PROGRAM_ID = new PublicKey( - 'LendZqTs7gn5CTSJU1jWKhKuVpjJGom45nnwPb2AMTi', -); - export let SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey( 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', ); @@ -45,140 +44,65 @@ export const METAPLEX_ID = new PublicKey( export let SYSTEM = new PublicKey('11111111111111111111111111111111'); -let WORMHOLE_BRIDGE: { - pubkey: PublicKey; - bridge: string; - wrappedMaster: string; -}; - -let GOVERNANCE: { - programId: PublicKey; -}; - -let SWAP_PROGRAM_ID: PublicKey; -let SWAP_PROGRAM_LEGACY_IDS: PublicKey[]; -let SWAP_PROGRAM_LAYOUT: any; - -export const LEND_HOST_FEE_ADDRESS = process.env.REACT_APP_LEND_HOST_FEE_ADDRESS - ? new PublicKey(`${process.env.REACT_APP_LEND_HOST_FEE_ADDRESS}`) - : undefined; - -console.debug(`Lend host fee address: ${LEND_HOST_FEE_ADDRESS?.toBase58()}`); - export const ENABLE_FEES_INPUT = false; // legacy pools are used to show users contributions in those pools to allow for withdrawals of funds export const PROGRAM_IDS = [ { name: 'mainnet-beta', - governance: () => ({ - programId: new PublicKey('9iAeqqppjn7g1Jn8o2cQCqU5aQVV3h4q9bbWdKRbeC2w'), - }), - wormhole: () => ({ - pubkey: new PublicKey('WormT3McKhFJ2RkiGpdw9GKvNCrB2aB54gb2uV9MfQC'), - bridge: '0xf92cD566Ea4864356C5491c177A430C222d7e678', - wrappedMaster: '9A5e27995309a03f8B583feBdE7eF289FcCdC6Ae', - }), - swap: () => ({ - current: { - pubkey: new PublicKey('9qvG1zUp8xF1Bi4m6UdRNby1BAAuaDrUxSpv4CmRRMjL'), - layout: TokenSwapLayoutV1, - }, - legacy: [ - // TODO: uncomment to enable legacy contract - // new PublicKey("9qvG1zUp8xF1Bi4m6UdRNby1BAAuaDrUxSpv4CmRRMjL"), - ], - }), }, { name: 'testnet', - governance: () => ({ - programId: new PublicKey('A9KW1nhwZUr1kMX8C6rgzZvAE9AwEEUi2C77SiVvEiuN'), - }), - wormhole: () => ({ - pubkey: new PublicKey('5gQf5AUhAgWYgUCt9ouShm9H7dzzXUsLdssYwe5krKhg'), - bridge: '0x251bBCD91E84098509beaeAfF0B9951859af66D3', - wrappedMaster: 'E39f0b145C0aF079B214c5a8840B2B01eA14794c', - }), - swap: () => ({ - current: { - pubkey: new PublicKey('2n2dsFSgmPcZ8jkmBZLGUM2nzuFqcBGQ3JEEj6RJJcEg'), - layout: TokenSwapLayoutV1, - }, - legacy: [], - }), }, { name: 'devnet', - governance: () => ({ - programId: new PublicKey('A9KW1nhwZUr1kMX8C6rgzZvAE9AwEEUi2C77SiVvEiuN'), - }), - wormhole: () => ({ - pubkey: new PublicKey('WormT3McKhFJ2RkiGpdw9GKvNCrB2aB54gb2uV9MfQC'), - bridge: '0xf92cD566Ea4864356C5491c177A430C222d7e678', - wrappedMaster: '9A5e27995309a03f8B583feBdE7eF289FcCdC6Ae', - }), - swap: () => ({ - current: { - pubkey: new PublicKey('6Cust2JhvweKLh4CVo1dt21s2PJ86uNGkziudpkNPaCj'), - layout: TokenSwapLayout, - }, - legacy: [new PublicKey('BSfTAcBdqmvX5iE2PW88WFNNp2DHhLUaBKk5WrnxVkcJ')], - }), }, { name: 'localnet', - governance: () => ({ - programId: new PublicKey('2uWrXQ3tMurqTLe3Dmue6DzasUGV9UPqK7AK7HzS7v3D'), - }), - wormhole: () => ({ - pubkey: new PublicKey('WormT3McKhFJ2RkiGpdw9GKvNCrB2aB54gb2uV9MfQC'), - bridge: '0xf92cD566Ea4864356C5491c177A430C222d7e678', - wrappedMaster: '9A5e27995309a03f8B583feBdE7eF289FcCdC6Ae', - }), - swap: () => ({ - current: { - pubkey: new PublicKey('369YmCWHGxznT7GGBhcLZDRcRoGWmGKFWdmtiPy78yj7'), - layout: TokenSwapLayoutV1, - }, - legacy: [], - }), }, ]; -export const setProgramIds = (envName: string) => { +const getStoreID = async () => { + console.log(`STORE_OWNER_ADDRESS: ${STORE_OWNER_ADDRESS}`); + if (!STORE_OWNER_ADDRESS) { + return DEFAULT_STORE; + } + + if (!STORE) { + STORE = ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metaplex'), + METAPLEX_ID.toBuffer(), + STORE_OWNER_ADDRESS.toBuffer(), + ], + METAPLEX_ID, + ) + )[0]; + } + + return STORE; +}; + +export const setProgramIds = async (envName: string) => { let instance = PROGRAM_IDS.find(env => envName.indexOf(env.name) >= 0); if (!instance) { return; } - WORMHOLE_BRIDGE = instance.wormhole(); - - let swap = instance.swap(); - - SWAP_PROGRAM_ID = swap.current.pubkey; - SWAP_PROGRAM_LAYOUT = swap.current.layout; - SWAP_PROGRAM_LEGACY_IDS = swap.legacy; - - GOVERNANCE = instance.governance(); - - if (envName === 'mainnet-beta') { - LENDING_PROGRAM_ID = new PublicKey( - 'LendZqTs7gn5CTSJU1jWKhKuVpjJGom45nnwPb2AMTi', - ); - } + STORE = await getStoreID(); }; +const DEFAULT_STORE = new PublicKey( + '7KwpjEy7KBpZTBErE3niBUNxWGAQTPo9kZzkgEoP6dfR', +); + +let STORE: PublicKey; + export const programIds = () => { return { token: TOKEN_PROGRAM_ID, - swap: SWAP_PROGRAM_ID, - swap_legacy: SWAP_PROGRAM_LEGACY_IDS, - swapLayout: SWAP_PROGRAM_LAYOUT, - lending: LENDING_PROGRAM_ID, - wormhole: WORMHOLE_BRIDGE, - governance: GOVERNANCE, associatedToken: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, bpf_upgrade_loader: BPF_UPGRADE_LOADER_ID, system: SYSTEM, diff --git a/js/packages/web/src/contexts/meta.tsx b/js/packages/web/src/contexts/meta.tsx index 1ef9daf..53d832d 100644 --- a/js/packages/web/src/contexts/meta.tsx +++ b/js/packages/web/src/contexts/meta.tsx @@ -25,6 +25,8 @@ import { BIDDER_POT_LEN, decodeVault, Vault, + setProgramIds, + useConnectionConfig, } from '@oyster/common'; import { MintInfo, Token, TOKEN_PROGRAM_ID } from '@solana/spl-token'; import { @@ -117,7 +119,7 @@ const MetaContext = React.createContext({ export function MetaProvider({ children = null as any }) { const connection = useConnection(); - const PROGRAM_IDS = programIds(); + const { env } = useConnectionConfig(); const [metadata, setMetadata] = useState[]>([]); const [metadataByMint, setMetadataByMint] = useState< @@ -197,6 +199,8 @@ export function MetaProvider({ children = null as any }) { ]) ).flat(); + await setProgramIds(env); + const tempCache = { metadata: {}, metadataByMint: {}, @@ -327,6 +331,7 @@ export function MetaProvider({ children = null as any }) { setStore, setWhitelistedCreatorsByCreator, updateMints, + env, ]); useEffect(() => { @@ -643,9 +648,10 @@ const processMetaplexAccounts = async ( setWhitelistedCreatorsByCreator: any, ) => { try { + const STORE_ID = programIds().store.toBase58() if (a.account.data[0] === MetaplexKey.AuctionManagerV1) { const storeKey = new PublicKey(a.account.data.slice(1, 33)); - if (storeKey.toBase58() === programIds().store.toBase58()) { + if (storeKey.toBase58() === STORE_ID) { const auctionManager = decodeAuctionManager(a.account.data); // An initialized auction manager hasnt been validated, so we cant show it to users. // Could have any kind of pictures in it. @@ -691,7 +697,7 @@ const processMetaplexAccounts = async ( account: a.account, info: store, }; - if (a.pubkey.toBase58() === programIds().store.toBase58()) { + if (a.pubkey.toBase58() === STORE_ID) { setStore(account); } } else if (a.account.data[0] === MetaplexKey.WhitelistedCreatorV1) { diff --git a/js/packages/web/src/utils/assets.ts b/js/packages/web/src/utils/assets.ts index 06ca790..0897392 100644 --- a/js/packages/web/src/utils/assets.ts +++ b/js/packages/web/src/utils/assets.ts @@ -59,7 +59,6 @@ export async function getAssetCostToStore(files: File[]) { const arMultiplier = conversionRates.value.arweave.usd / conversionRates.value.solana.usd; console.log('Ar mult', arMultiplier); - // Add 10% padding for safety and slippage in price. // We also always make a manifest file, which, though tiny, needs payment. return LAMPORT_MULTIPLIER * totalArCost * arMultiplier * 1.1; }