From b86850592631e36edb1208c629c189c9fe195959 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Sat, 21 Sep 2024 23:45:56 +0200 Subject: [PATCH] feat(connect): add prepareTransactionRequest --- bun.lockb | Bin 327672 -> 327704 bytes packages/connect/package.json | 1 + .../src/__snapshots__/client.spec.ts.snap | 4 ++ packages/connect/src/client.spec.ts | 14 +++++++ packages/connect/src/client.ts | 37 ++++++++++++++++-- packages/shared/src/types.ts | 6 +++ packages/shared/src/validation.ts | 5 +++ 7 files changed, 63 insertions(+), 4 deletions(-) diff --git a/bun.lockb b/bun.lockb index 9b60613eafdbd455eabca96b296fbddb38b9e7ee..b53b231dc6b3b0db6699fac519bd63cc2c6640a9 100755 GIT binary patch delta 551 zcmezIUwB4?$OJ#ejz<5j{*0<(^&AWg48?2=3|v6E7DzJz>3Sdy0?0H-yb&r6qM3pG z79hpBEW=p?RFDJ2h0|xMF`woH1z8;sw{Fi>XO3p#1bMj~hl)MU12 zXKeA#VN9GizC%=7OfUS-?7Dr&cjg2p&Wv9W!O884znHfx{$fdD z;=1sM1#B$G-|4-7SfV)t{zCW*wtxJ?($C0s;U84~KS*AA`r3ai)|>(VA%Y#-KmKE3 GX9NKF$z_B9 delta 558 zcmbQyAoAnC@B}}`j7I;h{*0<(_3R7`3`J}V3|v6E21qjj={g_{0?0H-ya6f>qM3pG zW+2T7q+6ik$TUd26{@ZSDvwSBm26)8_oBoAJK|rvvjO9FX9Fg~kD?V&r)~rK7vu$y zH!HVyDl)%jQ7r+=l>%`Y5SIfnNNpt$R{?P~5a$4K!StDG%%?d)Az2H=E!%U|nWLFF zK_Srw#O>QJYBJlivo-HEd7jJ8~#D%|AFL{r=R`DV$EsrA0n8sUGP5(J0k$E Cjbv2- diff --git a/packages/connect/package.json b/packages/connect/package.json index 77bd841..9eae0af 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -22,6 +22,7 @@ "cleanup": "rimraf dist .turbo" }, "dependencies": { + "@mina-js/shared": "workspace:*", "@mina-js/accounts": "workspace:*", "@mina-js/klesia-sdk": "workspace:*", "@mina-js/providers": "workspace:*", diff --git a/packages/connect/src/__snapshots__/client.spec.ts.snap b/packages/connect/src/__snapshots__/client.spec.ts.snap index 3c57799..d1c5206 100644 --- a/packages/connect/src/__snapshots__/client.spec.ts.snap +++ b/packages/connect/src/__snapshots__/client.spec.ts.snap @@ -3,10 +3,12 @@ exports[`matches snapshot of local source 1`] = ` { "createNullifier": [Function: AsyncFunction], + "estimateFees": [Function: AsyncFunction], "getAccounts": [Function: AsyncFunction], "getBalance": [Function: AsyncFunction], "getChainId": [Function: AsyncFunction], "getTransactionCount": [Function: AsyncFunction], + "prepareTransactionRequest": [Function: AsyncFunction], "signFields": [Function: AsyncFunction], "signMessage": [Function: AsyncFunction], "signTransaction": [Function: AsyncFunction], @@ -16,10 +18,12 @@ exports[`matches snapshot of local source 1`] = ` exports[`matches snapshot of json-rpc source 1`] = ` { "createNullifier": [Function: AsyncFunction], + "estimateFees": [Function: AsyncFunction], "getAccounts": [Function: AsyncFunction], "getBalance": [Function: AsyncFunction], "getChainId": [Function: AsyncFunction], "getTransactionCount": [Function: AsyncFunction], + "prepareTransactionRequest": [Function: AsyncFunction], "signFields": [Function: AsyncFunction], "signMessage": [Function: AsyncFunction], "signTransaction": [Function: AsyncFunction], diff --git a/packages/connect/src/client.spec.ts b/packages/connect/src/client.spec.ts index 5e82090..d6b9e82 100644 --- a/packages/connect/src/client.spec.ts +++ b/packages/connect/src/client.spec.ts @@ -75,4 +75,18 @@ describe("local source", () => { const signature = await client.signMessage({ message: "hello" }); expect(signature.data).toEqual("hello"); }); + + it("fills missing transaction fields", async () => { + const account = privateKeyToAccount({ + privateKey: Test.accounts[0].privateKey, + }); + const client = createWalletClient({ account, network: "devnet" }); + const transaction = await client.prepareTransactionRequest({ + from: PUBLIC_KEY, + to: PUBLIC_KEY, + amount: 1_000_000_000n, + }); + expect(transaction.fee).toBeDefined(); + expect(transaction.nonce).toBeDefined(); + }); }); diff --git a/packages/connect/src/client.ts b/packages/connect/src/client.ts index 0a6b997..c6c5f8a 100644 --- a/packages/connect/src/client.ts +++ b/packages/connect/src/client.ts @@ -1,8 +1,12 @@ -import type { Account, SignTransaction } from "@mina-js/accounts"; -import type { SignMessage } from "@mina-js/accounts"; -import type { SignFields } from "@mina-js/accounts"; -import type { CreateNullifier } from "@mina-js/accounts"; +import type { + Account, + CreateNullifier, + SignFields, + SignMessage, + SignTransaction, +} from "@mina-js/accounts"; import { createClient } from "@mina-js/klesia-sdk"; +import type { PartiallyFormedTransactionProperties } from "@mina-js/shared"; import { match } from "ts-pattern"; import { createStore } from "./store"; @@ -101,6 +105,29 @@ export const createWalletClient = ({ if (account.type !== "local") throw new Error("Account type not supported"); return account.createNullifier(params); }; + const estimateFees = async () => { + const { result } = await klesiaClient.request<"mina_estimateFees">({ + method: "mina_estimateFees", + }); + return result; + }; + const prepareTransactionRequest = async ( + transaction: PartiallyFormedTransactionProperties, + ) => { + let fee = transaction.fee; + let nonce = transaction.nonce; + if (!nonce) { + nonce = await getTransactionCount(); + } + if (!fee) { + fee = BigInt((await estimateFees()).medium); + } + return { + ...transaction, + fee, + nonce, + }; + }; return { getAccounts, getBalance, @@ -110,5 +137,7 @@ export const createWalletClient = ({ signMessage, signFields, createNullifier, + estimateFees, + prepareTransactionRequest, }; }; diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 65aaa45..904ab2b 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -2,11 +2,13 @@ import type { z } from "zod"; import type { LiteralSchema, NullifierSchema, + PartiallyFormedTransactionPayload, PrivateKeySchema, PublicKeySchema, SignedFieldsSchema, SignedMessageSchema, SignedTransactionSchema, + TransactionPayload, TransactionReceiptSchema, } from "./validation"; @@ -17,6 +19,10 @@ export type Literal = z.infer; export type Json = Literal | { [key: string]: Json } | Json[]; export type PublicKey = z.infer; export type PrivateKey = z.infer; +export type TransactionProperties = z.infer; +export type PartiallyFormedTransactionProperties = z.infer< + typeof PartiallyFormedTransactionPayload +>; /** * Return types diff --git a/packages/shared/src/validation.ts b/packages/shared/src/validation.ts index ca515e8..27b6957 100644 --- a/packages/shared/src/validation.ts +++ b/packages/shared/src/validation.ts @@ -39,6 +39,11 @@ export const TransactionPayload = z }) .strict(); +export const PartiallyFormedTransactionPayload = TransactionPayload.extend({ + fee: z.coerce.bigint().optional(), + nonce: z.coerce.bigint().optional(), +}); + /** * Return type schemas */