From ee50522fd8beedba87ba35fd0ff76183115f2129 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 12:35:28 +0300 Subject: [PATCH] mock signOrder hashing --- package-lock.json | 4 +- package.json | 2 +- src/crypt/signOrder.ts | 122 ++++++++++++++++++++++++++--------------- 3 files changed, 81 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7b1e69..1db130c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc13", + "version": "0.21.0-rc14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc13", + "version": "0.21.0-rc14", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6958dc4..f0bc273 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc13", + "version": "0.21.0-rc14", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 5aadb6e..586403f 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,5 +1,5 @@ import { BigNumber } from 'bignumber.js'; -import { ethers } from 'ethers'; +import { ethers, keccak256 } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; import ORDER_TYPES from '../constants/orderTypes.js'; import type { CrossOrder, Order, SignedOrder, SupportedChainId } from '../types.js'; @@ -79,63 +79,74 @@ export const signOrder = async ({ // lockOrderExpiration: expiration }; - const limitOrder = { - senderAddress, - matcherAddress, - baseAsset: baseAssetAddress, - quoteAsset: quoteAssetAddress, - matcherFeeAsset: serviceFeeAssetAddress, - amount: normalizeNumber( - amount, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_FLOOR, - ), - price: normalizeNumber( - price, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_FLOOR, - ), - matcherFee: normalizeNumber( - matcherFee, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error - ), - nonce: BigInt(nonce), - expiration: BigInt(expiration), - buySide: side === 'BUY' ? 1 : 0, - }; + // const limitOrder = { + // senderAddress, + // matcherAddress, + // baseAsset: baseAssetAddress, + // quoteAsset: quoteAssetAddress, + // matcherFeeAsset: serviceFeeAssetAddress, + // amount: normalizeNumber( + // amount, + // INTERNAL_PROTOCOL_PRECISION, + // BigNumber.ROUND_FLOOR, + // ), + // price: normalizeNumber( + // price, + // INTERNAL_PROTOCOL_PRECISION, + // BigNumber.ROUND_FLOOR, + // ), + // matcherFee: normalizeNumber( + // matcherFee, + // INTERNAL_PROTOCOL_PRECISION, + // BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error + // ), + // nonce: BigInt(nonce), + // expiration: BigInt(expiration), + // buySide: side === 'BUY' ? 1 : 0, + // }; + const mockLimit = { + senderAddress: '0xb07f292216d845dce4887777ec44a18566ca0e95', + matcherAddress: '0xfbcad2c3a90fbd94c335fbdf8e22573456da7f68', + baseAsset: '0xcb2951e90d8dcf16e1fa84ac0c83f48906d6a744', + quoteAsset: '0xf223eca06261145b3287a0fefd8cfad371c7eb34', + matcherFeeAsset: '0xf223eca06261145b3287a0fefd8cfad371c7eb34', + amount: 2000000000, + price: 66490000, + matcherFee: 49730783, + nonce: 1716449740461, + expiration: 1718955340461, + buySide: 0, + } // const limitOrderHash = ethers.keccak256(ethers.toUtf8Bytes(JSON.stringify(limitOrder))); // Generate the orderParamsHash - const orderParamsHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + const orderParamsHash = keccak256((ethers.AbiCoder.defaultAbiCoder().encode( ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], [ - limitOrder.senderAddress, - limitOrder.matcherAddress, - limitOrder.baseAsset, - limitOrder.quoteAsset, - limitOrder.matcherFeeAsset, - limitOrder.amount, - limitOrder.price, - limitOrder.matcherFee, - limitOrder.nonce, - limitOrder.expiration, - limitOrder.buySide + mockLimit.senderAddress, + mockLimit.matcherAddress, + mockLimit.baseAsset, + mockLimit.quoteAsset, + mockLimit.matcherFeeAsset, + mockLimit.amount, + mockLimit.price, + mockLimit.matcherFee, + mockLimit.nonce, + mockLimit.expiration, + mockLimit.buySide ] - )); + ))); const secret = generateSecret(); const secretHash = ethers.keccak256(secret); - console.log(limitOrder, chainId, secretHash, expiration); - // Type hash from Solidity contract - const CROSS_CHAIN_ORDER_TYPEHASH = ethers.keccak256(ethers.toUtf8Bytes('Order(address senderAddress,address matcherAddress,address baseAsset,address quoteAsset,address matcherFeeAsset,uint64 amount,uint64 price,uint64 matcherFee,uint64 nonce,uint64 expiration,uint8 buySide,uint24 chainId,bytes32 secretHash,uint64 lockOrderExpiration)')) + const CROSS_CHAIN_ORDER_TYPEHASH = '0xcb145a2347f48eab4e3341a245f53da2e686e47ef421c89a6b40dde27a063c3f' // Generate the full crossChainOrder hash const crossChainOrderHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], - [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, Number(chainId), secretHash, BigInt(expiration)] + [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] )); const signature = await signer.signTypedData( @@ -144,6 +155,29 @@ export const signOrder = async ({ order, ); + const EIP712_DOMAIN_TYPEHASH = '0xa604fff5a27d5951f334ccda7abff3286a8af29caeeb196a6f2b40a1dce7612b'; + // const EIP712_DOMAIN_TYPEHASH1 = ethers.keccak256(ethers.toUtf8Bytes('EIP712Domain(string name,string version,uint256 chainId,bytes32 salt)')); + + const domainData = getDomainData(chainId); + // Generate the full crossChainOrder hash + const DOMAIN_SEPARATOR = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + ['bytes32', 'bytes32', 'bytes32', 'uint256', 'bytes32'], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + [EIP712_DOMAIN_TYPEHASH, ethers.keccak256(ethers.toUtf8Bytes(domainData?.name as string)), ethers.keccak256(ethers.toUtf8Bytes(domainData?.version as string)), Number(domainData.chainId), domainData.salt] + )); + + // const digest = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + // ['bytes', 'bytes32', 'bytes32'], ['\x19\x01', DOMAIN_SEPARATOR, crossChainOrderHash] + // )); + + const digest = ethers.solidityPackedKeccak256( + ['bytes', 'bytes32', 'bytes32'], ['0x1901', DOMAIN_SEPARATOR, crossChainOrderHash] + ); + + console.log('digest', digest) + // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 // "Signature's v was always send as 27 or 28, but from Ledger was 0 or 1" const fixedSignature = ethers.Signature.from(signature).serialized; @@ -154,7 +188,7 @@ export const signOrder = async ({ ...order, id: hashOrder(order), signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash: crossChainOrderHash, targetChainId } : {}) + ...(isCrossChain ? { secret: crossChainOrderHash, secretHash, targetChainId } : {}) }; return signedOrder; };