Skip to content

Commit

Permalink
Update base v3 fixed parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Nadai2010 committed Oct 18, 2024
1 parent b426f93 commit 33c5518
Show file tree
Hide file tree
Showing 10 changed files with 206 additions and 160 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"scripts": {
"chain": "yarn workspace @ss-2/snfoundry chain",
"deploy": "yarn workspace @ss-2/snfoundry deploy",
"deploy:reset": "yarn workspace @ss-2/snfoundry deploy:reset",
"deploy:no-reset": "yarn workspace @ss-2/snfoundry deploy --no-reset",
"test": "yarn workspace @ss-2/snfoundry test",
"compile": "yarn workspace @ss-2/snfoundry compile",
"start": "yarn workspace @ss-2/nextjs dev",
Expand Down
111 changes: 74 additions & 37 deletions packages/nextjs/hooks/scaffold-stark/useScaffoldMultiWriteContract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -34,45 +34,53 @@ export const useScaffoldMultiWriteContract = <
const { chain } = useNetwork();
const sendTxnWrapper = useTransactor();

const parsedCalls = useMemo(() => {
if (calls) {
return calls.map((call) => {
const functionName = call.functionName;
const contractName = call.contractName;
const unParsedArgs = call.args as any[];
const contract = contracts?.[targetNetwork.network]?.[
contractName as ContractName
] as Contract<TContractName>;
// TODO: commented out in case we need it again
// const parsedCalls = useMemo(() => {
// if (calls) {
// return calls.map((call) => {
// const functionName = call.functionName;
// const contractName = call.contractName;
// const unParsedArgs = call.args as any[];
// const contract = contracts?.[targetNetwork.network]?.[
// contractName as ContractName
// ] as Contract<TContractName>;

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);

return {
contractAddress: contract?.address,
entrypoint: functionName,
calldata:
abiFunction && unParsedArgs && contract
? parseFunctionParams({
abiFunction,
isRead: false,
inputs: unParsedArgs as any[],
isReadArgsParsing: false,
abi: contract.abi,
}).flat()
: [],
};
});
} else {
return [];
}
}, [calls]);
// // 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 {
// ...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, targetNetwork.network]);

// TODO add custom options
const sendTransactionInstance = useSendTransaction({
calls: parsedCalls,
});

const sendTransactionInstance = useSendTransaction({});

const sendContractWriteTx = async () => {
if (!chain?.id) {
Expand All @@ -86,8 +94,37 @@ export const useScaffoldMultiWriteContract = <

if (sendTransactionInstance.sendAsync) {
try {
// we just parse calldata here so that it will only parse on demand.
// use IIFE pattern
const parsedCalls = (() => {
if (calls) {
return calls.map((call) => {
const functionName = call.functionName;
const contractName = call.contractName;
const unParsedArgs = call.args as any[];
const contract = contracts?.[targetNetwork.network]?.[
contractName as ContractName
] as Contract<TContractName>;
// 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 contractInstance.populate(
functionName,
unParsedArgs as any[],
);
});
} else {
return [];
}
})();

// setIsMining(true);
return await sendTxnWrapper(() => sendTransactionInstance.sendAsync());
return await sendTxnWrapper(() =>
sendTransactionInstance.sendAsync(parsedCalls),
);
} catch (e: any) {
throw e;
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const useScaffoldReadContract = <
address: deployedContract?.address,
abi: deployedContract?.abi,
watch: true,
args,
args: args || [],
enabled:
args && (!Array.isArray(args) || !args.some((arg) => arg === undefined)),
blockIdentifier: "pending" as BlockNumber,
Expand Down
171 changes: 92 additions & 79 deletions packages/nextjs/hooks/scaffold-stark/useScaffoldWriteContract.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useEffect, useMemo } from "react";
import { useCallback, useEffect, useMemo } from "react";
import { useTargetNetwork } from "./useTargetNetwork";
import {
useDeployedContractInfo,
Expand All @@ -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<typeof useSendTransaction>["sendAsync"]
Expand Down Expand Up @@ -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<TAbi, TContractName, TFunctionName>["args"];
}) => {
// if no args supplied, use the one supplied from hook
let newArgs = params?.args;
if (!newArgs) {
newArgs = args;
}
const sendContractWriteTx = useCallback(
async (params?: {
args?: UseScaffoldWriteConfig<TAbi, TContractName, TFunctionName>["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: args 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,
Expand Down
2 changes: 1 addition & 1 deletion packages/nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
},
"dependencies": {
"@heroicons/react": "^2.1.3",
"@next/font": "^14.2.1",
"@radix-ui/react-icons": "1.3.0",
"@next/font": "^14.2.1",
"@radix-ui/themes": "2.0.3",
"@starknet-io/types-js": "^0.7.7",
"@starknet-react/chains": "^3.0.0",
Expand Down
Loading

0 comments on commit 33c5518

Please sign in to comment.