Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update base v3 fixed parser #158

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading