From c6547781299d48f8343e941a6e28b3f3762ec92c Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 10 Jan 2024 15:29:06 +0300 Subject: [PATCH 01/74] add getCrossChainAssetsByNetwork method --- package.json | 2 +- src/services/Aggregator/index.ts | 17 +++++++++++++++-- src/types.ts | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index fc99e35a..3570f295 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.41", + "version": "0.20.42-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 1a4b2296..0d9d4abf 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -6,9 +6,9 @@ import cancelOrderSchema from './schemas/cancelOrderSchema.js'; import orderBenefitsSchema from './schemas/orderBenefitsSchema.js'; import errorSchema from './schemas/errorSchema.js'; import placeAtomicSwapSchema from './schemas/placeAtomicSwapSchema.js'; -import { AggregatorWS } from './ws/index.js'; +import { AggregatorWS } from './ws'; import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema.js'; -import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder } from '../../types.js'; +import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder, SupportedChainShortNames } from '../../types.js'; import { pairConfigSchema, aggregatedOrderbookSchema, exchangeOrderbookSchema, poolReservesSchema, @@ -51,6 +51,7 @@ class Aggregator { this.getPairConfigs = this.getPairConfigs.bind(this); this.getPairsList = this.getPairsList.bind(this); this.getSwapInfo = this.getSwapInfo.bind(this); + this.getCrossChainAssetsByNetwork = this.getCrossChainAssetsByNetwork.bind(this); this.getTradeProfits = this.getTradeProfits.bind(this); this.placeAtomicSwap = this.placeAtomicSwap.bind(this); this.placeOrder = this.placeOrder.bind(this); @@ -290,6 +291,18 @@ class Aggregator { ); }; + getCrossChainAssetsByNetwork = (sourceChain: SupportedChainShortNames) => { + const url = new URL(`${this.apiUrl}/api/v1/cross-chain/assets`); + url.searchParams.append('sourceChain', sourceChain); + + return fetchWithValidation( + url.toString(), + z.array(z.number()), + { headers: this.basicAuthHeaders }, + errorSchema, + ) + } + getPrices = (assetPair: string, includePools: boolean) => { const url = new URL(`${this.apiUrl}/api/v1/prices/`); url.searchParams.append('assetPair', assetPair); diff --git a/src/types.ts b/src/types.ts index 7511476d..84348676 100644 --- a/src/types.ts +++ b/src/types.ts @@ -99,6 +99,23 @@ export enum SupportedChainId { // BROKEN = '0', } +export enum SupportedChainShortNames { + MAINNET = 'ETH', + ROPSTEN = 'ETH-Ropsten', + GOERLI = 'ETH-Goerli', + ARBITRUM_GOERLI = 'Arbitrum Goerli', + FANTOM_OPERA = 'FTM', + POLYGON = 'Polygon', + OKC = 'OKC', + + POLYGON_TESTNET = 'Polygon Mumbai', + FANTOM_TESTNET = 'FTM-Testnet', + BSC = 'BSC', + BSC_TESTNET = 'BSC-Testnet', + OKC_TESTNET = 'OKC-Testnet', + DRIP_TESTNET = 'DRIP Chain', +} + const balanceTypes = ['exchange', 'wallet'] as const; export type Source = typeof balanceTypes[number]; From 49c529481bb537c065b6b06a959de9ff50af437a Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 10 Jan 2024 15:55:40 +0300 Subject: [PATCH 02/74] update getCrossChainAssetsByNetwork prop types --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 4 ++-- src/types.ts | 17 ----------------- 4 files changed, 5 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2671eeb7..65823598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.39", + "version": "0.20.42-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.39", + "version": "0.20.42-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 3570f295..94baf416 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc0", + "version": "0.20.42-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 0d9d4abf..d82b10ac 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -8,7 +8,7 @@ import errorSchema from './schemas/errorSchema.js'; import placeAtomicSwapSchema from './schemas/placeAtomicSwapSchema.js'; import { AggregatorWS } from './ws'; import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema.js'; -import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder, SupportedChainShortNames } from '../../types.js'; +import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder } from '../../types.js'; import { pairConfigSchema, aggregatedOrderbookSchema, exchangeOrderbookSchema, poolReservesSchema, @@ -291,7 +291,7 @@ class Aggregator { ); }; - getCrossChainAssetsByNetwork = (sourceChain: SupportedChainShortNames) => { + getCrossChainAssetsByNetwork = (sourceChain: Uppercase) => { const url = new URL(`${this.apiUrl}/api/v1/cross-chain/assets`); url.searchParams.append('sourceChain', sourceChain); diff --git a/src/types.ts b/src/types.ts index 84348676..7511476d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -99,23 +99,6 @@ export enum SupportedChainId { // BROKEN = '0', } -export enum SupportedChainShortNames { - MAINNET = 'ETH', - ROPSTEN = 'ETH-Ropsten', - GOERLI = 'ETH-Goerli', - ARBITRUM_GOERLI = 'Arbitrum Goerli', - FANTOM_OPERA = 'FTM', - POLYGON = 'Polygon', - OKC = 'OKC', - - POLYGON_TESTNET = 'Polygon Mumbai', - FANTOM_TESTNET = 'FTM-Testnet', - BSC = 'BSC', - BSC_TESTNET = 'BSC-Testnet', - OKC_TESTNET = 'OKC-Testnet', - DRIP_TESTNET = 'DRIP Chain', -} - const balanceTypes = ['exchange', 'wallet'] as const; export type Source = typeof balanceTypes[number]; From 782b39ca2343795b481aeca2f594d7c0233e6aa9 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 10 Jan 2024 17:18:38 +0300 Subject: [PATCH 03/74] update getCrossChainAssetsByNetwork return type --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65823598..9e70f1a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc1", + "version": "0.20.42-rc2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc1", + "version": "0.20.42-rc2", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 94baf416..24079438 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc1", + "version": "0.20.42-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index d82b10ac..a24fbb4d 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -297,7 +297,7 @@ class Aggregator { return fetchWithValidation( url.toString(), - z.array(z.number()), + z.array(z.string()), { headers: this.basicAuthHeaders }, errorSchema, ) From 12cbd5a87fad92c23fe316def4e99f80140c6296 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 16 Jan 2024 12:58:07 +0300 Subject: [PATCH 04/74] update lock file --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30b438e9..230235fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.43", + "version": "0.20.42-rc3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.43", + "version": "0.20.42-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { From 72e1e9464e82edaad8839d6f6db3c9ab4685080a Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 18 Jan 2024 17:45:32 +0300 Subject: [PATCH 05/74] add lock order support --- package-lock.json | 4 +- package.json | 2 +- src/Unit/Exchange/swapMarket.ts | 3 +- src/crypt/hashOrder.ts | 4 ++ src/crypt/signLockOrder.ts | 71 ++++++++++++++++++++++++++++ src/crypt/signOrder.ts | 9 +++- src/services/Aggregator/index.ts | 48 +++++++++++++++++-- src/services/Aggregator/ws/index.ts | 60 +++++++++++------------ src/types.ts | 59 ++++++++++++++++------- src/utils/isUppercasedNetworkCode.ts | 3 +- 10 files changed, 205 insertions(+), 58 deletions(-) create mode 100644 src/crypt/signLockOrder.ts diff --git a/package-lock.json b/package-lock.json index 230235fe..a06af069 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc3", + "version": "0.20.42-rc4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc3", + "version": "0.20.42-rc4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 89b39102..6ce75504 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc3", + "version": "0.20.42-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index c4c0b051..be7350ab 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -4,7 +4,7 @@ import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index. import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; -import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION, SWAP_THROUGH_ORION_POOL_GAS_LIMIT } from '../../constants/index.js'; +import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION, SWAP_THROUGH_ORION_POOL_GAS_LIMIT } from '../../constants'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { calculateFeeInFeeAsset, denormalizeNumber, normalizeNumber } from '../../utils/index.js'; import { signOrder } from '../../crypt/index.js'; @@ -37,7 +37,6 @@ type PoolSwap = { export type Swap = AggregatorOrder | PoolSwap; - const isValidSingleSwap = (singleSwap: Omit & { factory: string }): singleSwap is SingleSwap => { return isValidFactory(singleSwap.factory); } diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 23bc4749..8a5c5d28 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -14,6 +14,8 @@ const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( 'uint64', 'uint64', 'uint64', + 'uint64', + 'uint64', 'uint8', ], [ @@ -24,10 +26,12 @@ const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( order.quoteAsset, order.matcherFeeAsset, order.amount, + order.targetChainId, order.price, order.matcherFee, order.nonce, order.expiration, + order.secretHash, order.buySide === 1 ? '0x01' : '0x00', ], ); diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts new file mode 100644 index 00000000..b70c3eaf --- /dev/null +++ b/src/crypt/signLockOrder.ts @@ -0,0 +1,71 @@ +import type { TypedDataSigner } from '@ethersproject/abstract-signer'; +import { ethers } from 'ethers'; +import ORDER_TYPES from '../constants/orderTypes.js'; +import type { LockOrder, SignedLockOrder, SupportedChainId } from '../types.js'; +import getDomainData from './getDomainData.js'; +import generateSecret from '../utils/generateSecret'; + +const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days + +type SignerWithTypedDataSign = ethers.Signer & TypedDataSigner; + +export type LockOrderProps = { + userAddress: string // адрес юзера который хочет сделать лок + senderAddress: string // broker + asset: string + amount: ethers.BigNumberish + targetChainId: ethers.BigNumberish + sign: string // подпись юзера + signer: ethers.Signer + chainId: SupportedChainId +} + +export const signLockOrder = async ({ + userAddress, + senderAddress, + sign, + amount, + targetChainId, + asset, + chainId, + signer +}: LockOrderProps) => { + const nonce = Date.now(); + const expiration = nonce + DEFAULT_EXPIRATION; + const secret = generateSecret(); + const secretHash = ethers.keccak256(secret); + + const order: LockOrder = { + user: userAddress, + sender: senderAddress, + expiration, + asset, + amount, + targetChainId, + secretHash, + sign + }; + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const typedDataSigner = signer as SignerWithTypedDataSign; + + const signature = await typedDataSigner.signTypedData( + getDomainData(chainId), + ORDER_TYPES, + order, + ); + + // 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; + + // if (!fixedSignature) throw new Error("Can't sign order"); + + const signedOrder: SignedLockOrder = { + ...order, + signature: fixedSignature, + secret + }; + + return signedOrder; +}; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index fca41a73..7008935e 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,12 +1,13 @@ import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; -import { INTERNAL_PROTOCOL_PRECISION } from '../constants/index.js'; +import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; import ORDER_TYPES from '../constants/orderTypes.js'; import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; import hashOrder from './hashOrder.js'; +import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -24,9 +25,12 @@ export const signOrder = async ( serviceFeeAssetAddr: string, signer: ethers.Signer, chainId: SupportedChainId, + targetChainId?: ethers.BigNumberish, ) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; + const secret = generateSecret(); + const secretHash = ethers.keccak256(secret); const order: Order = { senderAddress, @@ -51,6 +55,8 @@ export const signOrder = async ( )), nonce, expiration, + secretHash, + targetChainId, buySide: side === 'BUY' ? 1 : 0, }; @@ -73,6 +79,7 @@ export const signOrder = async ( ...order, id: hashOrder(order), signature: fixedSignature, + secret }; return signedOrder; }; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index e38b0247..019e7ccd 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -8,12 +8,17 @@ import errorSchema from './schemas/errorSchema.js'; import placeAtomicSwapSchema from './schemas/placeAtomicSwapSchema.js'; import { AggregatorWS } from './ws'; import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema.js'; -import type { BasicAuthCredentials, SignedCancelOrderRequest, SignedOrder } from '../../types.js'; +import type { + BasicAuthCredentials, + NetworkShortName, + SignedCancelOrderRequest, + SignedLockOrder, + SignedOrder +} from '../../types.js'; import { pairConfigSchema, aggregatedOrderbookSchema, exchangeOrderbookSchema, poolReservesSchema, } from './schemas/index.js'; -import type networkCodes from '../../constants/networkCodes.js'; import toUpperCase from '../../utils/toUpperCase.js'; import httpToWS from '../../utils/httpToWS.js'; import { ethers } from 'ethers'; @@ -55,6 +60,7 @@ class Aggregator { this.getTradeProfits = this.getTradeProfits.bind(this); this.placeAtomicSwap = this.placeAtomicSwap.bind(this); this.placeOrder = this.placeOrder.bind(this); + this.placeLockOrder = this.placeLockOrder.bind(this); this.cancelOrder = this.cancelOrder.bind(this); this.checkWhitelisted = this.checkWhitelisted.bind(this); this.getLockedBalance = this.getLockedBalance.bind(this); @@ -236,6 +242,39 @@ class Aggregator { ); }; + placeLockOrder = ( + signedLockOrder: SignedLockOrder, + rawExchangeRestrictions?: string | undefined, + ) => { + const headers = { + 'Content-Type': 'application/json', + Accept: 'application/json', + ...this.basicAuthHeaders, + }; + + const url = new URL(`${this.apiUrl}/api/v1/cross-chain`); + + return fetchWithValidation( + url.toString(), + z.object({ + orderId: z.string(), + placementRequests: z.array( + z.object({ + amount: z.number(), + brokerAddress: z.string(), + exchange: z.string(), + }), + ).optional(), + }), + { + headers, + method: 'POST', + body: JSON.stringify({ ...signedLockOrder, rawExchangeRestrictions }), + }, + errorSchema, + ); + }; + cancelOrder = (signedCancelOrderRequest: SignedCancelOrderRequest) => fetchWithValidation( `${this.apiUrl}/api/v1/order`, cancelOrderSchema, @@ -291,7 +330,7 @@ class Aggregator { ); }; - getCrossChainAssetsByNetwork = (sourceChain: Uppercase) => { + getCrossChainAssetsByNetwork = (sourceChain: NetworkShortName) => { const url = new URL(`${this.apiUrl}/api/v1/cross-chain/assets`); url.searchParams.append('sourceChain', sourceChain); @@ -354,7 +393,7 @@ class Aggregator { */ placeAtomicSwap = ( secretHash: string, - sourceNetworkCode: Uppercase, + sourceNetworkCode: NetworkShortName, ) => fetchWithValidation( `${this.apiUrl}/api/v1/atomic-swap`, placeAtomicSwapSchema, @@ -376,6 +415,7 @@ class Aggregator { /** * Get placed atomic swaps. Each atomic swap received from this list has a target chain corresponding to this Aggregator * @param sender Sender address + * @param limit * @returns Fetch promise */ getHistoryAtomicSwaps = (sender: string, limit = 1000) => { diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index 69d214cb..2f63237f 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -82,22 +82,22 @@ type SwapInfoSubscription = { type AddressUpdateUpdate = { kind: 'update' balances: Partial< - Record< - string, - Balance + Record< + string, + Balance + > > - > order?: z.infer | z.infer | undefined } type AddressUpdateInitial = { kind: 'initial' balances: Partial< - Record< - string, - Balance + Record< + string, + Balance + > > - > orders?: Array> | undefined // The field is not defined if the user has no orders } @@ -122,22 +122,22 @@ const exclusiveSubscriptions = [ ] as const; type BufferLike = - | string - | Buffer - | DataView - | number - | ArrayBufferView - | Uint8Array - | ArrayBuffer - | SharedArrayBuffer - | readonly unknown[] - | readonly number[] - | { valueOf: () => ArrayBuffer } - | { valueOf: () => SharedArrayBuffer } - | { valueOf: () => Uint8Array } - | { valueOf: () => readonly number[] } - | { valueOf: () => string } - | { [Symbol.toPrimitive]: (hint: string) => string }; + | string + | Buffer + | DataView + | number + | ArrayBufferView + | Uint8Array + | ArrayBuffer + | SharedArrayBuffer + | readonly unknown[] + | readonly number[] + | { valueOf: () => ArrayBuffer } + | { valueOf: () => SharedArrayBuffer } + | { valueOf: () => Uint8Array } + | { valueOf: () => readonly number[] } + | { valueOf: () => string } + | { [Symbol.toPrimitive]: (hint: string) => string }; const isSubType = (subType: string): subType is keyof Subscription => Object.values(SubscriptionType).some((t) => t === subType); @@ -201,6 +201,7 @@ class AggregatorWS { } private messageQueue: BufferLike[] = []; + private sendWsMessage(message: BufferLike) { if (this.ws?.readyState === WebSocket.OPEN) { this.ws.send(message); @@ -228,6 +229,7 @@ class AggregatorWS { } private hearbeatIntervalId: ReturnType | undefined; + private setupHeartbeat() { const heartbeat = () => { if (this.isAlive) { @@ -328,11 +330,11 @@ class AggregatorWS { } /** - * Returns newest subscription id for given id. Subscription id can be changed during resubscription. - * This function ensure that old subscription id will be replaced with newest one. - * @param id Id of subscription - * @returns Newest subscription id - */ + * Returns newest subscription id for given id. Subscription id can be changed during resubscription. + * This function ensure that old subscription id will be replaced with newest one. + * @param id Id of subscription + * @returns Newest subscription id + */ getNewestSubscriptionId(id: string): string { const newId = this.subIdReplacements[id]; if (newId !== undefined && newId !== id) { diff --git a/src/types.ts b/src/types.ts index 7511476d..2fd40b09 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,8 +3,10 @@ import type factories from './constants/factories.js'; import type { BigNumber } from 'bignumber.js'; import type subOrderStatuses from './constants/subOrderStatuses.js'; import type positionStatuses from './constants/positionStatuses.js'; -import type { knownEnvs } from './config/schemas/index.js'; +import type { knownEnvs } from './config/schemas'; import type getHistory from './Orion/bridge/getHistory.js'; +import type { ethers } from 'ethers'; +import type { networkCodes } from './constants'; export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; @@ -47,14 +49,33 @@ export type Order = { matcherFee: number // uint64 nonce: number // uint64 expiration: number // uint64 + secretHash: string // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell + targetChainId: ethers.BigNumberish | undefined // uint64 } -export type SignedOrder = { - id: string // hash of Order (it's not part of order structure in smart-contract) +export type LockOrder = { + user: string // address // адрес юзера который хочет сделать лок + sender: string // address // broker + expiration: ethers.BigNumberish // uint64 + asset: string // address(?) + amount: ethers.BigNumberish // uint64 + targetChainId: ethers.BigNumberish // uint64 + secretHash: string // uint64 + sign: string // uint64 // подпись юзера +} + +type SignedOrderAdditionalProps = { signature: string // bytes + secret: string needWithdraw?: boolean // bool (not supported yet by smart-contract) -} & Order +} + +export type SignedOrder = SignedOrderAdditionalProps & Order & { + id: string // hash of Order (it's not part of order structure in smart-contract) +} + +export type SignedLockOrder = SignedOrderAdditionalProps & LockOrder export type CancelOrderRequest = { id: number | string @@ -99,6 +120,8 @@ export enum SupportedChainId { // BROKEN = '0', } +export type NetworkShortName = Uppercase; + const balanceTypes = ['exchange', 'wallet'] as const; export type Source = typeof balanceTypes[number]; @@ -278,22 +301,22 @@ export type EnvConfig = { analyticsAPI: string referralAPI: string networks: Partial< - Record< - SupportedChainId, - VerboseUnitConfig + Record< + SupportedChainId, + VerboseUnitConfig + > > - > } export type AggregatedAssets = Partial< - Record< - string, - Partial< - Record + Record< + string, + Partial< + Record + > > - > - >; +>; export type RedeemOrder = { sender: string @@ -433,9 +456,9 @@ type BridgeHistory = Awaited>; type BridgeHistoryItem = NonNullable; export type AtomicSwap = Partial< - Omit + Omit > & Partial< - Omit + Omit > & { sourceChainId: SupportedChainId targetChainId: SupportedChainId diff --git a/src/utils/isUppercasedNetworkCode.ts b/src/utils/isUppercasedNetworkCode.ts index 978f1cd5..2cf20554 100644 --- a/src/utils/isUppercasedNetworkCode.ts +++ b/src/utils/isUppercasedNetworkCode.ts @@ -1,7 +1,8 @@ import { networkCodes } from '../constants/index.js'; import toUpperCase from './toUpperCase.js'; +import type { NetworkShortName } from '../types'; -const isUppercasedNetworkCode = (value: string): value is Uppercase => networkCodes +const isUppercasedNetworkCode = (value: string): value is NetworkShortName => networkCodes .map(toUpperCase).some((networkCode) => networkCode === value); export default isUppercasedNetworkCode; From 330fc513e515ef56dcedcf248685387cf0d3ce29 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 19 Jan 2024 12:15:17 +0300 Subject: [PATCH 06/74] add to signOrder secretHash only if targetChainId exist --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 8 ++++++-- src/types.ts | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index a06af069..a96aa451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc4", + "version": "0.20.42-rc5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc4", + "version": "0.20.42-rc5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6ce75504..66512fb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc4", + "version": "0.20.42-rc5", "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 7008935e..013841b7 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -55,8 +55,12 @@ export const signOrder = async ( )), nonce, expiration, - secretHash, - targetChainId, + ...(targetChainId !== undefined + ? { + secretHash, + targetChainId + } + : {}), buySide: side === 'BUY' ? 1 : 0, }; diff --git a/src/types.ts b/src/types.ts index 2fd40b09..8de284a9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -49,9 +49,9 @@ export type Order = { matcherFee: number // uint64 nonce: number // uint64 expiration: number // uint64 - secretHash: string // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell - targetChainId: ethers.BigNumberish | undefined // uint64 + secretHash?: string // uint64 + targetChainId?: ethers.BigNumberish // uint64 } export type LockOrder = { From fcc30178ab6184561bb4cf6e337a99b7fd7ad571 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 19 Jan 2024 12:27:19 +0300 Subject: [PATCH 07/74] make fields in signOrder optional --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signLockOrder.ts | 2 +- src/crypt/signOrder.ts | 8 +++++--- src/types.ts | 6 +++--- tsconfig.json | 3 ++- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index a96aa451..eb858acd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc5", + "version": "0.20.42-rc6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc5", + "version": "0.20.42-rc6", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 66512fb2..c0e12f13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc5", + "version": "0.20.42-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index b70c3eaf..a04a29d5 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -14,10 +14,10 @@ export type LockOrderProps = { senderAddress: string // broker asset: string amount: ethers.BigNumberish - targetChainId: ethers.BigNumberish sign: string // подпись юзера signer: ethers.Signer chainId: SupportedChainId + targetChainId: SupportedChainId } export const signLockOrder = async ({ diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 013841b7..04ce1580 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -25,13 +25,15 @@ export const signOrder = async ( serviceFeeAssetAddr: string, signer: ethers.Signer, chainId: SupportedChainId, - targetChainId?: ethers.BigNumberish, + targetChainId?: SupportedChainId, ) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; const secret = generateSecret(); const secretHash = ethers.keccak256(secret); + const isCrossChain = targetChainId === undefined || targetChainId === chainId; + const order: Order = { senderAddress, matcherAddress, @@ -55,7 +57,7 @@ export const signOrder = async ( )), nonce, expiration, - ...(targetChainId !== undefined + ...(isCrossChain ? { secretHash, targetChainId @@ -83,7 +85,7 @@ export const signOrder = async ( ...order, id: hashOrder(order), signature: fixedSignature, - secret + ...(isCrossChain ? { secret } : {}) }; return signedOrder; }; diff --git a/src/types.ts b/src/types.ts index 8de284a9..304315b9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,7 +51,7 @@ export type Order = { expiration: number // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell secretHash?: string // uint64 - targetChainId?: ethers.BigNumberish // uint64 + targetChainId?: SupportedChainId // uint64 } export type LockOrder = { @@ -60,14 +60,14 @@ export type LockOrder = { expiration: ethers.BigNumberish // uint64 asset: string // address(?) amount: ethers.BigNumberish // uint64 - targetChainId: ethers.BigNumberish // uint64 + targetChainId: SupportedChainId // uint64 secretHash: string // uint64 sign: string // uint64 // подпись юзера } type SignedOrderAdditionalProps = { signature: string // bytes - secret: string + secret?: string needWithdraw?: boolean // bool (not supported yet by smart-contract) } diff --git a/tsconfig.json b/tsconfig.json index 2bbded1f..6b2298e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,8 @@ "noUnusedLocals": true /* Enable error reporting when a local variables aren't read. */, "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, "noUncheckedIndexedAccess": true, - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "skipLibCheck": true, /* Skip type checking all .d.ts files. */ + "exactOptionalPropertyTypes": false, /* allow ? in interfaces */ }, "ts-node": { // Tell ts-node CLI to install the --loader automatically, explained below From 2079e49a047cdd055a81771fd987b64a778aa378 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 19 Jan 2024 12:35:58 +0300 Subject: [PATCH 08/74] fix build and types --- package.json | 2 +- src/crypt/signOrder.ts | 4 ++-- src/types.ts | 8 +++++--- tsconfig.json | 1 - 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index aefac436..c0e12f13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc7", + "version": "0.20.42-rc6", "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 04ce1580..046e6bcf 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -3,7 +3,7 @@ import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; import ORDER_TYPES from '../constants/orderTypes.js'; -import type { Order, SignedOrder, SupportedChainId } from '../types.js'; +import type { CrossOrder, Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; import hashOrder from './hashOrder.js'; @@ -34,7 +34,7 @@ export const signOrder = async ( const isCrossChain = targetChainId === undefined || targetChainId === chainId; - const order: Order = { + const order: Order | CrossOrder = { senderAddress, matcherAddress, baseAsset: baseAssetAddr, diff --git a/src/types.ts b/src/types.ts index 304315b9..4e72128c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -50,8 +50,10 @@ export type Order = { nonce: number // uint64 expiration: number // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell - secretHash?: string // uint64 - targetChainId?: SupportedChainId // uint64 +} +export type CrossOrder = Order & { + secretHash: string // uint64 + targetChainId: SupportedChainId // uint64 } export type LockOrder = { @@ -71,7 +73,7 @@ type SignedOrderAdditionalProps = { needWithdraw?: boolean // bool (not supported yet by smart-contract) } -export type SignedOrder = SignedOrderAdditionalProps & Order & { +export type SignedOrder = SignedOrderAdditionalProps & (Order | CrossOrder) & { id: string // hash of Order (it's not part of order structure in smart-contract) } diff --git a/tsconfig.json b/tsconfig.json index 6b2298e4..8e321136 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,6 @@ "noUnusedParameters": true /* Raise an error when a function parameter isn't read */, "noUncheckedIndexedAccess": true, "skipLibCheck": true, /* Skip type checking all .d.ts files. */ - "exactOptionalPropertyTypes": false, /* allow ? in interfaces */ }, "ts-node": { // Tell ts-node CLI to install the --loader automatically, explained below From ac865f4de9720946b4ce6a00d4652640ae069a4f Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 23 Jan 2024 12:54:41 +0300 Subject: [PATCH 09/74] add signLockOrder to imports --- package.json | 2 +- src/crypt/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c0e12f13..aefac436 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc6", + "version": "0.20.42-rc7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/index.ts b/src/crypt/index.ts index d09530af..8a0574eb 100644 --- a/src/crypt/index.ts +++ b/src/crypt/index.ts @@ -1,2 +1,3 @@ export { default as signCancelOrder } from './signCancelOrder.js'; export { default as signOrder } from './signOrder.js'; +export { signLockOrder } from './signLockOrder.js'; From a2cdadfa09ffa1dd97ec3883dce994a6d23734cf Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 23 Jan 2024 16:52:22 +0300 Subject: [PATCH 10/74] update lockOrder types --- package-lock.json | 4 ++-- package.json | 2 +- src/Orion/bridge/swap.ts | 2 +- src/crypt/signLockOrder.ts | 5 +---- src/types.ts | 1 - 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01ec2ebe..fffa61d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.45", + "version": "0.20.42-rc9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.45", + "version": "0.20.42-rc9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6a3dea0d..b60a0387 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc8", + "version": "0.20.42-rc9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Orion/bridge/swap.ts b/src/Orion/bridge/swap.ts index 4bb83528..b38074a0 100644 --- a/src/Orion/bridge/swap.ts +++ b/src/Orion/bridge/swap.ts @@ -10,7 +10,7 @@ import { LOCKATOMIC_GAS_LIMIT, REDEEMATOMIC_GAS_LIMIT, WITHDRAW_GAS_LIMIT -} from '../../constants/index.js'; +} from '../../constants'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { denormalizeNumber, generateSecret, normalizeNumber, toUpperCase } from '../../utils/index.js'; import type { SupportedChainId } from '../../types.js'; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index a04a29d5..397675f7 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -14,7 +14,6 @@ export type LockOrderProps = { senderAddress: string // broker asset: string amount: ethers.BigNumberish - sign: string // подпись юзера signer: ethers.Signer chainId: SupportedChainId targetChainId: SupportedChainId @@ -23,11 +22,10 @@ export type LockOrderProps = { export const signLockOrder = async ({ userAddress, senderAddress, - sign, amount, + chainId, targetChainId, asset, - chainId, signer }: LockOrderProps) => { const nonce = Date.now(); @@ -43,7 +41,6 @@ export const signLockOrder = async ({ amount, targetChainId, secretHash, - sign }; // eslint-disable-next-line @typescript-eslint/consistent-type-assertions diff --git a/src/types.ts b/src/types.ts index 01372ae2..7a6cc6bc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -64,7 +64,6 @@ export type LockOrder = { amount: ethers.BigNumberish // uint64 targetChainId: SupportedChainId // uint64 secretHash: string // uint64 - sign: string // uint64 // подпись юзера } type SignedOrderAdditionalProps = { From 74b2e4443281a719d86539d2f177feb1ec6908f7 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 23 Jan 2024 17:21:43 +0300 Subject: [PATCH 11/74] update lockOrder types --- package.json | 2 +- src/crypt/signLockOrder.ts | 11 +++++++++-- src/types.ts | 5 ++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b60a0387..4cc5e1d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc9", + "version": "0.20.42-rc10", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 397675f7..3b1110cc 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -4,6 +4,9 @@ import ORDER_TYPES from '../constants/orderTypes.js'; import type { LockOrder, SignedLockOrder, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; +import { BigNumber } from 'bignumber.js'; +import normalizeNumber from '../utils/normalizeNumber'; +import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -13,7 +16,7 @@ export type LockOrderProps = { userAddress: string // адрес юзера который хочет сделать лок senderAddress: string // broker asset: string - amount: ethers.BigNumberish + amount: BigNumber.Value signer: ethers.Signer chainId: SupportedChainId targetChainId: SupportedChainId @@ -38,7 +41,11 @@ export const signLockOrder = async ({ sender: senderAddress, expiration, asset, - amount, + amount: Number(normalizeNumber( + amount, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_FLOOR, + )), targetChainId, secretHash, }; diff --git a/src/types.ts b/src/types.ts index 7a6cc6bc..68fe5607 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,7 +5,6 @@ import type subOrderStatuses from './constants/subOrderStatuses.js'; import type positionStatuses from './constants/positionStatuses.js'; import type { knownEnvs } from './config/schemas'; import type getHistory from './Orion/bridge/getHistory.js'; -import type { ethers } from 'ethers'; import type { networkCodes } from './constants'; export type DeepPartial = T extends object ? { @@ -59,9 +58,9 @@ export type CrossOrder = Order & { export type LockOrder = { user: string // address // адрес юзера который хочет сделать лок sender: string // address // broker - expiration: ethers.BigNumberish // uint64 + expiration: number // uint64 asset: string // address(?) - amount: ethers.BigNumberish // uint64 + amount: number // uint64 targetChainId: SupportedChainId // uint64 secretHash: string // uint64 } From 009f4f98d2e2ecc5049ca2be0e26440b77226245 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 23 Jan 2024 18:02:11 +0300 Subject: [PATCH 12/74] fix version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fffa61d4..f229d38d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc9", + "version": "0.20.42-rc11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc9", + "version": "0.20.42-rc11", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4cc5e1d2..132c8cf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc10", + "version": "0.20.42-rc11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From a5ab496475ebf85e6521e7cc0f6e1cd74b834e10 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 23 Jan 2024 20:22:27 +0300 Subject: [PATCH 13/74] add logger --- package-lock.json | 4 +- package.json | 2 +- src/crypt/signLockOrder.ts | 8 +- src/services/Aggregator/index.ts | 651 +++++++++++++++---------------- 4 files changed, 335 insertions(+), 330 deletions(-) diff --git a/package-lock.json b/package-lock.json index f229d38d..0f00b09a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc11", + "version": "0.20.42-rc12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc11", + "version": "0.20.42-rc12", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 132c8cf3..b1e16fcd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc11", + "version": "0.20.42-rc12", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 3b1110cc..2849b6b4 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -20,6 +20,7 @@ export type LockOrderProps = { signer: ethers.Signer chainId: SupportedChainId targetChainId: SupportedChainId + logger?: (message: string) => void } export const signLockOrder = async ({ @@ -29,7 +30,8 @@ export const signLockOrder = async ({ chainId, targetChainId, asset, - signer + signer, + logger }: LockOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; @@ -49,19 +51,23 @@ export const signLockOrder = async ({ targetChainId, secretHash, }; + logger?.('❌ test1'); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const typedDataSigner = signer as SignerWithTypedDataSign; + logger?.('❌ test2'); const signature = await typedDataSigner.signTypedData( getDomainData(chainId), ORDER_TYPES, order, ); + logger?.('❌ test3'); // 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; + logger?.('❌ test4'); // if (!fixedSignature) throw new Error("Can't sign order"); diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index d28fc5a6..300067e8 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -1,249 +1,248 @@ -import type {BigNumber} from 'bignumber.js'; -import {z} from 'zod'; +import type { BigNumber } from 'bignumber.js'; +import { z } from 'zod'; import swapInfoSchema from './schemas/swapInfoSchema.js'; import exchangeInfoSchema from './schemas/exchangeInfoSchema.js'; import cancelOrderSchema from './schemas/cancelOrderSchema.js'; import orderBenefitsSchema from './schemas/orderBenefitsSchema.js'; import errorSchema from './schemas/errorSchema.js'; import placeAtomicSwapSchema from './schemas/placeAtomicSwapSchema.js'; -import {AggregatorWS} from './ws'; -import {atomicSwapHistorySchema} from './schemas/atomicSwapHistorySchema.js'; +import { AggregatorWS } from './ws'; +import { atomicSwapHistorySchema } from './schemas/atomicSwapHistorySchema.js'; import type { - BasicAuthCredentials, - OrderSource, - NetworkShortName, - SignedLockOrder, - SignedCancelOrderRequest, - SignedOrder + BasicAuthCredentials, + OrderSource, + NetworkShortName, + SignedLockOrder, + SignedCancelOrderRequest, + SignedOrder } from '../../types.js'; import { - pairConfigSchema, aggregatedOrderbookSchema, - exchangeOrderbookSchema, poolReservesSchema, + pairConfigSchema, aggregatedOrderbookSchema, + exchangeOrderbookSchema, poolReservesSchema, } from './schemas/index.js'; import toUpperCase from '../../utils/toUpperCase.js'; import httpToWS from '../../utils/httpToWS.js'; -import {ethers} from 'ethers'; +import { ethers } from 'ethers'; import orderSchema from './schemas/orderSchema.js'; -import {fetchWithValidation} from 'simple-typed-fetch'; +import { fetchWithValidation } from 'simple-typed-fetch'; class Aggregator { - private readonly apiUrl: string; + private readonly apiUrl: string; - readonly ws: AggregatorWS; + readonly ws: AggregatorWS; - private readonly basicAuth?: BasicAuthCredentials | undefined; + private readonly basicAuth?: BasicAuthCredentials | undefined; - get api() { - return this.apiUrl; - } + get api() { + return this.apiUrl; + } - constructor( - httpAPIUrl: string, - wsAPIUrl: string, - basicAuth?: BasicAuthCredentials - ) { - // const oaUrl = new URL(apiUrl); - // const oaWsProtocol = oaUrl.protocol === 'https:' ? 'wss' : 'ws'; - // const aggregatorWsUrl = `${oaWsProtocol}://${oaUrl.host + (oaUrl.pathname === '/' - // ? '' - // : oaUrl.pathname)}/v1`; - - this.apiUrl = httpAPIUrl; - this.ws = new AggregatorWS(httpToWS(wsAPIUrl)); - this.basicAuth = basicAuth; - - this.getHistoryAtomicSwaps = this.getHistoryAtomicSwaps.bind(this); - this.getPairConfig = this.getPairConfig.bind(this); - this.getPairConfigs = this.getPairConfigs.bind(this); - this.getPairsList = this.getPairsList.bind(this); - this.getSwapInfo = this.getSwapInfo.bind(this); + constructor( + httpAPIUrl: string, + wsAPIUrl: string, + basicAuth?: BasicAuthCredentials + ) { + // const oaUrl = new URL(apiUrl); + // const oaWsProtocol = oaUrl.protocol === 'https:' ? 'wss' : 'ws'; + // const aggregatorWsUrl = `${oaWsProtocol}://${oaUrl.host + (oaUrl.pathname === '/' + // ? '' + // : oaUrl.pathname)}/v1`; + + this.apiUrl = httpAPIUrl; + this.ws = new AggregatorWS(httpToWS(wsAPIUrl)); + this.basicAuth = basicAuth; + + this.getHistoryAtomicSwaps = this.getHistoryAtomicSwaps.bind(this); + this.getPairConfig = this.getPairConfig.bind(this); + this.getPairConfigs = this.getPairConfigs.bind(this); + this.getPairsList = this.getPairsList.bind(this); + this.getSwapInfo = this.getSwapInfo.bind(this); this.getCrossChainAssetsByNetwork = this.getCrossChainAssetsByNetwork.bind(this); - this.getTradeProfits = this.getTradeProfits.bind(this); - this.placeAtomicSwap = this.placeAtomicSwap.bind(this); - this.placeOrder = this.placeOrder.bind(this); + this.getTradeProfits = this.getTradeProfits.bind(this); + this.placeAtomicSwap = this.placeAtomicSwap.bind(this); + this.placeOrder = this.placeOrder.bind(this); this.placeLockOrder = this.placeLockOrder.bind(this); - this.cancelOrder = this.cancelOrder.bind(this); - this.checkWhitelisted = this.checkWhitelisted.bind(this); - this.getLockedBalance = this.getLockedBalance.bind(this); - this.getAggregatedOrderbook = this.getAggregatedOrderbook.bind(this); - this.getExchangeOrderbook = this.getExchangeOrderbook.bind(this); - this.getPoolReserves = this.getPoolReserves.bind(this); - this.getVersion = this.getVersion.bind(this); - this.getPrices = this.getPrices.bind(this); - } + this.cancelOrder = this.cancelOrder.bind(this); + this.checkWhitelisted = this.checkWhitelisted.bind(this); + this.getLockedBalance = this.getLockedBalance.bind(this); + this.getAggregatedOrderbook = this.getAggregatedOrderbook.bind(this); + this.getExchangeOrderbook = this.getExchangeOrderbook.bind(this); + this.getPoolReserves = this.getPoolReserves.bind(this); + this.getVersion = this.getVersion.bind(this); + this.getPrices = this.getPrices.bind(this); + } - get basicAuthHeaders() { - if (this.basicAuth) { - return { - Authorization: `Basic ${btoa(`${this.basicAuth.username}:${this.basicAuth.password}`)}`, - }; - } - return {}; + get basicAuthHeaders() { + if (this.basicAuth) { + return { + Authorization: `Basic ${btoa(`${this.basicAuth.username}:${this.basicAuth.password}`)}`, + }; } + return {}; + } - getOrder = (orderId: string, owner?: string) => { - if (!ethers.isHexString(orderId)) { - throw new Error(`Invalid order id: ${orderId}. Must be a hex string`); - } - const url = new URL(`${this.apiUrl}/api/v1/order`); - url.searchParams.append('orderId', orderId); - if (owner !== undefined) { - if (!ethers.isAddress(owner)) { - throw new Error(`Invalid owner address: ${owner}`); - } - url.searchParams.append('owner', owner); - } - return fetchWithValidation( - url.toString(), - orderSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); + getOrder = (orderId: string, owner?: string) => { + if (!ethers.isHexString(orderId)) { + throw new Error(`Invalid order id: ${orderId}. Must be a hex string`); } + const url = new URL(`${this.apiUrl}/api/v1/order`); + url.searchParams.append('orderId', orderId); + if (owner !== undefined) { + if (!ethers.isAddress(owner)) { + throw new Error(`Invalid owner address: ${owner}`); + } + url.searchParams.append('owner', owner); + } + return fetchWithValidation( + url.toString(), + orderSchema, + { headers: this.basicAuthHeaders }, + errorSchema, + ); + } - getPairsList = (market: 'spot') => { - const url = new URL(`${this.apiUrl}/api/v1/pairs/list`); - url.searchParams.append('market', toUpperCase(market)); - - return fetchWithValidation( - url.toString(), - z.array(z.string().toUpperCase()), - {headers: this.basicAuthHeaders}, - ); - }; - - getAggregatedOrderbook = (pair: string, depth = 20) => { - const url = new URL(`${this.apiUrl}/api/v1/orderbook`); - url.searchParams.append('pair', pair); - url.searchParams.append('depth', depth.toString()); - return fetchWithValidation( - url.toString(), - aggregatedOrderbookSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + getPairsList = (market: 'spot') => { + const url = new URL(`${this.apiUrl}/api/v1/pairs/list`); + url.searchParams.append('market', toUpperCase(market)); - getAvailableExchanges = () => fetchWithValidation( - `${this.apiUrl}/api/v1/exchange/list`, - z.string().array(), + return fetchWithValidation( + url.toString(), + z.array(z.string().toUpperCase()), + { headers: this.basicAuthHeaders }, ); + }; - getExchangeOrderbook = ( - pair: string, - exchange: string, - depth = 20, - filterByBrokerBalances: boolean | null = null, - ) => { - const url = new URL(`${this.apiUrl}/api/v1/orderbook/${exchange}/${pair}`); - url.searchParams.append('pair', pair); - url.searchParams.append('depth', depth.toString()); - if (filterByBrokerBalances !== null) { - url.searchParams.append('filterByBrokerBalances', filterByBrokerBalances.toString()); - } - return fetchWithValidation( - url.toString(), - exchangeOrderbookSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + getAggregatedOrderbook = (pair: string, depth = 20) => { + const url = new URL(`${this.apiUrl}/api/v1/orderbook`); + url.searchParams.append('pair', pair); + url.searchParams.append('depth', depth.toString()); + return fetchWithValidation( + url.toString(), + aggregatedOrderbookSchema, + { headers: this.basicAuthHeaders }, + errorSchema, + ); + }; - getPairConfigs = (market: 'spot') => { - const url = new URL(`${this.apiUrl}/api/v1/pairs/exchangeInfo`); - url.searchParams.append('market', toUpperCase(market)); + getAvailableExchanges = () => fetchWithValidation( + `${this.apiUrl}/api/v1/exchange/list`, + z.string().array(), + ); - return fetchWithValidation( - url.toString(), - exchangeInfoSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); + getExchangeOrderbook = ( + pair: string, + exchange: string, + depth = 20, + filterByBrokerBalances: boolean | null = null, + ) => { + const url = new URL(`${this.apiUrl}/api/v1/orderbook/${exchange}/${pair}`); + url.searchParams.append('pair', pair); + url.searchParams.append('depth', depth.toString()); + if (filterByBrokerBalances !== null) { + url.searchParams.append('filterByBrokerBalances', filterByBrokerBalances.toString()); } - - getPoolReserves = ( - pair: string, - exchange: string, - ) => { - const url = new URL(`${this.apiUrl}/api/v1/pools/reserves/${exchange}/${pair}`); - return fetchWithValidation( - url.toString(), - poolReservesSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; - - getVersion = () => fetchWithValidation( - `${this.apiUrl}/api/v1/version`, - z.object({ - serviceName: z.string(), - version: z.string(), - apiVersion: z.string(), - }), - {headers: this.basicAuthHeaders}, - errorSchema, + return fetchWithValidation( + url.toString(), + exchangeOrderbookSchema, + { headers: this.basicAuthHeaders }, + errorSchema, ); + }; - getPairConfig = (assetPair: string) => fetchWithValidation( - `${this.apiUrl}/api/v1/pairs/exchangeInfo/${assetPair}`, - pairConfigSchema, - {headers: this.basicAuthHeaders}, - errorSchema, + getPairConfigs = (market: 'spot') => { + const url = new URL(`${this.apiUrl}/api/v1/pairs/exchangeInfo`); + url.searchParams.append('market', toUpperCase(market)); + + return fetchWithValidation( + url.toString(), + exchangeInfoSchema, + { headers: this.basicAuthHeaders }, + errorSchema, ); + } - checkWhitelisted = (address: string) => fetchWithValidation( - `${this.apiUrl}/api/v1/whitelist/check?address=${address}`, - z.boolean(), - {headers: this.basicAuthHeaders}, - errorSchema, + getPoolReserves = ( + pair: string, + exchange: string, + ) => { + const url = new URL(`${this.apiUrl}/api/v1/pools/reserves/${exchange}/${pair}`); + return fetchWithValidation( + url.toString(), + poolReservesSchema, + { headers: this.basicAuthHeaders }, + errorSchema, ); + }; - placeOrder = ( - signedOrder: SignedOrder, - isCreateInternalOrder: boolean, - isReversedOrder?: boolean, - partnerId?: string, + getVersion = () => fetchWithValidation( + `${this.apiUrl}/api/v1/version`, + z.object({ + serviceName: z.string(), + version: z.string(), + apiVersion: z.string(), + }), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + + getPairConfig = (assetPair: string) => fetchWithValidation( + `${this.apiUrl}/api/v1/pairs/exchangeInfo/${assetPair}`, + pairConfigSchema, + { headers: this.basicAuthHeaders }, + errorSchema, + ); + + checkWhitelisted = (address: string) => fetchWithValidation( + `${this.apiUrl}/api/v1/whitelist/check?address=${address}`, + z.boolean(), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + + placeOrder = ( + signedOrder: SignedOrder, + isCreateInternalOrder: boolean, + isReversedOrder?: boolean, + partnerId?: string, source?: OrderSource, - rawExchangeRestrictions?: string | undefined, - ) => { - const headers = { - 'Content-Type': 'application/json', - Accept: 'application/json', - ...(isReversedOrder !== undefined) && { - 'X-Reverse-Order': isReversedOrder ? 'true' : 'false', - }, - ...(partnerId !== undefined) && {'X-Partner-Id': partnerId}, - ...(source !== undefined) && {'X-Source': source}, - ...this.basicAuthHeaders, - }; - - const url = new URL(`${this.apiUrl}/api/v1/order/${isCreateInternalOrder ? 'internal' : ''}`); - - return fetchWithValidation( - url.toString(), - z.object({ - orderId: z.string(), - placementRequests: z.array( - z.object({ - amount: z.number(), - brokerAddress: z.string(), - exchange: z.string(), - }), - ).optional(), - }), - { - headers, - method: 'POST', - body: JSON.stringify({...signedOrder, rawExchangeRestrictions}), - }, - errorSchema, - ); + rawExchangeRestrictions?: string | undefined, + ) => { + const headers = { + 'Content-Type': 'application/json', + Accept: 'application/json', + ...(isReversedOrder !== undefined) && { + 'X-Reverse-Order': isReversedOrder ? 'true' : 'false', + }, + ...(partnerId !== undefined) && { 'X-Partner-Id': partnerId }, + ...(source !== undefined) && { 'X-Source': source }, + ...this.basicAuthHeaders, }; + const url = new URL(`${this.apiUrl}/api/v1/order/${isCreateInternalOrder ? 'internal' : ''}`); + + return fetchWithValidation( + url.toString(), + z.object({ + orderId: z.string(), + placementRequests: z.array( + z.object({ + amount: z.number(), + brokerAddress: z.string(), + exchange: z.string(), + }), + ).optional(), + }), + { + headers, + method: 'POST', + body: JSON.stringify({ ...signedOrder, rawExchangeRestrictions }), + }, + errorSchema, + ); + }; + placeLockOrder = ( signedLockOrder: SignedLockOrder, - rawExchangeRestrictions?: string | undefined, ) => { const headers = { 'Content-Type': 'application/json', @@ -268,66 +267,66 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify({ ...signedLockOrder, rawExchangeRestrictions }), + body: JSON.stringify(signedLockOrder), }, errorSchema, ); }; - cancelOrder = (signedCancelOrderRequest: SignedCancelOrderRequest) => fetchWithValidation( - `${this.apiUrl}/api/v1/order`, - cancelOrderSchema, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - ...this.basicAuthHeaders, - }, - body: JSON.stringify({ - ...signedCancelOrderRequest, - sender: signedCancelOrderRequest.senderAddress, - }), - }, - errorSchema, - ); + cancelOrder = (signedCancelOrderRequest: SignedCancelOrderRequest) => fetchWithValidation( + `${this.apiUrl}/api/v1/order`, + cancelOrderSchema, + { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + ...this.basicAuthHeaders, + }, + body: JSON.stringify({ + ...signedCancelOrderRequest, + sender: signedCancelOrderRequest.senderAddress, + }), + }, + errorSchema, + ); + + getSwapInfo = ( + type: 'exactSpend' | 'exactReceive', + assetIn: string, + assetOut: string, + amount: string, + instantSettlement?: boolean, + exchanges?: string[] | 'cex' | 'pools', + ) => { + const url = new URL(`${this.apiUrl}/api/v1/swap`); + url.searchParams.append('assetIn', assetIn); + url.searchParams.append('assetOut', assetOut); + if (type === 'exactSpend') { + url.searchParams.append('amountIn', amount); + } else { + url.searchParams.append('amountOut', amount); + } + if (exchanges !== undefined) { + if (Array.isArray(exchanges)) { + exchanges.forEach((exchange) => { + url.searchParams.append('exchanges', exchange); + }); + } else { + url.searchParams.append('exchanges', exchanges); + } + } + if (instantSettlement !== undefined && instantSettlement) { + url.searchParams.append('instantSettlement', 'true'); + } - getSwapInfo = ( - type: 'exactSpend' | 'exactReceive', - assetIn: string, - assetOut: string, - amount: string, - instantSettlement?: boolean, - exchanges?: string[] | 'cex' | 'pools', - ) => { - const url = new URL(`${this.apiUrl}/api/v1/swap`); - url.searchParams.append('assetIn', assetIn); - url.searchParams.append('assetOut', assetOut); - if (type === 'exactSpend') { - url.searchParams.append('amountIn', amount); - } else { - url.searchParams.append('amountOut', amount); - } - if (exchanges !== undefined) { - if (Array.isArray(exchanges)) { - exchanges.forEach((exchange) => { - url.searchParams.append('exchanges', exchange); - }); - } else { - url.searchParams.append('exchanges', exchanges); - } - } - if (instantSettlement !== undefined && instantSettlement) { - url.searchParams.append('instantSettlement', 'true'); - } - - return fetchWithValidation( - url.toString(), - swapInfoSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + return fetchWithValidation( + url.toString(), + swapInfoSchema, + { headers: this.basicAuthHeaders }, + errorSchema, + ); + }; getCrossChainAssetsByNetwork = (sourceChain: NetworkShortName) => { const url = new URL(`${this.apiUrl}/api/v1/cross-chain/assets`); @@ -341,90 +340,90 @@ class Aggregator { ) } - getPrices = (assetPair: string, includePools: boolean) => { - const url = new URL(`${this.apiUrl}/api/v1/prices/`); - url.searchParams.append('assetPair', assetPair); - url.searchParams.append('includePools', includePools.toString()); - return fetchWithValidation( - url.toString(), - z.number(), - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + getPrices = (assetPair: string, includePools: boolean) => { + const url = new URL(`${this.apiUrl}/api/v1/prices/`); + url.searchParams.append('assetPair', assetPair); + url.searchParams.append('includePools', includePools.toString()); + return fetchWithValidation( + url.toString(), + z.number(), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + }; - getLockedBalance = (address: string, currency: string) => { - const url = new URL(`${this.apiUrl}/api/v1/address/balance/reserved/${currency}`); - url.searchParams.append('address', address); - return fetchWithValidation( - url.toString(), - z.object({ - [currency]: z.number(), - }).partial(), - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + getLockedBalance = (address: string, currency: string) => { + const url = new URL(`${this.apiUrl}/api/v1/address/balance/reserved/${currency}`); + url.searchParams.append('address', address); + return fetchWithValidation( + url.toString(), + z.object({ + [currency]: z.number(), + }).partial(), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + }; - getTradeProfits = ( - symbol: string, - amount: BigNumber, - isBuy: boolean, - ) => { - const url = new URL(`${this.apiUrl}/api/v1/orderBenefits`); - url.searchParams.append('symbol', symbol); - url.searchParams.append('amount', amount.toString()); - url.searchParams.append('side', isBuy ? 'buy' : 'sell'); - - return fetchWithValidation( - url.toString(), - orderBenefitsSchema, - {headers: this.basicAuthHeaders}, - errorSchema, - ); - }; + getTradeProfits = ( + symbol: string, + amount: BigNumber, + isBuy: boolean, + ) => { + const url = new URL(`${this.apiUrl}/api/v1/orderBenefits`); + url.searchParams.append('symbol', symbol); + url.searchParams.append('amount', amount.toString()); + url.searchParams.append('side', isBuy ? 'buy' : 'sell'); - /** + return fetchWithValidation( + url.toString(), + orderBenefitsSchema, + { headers: this.basicAuthHeaders }, + errorSchema, + ); + }; + + /** * Placing atomic swap. Placement must take place on the target chain. * @param secretHash Secret hash * @param sourceNetworkCode uppercase, e.g. BSC, ETH * @returns Fetch promise */ - placeAtomicSwap = ( - secretHash: string, + placeAtomicSwap = ( + secretHash: string, sourceNetworkCode: NetworkShortName, - ) => fetchWithValidation( - `${this.apiUrl}/api/v1/atomic-swap`, - placeAtomicSwapSchema, - { - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - ...this.basicAuthHeaders, - }, - method: 'POST', - body: JSON.stringify({ - secretHash, - sourceNetworkCode, - }), - }, - errorSchema, - ); + ) => fetchWithValidation( + `${this.apiUrl}/api/v1/atomic-swap`, + placeAtomicSwapSchema, + { + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + ...this.basicAuthHeaders, + }, + method: 'POST', + body: JSON.stringify({ + secretHash, + sourceNetworkCode, + }), + }, + errorSchema, + ); - /** + /** * Get placed atomic swaps. Each atomic swap received from this list has a target chain corresponding to this Aggregator * @param sender Sender address - * @param limit + * @param limit * @returns Fetch promise */ - getHistoryAtomicSwaps = (sender: string, limit = 1000) => { - const url = new URL(`${this.apiUrl}/api/v1/atomic-swap/history/all`); - url.searchParams.append('sender', sender); - url.searchParams.append('limit', limit.toString()); - return fetchWithValidation(url.toString(), atomicSwapHistorySchema, {headers: this.basicAuthHeaders}); - }; + getHistoryAtomicSwaps = (sender: string, limit = 1000) => { + const url = new URL(`${this.apiUrl}/api/v1/atomic-swap/history/all`); + url.searchParams.append('sender', sender); + url.searchParams.append('limit', limit.toString()); + return fetchWithValidation(url.toString(), atomicSwapHistorySchema, { headers: this.basicAuthHeaders }); + }; } export * as schemas from './schemas/index.js'; export * as ws from './ws/index.js'; -export {Aggregator}; +export { Aggregator }; From c6be1c73c325af1c37e9da87b6aff26411bbc3ad Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 24 Jan 2024 12:23:14 +0300 Subject: [PATCH 14/74] fix signLockOrder --- package-lock.json | 43 ++------------------------------- package.json | 3 +-- src/constants/lockOrderTypes.ts | 11 +++++++++ src/crypt/hashLockOrder.ts | 25 +++++++++++++++++++ src/crypt/hashOrder.ts | 4 --- src/crypt/signCancelOrder.ts | 7 +----- src/crypt/signLockOrder.ts | 18 +++----------- src/crypt/signOrder.ts | 8 +----- 8 files changed, 44 insertions(+), 75 deletions(-) create mode 100644 src/constants/lockOrderTypes.ts create mode 100644 src/crypt/hashLockOrder.ts diff --git a/package-lock.json b/package-lock.json index 0f00b09a..230bef49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,16 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc12", + "version": "0.20.42-rc13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc12", + "version": "0.20.42-rc13", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@orionprotocol/contracts": "1.22.6", "@types/lodash.clonedeep": "^4.5.9", @@ -1084,28 +1083,6 @@ "@ethersproject/web": "^5.7.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, "node_modules/@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", @@ -1236,7 +1213,6 @@ } ], "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1333,7 +1309,6 @@ ], "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -12573,18 +12548,6 @@ "@ethersproject/web": "^5.7.0" } }, - "@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, "@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", @@ -12645,7 +12608,6 @@ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "requires": { - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -12692,7 +12654,6 @@ "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "requires": { "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/basex": "^5.7.0", diff --git a/package.json b/package.json index b1e16fcd..7a942f4b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc12", + "version": "0.20.42-rc13", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -86,7 +86,6 @@ }, "dependencies": { "@babel/runtime": "^7.21.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@orionprotocol/contracts": "1.22.6", "@types/lodash.clonedeep": "^4.5.9", diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts new file mode 100644 index 00000000..304a9912 --- /dev/null +++ b/src/constants/lockOrderTypes.ts @@ -0,0 +1,11 @@ +export const LOCK_ORDER_TYPES = { + Order: [ + { name: 'user', type: 'address' }, + { name: 'sender', type: 'address' }, + { name: 'expiration', type: 'uint64' }, + { name: 'asset', type: 'string' }, + { name: 'amount', type: 'uint64' }, + { name: 'targetChainId', type: 'uint64' }, + { name: 'secretHash', type: 'string' }, + ], +}; diff --git a/src/crypt/hashLockOrder.ts b/src/crypt/hashLockOrder.ts new file mode 100644 index 00000000..71173f8d --- /dev/null +++ b/src/crypt/hashLockOrder.ts @@ -0,0 +1,25 @@ +import { ethers } from 'ethers'; +import type { LockOrder } from '../types.js'; + +export const hashLockOrder = (order: LockOrder) => ethers.solidityPackedKeccak256( + [ + 'uint8', + 'address', + 'uint64', + 'string', + 'uint64', + 'uint64', + 'uint64', + 'string' + ], + [ + '0x03', + order.user, + order.sender, + order.expiration, + order.asset, + order.amount, + order.targetChainId, + order.secretHash + ], +); diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 8a5c5d28..23bc4749 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -14,8 +14,6 @@ const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( 'uint64', 'uint64', 'uint64', - 'uint64', - 'uint64', 'uint8', ], [ @@ -26,12 +24,10 @@ const hashOrder = (order: Order) => ethers.solidityPackedKeccak256( order.quoteAsset, order.matcherFeeAsset, order.amount, - order.targetChainId, order.price, order.matcherFee, order.nonce, order.expiration, - order.secretHash, order.buySide === 1 ? '0x01' : '0x00', ], ); diff --git a/src/crypt/signCancelOrder.ts b/src/crypt/signCancelOrder.ts index f9bd3293..d7924016 100644 --- a/src/crypt/signCancelOrder.ts +++ b/src/crypt/signCancelOrder.ts @@ -1,11 +1,8 @@ -import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import { ethers } from 'ethers'; import CANCEL_ORDER_TYPES from '../constants/cancelOrderTypes.js'; import type { CancelOrderRequest, SignedCancelOrderRequest, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; -type SignerWithTypedDataSign = ethers.Signer & TypedDataSigner; - const signCancelOrder = async ( senderAddress: string, id: string, @@ -16,10 +13,8 @@ const signCancelOrder = async ( id, senderAddress, }; - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const typedDataSigner = signer as SignerWithTypedDataSign; - const signature = await typedDataSigner.signTypedData( + const signature = await signer.signTypedData( getDomainData(chainId), CANCEL_ORDER_TYPES, cancelOrderRequest, diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 2849b6b4..aefbb216 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -1,17 +1,14 @@ -import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import { ethers } from 'ethers'; -import ORDER_TYPES from '../constants/orderTypes.js'; import type { LockOrder, SignedLockOrder, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; import { BigNumber } from 'bignumber.js'; import normalizeNumber from '../utils/normalizeNumber'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; +import { LOCK_ORDER_TYPES } from '../constants/lockOrderTypes'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -type SignerWithTypedDataSign = ethers.Signer & TypedDataSigner; - export type LockOrderProps = { userAddress: string // адрес юзера который хочет сделать лок senderAddress: string // broker @@ -20,7 +17,6 @@ export type LockOrderProps = { signer: ethers.Signer chainId: SupportedChainId targetChainId: SupportedChainId - logger?: (message: string) => void } export const signLockOrder = async ({ @@ -31,7 +27,6 @@ export const signLockOrder = async ({ targetChainId, asset, signer, - logger }: LockOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; @@ -51,23 +46,16 @@ export const signLockOrder = async ({ targetChainId, secretHash, }; - logger?.('❌ test1'); - - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const typedDataSigner = signer as SignerWithTypedDataSign; - logger?.('❌ test2'); - const signature = await typedDataSigner.signTypedData( + const signature = await signer.signTypedData( getDomainData(chainId), - ORDER_TYPES, + LOCK_ORDER_TYPES, order, ); - logger?.('❌ test3'); // 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; - logger?.('❌ test4'); // if (!fixedSignature) throw new Error("Can't sign order"); diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 046e6bcf..48f3ed94 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,4 +1,3 @@ -import type { TypedDataSigner } from '@ethersproject/abstract-signer'; import { BigNumber } from 'bignumber.js'; import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; @@ -11,8 +10,6 @@ import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -type SignerWithTypedDataSign = ethers.Signer & TypedDataSigner; - export const signOrder = async ( baseAssetAddr: string, quoteAssetAddr: string, @@ -66,10 +63,7 @@ export const signOrder = async ( buySide: side === 'BUY' ? 1 : 0, }; - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const typedDataSigner = signer as SignerWithTypedDataSign; - - const signature = await typedDataSigner.signTypedData( + const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, order, From e815373b0b7fab893d22aa457d245bac2bfdb6f2 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 24 Jan 2024 15:01:14 +0300 Subject: [PATCH 15/74] fix signLockOrder --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/lockOrderTypes.ts | 1 - src/crypt/signLockOrder.ts | 4 ++-- src/crypt/signOrder.ts | 3 +-- src/services/Aggregator/index.ts | 2 +- src/types.ts | 2 +- 7 files changed, 8 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 230bef49..9189f5e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc13", + "version": "0.20.42-rc14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc13", + "version": "0.20.42-rc14", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7a942f4b..e1dd0672 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc13", + "version": "0.20.42-rc14", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts index 304a9912..6302bfac 100644 --- a/src/constants/lockOrderTypes.ts +++ b/src/constants/lockOrderTypes.ts @@ -6,6 +6,5 @@ export const LOCK_ORDER_TYPES = { { name: 'asset', type: 'string' }, { name: 'amount', type: 'uint64' }, { name: 'targetChainId', type: 'uint64' }, - { name: 'secretHash', type: 'string' }, ], }; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index aefbb216..1488c9d7 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -44,7 +44,6 @@ export const signLockOrder = async ({ BigNumber.ROUND_FLOOR, )), targetChainId, - secretHash, }; const signature = await signer.signTypedData( @@ -62,7 +61,8 @@ export const signLockOrder = async ({ const signedOrder: SignedLockOrder = { ...order, signature: fixedSignature, - secret + secret, + secretHash }; return signedOrder; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 48f3ed94..533662a8 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -56,7 +56,6 @@ export const signOrder = async ( expiration, ...(isCrossChain ? { - secretHash, targetChainId } : {}), @@ -79,7 +78,7 @@ export const signOrder = async ( ...order, id: hashOrder(order), signature: fixedSignature, - ...(isCrossChain ? { secret } : {}) + ...(isCrossChain ? { secret, secretHash } : {}) }; return signedOrder; }; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 300067e8..789ee2b2 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -267,7 +267,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify(signedLockOrder), + body: JSON.stringify({ ...signedLockOrder, sign: '' }), // TODO: remove field sign when api updated }, errorSchema, ); diff --git a/src/types.ts b/src/types.ts index 68fe5607..3df00e30 100644 --- a/src/types.ts +++ b/src/types.ts @@ -62,12 +62,12 @@ export type LockOrder = { asset: string // address(?) amount: number // uint64 targetChainId: SupportedChainId // uint64 - secretHash: string // uint64 } type SignedOrderAdditionalProps = { signature: string // bytes secret?: string + secretHash?: string // bytes32 needWithdraw?: boolean // bool (not supported yet by smart-contract) } From 6948b1b55c79263f9f9668b740337505135941bd Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 6 May 2024 14:21:29 +0300 Subject: [PATCH 16/74] bump v --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9189f5e7..069de58d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc14", + "version": "0.20.42-rc15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc14", + "version": "0.20.42-rc15", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index e1dd0672..c62e0131 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc14", + "version": "0.20.42-rc15", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 22b260235a21212f7a940e285089479683c2ffc0 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 7 May 2024 11:19:15 +0300 Subject: [PATCH 17/74] bump v --- package-lock.json | 126 +++++++++++++++++++++++++--------------------- package.json | 7 +-- 2 files changed, 74 insertions(+), 59 deletions(-) diff --git a/package-lock.json b/package-lock.json index 069de58d..15cd2824 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,24 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc15", + "version": "0.20.42-rc16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc15", + "version": "0.20.42-rc16", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.6", + "@orionprotocol/contracts": "1.23.3", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", - "ethers": "^6.7.1", + "crypto-js": "^4.2.0", + "ethers": "^6.12.0", "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", @@ -79,9 +80,9 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -2338,27 +2339,27 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -2396,9 +2397,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", - "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.3.tgz", + "integrity": "sha512-3PBnuiUe//v7COArcm/dzFx71vxW+a9emU4PHi1zBdow+OUAa4WNb+NmNZ3AOjnx2AZKK+gWJY+zKo1zSfAOHQ==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -4372,6 +4373,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -5500,9 +5506,9 @@ } }, "node_modules/ethers": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", "funding": [ { "type": "individual", @@ -5514,9 +5520,9 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", @@ -11920,9 +11926,9 @@ "dev": true }, "@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" }, "@ampproject/remapping": { "version": "2.2.1", @@ -13404,15 +13410,18 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } }, - "@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -13441,9 +13450,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.22.6.tgz", - "integrity": "sha512-pPQGPNBcf1LQlNJk/Iq4BtV6ccuDSEBJhBIEORNf93vgYyUJ3SZ5O2/5y/nWgywLghPh2WwoAhnUKFeUEUmgsA==" + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.3.tgz", + "integrity": "sha512-3PBnuiUe//v7COArcm/dzFx71vxW+a9emU4PHi1zBdow+OUAa4WNb+NmNZ3AOjnx2AZKK+gWJY+zKo1zSfAOHQ==" }, "@sinclair/typebox": { "version": "0.27.8", @@ -14980,6 +14989,11 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -15751,13 +15765,13 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "ethers": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", "requires": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", diff --git a/package.json b/package.json index c62e0131..394278fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc15", + "version": "0.20.42-rc16", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -87,12 +87,13 @@ "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.22.6", + "@orionprotocol/contracts": "1.23.3", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", "buffer": "^6.0.3", - "ethers": "^6.7.1", + "crypto-js": "^4.2.0", + "ethers": "^6.12.0", "express": "^4.18.2", "isomorphic-ws": "^5.0.0", "just-clone": "^6.2.0", From 9a60f9751ed07e95933e3f3d6d89c1392684bee3 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 8 May 2024 15:00:22 +0300 Subject: [PATCH 18/74] bump v --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15cd2824..d6c13bc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc16", + "version": "0.21.0-rc0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc16", + "version": "0.21.0-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 394278fe..1801ee85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.42-rc16", + "version": "0.21.0-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From 82117a315de891f72381244a69e812ebb13d498e Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 13 May 2024 16:40:17 +0300 Subject: [PATCH 19/74] extend swap info --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/ws/index.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6c13bc8..932979ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc0", + "version": "0.21.0-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc0", + "version": "0.21.0-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 1801ee85..1f56aac9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc0", + "version": "0.21.0-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/index.ts b/src/services/Aggregator/ws/index.ts index b07f6731..e03b6f10 100644 --- a/src/services/Aggregator/ws/index.ts +++ b/src/services/Aggregator/ws/index.ts @@ -43,6 +43,8 @@ type SwapInfoSubscriptionPayload = { es?: string // exchange list of all cex or all pools (ORION_POOL, UNISWAP, PANCAKESWAP etc) e?: boolean // is amount IN? Value `false` means a = amount OUT, `true` if omitted is?: boolean // instant settlement + sc?: string // CS sourceChain + tc?: string // CS targetChain } type BrokerTradableAtomicSwapBalanceSubscription = { From 6ed39b9c5814d9b0345d3b8ee3873fc802c07123 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 13 May 2024 17:35:57 +0300 Subject: [PATCH 20/74] bump stf --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 932979ac..96c08949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc1", + "version": "0.21.0-rc2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc1", + "version": "0.21.0-rc2", "hasInstallScript": true, "license": "ISC", "dependencies": { @@ -26,7 +26,7 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.3", + "simple-typed-fetch": "0.2.5", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", @@ -10374,9 +10374,9 @@ "dev": true }, "node_modules/simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "dependencies": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", @@ -19297,9 +19297,9 @@ "dev": true }, "simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "requires": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", diff --git a/package.json b/package.json index 1f56aac9..1c64cd18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc1", + "version": "0.21.0-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -101,7 +101,7 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.3", + "simple-typed-fetch": "0.2.5", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", From ef099f3f632beaa01275379ffe80ce9a2351fb66 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 15 May 2024 16:27:30 +0300 Subject: [PATCH 21/74] update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96c08949..cb6a2200 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc2", + "version": "0.21.0-rc3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc2", + "version": "0.21.0-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { From 14c2f3bb5f92213802dd4c40896e039687e0deb5 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 16 May 2024 18:26:50 +0300 Subject: [PATCH 22/74] update swapinfo schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/schemas/swapInfoSchema.ts | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb6a2200..87b8a5f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc3", + "version": "0.21.0-rc4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc3", + "version": "0.21.0-rc4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4824521d..d2829c9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc3", + "version": "0.21.0-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/schemas/swapInfoSchema.ts b/src/services/Aggregator/schemas/swapInfoSchema.ts index aed6d098..dc4b2190 100644 --- a/src/services/Aggregator/schemas/swapInfoSchema.ts +++ b/src/services/Aggregator/schemas/swapInfoSchema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import uppercasedNetworkCodes from '../../../constants/uppercasedNetworkCodes'; const orderInfoSchema = z.object({ assetPair: z.string().toUpperCase(), @@ -50,6 +51,8 @@ const swapInfoBase = z.object({ d: z.string().optional(), // difference in available amount in/out (USD) and market amount out/in (USD) in percentage }).optional(), autoSlippage: z.number().optional(), + sourceChain: z.enum(uppercasedNetworkCodes).optional(), + targetChain: z.enum(uppercasedNetworkCodes).optional(), }); const swapInfoByAmountIn = swapInfoBase.extend({ From 5a981723e1d82e91a57b29669e22116c02e20fe4 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 20 May 2024 12:26:38 +0300 Subject: [PATCH 23/74] make props as object --- package-lock.json | 4 +-- package.json | 2 +- src/Unit/Exchange/swapLimit.ts | 34 +++++++++++++---------- src/Unit/Exchange/swapMarket.ts | 28 +++++++++++-------- src/crypt/signOrder.ts | 49 +++++++++++++++++++++------------ 5 files changed, 70 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87b8a5f6..97d21c6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc4", + "version": "0.21.0-rc5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc4", + "version": "0.21.0-rc5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index d2829c9e..f62133ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc4", + "version": "0.21.0-rc5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index 6c9f4c8d..26b30496 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -5,7 +5,11 @@ import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; import type Unit from '../index.js'; -import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION, SWAP_THROUGH_ORION_POOL_GAS_LIMIT } from '../../constants/index.js'; +import { + INTERNAL_PROTOCOL_PRECISION, + NATIVE_CURRENCY_PRECISION, + SWAP_THROUGH_ORION_POOL_GAS_LIMIT +} from '../../constants/index.js'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { calculateFeeInFeeAsset, denormalizeNumber, normalizeNumber } from '../../utils/index.js'; import { signOrder } from '../../crypt/index.js'; @@ -212,7 +216,7 @@ export default async function swapLimit({ if (options.developer.route === 'pool' && !priceIsBTEMP) { throw new Error( 'CONFLICT: Pool execution is not available for this swap.' + - ' Price is worse than market price. Please unset "route" option or set it to "aggregator"' + ' Price is worse than market price. Please unset "route" option or set it to "aggregator"' ); } route = options.developer.route; @@ -221,17 +225,17 @@ export default async function swapLimit({ if (!priceIsBTEMP) { throw new Error( 'CONFLICT: Pool execution is not available for this swap.' + - ' Price is worse than market price. Please disable "poolOnly" option' + ' Price is worse than market price. Please disable "poolOnly" option' ); } options.logger?.('Swap is through pool (because "poolOnly" option is true)'); route = 'pool'; } else if ( poolExchangesList.length > 0 && - swapExchanges.length === 1 && - firstSwapExchange !== undefined && - poolExchangesList.some((poolExchange) => poolExchange === firstSwapExchange) && - priceIsBTEMP + swapExchanges.length === 1 && + firstSwapExchange !== undefined && + poolExchangesList.some((poolExchange) => poolExchange === firstSwapExchange) && + priceIsBTEMP ) { options?.logger?.(`Swap is through pool [via ${firstSwapExchange}] (detected by "exchanges" field)`); route = 'pool'; @@ -439,19 +443,19 @@ export default async function swapLimit({ await balanceGuard.check(options?.autoApprove); - const signedOrder = await signOrder( + const signedOrder = await signOrder({ baseAssetAddress, quoteAssetAddress, - swapInfo.orderInfo.side, - safePriceWithAppliedPrecision.toString(), - swapInfo.orderInfo.amount, - totalFeeInFeeAsset, - walletAddress, + side: swapInfo.orderInfo.side, + price: safePriceWithAppliedPrecision.toString(), + amount: swapInfo.orderInfo.amount, + matcherFee: totalFeeInFeeAsset, + senderAddress: walletAddress, matcherAddress, - feeAssetAddress, + serviceFeeAssetAddress: feeAssetAddress, signer, chainId, - ); + }); const orderIsOk = await exchangeContract.validateOrder(signedOrder); if (!orderIsOk) throw new Error('Order is not valid'); diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index be7350ab..a5c971b4 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -4,7 +4,11 @@ import { Exchange__factory } from '@orionprotocol/contracts/lib/ethers-v6/index. import getBalances from '../../utils/getBalances.js'; import BalanceGuard from '../../BalanceGuard.js'; import getAvailableSources from '../../utils/getAvailableFundsSources.js'; -import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION, SWAP_THROUGH_ORION_POOL_GAS_LIMIT } from '../../constants'; +import { + INTERNAL_PROTOCOL_PRECISION, + NATIVE_CURRENCY_PRECISION, + SWAP_THROUGH_ORION_POOL_GAS_LIMIT +} from '../../constants'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { calculateFeeInFeeAsset, denormalizeNumber, normalizeNumber } from '../../utils/index.js'; import { signOrder } from '../../crypt/index.js'; @@ -178,9 +182,9 @@ export default async function swapMarket({ route = 'pool'; } else if ( poolExchangesList.length > 0 && - swapExchanges.length === 1 && - firstSwapExchange !== undefined && - poolExchangesList.some((poolExchange) => poolExchange === firstSwapExchange) + swapExchanges.length === 1 && + firstSwapExchange !== undefined && + poolExchangesList.some((poolExchange) => poolExchange === firstSwapExchange) ) { options?.logger?.(`Swap is through pool [via ${firstSwapExchange}] (detected by "exchanges" field)`); route = 'pool'; @@ -398,19 +402,19 @@ export default async function swapMarket({ await balanceGuard.check(options?.autoApprove); - const signedOrder = await signOrder( + const signedOrder = await signOrder({ baseAssetAddress, quoteAssetAddress, - swapInfo.orderInfo.side, - safePriceWithAppliedPrecision.toString(), - swapInfo.orderInfo.amount, - totalFeeInFeeAsset, - walletAddress, + side: swapInfo.orderInfo.side, + price: safePriceWithAppliedPrecision.toString(), + amount: swapInfo.orderInfo.amount, + matcherFee: totalFeeInFeeAsset, + senderAddress: walletAddress, matcherAddress, - feeAssetAddress, + serviceFeeAssetAddress: feeAssetAddress, signer, chainId, - ); + }); const orderIsOk = await exchangeContract.validateOrder(signedOrder); if (!orderIsOk) throw new Error('Order is not valid'); diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 533662a8..331bd612 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -10,20 +10,35 @@ import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -export const signOrder = async ( - baseAssetAddr: string, - quoteAssetAddr: string, - side: 'BUY' | 'SELL', - price: BigNumber.Value, - amount: BigNumber.Value, - matcherFee: BigNumber.Value, - senderAddress: string, - matcherAddress: string, - serviceFeeAssetAddr: string, - signer: ethers.Signer, - chainId: SupportedChainId, - targetChainId?: SupportedChainId, -) => { +type SignOrderProps = { + baseAssetAddress: string + quoteAssetAddress: string + side: 'BUY' | 'SELL' + price: BigNumber.Value + amount: BigNumber.Value + matcherFee: BigNumber.Value + senderAddress: string + matcherAddress: string + serviceFeeAssetAddress: string + signer: ethers.Signer + chainId: SupportedChainId + targetChainId?: SupportedChainId +} + +export const signOrder = async ({ + amount, + signer, + side, + baseAssetAddress, + quoteAssetAddress, + serviceFeeAssetAddress, + matcherFee, + matcherAddress, + senderAddress, + targetChainId, + chainId, + price +}: SignOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; const secret = generateSecret(); @@ -34,9 +49,9 @@ export const signOrder = async ( const order: Order | CrossOrder = { senderAddress, matcherAddress, - baseAsset: baseAssetAddr, - quoteAsset: quoteAssetAddr, - matcherFeeAsset: serviceFeeAssetAddr, + baseAsset: baseAssetAddress, + quoteAsset: quoteAssetAddress, + matcherFeeAsset: serviceFeeAssetAddress, amount: Number(normalizeNumber( amount, INTERNAL_PROTOCOL_PRECISION, From b1ad8375715f7632094f7af81b0f591297e9fbca Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 20 May 2024 12:43:54 +0300 Subject: [PATCH 24/74] add types export --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/index.ts | 4 ++-- src/crypt/signLockOrder.ts | 4 ++-- src/crypt/signOrder.ts | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97d21c6f..df8f5ef9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc5", + "version": "0.21.0-rc6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc5", + "version": "0.21.0-rc6", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index f62133ac..dc4f2d72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc5", + "version": "0.21.0-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/index.ts b/src/crypt/index.ts index 8a0574eb..4bf90858 100644 --- a/src/crypt/index.ts +++ b/src/crypt/index.ts @@ -1,3 +1,3 @@ export { default as signCancelOrder } from './signCancelOrder.js'; -export { default as signOrder } from './signOrder.js'; -export { signLockOrder } from './signLockOrder.js'; +export { signOrder, type SignOrderProps } from './signOrder.js'; +export { signLockOrder, type SignLockOrderProps } from './signLockOrder.js'; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 1488c9d7..3adb81e9 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -9,7 +9,7 @@ import { LOCK_ORDER_TYPES } from '../constants/lockOrderTypes'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -export type LockOrderProps = { +export type SignLockOrderProps = { userAddress: string // адрес юзера который хочет сделать лок senderAddress: string // broker asset: string @@ -27,7 +27,7 @@ export const signLockOrder = async ({ targetChainId, asset, signer, -}: LockOrderProps) => { +}: SignLockOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; const secret = generateSecret(); diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 331bd612..4cb7c953 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -10,7 +10,7 @@ import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -type SignOrderProps = { +export type SignOrderProps = { baseAssetAddress: string quoteAssetAddress: string side: 'BUY' | 'SELL' From b1ea82e31fd0cf947186d99303165054fc4604c9 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 21 May 2024 17:40:45 +0300 Subject: [PATCH 25/74] update signOrder function --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index df8f5ef9..7ee25982 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc6", + "version": "0.21.0-rc8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc6", + "version": "0.21.0-rc8", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 52b5d64c..9b775f9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc7", + "version": "0.21.0-rc8", "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 4cb7c953..907c3b56 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -44,7 +44,7 @@ export const signOrder = async ({ const secret = generateSecret(); const secretHash = ethers.keccak256(secret); - const isCrossChain = targetChainId === undefined || targetChainId === chainId; + const isCrossChain = targetChainId === undefined || targetChainId !== chainId; const order: Order | CrossOrder = { senderAddress, From a0c5bf400fcba3ee16fe311721e550a665f6400c Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 21 May 2024 18:45:47 +0300 Subject: [PATCH 26/74] update signLockOrder request --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 14 +++++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ee25982..0aad5237 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc8", + "version": "0.21.0-rc9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc8", + "version": "0.21.0-rc9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 9b775f9e..cac53dc1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc8", + "version": "0.21.0-rc9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index d671782d..d8bec978 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -263,6 +263,18 @@ class Aggregator { const url = new URL(`${this.apiUrl}/api/v1/cross-chain`); + const body = { + secretHash: signedLockOrder.secretHash, + user: signedLockOrder.user, + sender: signedLockOrder.sender, + expiration: signedLockOrder.expiration, + asset: signedLockOrder.asset, + amount: signedLockOrder.amount, + targetChainId: signedLockOrder.targetChainId, + sign: signedLockOrder.signature, + secret: signedLockOrder.secretHash, + } + return fetchWithValidation( url.toString(), z.object({ @@ -278,7 +290,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify({ ...signedLockOrder, sign: '' }), // TODO: remove field sign when api updated + body: JSON.stringify(body), // TODO: add field sign when api updated }, errorSchema, ); From 132399c42228f0c64a5adedbe2e7c49804660326 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 22 May 2024 10:26:13 +0300 Subject: [PATCH 27/74] update signOrder function --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0aad5237..7286bf18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc9", + "version": "0.21.0-rc10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc9", + "version": "0.21.0-rc10", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index cac53dc1..23bbc470 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc9", + "version": "0.21.0-rc10", "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 907c3b56..89d0f633 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -69,11 +69,11 @@ export const signOrder = async ({ )), nonce, expiration, - ...(isCrossChain - ? { - targetChainId - } - : {}), + // ...(isCrossChain + // ? { + // targetChainId + // } + // : {}), buySide: side === 'BUY' ? 1 : 0, }; @@ -93,7 +93,7 @@ export const signOrder = async ({ ...order, id: hashOrder(order), signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash } : {}) + ...(isCrossChain ? { secret, secretHash, targetChainId } : {}) }; return signedOrder; }; From cc928e47eb96800f958b26dd4255803000a971d6 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 22 May 2024 12:02:16 +0300 Subject: [PATCH 28/74] update signLockOrder --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/lockOrderTypes.ts | 1 + src/crypt/signLockOrder.ts | 1 + src/crypt/signOrder.ts | 10 +++++----- src/types.ts | 1 + 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7286bf18..01c14fea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc10", + "version": "0.21.0-rc11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc10", + "version": "0.21.0-rc11", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 23bbc470..fad43641 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc10", + "version": "0.21.0-rc11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts index 6302bfac..bc790e7f 100644 --- a/src/constants/lockOrderTypes.ts +++ b/src/constants/lockOrderTypes.ts @@ -6,5 +6,6 @@ export const LOCK_ORDER_TYPES = { { name: 'asset', type: 'string' }, { name: 'amount', type: 'uint64' }, { name: 'targetChainId', type: 'uint64' }, + { name: 'secretHash', type: 'bytes32' }, ], }; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 3adb81e9..095c6b20 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -44,6 +44,7 @@ export const signLockOrder = async ({ BigNumber.ROUND_FLOOR, )), targetChainId, + secretHash }; const signature = await signer.signTypedData( diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 89d0f633..bf256188 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -69,11 +69,11 @@ export const signOrder = async ({ )), nonce, expiration, - // ...(isCrossChain - // ? { - // targetChainId - // } - // : {}), + ...(isCrossChain + ? { + targetChainId + } + : {}), buySide: side === 'BUY' ? 1 : 0, }; diff --git a/src/types.ts b/src/types.ts index df653268..fd9d0b42 100644 --- a/src/types.ts +++ b/src/types.ts @@ -62,6 +62,7 @@ export type LockOrder = { asset: string // address(?) amount: number // uint64 targetChainId: SupportedChainId // uint64 + secretHash: string // bytes32 } type SignedOrderAdditionalProps = { From 7c7f2f1cbfaaeeb829363db4cda5a9acb6ba1c53 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 22 May 2024 17:20:46 +0300 Subject: [PATCH 29/74] update hash forming --- package-lock.json | 4 +- package.json | 2 +- src/crypt/hashOrder.ts | 30 +++++++++----- src/crypt/signLockOrder.ts | 5 +-- src/crypt/signOrder.ts | 67 ++++++++++++++++++++++++++++++-- src/services/Aggregator/index.ts | 7 ++-- src/types.ts | 3 +- 7 files changed, 94 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01c14fea..a95a8515 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 fad43641..994bd6de 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 c62f97d0..858b03d3 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 095c6b20..98ff2659 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 bf256188..5aadb6e5 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 d8bec978..f916a4ff 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 fd9d0b42..93e0b628 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 From 9cd077f9f460ba8d57702101ba3196d64545d765 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 22 May 2024 18:23:28 +0300 Subject: [PATCH 30/74] bump sdk --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a95a8515..a7b1e69f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc12", + "version": "0.21.0-rc13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc12", + "version": "0.21.0-rc13", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 994bd6de..6958dc43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc12", + "version": "0.21.0-rc13", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From ee50522fd8beedba87ba35fd0ff76183115f2129 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 12:35:28 +0300 Subject: [PATCH 31/74] 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 a7b1e69f..1db130c1 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 6958dc43..f0bc2736 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 5aadb6e5..586403f1 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; }; From 39cacef2dc617508a1d8f763eb4d8cda14ca91ee Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 13:38:23 +0300 Subject: [PATCH 32/74] remove user from signLockOrder --- src/constants/lockOrderTypes.ts | 1 - src/services/Aggregator/index.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts index bc790e7f..a8dffe26 100644 --- a/src/constants/lockOrderTypes.ts +++ b/src/constants/lockOrderTypes.ts @@ -1,6 +1,5 @@ export const LOCK_ORDER_TYPES = { Order: [ - { name: 'user', type: 'address' }, { name: 'sender', type: 'address' }, { name: 'expiration', type: 'uint64' }, { name: 'asset', type: 'string' }, diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index f916a4ff..a5fa4b49 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -289,7 +289,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify(body), // TODO: add field sign when api updated + body: JSON.stringify(body), }, errorSchema, ); From 6001d75185f35a2938d35cef6409ee8cf9d727f9 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 19:11:24 +0300 Subject: [PATCH 33/74] update lockOrderTypes.ts --- package.json | 2 +- src/constants/lockOrderTypes.ts | 4 +- src/crypt/hashOrder.ts | 70 ++++++++++++------ src/crypt/signOrder.ts | 125 ++++++++------------------------ 4 files changed, 81 insertions(+), 120 deletions(-) diff --git a/package.json b/package.json index f0bc2736..42b69a3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc14", + "version": "0.21.0-rc15", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts index a8dffe26..411d04b9 100644 --- a/src/constants/lockOrderTypes.ts +++ b/src/constants/lockOrderTypes.ts @@ -2,9 +2,9 @@ export const LOCK_ORDER_TYPES = { Order: [ { name: 'sender', type: 'address' }, { name: 'expiration', type: 'uint64' }, - { name: 'asset', type: 'string' }, + { name: 'asset', type: 'address' }, { name: 'amount', type: 'uint64' }, - { name: 'targetChainId', type: 'uint64' }, + { name: 'targetChainId', type: 'uint24' }, { name: 'secretHash', type: 'bytes32' }, ], }; diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 858b03d3..5b3cd6e1 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -1,28 +1,56 @@ import { ethers, keccak256 } from 'ethers'; import type { Order } from '../types.js'; +import generateSecret from '../utils/generateSecret'; +import getDomainData from './getDomainData'; +import type { SupportedChainId } from '../../lib'; -const ORDER_TYPEHASH = '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54' +const CROSS_CHAIN_ORDER_TYPEHASH = '0xcb145a2347f48eab4e3341a245f53da2e686e47ef421c89a6b40dde27a063c3f' +const EIP712_DOMAIN_TYPEHASH = '0xa604fff5a27d5951f334ccda7abff3286a8af29caeeb196a6f2b40a1dce7612b'; -export default function getOrderHash(order: Order) { +export default function getOrderHash(order: Order, chainId: SupportedChainId) { const abiCoder = ethers.AbiCoder.defaultAbiCoder() + const secret = generateSecret(); + const secretHash = ethers.keccak256(secret); - 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) + // Generate the orderParamsHash + const orderParamsHash = keccak256((abiCoder.encode( + ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], + [ + order.senderAddress, + order.matcherAddress, + order.baseAsset, + order.quoteAsset, + order.matcherFeeAsset, + order.amount, + order.price, + order.matcherFee, + order.nonce, + order.expiration, + order.buySide + ] + ))); + + // Generate the full crossChainOrder hash + const orderHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], + [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] + )); + + const domainData = getDomainData(chainId); + // Generate the full crossChainOrder hash + const domainSeparator = 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.solidityPackedKeccak256( + ['bytes', 'bytes32', 'bytes32'], ['0x1901', domainSeparator, orderHash] + ); + + console.log({ secretHash }, { orderParamsHash }, { orderHash }, { domainData }, { domainSeparator }, { digest }); + + return { secret, secretHash, orderHash }; } diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 586403f1..7ab50c97 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,12 +1,11 @@ import { BigNumber } from 'bignumber.js'; -import { ethers, keccak256 } from 'ethers'; +import { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; import ORDER_TYPES from '../constants/orderTypes.js'; import type { CrossOrder, Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; import hashOrder from './hashOrder.js'; -import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -79,75 +78,31 @@ 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 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 = keccak256((ethers.AbiCoder.defaultAbiCoder().encode( - ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], - [ - 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); - - // Type hash from Solidity contract - 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, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] - )); + const limitOrder: Order = { + senderAddress, + matcherAddress, + baseAsset: baseAssetAddress, + quoteAsset: quoteAssetAddress, + matcherFeeAsset: serviceFeeAssetAddress, + amount: Number(normalizeNumber( + amount, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_FLOOR, + )), + price: Number(normalizeNumber( + price, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_FLOOR, + )), + matcherFee: Number(normalizeNumber( + matcherFee, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error + )), + nonce, + expiration, + buySide: side === 'BUY' ? 1 : 0, + }; const signature = await signer.signTypedData( getDomainData(chainId), @@ -155,40 +110,18 @@ 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; // if (!fixedSignature) throw new Error("Can't sign order"); + const { orderHash, secret, secretHash } = hashOrder(limitOrder, chainId); const signedOrder: SignedOrder = { ...order, - id: hashOrder(order), + id: orderHash, signature: fixedSignature, - ...(isCrossChain ? { secret: crossChainOrderHash, secretHash, targetChainId } : {}) + ...(isCrossChain ? { secret, secretHash, targetChainId } : {}) }; return signedOrder; }; From c262535d0572d2ee8d4885dfac9dcfab8b8c5aa5 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 19:38:32 +0300 Subject: [PATCH 34/74] update lockOrderTypes.ts --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signLockOrder.ts | 2 +- src/types.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1db130c1..93a22459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc14", + "version": "0.21.0-rc16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc14", + "version": "0.21.0-rc16", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 42b69a3d..3c898f48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc15", + "version": "0.21.0-rc16", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 98ff2659..52d659c7 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -40,7 +40,7 @@ export const signLockOrder = async ({ INTERNAL_PROTOCOL_PRECISION, BigNumber.ROUND_FLOOR, )), - targetChainId, + targetChainId: Number(targetChainId), secretHash }; diff --git a/src/types.ts b/src/types.ts index 93e0b628..e50f4957 100644 --- a/src/types.ts +++ b/src/types.ts @@ -60,7 +60,7 @@ export type LockOrder = { expiration: number // uint64 asset: string // address(?) amount: number // uint64 - targetChainId: SupportedChainId // uint64 + targetChainId: number // uint64 secretHash: string // bytes32 } From fd81062fe45b4484c0b8a838de1a23ebe423212b Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 19:47:43 +0300 Subject: [PATCH 35/74] update lockOrderTypes.ts --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93a22459..564ae157 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc16", + "version": "0.21.0-rc17", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc16", + "version": "0.21.0-rc17", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 3c898f48..7a00a362 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc16", + "version": "0.21.0-rc17", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index a5fa4b49..1b5ba633 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -269,7 +269,7 @@ class Aggregator { expiration: signedLockOrder.expiration, asset: signedLockOrder.asset, amount: signedLockOrder.amount, - targetChainId: signedLockOrder.targetChainId, + targetChainId: Number(signedLockOrder.targetChainId), sign: signedLockOrder.signature, secret: signedLockOrder.secretHash, } From 15da8fef89fddaa7281c90e20e9ed4005b380c1a Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 23 May 2024 21:12:01 +0300 Subject: [PATCH 36/74] update domainData chainId type --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/lockOrderTypes.ts | 2 +- src/crypt/getDomainData.ts | 2 +- src/crypt/signLockOrder.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 564ae157..d963b65e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc17", + "version": "0.21.0-rc18", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc17", + "version": "0.21.0-rc18", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7a00a362..0ace01f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc17", + "version": "0.21.0-rc18", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/lockOrderTypes.ts b/src/constants/lockOrderTypes.ts index 411d04b9..2d009181 100644 --- a/src/constants/lockOrderTypes.ts +++ b/src/constants/lockOrderTypes.ts @@ -1,5 +1,5 @@ export const LOCK_ORDER_TYPES = { - Order: [ + LockOrder: [ { name: 'sender', type: 'address' }, { name: 'expiration', type: 'uint64' }, { name: 'asset', type: 'address' }, diff --git a/src/crypt/getDomainData.ts b/src/crypt/getDomainData.ts index 2b077428..d3d14452 100644 --- a/src/crypt/getDomainData.ts +++ b/src/crypt/getDomainData.ts @@ -19,7 +19,7 @@ function removeUndefined(obj: Record) { */ const getDomainData = (chainId: SupportedChainId) => ({ ...removeUndefined(EIP712Domain), - chainId, + chainId: Number(chainId), // check if it broke }); export default getDomainData; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 52d659c7..6d75bf49 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import type { LockOrder, SignedLockOrder, SupportedChainId } from '../types.js'; +import type { SupportedChainId, LockOrder, SignedLockOrder } from '../types.js'; import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; import { BigNumber } from 'bignumber.js'; From 5d9900c955cea115f853ff3b3726131646e1c742 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 27 May 2024 19:38:46 +0300 Subject: [PATCH 37/74] update secret generation --- package-lock.json | 4 ++-- package.json | 2 +- src/utils/generateSecret.ts | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d963b65e..63586685 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc18", + "version": "0.21.0-rc19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc18", + "version": "0.21.0-rc19", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0ace01f7..78035b14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc18", + "version": "0.21.0-rc19", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/utils/generateSecret.ts b/src/utils/generateSecret.ts index 7caabca5..513e42e5 100644 --- a/src/utils/generateSecret.ts +++ b/src/utils/generateSecret.ts @@ -1,4 +1,3 @@ -import { ethers } from 'ethers'; class XorShift128Plus { private x: number; private y: number; @@ -42,11 +41,13 @@ function isomorphicCryptoRandomBytes(size: number): Uint8Array { return generateRandomBytes(size, rng); } -const generateSecret = () => { +function decodeToString(uint8Array: Uint8Array): string { + return new TextDecoder('utf-8').decode(uint8Array); +} + +const generateSecret = (): string => { const RANDOM_BITS = 256; - const rand = isomorphicCryptoRandomBytes(RANDOM_BITS); - const secret = ethers.keccak256(rand); - return secret; + return decodeToString(isomorphicCryptoRandomBytes(RANDOM_BITS)); }; export default generateSecret; From e6ec27862040e14193af4466fbd266f8b36c12cb Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 27 May 2024 20:30:24 +0300 Subject: [PATCH 38/74] bump sdk --- package-lock.json | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31766758..310043ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,16 @@ { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc110", + "version": "0.21.0-rc20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.20.76-rc110", + "version": "0.21.0-rc20", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@orionprotocol/contracts": "1.23.3", "@types/lodash.clonedeep": "^4.5.9", @@ -27,7 +26,7 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.3", + "simple-typed-fetch": "0.2.5", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", @@ -10399,9 +10398,9 @@ "dev": true }, "node_modules/simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "dependencies": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", @@ -19336,9 +19335,9 @@ "dev": true }, "simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "requires": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", From 6a7caf494f0154101feb3abcfb81bd73e416961d Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 27 May 2024 21:09:53 +0300 Subject: [PATCH 39/74] bump sdk --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 310043ea..d8b46ea1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc20", + "version": "0.22.0-rc0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc20", + "version": "0.22.0-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 4fdb2dc9..0ef962fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.21.0-rc20", + "version": "0.22.0-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From b47a81fd00c117c3f38853f2e299cbe07254a49f Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 28 May 2024 11:51:12 +0300 Subject: [PATCH 40/74] update signOrder --- package-lock.json | 4 +- package.json | 2 +- src/constants/orderTypes.ts | 15 ++----- src/crypt/signOrder.ts | 81 ++++++++++++++++++++----------------- src/utils/generateSecret.ts | 12 +++--- 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8b46ea1..16a9075f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc0", + "version": "0.22.0-rc1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc0", + "version": "0.22.0-rc1", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0ef962fd..09476378 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc0", + "version": "0.22.0-rc1", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/orderTypes.ts b/src/constants/orderTypes.ts index cf80f602..b14ecd73 100644 --- a/src/constants/orderTypes.ts +++ b/src/constants/orderTypes.ts @@ -1,16 +1,9 @@ const ORDER_TYPES = { Order: [ - { name: 'senderAddress', type: 'address' }, - { name: 'matcherAddress', type: 'address' }, - { name: 'baseAsset', type: 'address' }, - { name: 'quoteAsset', type: 'address' }, - { name: 'matcherFeeAsset', type: 'address' }, - { name: 'amount', type: 'uint64' }, - { name: 'price', type: 'uint64' }, - { name: 'matcherFee', type: 'uint64' }, - { name: 'nonce', type: 'uint64' }, - { name: 'expiration', type: 'uint64' }, - { name: 'buySide', type: 'uint8' }, + { name: 'limitOrder', type: 'bytes32' }, + { name: 'chainId', type: 'uint24' }, + { name: 'secretHash', type: 'bytes32' }, + { name: 'lockOrderExpiration', type: 'uint64' }, ], }; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 7ab50c97..f7b21344 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,11 +1,11 @@ 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'; +import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; -import hashOrder from './hashOrder.js'; +import generateSecret from '../utils/generateSecret'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -40,11 +40,10 @@ export const signOrder = async ({ }: SignOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; - // const secretHash = ethers.keccak256(secret); const isCrossChain = targetChainId === undefined || targetChainId !== chainId; - const order: Order | CrossOrder = { + const order: Order = { senderAddress, matcherAddress, baseAsset: baseAssetAddress, @@ -72,42 +71,50 @@ export const signOrder = async ({ targetChainId } : {}), - buySide: side === 'BUY' ? 1 : 0, - // chainId, - // secretHash, - // lockOrderExpiration: expiration + buySide: side === 'BUY' ? 1 : 0 }; - const limitOrder: Order = { - senderAddress, - matcherAddress, - baseAsset: baseAssetAddress, - quoteAsset: quoteAssetAddress, - matcherFeeAsset: serviceFeeAssetAddress, - amount: Number(normalizeNumber( - amount, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_FLOOR, - )), - price: Number(normalizeNumber( - price, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_FLOOR, - )), - matcherFee: Number(normalizeNumber( - matcherFee, - INTERNAL_PROTOCOL_PRECISION, - BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error - )), - nonce, - expiration, - buySide: side === 'BUY' ? 1 : 0, - }; + const secret = generateSecret(); + const secretHash = keccak256(secret); + + const abiCoder = ethers.AbiCoder.defaultAbiCoder(); + + // Generate the orderParamsHash + const limitOrderHash = keccak256((abiCoder.encode( + ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], + [ + order.senderAddress, + order.matcherAddress, + order.baseAsset, + order.quoteAsset, + order.matcherFeeAsset, + order.amount, + order.price, + order.matcherFee, + order.nonce, + order.expiration, + order.buySide + ] + ))); + + const crossChainOrder = { + limitOrder: limitOrderHash, + chainId, + secretHash, + lockOrderExpiration: expiration + } + + // Generate the full crossChainOrder hash + // const orderHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( + // ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], + // [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] + // )); + // TODO: change what to show const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, - order, + crossChainOrder, ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 @@ -115,11 +122,11 @@ export const signOrder = async ({ const fixedSignature = ethers.Signature.from(signature).serialized; // if (!fixedSignature) throw new Error("Can't sign order"); - const { orderHash, secret, secretHash } = hashOrder(limitOrder, chainId); + // const { orderHash, secret, secretHash } = hashOrder(limitOrder, chainId); const signedOrder: SignedOrder = { ...order, - id: orderHash, + id: limitOrderHash, // TODO: change to orderHash signature: fixedSignature, ...(isCrossChain ? { secret, secretHash, targetChainId } : {}) }; diff --git a/src/utils/generateSecret.ts b/src/utils/generateSecret.ts index 513e42e5..68dc7dc6 100644 --- a/src/utils/generateSecret.ts +++ b/src/utils/generateSecret.ts @@ -1,3 +1,5 @@ +import { ethers } from 'ethers'; + class XorShift128Plus { private x: number; private y: number; @@ -41,13 +43,11 @@ function isomorphicCryptoRandomBytes(size: number): Uint8Array { return generateRandomBytes(size, rng); } -function decodeToString(uint8Array: Uint8Array): string { - return new TextDecoder('utf-8').decode(uint8Array); -} - -const generateSecret = (): string => { +const generateSecret = () => { const RANDOM_BITS = 256; - return decodeToString(isomorphicCryptoRandomBytes(RANDOM_BITS)); + const rand = isomorphicCryptoRandomBytes(RANDOM_BITS); + const secret = ethers.keccak256(rand); + return secret; }; export default generateSecret; From 7cbf81eb77596bc12daaf4520b4c6ab7a4f9d2d6 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 28 May 2024 11:59:29 +0300 Subject: [PATCH 41/74] fix placeLockOrder same secret and secretHash --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16a9075f..da902630 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc1", + "version": "0.22.0-rc2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc1", + "version": "0.22.0-rc2", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 09476378..1bb4ed7d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc1", + "version": "0.22.0-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 1b5ba633..29edd713 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -271,7 +271,7 @@ class Aggregator { amount: signedLockOrder.amount, targetChainId: Number(signedLockOrder.targetChainId), sign: signedLockOrder.signature, - secret: signedLockOrder.secretHash, + secret: signedLockOrder.secret, } return fetchWithValidation( From ef5ef4f97e38c93ae9134a42c07860ac2289e918 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 28 May 2024 18:30:05 +0300 Subject: [PATCH 42/74] update signOrder types --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/orderTypes.ts | 2 +- src/crypt/signOrder.ts | 9 ++++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index da902630..9ea111b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc2", + "version": "0.22.0-rc3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc2", + "version": "0.22.0-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 1bb4ed7d..03529bce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc2", + "version": "0.22.0-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/orderTypes.ts b/src/constants/orderTypes.ts index b14ecd73..4961fec2 100644 --- a/src/constants/orderTypes.ts +++ b/src/constants/orderTypes.ts @@ -1,5 +1,5 @@ const ORDER_TYPES = { - Order: [ + CrossChainOrder: [ { name: 'limitOrder', type: 'bytes32' }, { name: 'chainId', type: 'uint24' }, { name: 'secretHash', type: 'bytes32' }, diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index f7b21344..a86ca13f 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -99,7 +99,7 @@ export const signOrder = async ({ const crossChainOrder = { limitOrder: limitOrderHash, - chainId, + chainId: Number(chainId), secretHash, lockOrderExpiration: expiration } @@ -114,7 +114,10 @@ export const signOrder = async ({ const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, - crossChainOrder, + { + order, + ...crossChainOrder, + } ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 @@ -128,7 +131,7 @@ export const signOrder = async ({ ...order, id: limitOrderHash, // TODO: change to orderHash signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash, targetChainId } : {}) + ...(isCrossChain ? { secret, secretHash, targetChainId: Number(targetChainId) } : {}) }; return signedOrder; }; From 3cb95bb8dfd13843688ff5857e5f6f5bd1e4aef7 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 28 May 2024 19:21:50 +0300 Subject: [PATCH 43/74] update signOrder types --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 4 ++-- src/types.ts | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ea111b1..f009cd32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc3", + "version": "0.22.0-rc5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc3", + "version": "0.22.0-rc5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 98c502b8..a07554b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc4", + "version": "0.22.0-rc5", "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 a86ca13f..7df8a5df 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -101,7 +101,7 @@ export const signOrder = async ({ limitOrder: limitOrderHash, chainId: Number(chainId), secretHash, - lockOrderExpiration: expiration + lockOrderExpiration: expiration // TODO: change to fillAndLockAtomic data } // Generate the full crossChainOrder hash @@ -131,7 +131,7 @@ export const signOrder = async ({ ...order, id: limitOrderHash, // TODO: change to orderHash signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash, targetChainId: Number(targetChainId) } : {}) + ...(isCrossChain ? { secret, secretHash, targetChainId: Number(targetChainId), lockOrderExpiration: expiration } : {}) }; return signedOrder; }; diff --git a/src/types.ts b/src/types.ts index 8baa3f75..3f2445e9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,8 +51,9 @@ export type Order = { buySide: 0 | 1 // uint8, 1=buy, 0=sell } export type CrossOrder = Order & { - secretHash: string // uint64 - targetChainId: SupportedChainId // uint64 + secretHash: string // bytes32 + targetChainId: number // uint24 + lockOrderExpiration: number // uint64 } export type LockOrder = { From 677f99a2ff1f6832ad11d1f33d95fa6133f3e48d Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 28 May 2024 19:46:37 +0300 Subject: [PATCH 44/74] =?UTF-8?q?=F0=9F=97=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 11 +++++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f009cd32..6c797034 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc5", + "version": "0.22.0-rc6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc5", + "version": "0.22.0-rc6", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a07554b5..2f7282b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc5", + "version": "0.22.0-rc6", "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 7df8a5df..406ee316 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -37,7 +37,7 @@ export const signOrder = async ({ targetChainId, chainId, price -}: SignOrderProps) => { +}: SignOrderProps): Promise => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; @@ -131,7 +131,14 @@ export const signOrder = async ({ ...order, id: limitOrderHash, // TODO: change to orderHash signature: fixedSignature, - ...(isCrossChain ? { secret, secretHash, targetChainId: Number(targetChainId), lockOrderExpiration: expiration } : {}) + ...(isCrossChain + ? { + secret, + secretHash, + targetChainId: Number(targetChainId), + lockOrderExpiration: expiration + } + : {}) }; return signedOrder; }; From 0c99c52d6937f031384352c8fec6b8ab8f6ea1bc Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 29 May 2024 10:37:18 +0300 Subject: [PATCH 45/74] update orderTypes.ts --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/orderTypes.ts | 19 ++++++++++++++++--- src/crypt/signOrder.ts | 5 ++--- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c797034..0b4248b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc6", + "version": "0.22.0-rc7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc6", + "version": "0.22.0-rc7", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2f7282b1..a50d6709 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc6", + "version": "0.22.0-rc7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/orderTypes.ts b/src/constants/orderTypes.ts index 4961fec2..a420be2d 100644 --- a/src/constants/orderTypes.ts +++ b/src/constants/orderTypes.ts @@ -1,10 +1,23 @@ -const ORDER_TYPES = { +export const ORDER_TYPES = { CrossChainOrder: [ - { name: 'limitOrder', type: 'bytes32' }, + { name: 'limitOrder', type: 'Order' }, { name: 'chainId', type: 'uint24' }, { name: 'secretHash', type: 'bytes32' }, { name: 'lockOrderExpiration', type: 'uint64' }, ], -}; + Order: [ + { name: 'senderAddress', type: 'address' }, + { name: 'matcherAddress', type: 'address' }, + { name: 'baseAsset', type: 'address' }, + { name: 'quoteAsset', type: 'address' }, + { name: 'matcherFeeAsset', type: 'address' }, + { name: 'amount', type: 'uint64' }, + { name: 'price', type: 'uint64' }, + { name: 'matcherFee', type: 'uint64' }, + { name: 'nonce', type: 'uint64' }, + { name: 'expiration', type: 'uint64' }, + { name: 'buySide', type: 'uint8' }, + ] +} export default ORDER_TYPES; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 406ee316..fb401604 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -98,7 +98,7 @@ export const signOrder = async ({ ))); const crossChainOrder = { - limitOrder: limitOrderHash, + limitOrder: order, chainId: Number(chainId), secretHash, lockOrderExpiration: expiration // TODO: change to fillAndLockAtomic data @@ -115,8 +115,7 @@ export const signOrder = async ({ getDomainData(chainId), ORDER_TYPES, { - order, - ...crossChainOrder, + crossChainOrder, } ); From f76b493daf3552d86fe057d1828468390924904e Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 29 May 2024 14:40:11 +0300 Subject: [PATCH 46/74] update signOrder --- package-lock.json | 18 +++--- package.json | 4 +- src/constants/orderTypes.ts | 12 ++-- src/crypt/hashOrder.ts | 99 ++++++++++++++++---------------- src/crypt/signOrder.ts | 54 +++++------------ src/services/Aggregator/index.ts | 10 +++- src/types.ts | 1 + 7 files changed, 93 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b4248b9..a68cc536 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc7", + "version": "0.22.0-rc8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc7", + "version": "0.22.0-rc8", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.23.3", + "@orionprotocol/contracts": "1.23.4-rc", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.3.tgz", - "integrity": "sha512-3PBnuiUe//v7COArcm/dzFx71vxW+a9emU4PHi1zBdow+OUAa4WNb+NmNZ3AOjnx2AZKK+gWJY+zKo1zSfAOHQ==" + "version": "1.23.4-rc", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", + "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -13488,9 +13488,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.3.tgz", - "integrity": "sha512-3PBnuiUe//v7COArcm/dzFx71vxW+a9emU4PHi1zBdow+OUAa4WNb+NmNZ3AOjnx2AZKK+gWJY+zKo1zSfAOHQ==" + "version": "1.23.4-rc", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", + "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index a50d6709..91ee7b22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc7", + "version": "0.22.0-rc8", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", @@ -87,7 +87,7 @@ "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.23.3", + "@orionprotocol/contracts": "1.23.4-rc", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", diff --git a/src/constants/orderTypes.ts b/src/constants/orderTypes.ts index a420be2d..699190f9 100644 --- a/src/constants/orderTypes.ts +++ b/src/constants/orderTypes.ts @@ -1,10 +1,4 @@ export const ORDER_TYPES = { - CrossChainOrder: [ - { name: 'limitOrder', type: 'Order' }, - { name: 'chainId', type: 'uint24' }, - { name: 'secretHash', type: 'bytes32' }, - { name: 'lockOrderExpiration', type: 'uint64' }, - ], Order: [ { name: 'senderAddress', type: 'address' }, { name: 'matcherAddress', type: 'address' }, @@ -17,6 +11,12 @@ export const ORDER_TYPES = { { name: 'nonce', type: 'uint64' }, { name: 'expiration', type: 'uint64' }, { name: 'buySide', type: 'uint8' }, + ], + CrossChainOrder: [ + { name: 'limitOrder', type: 'Order' }, + { name: 'chainId', type: 'uint24' }, + { name: 'secretHash', type: 'bytes32' }, + { name: 'lockOrderExpiration', type: 'uint64' }, ] } diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrder.ts index 5b3cd6e1..98a1365b 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrder.ts @@ -1,56 +1,59 @@ import { ethers, keccak256 } from 'ethers'; -import type { Order } from '../types.js'; -import generateSecret from '../utils/generateSecret'; -import getDomainData from './getDomainData'; -import type { SupportedChainId } from '../../lib'; +import type { SupportedChainId, SignedOrder } from '../types.js'; -const CROSS_CHAIN_ORDER_TYPEHASH = '0xcb145a2347f48eab4e3341a245f53da2e686e47ef421c89a6b40dde27a063c3f' -const EIP712_DOMAIN_TYPEHASH = '0xa604fff5a27d5951f334ccda7abff3286a8af29caeeb196a6f2b40a1dce7612b'; +const ORDER_TYPEHASH = + '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54'; +const CROSS_CHAIN_ORDER_TYPEHASH = + '0xc4666edeecc42a94cf6b87f39e1ca967792e6d738224365e54d7d06ec632b05c'; -export default function getOrderHash(order: Order, chainId: SupportedChainId) { - const abiCoder = ethers.AbiCoder.defaultAbiCoder() - const secret = generateSecret(); - const secretHash = ethers.keccak256(secret); +export function getOrderHash(order: Omit, chainId: SupportedChainId) { + const abiCoder = ethers.AbiCoder.defaultAbiCoder(); // Generate the orderParamsHash - const orderParamsHash = keccak256((abiCoder.encode( - ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], - [ - order.senderAddress, - order.matcherAddress, - order.baseAsset, - order.quoteAsset, - order.matcherFeeAsset, - order.amount, - order.price, - order.matcherFee, - order.nonce, - order.expiration, - order.buySide - ] - ))); - - // Generate the full crossChainOrder hash - const orderHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], - [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] - )); - - const domainData = getDomainData(chainId); - // Generate the full crossChainOrder hash - const domainSeparator = 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.solidityPackedKeccak256( - ['bytes', 'bytes32', 'bytes32'], ['0x1901', domainSeparator, orderHash] + const limitOrderHash = keccak256( + abiCoder.encode( + [ + 'bytes32', + 'address', + 'address', + 'address', + 'address', + 'address', + 'uint64', + 'uint64', + 'uint64', + 'uint64', + 'uint64', + 'uint8', + ], + [ + ORDER_TYPEHASH, + order.senderAddress, + order.matcherAddress, + order.baseAsset, + order.quoteAsset, + order.matcherFeeAsset, + order.amount, + order.price, + order.matcherFee, + order.nonce, + order.expiration, + order.buySide, + ] + ) + ); + const orderHash = keccak256( + abiCoder.encode( + ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], + [ + CROSS_CHAIN_ORDER_TYPEHASH, + limitOrderHash, + Number(chainId), + order.secretHash, + order.lockOrderExpiration, + ] + ) ); - console.log({ secretHash }, { orderParamsHash }, { orderHash }, { domainData }, { domainSeparator }, { digest }); - - return { secret, secretHash, orderHash }; + return orderHash } diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index fb401604..45ba6ed5 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -6,6 +6,7 @@ import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; +import { getOrderHash } from './hashOrder'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -68,7 +69,7 @@ export const signOrder = async ({ expiration, ...(isCrossChain ? { - targetChainId + targetChainId: Number(targetChainId) } : {}), buySide: side === 'BUY' ? 1 : 0 @@ -77,26 +78,6 @@ export const signOrder = async ({ const secret = generateSecret(); const secretHash = keccak256(secret); - const abiCoder = ethers.AbiCoder.defaultAbiCoder(); - - // Generate the orderParamsHash - const limitOrderHash = keccak256((abiCoder.encode( - ['address', 'address', 'address', 'address', 'address', 'uint64', 'uint64', 'uint64', 'uint64', 'uint64', 'uint8'], - [ - order.senderAddress, - order.matcherAddress, - order.baseAsset, - order.quoteAsset, - order.matcherFeeAsset, - order.amount, - order.price, - order.matcherFee, - order.nonce, - order.expiration, - order.buySide - ] - ))); - const crossChainOrder = { limitOrder: order, chainId: Number(chainId), @@ -104,19 +85,11 @@ export const signOrder = async ({ lockOrderExpiration: expiration // TODO: change to fillAndLockAtomic data } - // Generate the full crossChainOrder hash - // const orderHash = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode( - // ['bytes32', 'bytes32', 'uint24', 'bytes32', 'uint64'], - // [CROSS_CHAIN_ORDER_TYPEHASH, orderParamsHash, 97, '0x74a00e5cceb68d791486ddb9ea83bb8245eca22f67cb0ea81342f6eff8bf6e51', 1718955340461] - // )); - // TODO: change what to show const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, - { - crossChainOrder, - } + crossChainOrder ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 @@ -124,20 +97,23 @@ export const signOrder = async ({ const fixedSignature = ethers.Signature.from(signature).serialized; // if (!fixedSignature) throw new Error("Can't sign order"); - // const { orderHash, secret, secretHash } = hashOrder(limitOrder, chainId); - - const signedOrder: SignedOrder = { + const signedOrderWithoutId: Omit = { ...order, - id: limitOrderHash, // TODO: change to orderHash signature: fixedSignature, + secret, + secretHash, ...(isCrossChain ? { - secret, - secretHash, - targetChainId: Number(targetChainId), - lockOrderExpiration: expiration + targetChainId: Number(targetChainId) } - : {}) + : {}), + lockOrderExpiration: expiration + } + const orderHash = getOrderHash(signedOrderWithoutId, chainId); + + const signedOrder: SignedOrder = { + ...signedOrderWithoutId, + id: orderHash }; return signedOrder; }; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 29edd713..8e1cf107 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -231,6 +231,14 @@ class Aggregator { const url = new URL(`${this.apiUrl}/api/v1/order/${isCreateInternalOrder ? 'internal' : ''}`); + const body = { + ...signedOrder, + lockExpiration: signedOrder.lockOrderExpiration, + rawExchangeRestrictions + } + + delete body.lockOrderExpiration; + return fetchWithValidation( url.toString(), z.object({ @@ -246,7 +254,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify({ ...signedOrder, rawExchangeRestrictions }), + body: JSON.stringify(body), }, errorSchema, ); diff --git a/src/types.ts b/src/types.ts index 3f2445e9..a47116dd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -70,6 +70,7 @@ type SignedOrderAdditionalProps = { secret?: string secretHash?: string // bytes32 needWithdraw?: boolean // bool (not supported yet by smart-contract) + lockOrderExpiration?: number } export type SignedOrder = SignedOrderAdditionalProps & (Order | CrossOrder) & { From af8eb67959e8ced0dcc9007cbe1c5b9f13dee385 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 29 May 2024 15:05:27 +0300 Subject: [PATCH 47/74] add new order status: "TRANSFER" --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/orderStatuses.ts | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a68cc536..984d7e21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc8", + "version": "0.22.0-rc9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc8", + "version": "0.22.0-rc9", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 91ee7b22..6ef77c7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc8", + "version": "0.22.0-rc9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/orderStatuses.ts b/src/constants/orderStatuses.ts index ce853a70..ebe42d67 100644 --- a/src/constants/orderStatuses.ts +++ b/src/constants/orderStatuses.ts @@ -3,6 +3,7 @@ import subOrderStatuses from './subOrderStatuses.js'; const orderStatuses = [ ...subOrderStatuses, 'ROUTING', // order got sub orders, but not all of them have status ACCEPTED + 'TRANSFER' // TX_PENDING > TRANSFER > SETTLED ] as const; export default orderStatuses; From 5f4e5401609c98ae663dd759c2f2b62c5a706042 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 12:38:18 +0300 Subject: [PATCH 48/74] add lock order expiration = 4 days --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 8 +++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 984d7e21..4f90d035 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc9", + "version": "0.22.0-rc10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc9", + "version": "0.22.0-rc10", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6ef77c7f..6ba597e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc9", + "version": "0.22.0-rc10", "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 45ba6ed5..3f2068f6 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -8,7 +8,9 @@ import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; import { getOrderHash } from './hashOrder'; -const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days +const DAY = 24 * 60 * 60 * 1000; +const LOCK_ORDER_EXPIRATION = 4 * DAY; +const DEFAULT_EXPIRATION = 29 * DAY; export type SignOrderProps = { baseAssetAddress: string @@ -82,7 +84,7 @@ export const signOrder = async ({ limitOrder: order, chainId: Number(chainId), secretHash, - lockOrderExpiration: expiration // TODO: change to fillAndLockAtomic data + lockOrderExpiration: LOCK_ORDER_EXPIRATION } // TODO: change what to show @@ -107,7 +109,7 @@ export const signOrder = async ({ targetChainId: Number(targetChainId) } : {}), - lockOrderExpiration: expiration + lockOrderExpiration: LOCK_ORDER_EXPIRATION } const orderHash = getOrderHash(signedOrderWithoutId, chainId); From c76597e40f356ebd2478c4eb18809403e1fe38ad Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 12:46:44 +0300 Subject: [PATCH 49/74] change placeOrder body --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 10 +--------- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f90d035..17d0a01f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc10", + "version": "0.22.0-rc11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc10", + "version": "0.22.0-rc11", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 6ba597e5..af9d104e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc10", + "version": "0.22.0-rc11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 8e1cf107..29edd713 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -231,14 +231,6 @@ class Aggregator { const url = new URL(`${this.apiUrl}/api/v1/order/${isCreateInternalOrder ? 'internal' : ''}`); - const body = { - ...signedOrder, - lockExpiration: signedOrder.lockOrderExpiration, - rawExchangeRestrictions - } - - delete body.lockOrderExpiration; - return fetchWithValidation( url.toString(), z.object({ @@ -254,7 +246,7 @@ class Aggregator { { headers, method: 'POST', - body: JSON.stringify(body), + body: JSON.stringify({ ...signedOrder, rawExchangeRestrictions }), }, errorSchema, ); From afb80495890beb23eb8a8e03950251dda0526e45 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 16:10:09 +0300 Subject: [PATCH 50/74] change lockOrderExpiration --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signOrder.ts | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17d0a01f..1614f0dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc11", + "version": "0.22.0-rc12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc11", + "version": "0.22.0-rc12", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index af9d104e..c7032a81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc11", + "version": "0.22.0-rc12", "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 3f2068f6..7b1ca80c 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -43,6 +43,7 @@ export const signOrder = async ({ }: SignOrderProps): Promise => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; + const lockOrderExpiration = nonce + LOCK_ORDER_EXPIRATION; const isCrossChain = targetChainId === undefined || targetChainId !== chainId; @@ -84,7 +85,7 @@ export const signOrder = async ({ limitOrder: order, chainId: Number(chainId), secretHash, - lockOrderExpiration: LOCK_ORDER_EXPIRATION + lockOrderExpiration } // TODO: change what to show @@ -109,7 +110,7 @@ export const signOrder = async ({ targetChainId: Number(targetChainId) } : {}), - lockOrderExpiration: LOCK_ORDER_EXPIRATION + lockOrderExpiration } const orderHash = getOrderHash(signedOrderWithoutId, chainId); From 761a9cc1800021b255b03c96eae66bb81419bc89 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 16:59:39 +0300 Subject: [PATCH 51/74] massive refactor --- package.json | 2 +- src/Unit/Exchange/swapLimit.ts | 4 +- src/Unit/Exchange/swapMarket.ts | 2 +- src/constants/index.ts | 2 +- src/constants/orderTypes.ts | 23 ---- .../orderTypes/crossChainOrderTypes.ts | 11 ++ src/constants/orderTypes/index.ts | 3 + .../{ => orderTypes}/lockOrderTypes.ts | 0 src/constants/orderTypes/orderTypes.ts | 27 +++++ src/crypt/getDomainData.ts | 4 +- .../hashCrossChainOrder.ts} | 4 +- src/crypt/{ => hashOrders}/hashLockOrder.ts | 4 +- src/crypt/hashOrders/hashOrder.ts | 54 +++++++++ src/crypt/hashOrders/index.ts | 3 + src/crypt/index.ts | 1 + src/crypt/signCrossChainOrder.ts | 111 ++++++++++++++++++ src/crypt/signLockOrder.ts | 4 +- src/crypt/signOrder.ts | 69 +++-------- src/services/Aggregator/index.ts | 5 +- src/types.ts | 14 ++- 20 files changed, 249 insertions(+), 98 deletions(-) delete mode 100644 src/constants/orderTypes.ts create mode 100644 src/constants/orderTypes/crossChainOrderTypes.ts create mode 100644 src/constants/orderTypes/index.ts rename src/constants/{ => orderTypes}/lockOrderTypes.ts (100%) create mode 100644 src/constants/orderTypes/orderTypes.ts rename src/crypt/{hashOrder.ts => hashOrders/hashCrossChainOrder.ts} (89%) rename src/crypt/{ => hashOrders}/hashLockOrder.ts (83%) create mode 100644 src/crypt/hashOrders/hashOrder.ts create mode 100644 src/crypt/hashOrders/index.ts create mode 100644 src/crypt/signCrossChainOrder.ts diff --git a/package.json b/package.json index c7032a81..f0811b40 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc12", + "version": "0.22.0-rc13", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/Unit/Exchange/swapLimit.ts b/src/Unit/Exchange/swapLimit.ts index 26b30496..32c773b1 100644 --- a/src/Unit/Exchange/swapLimit.ts +++ b/src/Unit/Exchange/swapLimit.ts @@ -9,10 +9,10 @@ import { INTERNAL_PROTOCOL_PRECISION, NATIVE_CURRENCY_PRECISION, SWAP_THROUGH_ORION_POOL_GAS_LIMIT -} from '../../constants/index.js'; +} from '../../constants'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { calculateFeeInFeeAsset, denormalizeNumber, normalizeNumber } from '../../utils/index.js'; -import { signOrder } from '../../crypt/index.js'; +import { signOrder } from '../../crypt'; import type orderSchema from '../../services/Aggregator/schemas/orderSchema.js'; import type { z } from 'zod'; import { simpleFetch } from 'simple-typed-fetch'; diff --git a/src/Unit/Exchange/swapMarket.ts b/src/Unit/Exchange/swapMarket.ts index a5c971b4..2cbc3e59 100644 --- a/src/Unit/Exchange/swapMarket.ts +++ b/src/Unit/Exchange/swapMarket.ts @@ -11,7 +11,7 @@ import { } from '../../constants'; import getNativeCryptocurrencyName from '../../utils/getNativeCryptocurrencyName.js'; import { calculateFeeInFeeAsset, denormalizeNumber, normalizeNumber } from '../../utils/index.js'; -import { signOrder } from '../../crypt/index.js'; +import { signOrder } from '../../crypt'; import type orderSchema from '../../services/Aggregator/schemas/orderSchema.js'; import type { z } from 'zod'; import type { SwapLimitParams } from './swapLimit.js'; diff --git a/src/constants/index.ts b/src/constants/index.ts index efe47f0e..835464e7 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,11 +1,11 @@ export { default as cancelOrderTypes } from './cancelOrderTypes.js'; export { default as orderStatuses } from './orderStatuses.js'; -export { default as orderTypes } from './orderTypes.js'; export { default as subOrderStatuses } from './subOrderStatuses.js'; export { default as networkCodes } from './networkCodes.js'; export { default as exchanges } from './exchanges.js'; export { default as exchangesMap } from './exchangesMap.js'; +export * from './orderTypes'; export * from './chains.js'; export * from './precisions.js'; export * from './gasLimits.js'; diff --git a/src/constants/orderTypes.ts b/src/constants/orderTypes.ts deleted file mode 100644 index 699190f9..00000000 --- a/src/constants/orderTypes.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const ORDER_TYPES = { - Order: [ - { name: 'senderAddress', type: 'address' }, - { name: 'matcherAddress', type: 'address' }, - { name: 'baseAsset', type: 'address' }, - { name: 'quoteAsset', type: 'address' }, - { name: 'matcherFeeAsset', type: 'address' }, - { name: 'amount', type: 'uint64' }, - { name: 'price', type: 'uint64' }, - { name: 'matcherFee', type: 'uint64' }, - { name: 'nonce', type: 'uint64' }, - { name: 'expiration', type: 'uint64' }, - { name: 'buySide', type: 'uint8' }, - ], - CrossChainOrder: [ - { name: 'limitOrder', type: 'Order' }, - { name: 'chainId', type: 'uint24' }, - { name: 'secretHash', type: 'bytes32' }, - { name: 'lockOrderExpiration', type: 'uint64' }, - ] -} - -export default ORDER_TYPES; diff --git a/src/constants/orderTypes/crossChainOrderTypes.ts b/src/constants/orderTypes/crossChainOrderTypes.ts new file mode 100644 index 00000000..2c7a1c86 --- /dev/null +++ b/src/constants/orderTypes/crossChainOrderTypes.ts @@ -0,0 +1,11 @@ +import {ORDER_TYPE} from './orderTypes'; + +export const CROSS_CHAIN_ORDER_TYPES = { + Order: ORDER_TYPE, + CrossChainOrder: [ + {name: 'limitOrder', type: 'Order'}, + {name: 'chainId', type: 'uint24'}, + {name: 'secretHash', type: 'bytes32'}, + {name: 'lockOrderExpiration', type: 'uint64'}, + ] +} diff --git a/src/constants/orderTypes/index.ts b/src/constants/orderTypes/index.ts new file mode 100644 index 00000000..8be58c46 --- /dev/null +++ b/src/constants/orderTypes/index.ts @@ -0,0 +1,3 @@ +export * from './crossChainOrderTypes'; +export * from './lockOrderTypes'; +export { ORDER_TYPES } from './orderTypes'; diff --git a/src/constants/lockOrderTypes.ts b/src/constants/orderTypes/lockOrderTypes.ts similarity index 100% rename from src/constants/lockOrderTypes.ts rename to src/constants/orderTypes/lockOrderTypes.ts diff --git a/src/constants/orderTypes/orderTypes.ts b/src/constants/orderTypes/orderTypes.ts new file mode 100644 index 00000000..c265a2d9 --- /dev/null +++ b/src/constants/orderTypes/orderTypes.ts @@ -0,0 +1,27 @@ +export const ORDER_TYPE = [ + { name: 'senderAddress', type: 'address' }, + { name: 'matcherAddress', type: 'address' }, + { name: 'baseAsset', type: 'address' }, + { name: 'quoteAsset', type: 'address' }, + { name: 'matcherFeeAsset', type: 'address' }, + { name: 'amount', type: 'uint64' }, + { name: 'price', type: 'uint64' }, + { name: 'matcherFee', type: 'uint64' }, + { name: 'nonce', type: 'uint64' }, + { name: 'expiration', type: 'uint64' }, + { name: 'buySide', type: 'uint8' }, +]; + +export const ORDER_TYPES = { + Order: ORDER_TYPE +} + +export const CROSS_CHAIN_ORDER_TYPES = { + Order: ORDER_TYPE, + CrossChainOrder: [ + { name: 'limitOrder', type: 'Order' }, + { name: 'chainId', type: 'uint24' }, + { name: 'secretHash', type: 'bytes32' }, + { name: 'lockOrderExpiration', type: 'uint64' }, + ] +} diff --git a/src/crypt/getDomainData.ts b/src/crypt/getDomainData.ts index d3d14452..ecd361be 100644 --- a/src/crypt/getDomainData.ts +++ b/src/crypt/getDomainData.ts @@ -1,5 +1,5 @@ import type { SupportedChainId } from '../types.js'; -import eip712DomainData from '../config/eip712DomainData.json' assert { type: 'json' }; +import eip712DomainData from '../config/eip712DomainData.json' assert {type: 'json'}; import eip712DomainSchema from '../config/schemas/eip712DomainSchema.js'; const EIP712Domain = eip712DomainSchema.parse(eip712DomainData); @@ -19,7 +19,7 @@ function removeUndefined(obj: Record) { */ const getDomainData = (chainId: SupportedChainId) => ({ ...removeUndefined(EIP712Domain), - chainId: Number(chainId), // check if it broke + chainId: Number(chainId), }); export default getDomainData; diff --git a/src/crypt/hashOrder.ts b/src/crypt/hashOrders/hashCrossChainOrder.ts similarity index 89% rename from src/crypt/hashOrder.ts rename to src/crypt/hashOrders/hashCrossChainOrder.ts index 98a1365b..ac074ae8 100644 --- a/src/crypt/hashOrder.ts +++ b/src/crypt/hashOrders/hashCrossChainOrder.ts @@ -1,12 +1,12 @@ import { ethers, keccak256 } from 'ethers'; -import type { SupportedChainId, SignedOrder } from '../types.js'; +import type { SupportedChainId, CrossChainOrder } from '../../types'; const ORDER_TYPEHASH = '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54'; const CROSS_CHAIN_ORDER_TYPEHASH = '0xc4666edeecc42a94cf6b87f39e1ca967792e6d738224365e54d7d06ec632b05c'; -export function getOrderHash(order: Omit, chainId: SupportedChainId) { +export function getOrderHash(order: CrossChainOrder, chainId: SupportedChainId) { const abiCoder = ethers.AbiCoder.defaultAbiCoder(); // Generate the orderParamsHash diff --git a/src/crypt/hashLockOrder.ts b/src/crypt/hashOrders/hashLockOrder.ts similarity index 83% rename from src/crypt/hashLockOrder.ts rename to src/crypt/hashOrders/hashLockOrder.ts index 71173f8d..c3084eb1 100644 --- a/src/crypt/hashLockOrder.ts +++ b/src/crypt/hashOrders/hashLockOrder.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import type { LockOrder } from '../types.js'; +import type { LockOrder } from '../../types'; export const hashLockOrder = (order: LockOrder) => ethers.solidityPackedKeccak256( [ @@ -10,11 +10,9 @@ export const hashLockOrder = (order: LockOrder) => ethers.solidityPackedKeccak25 'uint64', 'uint64', 'uint64', - 'string' ], [ '0x03', - order.user, order.sender, order.expiration, order.asset, diff --git a/src/crypt/hashOrders/hashOrder.ts b/src/crypt/hashOrders/hashOrder.ts new file mode 100644 index 00000000..c8abe14f --- /dev/null +++ b/src/crypt/hashOrders/hashOrder.ts @@ -0,0 +1,54 @@ +import { ethers, keccak256 } from 'ethers'; +import type { Order } from '../../types'; + +const ORDER_TYPEHASH = '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54' + +export default function getOrderHash(order: Order) { + 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 + ] + ) + + return keccak256(orderBytes) +} diff --git a/src/crypt/hashOrders/index.ts b/src/crypt/hashOrders/index.ts new file mode 100644 index 00000000..fe8b3994 --- /dev/null +++ b/src/crypt/hashOrders/index.ts @@ -0,0 +1,3 @@ +export * from './hashCrossChainOrder'; +export * from './hashOrder'; +export * from './hashLockOrder'; diff --git a/src/crypt/index.ts b/src/crypt/index.ts index 4bf90858..2d0ac7e2 100644 --- a/src/crypt/index.ts +++ b/src/crypt/index.ts @@ -1,3 +1,4 @@ export { default as signCancelOrder } from './signCancelOrder.js'; export { signOrder, type SignOrderProps } from './signOrder.js'; +export { signCrossChainOrder, type SignCrossChainOrderProps } from './signCrossChainOrder.js'; export { signLockOrder, type SignLockOrderProps } from './signLockOrder.js'; diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts new file mode 100644 index 00000000..ce2f6499 --- /dev/null +++ b/src/crypt/signCrossChainOrder.ts @@ -0,0 +1,111 @@ +import { BigNumber } from 'bignumber.js'; +import { ethers, keccak256 } from 'ethers'; +import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; +import { CROSS_CHAIN_ORDER_TYPES } from '../constants/orderTypes/orderTypes'; +import type { Order, SignedCrossChainOrder, SupportedChainId } from '../types.js'; +import normalizeNumber from '../utils/normalizeNumber.js'; +import getDomainData from './getDomainData.js'; +import generateSecret from '../utils/generateSecret'; +import { getOrderHash } from './hashOrders'; + +const DAY = 24 * 60 * 60 * 1000; +const LOCK_ORDER_EXPIRATION = 4 * DAY; +const DEFAULT_EXPIRATION = 29 * DAY; + +export type SignCrossChainOrderProps = { + baseAssetAddress: string + quoteAssetAddress: string + side: 'BUY' | 'SELL' + price: BigNumber.Value + amount: BigNumber.Value + matcherFee: BigNumber.Value + senderAddress: string + matcherAddress: string + serviceFeeAssetAddress: string + signer: ethers.Signer + chainId: SupportedChainId + targetChainId?: SupportedChainId +} + +export const signCrossChainOrder = async ({ + amount, + signer, + side, + baseAssetAddress, + quoteAssetAddress, + serviceFeeAssetAddress, + matcherFee, + matcherAddress, + senderAddress, + targetChainId, + chainId, + price +}: SignCrossChainOrderProps): Promise => { + const nonce = Date.now(); + const expiration = nonce + DEFAULT_EXPIRATION; + const lockOrderExpiration = nonce + LOCK_ORDER_EXPIRATION; + + const order: Order = { + senderAddress, + matcherAddress, + baseAsset: baseAssetAddress, + quoteAsset: quoteAssetAddress, + matcherFeeAsset: serviceFeeAssetAddress, + amount: Number(normalizeNumber( + amount, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_FLOOR, + )), + price: Number(normalizeNumber( + price, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_FLOOR, + )), + matcherFee: Number(normalizeNumber( + matcherFee, + INTERNAL_PROTOCOL_PRECISION, + BigNumber.ROUND_CEIL, // ROUND_CEIL because we don't want get "not enough fee" error + )), + nonce, + expiration, + buySide: side === 'BUY' ? 1 : 0 + }; + + const secret = generateSecret(); + const secretHash = keccak256(secret); + + const crossChainOrder = { + limitOrder: order, + chainId: Number(chainId), + secretHash, + lockOrderExpiration + } + + const signature = await signer.signTypedData( + getDomainData(chainId), + CROSS_CHAIN_ORDER_TYPES, + crossChainOrder + ); + + // 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; + + // if (!fixedSignature) throw new Error("Can't sign order"); + const signedOrderWithoutId: Omit = { + ...order, + signature: fixedSignature, + secret, + secretHash, + targetChainId: Number(targetChainId), + lockOrderExpiration + } + const orderHash = getOrderHash(signedOrderWithoutId, chainId); + + const signedCrossChainOrder: SignedCrossChainOrder = { + ...signedOrderWithoutId, + id: orderHash + }; + + return signedCrossChainOrder; +}; diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 6d75bf49..3ffb34d9 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -4,8 +4,7 @@ import getDomainData from './getDomainData.js'; import generateSecret from '../utils/generateSecret'; import { BigNumber } from 'bignumber.js'; import normalizeNumber from '../utils/normalizeNumber'; -import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; -import { LOCK_ORDER_TYPES } from '../constants/lockOrderTypes'; +import { INTERNAL_PROTOCOL_PRECISION, LOCK_ORDER_TYPES } from '../constants'; const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days @@ -41,6 +40,7 @@ export const signLockOrder = async ({ BigNumber.ROUND_FLOOR, )), targetChainId: Number(targetChainId), + secret, secretHash }; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index 7b1ca80c..e772620d 100644 --- a/src/crypt/signOrder.ts +++ b/src/crypt/signOrder.ts @@ -1,16 +1,12 @@ import { BigNumber } from 'bignumber.js'; -import { ethers, keccak256 } from 'ethers'; -import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; -import ORDER_TYPES from '../constants/orderTypes.js'; +import { ethers } from 'ethers'; +import { INTERNAL_PROTOCOL_PRECISION, ORDER_TYPES } from '../constants'; import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; import getDomainData from './getDomainData.js'; -import generateSecret from '../utils/generateSecret'; -import { getOrderHash } from './hashOrder'; +import hashOrder from './hashOrders/hashOrder'; -const DAY = 24 * 60 * 60 * 1000; -const LOCK_ORDER_EXPIRATION = 4 * DAY; -const DEFAULT_EXPIRATION = 29 * DAY; +const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days export type SignOrderProps = { baseAssetAddress: string @@ -24,28 +20,23 @@ export type SignOrderProps = { serviceFeeAssetAddress: string signer: ethers.Signer chainId: SupportedChainId - targetChainId?: SupportedChainId } export const signOrder = async ({ - amount, - signer, - side, + senderAddress, + serviceFeeAssetAddress, baseAssetAddress, quoteAssetAddress, - serviceFeeAssetAddress, matcherFee, matcherAddress, - senderAddress, - targetChainId, chainId, + signer, + side, + amount, price -}: SignOrderProps): Promise => { +}: SignOrderProps) => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; - const lockOrderExpiration = nonce + LOCK_ORDER_EXPIRATION; - - const isCrossChain = targetChainId === undefined || targetChainId !== chainId; const order: Order = { senderAddress, @@ -70,29 +61,13 @@ export const signOrder = async ({ )), nonce, expiration, - ...(isCrossChain - ? { - targetChainId: Number(targetChainId) - } - : {}), - buySide: side === 'BUY' ? 1 : 0 + buySide: side === 'BUY' ? 1 : 0, }; - const secret = generateSecret(); - const secretHash = keccak256(secret); - - const crossChainOrder = { - limitOrder: order, - chainId: Number(chainId), - secretHash, - lockOrderExpiration - } - - // TODO: change what to show const signature = await signer.signTypedData( getDomainData(chainId), ORDER_TYPES, - crossChainOrder + order, ); // https://github.com/poap-xyz/poap-fun/pull/62#issue-928290265 @@ -100,25 +75,11 @@ export const signOrder = async ({ const fixedSignature = ethers.Signature.from(signature).serialized; // if (!fixedSignature) throw new Error("Can't sign order"); - const signedOrderWithoutId: Omit = { - ...order, - signature: fixedSignature, - secret, - secretHash, - ...(isCrossChain - ? { - targetChainId: Number(targetChainId) - } - : {}), - lockOrderExpiration - } - const orderHash = getOrderHash(signedOrderWithoutId, chainId); const signedOrder: SignedOrder = { - ...signedOrderWithoutId, - id: orderHash + ...order, + id: hashOrder(order), + signature: fixedSignature, }; return signedOrder; }; - -export default signOrder; diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 29edd713..bf721635 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -14,7 +14,8 @@ import type { NetworkShortName, SignedLockOrder, SignedCancelOrderRequest, - SignedOrder + SignedOrder, + SignedCrossChainOrder } from '../../types.js'; import { pairConfigSchema, aggregatedOrderbookSchema, @@ -211,7 +212,7 @@ class Aggregator { ); placeOrder = ( - signedOrder: SignedOrder, + signedOrder: SignedOrder | SignedCrossChainOrder, isCreateInternalOrder: boolean, isReversedOrder?: boolean, partnerId?: string, diff --git a/src/types.ts b/src/types.ts index a47116dd..5c6189cb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -50,7 +50,9 @@ export type Order = { expiration: number // uint64 buySide: 0 | 1 // uint8, 1=buy, 0=sell } -export type CrossOrder = Order & { + +export type CrossChainOrder = Order & { + secret: string secretHash: string // bytes32 targetChainId: number // uint24 lockOrderExpiration: number // uint64 @@ -62,18 +64,20 @@ export type LockOrder = { asset: string // address(?) amount: number // uint64 targetChainId: number // uint64 + secret: string // bytes32 secretHash: string // bytes32 } type SignedOrderAdditionalProps = { signature: string // bytes - secret?: string - secretHash?: string // bytes32 needWithdraw?: boolean // bool (not supported yet by smart-contract) - lockOrderExpiration?: number } -export type SignedOrder = SignedOrderAdditionalProps & (Order | CrossOrder) & { +export type SignedOrder = SignedOrderAdditionalProps & Order & { + id: string // hash of Order (it's not part of order structure in smart-contract) +} + +export type SignedCrossChainOrder = SignedOrderAdditionalProps & CrossChainOrder & { id: string // hash of Order (it's not part of order structure in smart-contract) } From 2613e4a80d4b8f3efd15f9e9bcdbd0e6dd840c53 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 17:37:51 +0300 Subject: [PATCH 52/74] au update schema --- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f0811b40..606dbe07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc13", + "version": "0.22.0-rc14", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 1e3e8d99..0fa9ffe8 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -84,6 +84,8 @@ export const fullOrderSchema = z.object({ E: z.enum(executionTypes).optional(), C: z.string().optional(), // trigger condition ro: z.boolean().optional(), // is reversed order + sc: z.boolean().optional(), // source chain + tc: z.boolean().optional(), // target chain }).transform((val) => ({ ...val, k: 'full' as const, @@ -105,6 +107,8 @@ export const fullOrderSchema = z.object({ executionType: o.E, triggerCondition: o.C, isReversedOrder: o.ro, + sorceChain: o.sc, + targetChain: o.tc, subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, From 0c2b95ada615008ccef735b8f43ed1fc2b9ced26 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 30 May 2024 17:43:31 +0300 Subject: [PATCH 53/74] au update schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1614f0dd..ede2901a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc12", + "version": "0.22.0-rc15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc12", + "version": "0.22.0-rc15", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 606dbe07..2eb9815c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc14", + "version": "0.22.0-rc15", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 0fa9ffe8..d1549774 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -84,8 +84,8 @@ export const fullOrderSchema = z.object({ E: z.enum(executionTypes).optional(), C: z.string().optional(), // trigger condition ro: z.boolean().optional(), // is reversed order - sc: z.boolean().optional(), // source chain - tc: z.boolean().optional(), // target chain + sc: z.string().optional(), // source chain + tc: z.string().optional(), // target chain }).transform((val) => ({ ...val, k: 'full' as const, From 517f127b2944190ce6c2a5632f6ed245ab242d9b Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 31 May 2024 10:47:59 +0300 Subject: [PATCH 54/74] change chainId to targetChainId --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signCrossChainOrder.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ede2901a..5ea4c395 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc15", + "version": "0.22.0-rc16", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc15", + "version": "0.22.0-rc16", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2eb9815c..34eca883 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc15", + "version": "0.22.0-rc16", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts index ce2f6499..e4a98249 100644 --- a/src/crypt/signCrossChainOrder.ts +++ b/src/crypt/signCrossChainOrder.ts @@ -76,7 +76,7 @@ export const signCrossChainOrder = async ({ const crossChainOrder = { limitOrder: order, - chainId: Number(chainId), + chainId: Number(targetChainId), secretHash, lockOrderExpiration } From ab4a6745d7819128915b74e8c4e5f11622ff2bab Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 3 Jun 2024 10:21:25 +0300 Subject: [PATCH 55/74] update sign cross-chain order types --- package-lock.json | 4 ++-- package.json | 2 +- src/constants/orderTypes/orderTypes.ts | 2 +- src/crypt/hashOrders/hashCrossChainOrder.ts | 6 +++--- src/crypt/signCrossChainOrder.ts | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ea4c395..68984f8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc16", + "version": "0.22.0-rc19", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc16", + "version": "0.22.0-rc19", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 34eca883..f16a176f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc16", + "version": "0.22.0-rc19", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/constants/orderTypes/orderTypes.ts b/src/constants/orderTypes/orderTypes.ts index c265a2d9..1751c276 100644 --- a/src/constants/orderTypes/orderTypes.ts +++ b/src/constants/orderTypes/orderTypes.ts @@ -20,7 +20,7 @@ export const CROSS_CHAIN_ORDER_TYPES = { Order: ORDER_TYPE, CrossChainOrder: [ { name: 'limitOrder', type: 'Order' }, - { name: 'chainId', type: 'uint24' }, + { name: 'targetChainId', type: 'uint24' }, { name: 'secretHash', type: 'bytes32' }, { name: 'lockOrderExpiration', type: 'uint64' }, ] diff --git a/src/crypt/hashOrders/hashCrossChainOrder.ts b/src/crypt/hashOrders/hashCrossChainOrder.ts index ac074ae8..e089f087 100644 --- a/src/crypt/hashOrders/hashCrossChainOrder.ts +++ b/src/crypt/hashOrders/hashCrossChainOrder.ts @@ -4,9 +4,9 @@ import type { SupportedChainId, CrossChainOrder } from '../../types'; const ORDER_TYPEHASH = '0xb5132db62dfceb466f2f8aee7a039db36a99772e5a9771d28388a5f9baad7c54'; const CROSS_CHAIN_ORDER_TYPEHASH = - '0xc4666edeecc42a94cf6b87f39e1ca967792e6d738224365e54d7d06ec632b05c'; + '0xb0edab98a08b4f5ce4f349d7cb1622bde999112acf1ac4a30cc9f394bd7809a6'; -export function getOrderHash(order: CrossChainOrder, chainId: SupportedChainId) { +export function getOrderHash(order: CrossChainOrder, targetChainId: SupportedChainId) { const abiCoder = ethers.AbiCoder.defaultAbiCoder(); // Generate the orderParamsHash @@ -48,7 +48,7 @@ export function getOrderHash(order: CrossChainOrder, chainId: SupportedChainId) [ CROSS_CHAIN_ORDER_TYPEHASH, limitOrderHash, - Number(chainId), + Number(targetChainId), order.secretHash, order.lockOrderExpiration, ] diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts index e4a98249..8d65d4ca 100644 --- a/src/crypt/signCrossChainOrder.ts +++ b/src/crypt/signCrossChainOrder.ts @@ -24,7 +24,7 @@ export type SignCrossChainOrderProps = { serviceFeeAssetAddress: string signer: ethers.Signer chainId: SupportedChainId - targetChainId?: SupportedChainId + targetChainId: SupportedChainId } export const signCrossChainOrder = async ({ @@ -76,7 +76,7 @@ export const signCrossChainOrder = async ({ const crossChainOrder = { limitOrder: order, - chainId: Number(targetChainId), + targetChainId: Number(targetChainId), secretHash, lockOrderExpiration } @@ -100,7 +100,7 @@ export const signCrossChainOrder = async ({ targetChainId: Number(targetChainId), lockOrderExpiration } - const orderHash = getOrderHash(signedOrderWithoutId, chainId); + const orderHash = getOrderHash(signedOrderWithoutId, targetChainId); const signedCrossChainOrder: SignedCrossChainOrder = { ...signedOrderWithoutId, From 551a3ff0378f2eab2bb274d54cef240a2d16f9c7 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 5 Jun 2024 10:19:44 +0300 Subject: [PATCH 56/74] bump v --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e56eb49..48df1eb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc20", + "version": "0.22.0-rc21", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc20", + "version": "0.22.0-rc21", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0ec2e497..0c1b2e25 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc20", + "version": "0.22.0-rc21", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From c73a41be3fc9f46ad445b86c902783916f9930f3 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 5 Jun 2024 16:48:03 +0300 Subject: [PATCH 57/74] fix typo --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 48df1eb0..e6a02625 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc21", + "version": "0.22.0-rc22", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc21", + "version": "0.22.0-rc22", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 0c1b2e25..36066f4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc21", + "version": "0.22.0-rc22", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index d1549774..bd60d085 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -107,7 +107,7 @@ export const fullOrderSchema = z.object({ executionType: o.E, triggerCondition: o.C, isReversedOrder: o.ro, - sorceChain: o.sc, + sourceChain: o.sc, targetChain: o.tc, subOrders: o.c.map((so) => ({ pair: so.P, From d36d616f46b3ad9591aa2a13e8e89f2bfc54bd4b Mon Sep 17 00:00:00 2001 From: TheJuze Date: Thu, 6 Jun 2024 11:05:43 +0300 Subject: [PATCH 58/74] remove ledger signature --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signCancelOrder.ts | 10 ++-------- src/crypt/signCrossChainOrder.ts | 10 +++------- src/crypt/signLockOrder.ts | 8 +------- src/crypt/signOrder.ts | 10 ++-------- 6 files changed, 11 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6a02625..ab58c9c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc22", + "version": "0.22.0-rc23", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc22", + "version": "0.22.0-rc23", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 36066f4c..ca46ce37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc22", + "version": "0.22.0-rc23", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signCancelOrder.ts b/src/crypt/signCancelOrder.ts index d7924016..51fda908 100644 --- a/src/crypt/signCancelOrder.ts +++ b/src/crypt/signCancelOrder.ts @@ -1,4 +1,4 @@ -import { ethers } from 'ethers'; +import type { ethers } from 'ethers'; import CANCEL_ORDER_TYPES from '../constants/cancelOrderTypes.js'; import type { CancelOrderRequest, SignedCancelOrderRequest, SupportedChainId } from '../types.js'; import getDomainData from './getDomainData.js'; @@ -20,15 +20,9 @@ const signCancelOrder = async ( cancelOrderRequest, ); - // 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; - - // if (!fixedSignature) throw new Error("Can't sign order cancel"); - const signedCancelOrderReqeust: SignedCancelOrderRequest = { ...cancelOrderRequest, - signature: fixedSignature, + signature, }; return signedCancelOrderReqeust; }; diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts index 8d65d4ca..57571af2 100644 --- a/src/crypt/signCrossChainOrder.ts +++ b/src/crypt/signCrossChainOrder.ts @@ -1,5 +1,6 @@ import { BigNumber } from 'bignumber.js'; -import { ethers, keccak256 } from 'ethers'; +import type { ethers } from 'ethers'; +import { keccak256 } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION } from '../constants'; import { CROSS_CHAIN_ORDER_TYPES } from '../constants/orderTypes/orderTypes'; import type { Order, SignedCrossChainOrder, SupportedChainId } from '../types.js'; @@ -87,14 +88,9 @@ export const signCrossChainOrder = async ({ crossChainOrder ); - // 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; - - // if (!fixedSignature) throw new Error("Can't sign order"); const signedOrderWithoutId: Omit = { ...order, - signature: fixedSignature, + signature, secret, secretHash, targetChainId: Number(targetChainId), diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 3ffb34d9..47ea130b 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -50,15 +50,9 @@ export const signLockOrder = async ({ order, ); - // 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; - - // if (!fixedSignature) throw new Error("Can't sign order"); - const signedOrder: SignedLockOrder = { ...order, - signature: fixedSignature, + signature, secret, secretHash }; diff --git a/src/crypt/signOrder.ts b/src/crypt/signOrder.ts index e772620d..4623991a 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 type { ethers } from 'ethers'; import { INTERNAL_PROTOCOL_PRECISION, ORDER_TYPES } from '../constants'; import type { Order, SignedOrder, SupportedChainId } from '../types.js'; import normalizeNumber from '../utils/normalizeNumber.js'; @@ -70,16 +70,10 @@ export const signOrder = async ({ order, ); - // 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; - - // if (!fixedSignature) throw new Error("Can't sign order"); - const signedOrder: SignedOrder = { ...order, id: hashOrder(order), - signature: fixedSignature, + signature, }; return signedOrder; }; From 296d644997a0d8c74dfa716e8043df727ba98588 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Fri, 7 Jun 2024 20:57:18 +0300 Subject: [PATCH 59/74] change lockOrderExpiration (mock) --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signCrossChainOrder.ts | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab58c9c6..43639568 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc23", + "version": "0.22.0-rc24", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc23", + "version": "0.22.0-rc24", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ca46ce37..3f7a5ec2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc23", + "version": "0.22.0-rc24", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts index 57571af2..2225b579 100644 --- a/src/crypt/signCrossChainOrder.ts +++ b/src/crypt/signCrossChainOrder.ts @@ -10,7 +10,10 @@ import generateSecret from '../utils/generateSecret'; import { getOrderHash } from './hashOrders'; const DAY = 24 * 60 * 60 * 1000; -const LOCK_ORDER_EXPIRATION = 4 * DAY; +// TODO: return LOCK_ORDER_EXPIRATION and remove MOCK_LOCK_ORDER_EXPIRATION +// const LOCK_ORDER_EXPIRATION = 4 * DAY; +const MOCK_LOCK_ORDER_EXPIRATION = 10 * 60 * 1000; // 10 mins + const DEFAULT_EXPIRATION = 29 * DAY; export type SignCrossChainOrderProps = { @@ -44,7 +47,7 @@ export const signCrossChainOrder = async ({ }: SignCrossChainOrderProps): Promise => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; - const lockOrderExpiration = nonce + LOCK_ORDER_EXPIRATION; + const lockOrderExpiration = nonce + MOCK_LOCK_ORDER_EXPIRATION; const order: Order = { senderAddress, From 543a74e959e686ec39495582a5ca688ba4ec65f4 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 10 Jun 2024 12:24:55 +0300 Subject: [PATCH 60/74] change lockOrderExpiration (mock) --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signLockOrder.ts | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43639568..a68a6a48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc24", + "version": "0.22.0-rc25", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc24", + "version": "0.22.0-rc25", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 3f7a5ec2..00505fbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.0-rc24", + "version": "0.22.0-rc25", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 47ea130b..edad852a 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -6,7 +6,9 @@ import { BigNumber } from 'bignumber.js'; import normalizeNumber from '../utils/normalizeNumber'; import { INTERNAL_PROTOCOL_PRECISION, LOCK_ORDER_TYPES } from '../constants'; -const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days +// TODO: return LOCK_ORDER_EXPIRATION and remove MOCK_LOCK_ORDER_EXPIRATION +// const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days +const MOCK_ORDER_EXPIRATION = 10 * 60 * 1000; // 10 mins export type SignLockOrderProps = { senderAddress: string // user @@ -26,7 +28,7 @@ export const signLockOrder = async ({ signer, }: SignLockOrderProps) => { const nonce = Date.now(); - const expiration = nonce + DEFAULT_EXPIRATION; + const expiration = nonce + MOCK_ORDER_EXPIRATION; const secret = generateSecret(); const secretHash = ethers.keccak256(secret); From c07e6727c4bf1bd922dee341a312b6c0162eb4dd Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 11 Jun 2024 16:12:29 +0300 Subject: [PATCH 61/74] add secret hash field --- package-lock.json | 33 +++++++++---------- src/constants/orderStatuses.ts | 3 +- .../ws/schemas/addressUpdateSchema.ts | 3 ++ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index aebbd2f9..6dfe9b2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,18 @@ { "name": "@orionprotocol/sdk", - "version": "0.22.3", + "version": "0.23.0-rc0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.22.3", + "version": "0.23.0-rc0", "hasInstallScript": true, "license": "ISC", "dependencies": { "@babel/runtime": "^7.21.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "^1.23.9", + "@orionprotocol/contracts": "1.23.4-rc", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -27,7 +26,7 @@ "merge-anything": "^5.1.7", "neverthrow": "^6.0.0", "patch-package": "^8.0.0", - "simple-typed-fetch": "0.2.3", + "simple-typed-fetch": "0.2.5", "stream-browserify": "^3.0.0", "tiny-invariant": "^1.3.1", "ts-is-present": "^1.2.2", @@ -2422,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.9.tgz", - "integrity": "sha512-tx21XokSK8kBYmuzfYrXoDattirm6yaG3dslrOKZTHgGP1wC6c6SbQF69pVCCAnPNGvQCt4lw0I/8fxm9Cx23Q==" + "version": "1.23.4-rc", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", + "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -10399,9 +10398,9 @@ "dev": true }, "node_modules/simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "dependencies": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", @@ -13489,9 +13488,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.9.tgz", - "integrity": "sha512-tx21XokSK8kBYmuzfYrXoDattirm6yaG3dslrOKZTHgGP1wC6c6SbQF69pVCCAnPNGvQCt4lw0I/8fxm9Cx23Q==" + "version": "1.23.4-rc", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", + "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==" }, "@sinclair/typebox": { "version": "0.27.8", @@ -19336,9 +19335,9 @@ "dev": true }, "simple-typed-fetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.3.tgz", - "integrity": "sha512-EXP2mVVsVf4A3+5QGevs8789ztnT6FozsYyMrIrUYhfqtX2V+X9xETHeGXffmgv7YQ0p+GrW7N+5x+b+pBW59Q==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/simple-typed-fetch/-/simple-typed-fetch-0.2.5.tgz", + "integrity": "sha512-T/KKUHKOZgaYVp3dbjE1wEK5cAGmG5N7FNAzP6ZGqLDhzBsRm3Gpt8bO/kowV6bt8duXDWiapYFQibW/8iHp6Q==", "requires": { "isomorphic-unfetch": "^4.0.2", "neverthrow": "^6.0.0", diff --git a/src/constants/orderStatuses.ts b/src/constants/orderStatuses.ts index ebe42d67..2cfb894a 100644 --- a/src/constants/orderStatuses.ts +++ b/src/constants/orderStatuses.ts @@ -3,7 +3,8 @@ import subOrderStatuses from './subOrderStatuses.js'; const orderStatuses = [ ...subOrderStatuses, 'ROUTING', // order got sub orders, but not all of them have status ACCEPTED - 'TRANSFER' // TX_PENDING > TRANSFER > SETTLED + 'TRANSFER', // TX_PENDING > TRANSFER > SETTLED + 'REFUNDED' // TX_PENDING > TRANSFER > CANCELED > REFUNDED ] as const; export default orderStatuses; diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index bd60d085..7e164d04 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -86,6 +86,8 @@ export const fullOrderSchema = z.object({ ro: z.boolean().optional(), // is reversed order sc: z.string().optional(), // source chain tc: z.string().optional(), // target chain + ir: z.string().optional(), // is refundable + sh: z.string().optional(), // secret hash }).transform((val) => ({ ...val, k: 'full' as const, @@ -109,6 +111,7 @@ export const fullOrderSchema = z.object({ isReversedOrder: o.ro, sourceChain: o.sc, targetChain: o.tc, + isRefundable: o.ir, subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, From 1b045b74811ba08c8f67fa10fd8baa9c9841b8ef Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 11 Jun 2024 18:00:17 +0300 Subject: [PATCH 62/74] bump contracts --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b233b81..a50365e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.23.4-rc", + "@orionprotocol/contracts": "1.23.9", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", @@ -2421,9 +2421,9 @@ } }, "node_modules/@orionprotocol/contracts": { - "version": "1.23.4-rc", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", - "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.9.tgz", + "integrity": "sha512-tx21XokSK8kBYmuzfYrXoDattirm6yaG3dslrOKZTHgGP1wC6c6SbQF69pVCCAnPNGvQCt4lw0I/8fxm9Cx23Q==", "workspaces": [ "packages/*" ] @@ -13491,9 +13491,9 @@ } }, "@orionprotocol/contracts": { - "version": "1.23.4-rc", - "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.4-rc.tgz", - "integrity": "sha512-Cd5oMVZzMuQbOqbVBnwUbLXr6jpwOq4MtwoLo/l6T1BxWh/s1hKF8VuIvUJgGbzI0HEg3AGa1DCT4chwe9721Q==" + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/@orionprotocol/contracts/-/contracts-1.23.9.tgz", + "integrity": "sha512-tx21XokSK8kBYmuzfYrXoDattirm6yaG3dslrOKZTHgGP1wC6c6SbQF69pVCCAnPNGvQCt4lw0I/8fxm9Cx23Q==" }, "@sinclair/typebox": { "version": "0.27.8", diff --git a/package.json b/package.json index 561f140d..565cfff7 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "dependencies": { "@babel/runtime": "^7.21.0", "@ethersproject/providers": "^5.7.2", - "@orionprotocol/contracts": "1.23.4-rc", + "@orionprotocol/contracts": "1.23.9", "@types/lodash.clonedeep": "^4.5.9", "bignumber.js": "^9.1.1", "bson-objectid": "^2.0.4", From f515d880f1cc12d01267aca99af7addc74718463 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Wed, 12 Jun 2024 11:01:51 +0300 Subject: [PATCH 63/74] update au schema --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a50365e3..afe5420b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc1", + "version": "0.23.0-rc2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc1", + "version": "0.23.0-rc2", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 565cfff7..ce586ce4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc1", + "version": "0.23.0-rc2", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 7e164d04..2730fbec 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -86,7 +86,7 @@ export const fullOrderSchema = z.object({ ro: z.boolean().optional(), // is reversed order sc: z.string().optional(), // source chain tc: z.string().optional(), // target chain - ir: z.string().optional(), // is refundable + ir: z.boolean().optional(), // is refundable sh: z.string().optional(), // secret hash }).transform((val) => ({ ...val, @@ -112,6 +112,7 @@ export const fullOrderSchema = z.object({ sourceChain: o.sc, targetChain: o.tc, isRefundable: o.ir, + secretHash: o.sh, subOrders: o.c.map((so) => ({ pair: so.P, exchange: so.e, From 5dce6e520d7c97cd8597c820c0e2b3457a49cd4a Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 17 Jun 2024 14:58:59 +0300 Subject: [PATCH 64/74] add get atomic fee method --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 12 ++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index afe5420b..e593e229 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc2", + "version": "0.23.0-rc3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc2", + "version": "0.23.0-rc3", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ce586ce4..ac36d1d4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc2", + "version": "0.23.0-rc3", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index f1a05166..76719d73 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -71,6 +71,7 @@ class Aggregator { this.getTradeProfits = this.getTradeProfits.bind(this); this.getStableCoins = this.getStableCoins.bind(this); this.placeAtomicSwap = this.placeAtomicSwap.bind(this); + this.getAtomicSwapFee = this.getAtomicSwapFee.bind(this); this.placeOrder = this.placeOrder.bind(this); this.placeLockOrder = this.placeLockOrder.bind(this); this.cancelOrder = this.cancelOrder.bind(this); @@ -444,6 +445,17 @@ class Aggregator { errorSchema, ); + /** + * Get atomic swap fee in current chain + * @returns Fee in percents + */ + getAtomicSwapFee = () => fetchWithValidation( + `${this.apiUrl}/api/v1/atomic/swap-fee`, + z.string(), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + /** * Get placed atomic swaps. Each atomic swap received from this list has a target chain corresponding to this Aggregator * @param sender Sender address From ad6de651436c942c99c2d6359ee0fc783334c0ff Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 17 Jun 2024 15:47:02 +0300 Subject: [PATCH 65/74] move atomic fee method to blockchain service --- package-lock.json | 4 ++-- package.json | 2 +- src/services/Aggregator/index.ts | 12 ------------ src/services/BlockchainService/index.ts | 13 +++++++++++++ 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index e593e229..fd1b9af1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc3", + "version": "0.23.0-rc4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc3", + "version": "0.23.0-rc4", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index ac36d1d4..2e68f4b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc3", + "version": "0.23.0-rc4", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/index.ts b/src/services/Aggregator/index.ts index 76719d73..f1a05166 100644 --- a/src/services/Aggregator/index.ts +++ b/src/services/Aggregator/index.ts @@ -71,7 +71,6 @@ class Aggregator { this.getTradeProfits = this.getTradeProfits.bind(this); this.getStableCoins = this.getStableCoins.bind(this); this.placeAtomicSwap = this.placeAtomicSwap.bind(this); - this.getAtomicSwapFee = this.getAtomicSwapFee.bind(this); this.placeOrder = this.placeOrder.bind(this); this.placeLockOrder = this.placeLockOrder.bind(this); this.cancelOrder = this.cancelOrder.bind(this); @@ -445,17 +444,6 @@ class Aggregator { errorSchema, ); - /** - * Get atomic swap fee in current chain - * @returns Fee in percents - */ - getAtomicSwapFee = () => fetchWithValidation( - `${this.apiUrl}/api/v1/atomic/swap-fee`, - z.string(), - { headers: this.basicAuthHeaders }, - errorSchema, - ); - /** * Get placed atomic swaps. Each atomic swap received from this list has a target chain corresponding to this Aggregator * @param sender Sender address diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index ceacbcbe..885a4f68 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -20,6 +20,7 @@ import { makePartial } from '../../utils'; import type { networkCodes } from '../../constants/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; import type { BasicAuthCredentials } from '../../types.js'; +import errorSchema from '../Aggregator/schemas/errorSchema'; type IAdminAuthHeaders = { auth: string @@ -115,6 +116,7 @@ class BlockchainService { this.claimOrder = this.claimOrder.bind(this); this.getGasLimits = this.getGasLimits.bind(this); this.getExchangeContractWalletBalance = this.getExchangeContractWalletBalance.bind(this); + this.getAtomicSwapFee = this.getAtomicSwapFee.bind(this); } get basicAuthHeaders() { @@ -491,6 +493,17 @@ class BlockchainService { }, ); + /** + * Get atomic swap fee in current chain + * @returns Fee in percents + */ + getAtomicSwapFee = () => fetchWithValidation( + `${this.apiUrl}/api/v1/atomic/swap-fee`, + z.string(), + { headers: this.basicAuthHeaders }, + errorSchema, + ); + getGasLimits = () => fetchWithValidation( `${this.apiUrl}/api/baseLimits`, z.record(z.number()), From 7a8f5554c41d03f76a27a1ba8864a142ad09fb15 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Mon, 17 Jun 2024 22:32:14 +0300 Subject: [PATCH 66/74] update getAtomicSwapFee url --- package-lock.json | 4 ++-- package.json | 2 +- src/services/BlockchainService/index.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd1b9af1..49ae7167 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc4", + "version": "0.23.0-rc5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc4", + "version": "0.23.0-rc5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 2e68f4b1..7201c063 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc4", + "version": "0.23.0-rc5", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 885a4f68..7c147359 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -498,7 +498,7 @@ class BlockchainService { * @returns Fee in percents */ getAtomicSwapFee = () => fetchWithValidation( - `${this.apiUrl}/api/v1/atomic/swap-fee`, + `${this.apiUrl}/api/atomic/swap-fee`, z.string(), { headers: this.basicAuthHeaders }, errorSchema, From 87f2eed76d49029dede58fe7ae432643cbbc7e47 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 18 Jun 2024 16:04:22 +0300 Subject: [PATCH 67/74] Revert "change lockOrderExpiration (mock)" This reverts commit 543a74e9 --- package.json | 2 +- src/crypt/signLockOrder.ts | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7201c063..f3441d5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc5", + "version": "0.23.0-rc6", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index edad852a..47ea130b 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -6,9 +6,7 @@ import { BigNumber } from 'bignumber.js'; import normalizeNumber from '../utils/normalizeNumber'; import { INTERNAL_PROTOCOL_PRECISION, LOCK_ORDER_TYPES } from '../constants'; -// TODO: return LOCK_ORDER_EXPIRATION and remove MOCK_LOCK_ORDER_EXPIRATION -// const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days -const MOCK_ORDER_EXPIRATION = 10 * 60 * 1000; // 10 mins +const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days export type SignLockOrderProps = { senderAddress: string // user @@ -28,7 +26,7 @@ export const signLockOrder = async ({ signer, }: SignLockOrderProps) => { const nonce = Date.now(); - const expiration = nonce + MOCK_ORDER_EXPIRATION; + const expiration = nonce + DEFAULT_EXPIRATION; const secret = generateSecret(); const secretHash = ethers.keccak256(secret); From cfa389d2f50a72cd9713283ff5024321f3fd607d Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 18 Jun 2024 16:04:43 +0300 Subject: [PATCH 68/74] Revert "change lockOrderExpiration (mock)" This reverts commit 296d6449 --- package-lock.json | 4 ++-- src/crypt/signCrossChainOrder.ts | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49ae7167..1841ffd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc5", + "version": "0.23.0-rc6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc5", + "version": "0.23.0-rc6", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/src/crypt/signCrossChainOrder.ts b/src/crypt/signCrossChainOrder.ts index 2225b579..57571af2 100644 --- a/src/crypt/signCrossChainOrder.ts +++ b/src/crypt/signCrossChainOrder.ts @@ -10,10 +10,7 @@ import generateSecret from '../utils/generateSecret'; import { getOrderHash } from './hashOrders'; const DAY = 24 * 60 * 60 * 1000; -// TODO: return LOCK_ORDER_EXPIRATION and remove MOCK_LOCK_ORDER_EXPIRATION -// const LOCK_ORDER_EXPIRATION = 4 * DAY; -const MOCK_LOCK_ORDER_EXPIRATION = 10 * 60 * 1000; // 10 mins - +const LOCK_ORDER_EXPIRATION = 4 * DAY; const DEFAULT_EXPIRATION = 29 * DAY; export type SignCrossChainOrderProps = { @@ -47,7 +44,7 @@ export const signCrossChainOrder = async ({ }: SignCrossChainOrderProps): Promise => { const nonce = Date.now(); const expiration = nonce + DEFAULT_EXPIRATION; - const lockOrderExpiration = nonce + MOCK_LOCK_ORDER_EXPIRATION; + const lockOrderExpiration = nonce + LOCK_ORDER_EXPIRATION; const order: Order = { senderAddress, From de2219a4ba375961f483fe9797061ef037e0dea7 Mon Sep 17 00:00:00 2001 From: TheJuze Date: Tue, 18 Jun 2024 16:26:16 +0300 Subject: [PATCH 69/74] change atomic expiration to 4 days --- package-lock.json | 4 ++-- package.json | 2 +- src/crypt/signLockOrder.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1841ffd6..fda9bd7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc6", + "version": "0.23.0-rc7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc6", + "version": "0.23.0-rc7", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index f3441d5f..06fd1fb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc6", + "version": "0.23.0-rc7", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/crypt/signLockOrder.ts b/src/crypt/signLockOrder.ts index 47ea130b..2eae4dfb 100644 --- a/src/crypt/signLockOrder.ts +++ b/src/crypt/signLockOrder.ts @@ -6,7 +6,7 @@ import { BigNumber } from 'bignumber.js'; import normalizeNumber from '../utils/normalizeNumber'; import { INTERNAL_PROTOCOL_PRECISION, LOCK_ORDER_TYPES } from '../constants'; -const DEFAULT_EXPIRATION = 29 * 24 * 60 * 60 * 1000; // 29 days +const DEFAULT_EXPIRATION = 4 * 24 * 60 * 60 * 1000; // 4 days export type SignLockOrderProps = { senderAddress: string // user From bec2775fabadf7c21061bbb12f252ac898035059 Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 18 Jul 2024 17:13:27 +0100 Subject: [PATCH 70/74] feat: added getMinLockAmountForCCS method --- package.json | 2 +- src/services/BlockchainService/index.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f5104b22..45408adc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc8", + "version": "0.23.0-rc9", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 7c147359..66a07777 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -19,7 +19,7 @@ import { sourceAtomicHistorySchema, targetAtomicHistorySchema } from './schemas/ import { makePartial } from '../../utils'; import type { networkCodes } from '../../constants/index.js'; import { fetchWithValidation } from 'simple-typed-fetch'; -import type { BasicAuthCredentials } from '../../types.js'; +import { type BasicAuthCredentials, SupportedChainId } from '../../types.js'; import errorSchema from '../Aggregator/schemas/errorSchema'; type IAdminAuthHeaders = { @@ -66,6 +66,12 @@ type PlatformFees = { fromWidget?: string | undefined } +type MinLockAmount = { + assetIn: string + assetOut: string + targetChainId: SupportedChainId +} + class BlockchainService { private readonly apiUrl: string; @@ -117,6 +123,7 @@ class BlockchainService { this.getGasLimits = this.getGasLimits.bind(this); this.getExchangeContractWalletBalance = this.getExchangeContractWalletBalance.bind(this); this.getAtomicSwapFee = this.getAtomicSwapFee.bind(this); + this.getMinLockAmountForCCS = this.getMinLockAmountForCCS.bind(this); } get basicAuthHeaders() { @@ -515,6 +522,12 @@ class BlockchainService { z.record(z.string()), { headers: this.basicAuthHeaders } ); + + ф = ({ assetIn, assetOut, targetChainId }: MinLockAmount) => fetchWithValidation( + `${this.apiUrl}/api/atomic/min-lock-amount?assetIn=${assetIn}&assetOut=${assetOut}&targetChainId=${targetChainId}`, + z.number(), + { headers: this.basicAuthHeaders } + ); } export * as schemas from './schemas/index.js'; From d2fe0d3d6fead3a26de3ade03f2471d30c81447a Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Thu, 18 Jul 2024 17:22:40 +0100 Subject: [PATCH 71/74] fix: fix small typo --- src/services/BlockchainService/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/BlockchainService/index.ts b/src/services/BlockchainService/index.ts index 66a07777..ee37b28b 100644 --- a/src/services/BlockchainService/index.ts +++ b/src/services/BlockchainService/index.ts @@ -523,7 +523,7 @@ class BlockchainService { { headers: this.basicAuthHeaders } ); - ф = ({ assetIn, assetOut, targetChainId }: MinLockAmount) => fetchWithValidation( + getMinLockAmountForCCS = ({ assetIn, assetOut, targetChainId }: MinLockAmount) => fetchWithValidation( `${this.apiUrl}/api/atomic/min-lock-amount?assetIn=${assetIn}&assetOut=${assetOut}&targetChainId=${targetChainId}`, z.number(), { headers: this.basicAuthHeaders } From 97119305b2ed0c2df68834efa007f154333bf8ae Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Tue, 23 Jul 2024 15:49:59 +0100 Subject: [PATCH 72/74] feat: updated order scheme --- package.json | 2 +- src/services/Aggregator/ws/schemas/addressUpdateSchema.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 45408adc..1d746202 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc9", + "version": "0.23.0-rc10", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", diff --git a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts index 2730fbec..048e9c08 100644 --- a/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts +++ b/src/services/Aggregator/ws/schemas/addressUpdateSchema.ts @@ -37,6 +37,8 @@ export const orderUpdateSchema = z.object({ t: z.number(), // update time C: z.string().optional(), // trigger condition E: z.enum(executionTypes).optional(), + bf: z.number().optional(), + bF: z.string().optional(), c: subOrderSchema.array(), }) .transform((val) => ({ @@ -49,6 +51,8 @@ export const orderUpdateSchema = z.object({ status: o.S, liquidated: o.l, executionType: o.E, + bridgeFee: o.bf, + bridgeFeeAsset: o.bF, triggerCondition: o.C, subOrders: o.c.map((so) => ({ pair: so.P, @@ -74,6 +78,8 @@ export const fullOrderSchema = z.object({ p: z.number(), // price F: z.string().toUpperCase(), // fee asset f: z.number(), // fee + bf: z.number().optional(), + bF: z.string().optional(), l: z.boolean().optional(), // is liquidation order L: z.number().optional(), // stop limit price, o: z.boolean(), // internal only @@ -97,6 +103,8 @@ export const fullOrderSchema = z.object({ settledAmount: o.A, feeAsset: o.F, fee: o.f, + bridgeFee: o.bf, + bridgeFeeAsset: o.bF, liquidated: o.l, stopPrice: o.L, status: o.S, From 8d283029515a50a4ffb7cf548e69ae21d1636cbe Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Wed, 24 Jul 2024 10:14:36 +0100 Subject: [PATCH 73/74] feat: updated SDK version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d746202..d272fc9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc10", + "version": "0.23.0-rc11", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js", From b5d700dcad5d3154ed8cbe9d3d01cbfc8d4145bf Mon Sep 17 00:00:00 2001 From: Mikhail Gladchenko Date: Wed, 24 Jul 2024 10:28:15 +0100 Subject: [PATCH 74/74] feat: updated SDK version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d272fc9b..e1efb235 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@orionprotocol/sdk", - "version": "0.23.0-rc11", + "version": "0.23.1-rc0", "description": "Orion Protocol SDK", "main": "./lib/index.cjs", "module": "./lib/index.js",