diff --git a/package-lock.json b/package-lock.json index 01c14fe..a95a851 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc11", + "version": "0.21.0-rc12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc11", + "version": "0.21.0-rc12", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index fad4364..994bd6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc11", + "version": "0.21.0-rc12", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index c62f97d..858b03d 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -1,16 +1,28 @@ import { ethers, keccak256 } from 'ethers'; import type { Order } from '../types.js'; -const ORDER_TYPEHASH = "0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54" +const ORDER_TYPEHASH = '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54' export default function getOrderHash(order: Order) { - const abiCoder = ethers.AbiCoder.defaultAbiCoder() + const abiCoder = ethers.AbiCoder.defaultAbiCoder() - const { senderAddress, matcherAddress, baseAsset, quoteAsset, matcherFeeAsset, amount, price, matcherFee, nonce, expiration, buySide } = order - const orderBytes = abiCoder.encode( - ["bytes32", "address", "address", "address", "address", "address", "uint64", "uint64", "uint64", "uint64", "uint64", "uint8"], - [ORDER_TYPEHASH, senderAddress, matcherAddress, baseAsset, quoteAsset, matcherFeeAsset, amount, price, matcherFee, nonce, expiration, buySide] - ) + const { + senderAddress, + matcherAddress, + baseAsset, + quoteAsset, + matcherFeeAsset, + amount, + price, + matcherFee, + nonce, + expiration, + buySide + } = order + const orderBytes = abiCoder.encode( + ['bytes32', 'address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], + [ORDER_TYPEHASH, senderAddress, matcherAddress, baseAsset, quoteAsset, matcherFeeAsset, amount, price, matcherFee, nonce, expiration, buySide] + ) - return keccak256(orderBytes) -} \ No newline at end of file + return keccak256(orderBytes) +} diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 095c6b2..98ff265 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -10,8 +10,7 @@ import { LOCK_ORDER_TYPES } from '../constants/lockOrderTypes'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days export type SignLockOrderProps = { - userAddress: string // адрес юзера который хочет сделать лок - senderAddress: string // broker + senderAddress: string // user asset: string amount: BigNumber.Value signer: ethers.Signer @@ -20,7 +19,6 @@ export type SignLockOrderProps = { } export const signLockOrder = async ({ - userAddress, senderAddress, amount, chainId, @@ -34,7 +32,6 @@ export const signLockOrder = async ({ const secretHash = ethers.keccak256(secret); const order: LockOrder = { - user: userAddress, sender: senderAddress, expiration, asset, diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index bf25618..5aadb6e 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -41,8 +41,7 @@ export const signOrder = async ({ }: SignOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; - const secret = generateSecret(); - const secretHash = ethers.keccak256(secret); + // const secretHash = ethers.keccak256(secret); const isCrossChain = targetChainId === undefined || targetChainId !== chainId; @@ -75,8 +74,70 @@ export const signOrder = async ({ } : {}), buySide: side === 'BUY' ? 1 : 0, + // chainId, + // secretHash, + // 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 limitOrderHash = ethers.keccak256(ethers.toUtf8Bytes(JSON.stringify(limitOrder))); + // Generate the orderParamsHash + const orderParamsHash = ethers.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 + ] + )); + + 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)')) + + // 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)] + )); + const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, @@ -93,7 +154,7 @@ export const signOrder = async ({ ...order, id: hashOrder(order), signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash, targetChainId } : {}) + ...(isCrossChain ? { secret, secretHash: crossChainOrderHash, targetChainId } : {}) }; return signedOrder; }; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index d8bec97..f916a4f 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -265,7 +265,6 @@ class Aggregator { const body = { secretHash: signedLockOrder.secretHash, - user: signedLockOrder.user, sender: signedLockOrder.sender, expiration: signedLockOrder.expiration, asset: signedLockOrder.asset, @@ -530,7 +529,7 @@ class Aggregator { const signatureHeaders = this.generateHeaders(data, method, path, timestamp, apiKey, secretKey); const compiledHeaders = { ...headers, ...signatureHeaders.headers, }; const body = JSON.stringify(data) - ; + ; const res = pmmOrderSchema.parse({}); @@ -550,7 +549,9 @@ class Aggregator { const errorParseResult = errorSchema.safeParse(json); - if (!errorParseResult.success) { throw Error(`Unrecognized answer from aggregator: ${json}`); } + if (!errorParseResult.success) { + throw Error(`Unrecognized answer from aggregator: ${json}`); + } throw Error(errorParseResult.data.error.reason); } diff --git a/src/types.ts b/src/types.ts index fd9d0b4..93e0b62 100644 --- a/src/types.ts +++ b/src/types.ts @@ -56,8 +56,7 @@ export type CrossOrder = Order & { } export type LockOrder = { - user: string // address // адрес юзера который хочет сделать лок - sender: string // address // broker + sender: string // user address expiration: number // uint64 asset: string // address(?) amount: number // uint64