From ec6dd846cee7afbd3f5d9b3d453b01b8e3f05583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sehyun=20Chung=20=E2=9C=8C=EF=B8=8E?= <41171808+sehyunc@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:55:59 -0700 Subject: [PATCH] pk_root in permit2 witness --- .../[base]/[quote]/deposit-button.tsx | 3 +- .../contexts/Renegade/renegade-context.tsx | 6 ++++ trade.renegade.fi/contexts/Renegade/types.ts | 1 + trade.renegade.fi/lib/permit2.ts | 32 ++++++++++++++----- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/trade.renegade.fi/app/(desktop)/[base]/[quote]/deposit-button.tsx b/trade.renegade.fi/app/(desktop)/[base]/[quote]/deposit-button.tsx index b4586128..3f6b273c 100644 --- a/trade.renegade.fi/app/(desktop)/[base]/[quote]/deposit-button.tsx +++ b/trade.renegade.fi/app/(desktop)/[base]/[quote]/deposit-button.tsx @@ -30,7 +30,7 @@ const MAX_INT = BigInt( export default function DepositButton() { const { baseTicker, baseTokenAmount } = useDeposit() - const { accountId } = useRenegade() + const { accountId, pkRoot } = useRenegade() const { isOpen: signInIsOpen, onOpen: onOpenSignIn, @@ -108,6 +108,7 @@ export default function DepositButton() { permit2Address: env.NEXT_PUBLIC_PERMIT2_CONTRACT as `0x${string}`, token, walletClient, + pkRoot, }) // Deposit diff --git a/trade.renegade.fi/contexts/Renegade/renegade-context.tsx b/trade.renegade.fi/contexts/Renegade/renegade-context.tsx index a0764d85..03f6f3cb 100644 --- a/trade.renegade.fi/contexts/Renegade/renegade-context.tsx +++ b/trade.renegade.fi/contexts/Renegade/renegade-context.tsx @@ -36,6 +36,8 @@ function RenegadeProvider({ children }: React.PropsWithChildren) { const [accountId, setAccountId] = React.useState() const [balances, setBalances] = React.useState>({}) const [orders, setOrders] = React.useState>({}) + // Used in Permit2 witness + const [pkRoot, setPkRoot] = React.useState([]) // Create task states. const [taskId, setTaskId] = React.useState() @@ -157,6 +159,9 @@ function RenegadeProvider({ children }: React.PropsWithChildren) { .then(() => { attemptedAutoSignin.current = accountId setAccountId(accountId) + const pkRoot = keychain.getPkRoot() + console.log("Setting account, setting pkroot: ", pkRoot) + setPkRoot(pkRoot) refreshAccount(accountId) const funded = safeLocalStorageGetItem(`funded_${accountId}`) @@ -249,6 +254,7 @@ function RenegadeProvider({ children }: React.PropsWithChildren) { counterparties, orderBook, orders, + pkRoot, refreshAccount, setAccount, setTask, diff --git a/trade.renegade.fi/contexts/Renegade/types.ts b/trade.renegade.fi/contexts/Renegade/types.ts index 01e9e0df..15224026 100644 --- a/trade.renegade.fi/contexts/Renegade/types.ts +++ b/trade.renegade.fi/contexts/Renegade/types.ts @@ -32,6 +32,7 @@ export interface RenegadeContextType { counterparties: Record orderBook: Record orders: Record + pkRoot: bigint[] refreshAccount: (accountId?: AccountId) => void setAccount: (oldAccountId?: AccountId, keychain?: Keychain) => Promise setTask: (newTaskId?: TaskId, taskType?: TaskType) => void diff --git a/trade.renegade.fi/lib/permit2.ts b/trade.renegade.fi/lib/permit2.ts index 484fc894..1ba12d6c 100644 --- a/trade.renegade.fi/lib/permit2.ts +++ b/trade.renegade.fi/lib/permit2.ts @@ -17,14 +17,20 @@ const TOKEN_PERMISSIONS = [ { name: "amount", type: "uint256" }, ] -const PERMIT_TRANSFER_FROM_TYPES = { - PermitTransferFrom: [ +const WITNESS = [{ name: "pk_root", type: "uint256[4]" }] + +// const PERMIT_TRANSFER_FROM_TYPES = { +const PERMIT_WITNESS_TRANSFER_FROM_TYPES = { + // PermitTransferFrom: [ + PermitWitnessTransferFrom: [ { name: "permitted", type: "TokenPermissions" }, { name: "spender", type: "address" }, { name: "nonce", type: "uint256" }, { name: "deadline", type: "uint256" }, + { name: "witness", type: "Witness" }, ], TokenPermissions: TOKEN_PERMISSIONS, + Witness: WITNESS, } /** @@ -49,6 +55,7 @@ export async function signPermit2({ permit2Address, token, walletClient, + pkRoot, }: { amount: bigint chainId: number @@ -56,7 +63,9 @@ export async function signPermit2({ permit2Address: Address token: Token walletClient: WalletClient + pkRoot: bigint[] }) { + console.log("Inside sign Permit2", pkRoot) if (!walletClient.account) throw new Error("Address not found on wallet client") @@ -76,14 +85,17 @@ export async function signPermit2({ spender, nonce: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)), deadline: BigInt(millisecondsToSeconds(Date.now() + 1000 * 60 * 30)), + witness: { pk_root: pkRoot }, } as const // Generate signature const signature = await walletClient.signTypedData({ account: walletClient.account.address, domain, - types: PERMIT_TRANSFER_FROM_TYPES, - primaryType: "PermitTransferFrom", + // types: PERMIT_TRANSFER_FROM_TYPES, + types: PERMIT_WITNESS_TRANSFER_FROM_TYPES, + // primaryType: "PermitTransferFrom", + primaryType: "PermitWitnessTransferFrom", message, }) @@ -91,8 +103,10 @@ export async function signPermit2({ const valid = await verifyTypedData({ address: walletClient.account.address, domain, - types: PERMIT_TRANSFER_FROM_TYPES, - primaryType: "PermitTransferFrom", + // types: PERMIT_TRANSFER_FROM_TYPES, + types: PERMIT_WITNESS_TRANSFER_FROM_TYPES, + // primaryType: "PermitTransferFrom", + primaryType: "PermitWitnessTransferFrom", message, signature, }) @@ -101,8 +115,10 @@ export async function signPermit2({ // Ensure correct public key is recovered const hash = hashTypedData({ domain, - types: PERMIT_TRANSFER_FROM_TYPES, - primaryType: "PermitTransferFrom", + // types: PERMIT_TRANSFER_FROM_TYPES, + types: PERMIT_WITNESS_TRANSFER_FROM_TYPES, + // primaryType: "PermitTransferFrom", + primaryType: "PermitWitnessTransferFrom", message, }) const recoveredPubKey = publicKeyToAddress(