diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts index 16728c86..e6661477 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts @@ -11,7 +11,7 @@ import { UseScaffoldWriteConfig, } from "~~/utils/scaffold-stark/contract"; import { useSendTransaction, useNetwork, Abi } from "@starknet-react/core"; -import { InvocationsDetails } from "starknet"; +import { Contract as StarknetJsContract, InvocationsDetails } from "starknet"; import { notification } from "~~/utils/scaffold-stark"; import { useMemo } from "react"; import { useTransactor } from "./useTransactor"; @@ -44,30 +44,38 @@ export const useScaffoldMultiWriteContract = < contractName as ContractName ] as Contract; - const abiFunction = getFunctionsByStateMutability( - contract?.abi || [], - "external", - ).find((fn) => fn.name === functionName); + // TODO: see if we still need this + // const abiFunction = getFunctionsByStateMutability( + // contract?.abi || [], + // "external", + // ).find((fn) => fn.name === functionName); + + // we convert to starknetjs contract instance here since deployed data may be undefined if contract is not deployed + const contractInstance = new StarknetJsContract( + contract.abi, + contract.address, + ); return { - contractAddress: contract?.address, - entrypoint: functionName, - calldata: - abiFunction && unParsedArgs && contract - ? parseFunctionParams({ - abiFunction, - isRead: false, - inputs: unParsedArgs as any[], - isReadArgsParsing: false, - abi: contract.abi, - }).flat() - : [], + ...contractInstance.populate(functionName, unParsedArgs as any[]), + + // TODO: see if we still need this + // calldata: + // abiFunction && unParsedArgs && contract + // ? parseFunctionParams({ + // abiFunction, + // isRead: false, + // inputs: unParsedArgs as any[], + // isReadArgsParsing: false, + // abi: contract.abi, + // }).flat() + // : [], }; }); } else { return []; } - }, [calls]); + }, [calls, targetNetwork.network]); // TODO add custom options const sendTransactionInstance = useSendTransaction({ diff --git a/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts b/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts index 9fce2ee5..7632c9e8 100644 --- a/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts +++ b/packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts @@ -1,4 +1,4 @@ -import { useEffect, useMemo } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import { useTargetNetwork } from "./useTargetNetwork"; import { useDeployedContractInfo, @@ -12,8 +12,14 @@ import { parseFunctionParams, UseScaffoldWriteConfig, } from "~~/utils/scaffold-stark/contract"; -import { useSendTransaction, useNetwork, Abi } from "@starknet-react/core"; +import { + useSendTransaction, + useNetwork, + Abi, + useContract, +} from "@starknet-react/core"; import { notification } from "~~/utils/scaffold-stark"; +import { Contract as StarknetJsContract } from "starknet"; type UpdatedArgs = Parameters< ReturnType["sendAsync"] @@ -45,90 +51,97 @@ export const useScaffoldWriteContract = < [deployedContractData?.abi, functionName], ); - const parsedParams = useMemo(() => { - if (args && abiFunction && deployedContractData) { - const parsed = parseFunctionParams({ - abiFunction, - abi: deployedContractData.abi, - inputs: args as any[], - isRead: false, - isReadArgsParsing: false, - }).flat(Infinity); - return parsed; - } - return []; - }, [args, abiFunction, deployedContractData]); + // TODO: see if we need this bit later + // const parsedParams = useMemo(() => { + // if (args && abiFunction && deployedContractData) { + // const parsed = parseFunctionParams({ + // abiFunction, + // abi: deployedContractData.abi, + // inputs: args as any[], + // isRead: false, + // isReadArgsParsing: true, + // }).flat(Infinity); + // return parsed; + // } + // return []; + // }, [args, abiFunction, deployedContractData]); - const sendTransactionInstance = useSendTransaction({ - calls: deployedContractData - ? [ - { - contractAddress: deployedContractData?.address, - entrypoint: functionName, - calldata: parsedParams, - }, - ] - : [], - }); + // leave blank for now since default args will be called by the trigger function anyway + const sendTransactionInstance = useSendTransaction({}); - const sendContractWriteTx = async (params?: { - args?: UseScaffoldWriteConfig["args"]; - }) => { - // if no args supplied, use the one supplied from hook - let newArgs = params?.args; - if (Object.keys(newArgs || {}).length <= 0) { - newArgs = args; - } + const sendContractWriteTx = useCallback( + async (params?: { + args?: UseScaffoldWriteConfig["args"]; + }) => { + // if no args supplied, use the one supplied from hook + let newArgs = params?.args; + if (Object.keys(newArgs || {}).length <= 0) { + newArgs = args; + } - if (!deployedContractData) { - console.error( - "Target Contract is not deployed, did you forget to run `yarn deploy`?", + if (!deployedContractData) { + console.error( + "Target Contract is not deployed, did you forget to run `yarn deploy`?", + ); + return; + } + if (!chain?.id) { + console.error("Please connect your wallet"); + return; + } + if (chain?.id !== targetNetwork.id) { + console.error("You are on the wrong network"); + return; + } + + // TODO: see if we need this back, keeping this here + // let newParsedParams = + // newArgs && abiFunction && deployedContractData + // ? parseFunctionParams({ + // abiFunction, + // abi: deployedContractData.abi, + // inputs: newArgs as any[], + // isRead: false, + // isReadArgsParsing: false, + // }) + // : parsedParams; + + // we convert to starknetjs contract instance here since deployed data may be undefined if contract is not deployed + const contractInstance = new StarknetJsContract( + deployedContractData.abi, + deployedContractData.address, ); - return; - } - if (!chain?.id) { - console.error("Please connect your wallet"); - return; - } - if (chain?.id !== targetNetwork.id) { - console.error("You are on the wrong network"); - return; - } - let newParsedParams = - newArgs && abiFunction && deployedContractData - ? parseFunctionParams({ - abiFunction, - abi: deployedContractData.abi, - inputs: newArgs as any[], - isRead: false, - isReadArgsParsing: false, - }).flat(Infinity) - : parsedParams; - const newCalls = [ - { - contractAddress: deployedContractData.address, - entrypoint: functionName, - calldata: newParsedParams, - }, - ]; + const newCalls = deployedContractData + ? [contractInstance.populate(functionName, newArgs as any[])] + : []; - if (sendTransactionInstance.sendAsync) { - try { - // setIsMining(true); - return await sendTxnWrapper(() => - sendTransactionInstance.sendAsync(newCalls as any[]), - ); - } catch (e: any) { - throw e; - } finally { - // setIsMining(false); + if (sendTransactionInstance.sendAsync) { + try { + // setIsMining(true); + return await sendTxnWrapper(() => + sendTransactionInstance.sendAsync(newCalls as any[]), + ); + } catch (e: any) { + throw e; + } finally { + // setIsMining(false); + } + } else { + notification.error("Contract writer error. Try again."); + return; } - } else { - notification.error("Contract writer error. Try again."); - return; - } - }; + }, + [ + args, + chain?.id, + deployedContractData, + functionName, + sendTransactionInstance, + sendTxnWrapper, + targetNetwork.id, + ], + ); return { ...sendTransactionInstance, diff --git a/packages/nextjs/utils/scaffold-stark/contract.ts b/packages/nextjs/utils/scaffold-stark/contract.ts index 6a8fb479..6016009e 100644 --- a/packages/nextjs/utils/scaffold-stark/contract.ts +++ b/packages/nextjs/utils/scaffold-stark/contract.ts @@ -783,13 +783,11 @@ export function parseFunctionParams({ args: inputs, }); - console.debug({ formattedInputs }); - formattedInputs.forEach((inputItem) => { const { type: inputType, value: inputValue } = inputItem; parsedInputs.push( - parseParamWithType(inputType, inputValue, isRead, !!isReadArgsParsing), + deepParseValues(inputValue, isRead, inputType, !!isReadArgsParsing), ); }); @@ -841,7 +839,10 @@ function formatInputForParsing({ _formatInput(structValue, argIndex, variants as AbiParameter[]), ]; }); - return { type: structName, value: { variant: Object.fromEntries } }; + return { + type: structName, + value: { variant: Object.fromEntries(formattedEntries) }, + }; } const { members } = structDef as AbiStruct;