import { playgroundHelper } from "../helpers/helpers"; import { createPublicClient, encodeFunctionData, http, parseUnits, serializeTransaction, } from "viem"; import { sepolia } from "viem/chains"; import { chainAdapters, contracts, MPCSignature, utils } from "chainsig.js"; import { evm_constant } from "./constant"; const addressInfo = await playgroundHelper.provider.callFunction<{ public_key: string; address: `0x${string}`; }>( playgroundHelper.vaultContractId, "derive_address_and_public_key", { path: "1", chain: "EVM", near_network: "Testnet", }); if(!addressInfo){ throw new Error("Unable to find chain sig address info") } console.log(addressInfo); const client = createPublicClient({ chain: sepolia, transport: http(), }); const txRequest = await client.prepareTransactionRequest({ account: addressInfo.address, to: evm_constant.SEPOLIA_USDC_ADDRESS, data: encodeFunctionData({ abi: evm_constant.erc20Abi, functionName: "transfer", args: ["0x795A709106052181174411969d15397e9e6947DE", parseUnits("0.01", 6)], }), type: "eip1559", }); const serialized = serializeTransaction(txRequest); const signatures = await playgroundHelper.account.callFunction({ contractId: playgroundHelper.vaultContractId, methodName: "propose_execution", args: { policy_id: "transfer_sepolia_usdc", function_args: serialized, deadline_hours: 0, }, }); const contract = new contracts.ChainSignatureContract({ networkId: "testnet", contractId: "v1.signer-prod.testnet", }); const evmChain = new chainAdapters.evm.EVM({ publicClient: client, contract, }); const signedTx = evmChain.finalizeTransactionSigning({ transaction: txRequest, rsvSignatures: signatures.map((v) => utils.cryptography.toRSV(v)), }); const { hash } = await evmChain.broadcastTx(signedTx); console.log(hash);