mock signOrder hashing

This commit is contained in:
TheJuze
2024-05-23 12:35:28 +03:00
parent 9cd077f9f4
commit ee50522fd8
3 changed files with 81 additions and 47 deletions

View File

@@ -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;
};