sushi 5.0.9 → 5.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # sushi
2
2
 
3
+ ## 5.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - [#103](https://github.com/sushi-labs/sushi/pull/103) [`553ac34`](https://github.com/sushi-labs/sushi/commit/553ac340ea74ac09a4b109cc4887dd35486bdef1) Thanks [@LufyCZ](https://github.com/LufyCZ)! - Improved the getSwap function
8
+
3
9
  ## 5.0.9
4
10
 
5
11
  ### Patch Changes
package/_cjs/api/swap.js CHANGED
@@ -1,28 +1,77 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSwap = getSwap;
4
+ const zod_1 = require("zod");
5
+ const package_json_1 = require("../package.json");
6
+ const route_status_js_1 = require("../router/route-status.js");
7
+ const zod_js_1 = require("../validate/zod.js");
8
+ function swapResponseSchema(includeTransaction) {
9
+ const baseSuccessPartial = zod_1.z.object({
10
+ status: zod_1.z.literal(route_status_js_1.RouteStatus.Success).or(zod_1.z.literal(route_status_js_1.RouteStatus.Partial)),
11
+ tokens: zod_1.z.array(zod_1.z.object({
12
+ address: zod_js_1.sz.address(),
13
+ decimals: zod_1.z.number(),
14
+ symbol: zod_1.z.string(),
15
+ name: zod_1.z.string(),
16
+ })),
17
+ tokenFrom: zod_1.z.number(),
18
+ tokenTo: zod_1.z.number(),
19
+ swapPrice: zod_1.z.number(),
20
+ priceImpact: zod_1.z.number(),
21
+ amountIn: zod_1.z.string(),
22
+ assumedAmountOut: zod_1.z.string(),
23
+ });
24
+ const baseNoWay = zod_1.z.object({
25
+ status: zod_1.z.literal(route_status_js_1.RouteStatus.NoWay),
26
+ });
27
+ const txSchema = zod_1.z.object({
28
+ from: zod_js_1.sz.address(),
29
+ to: zod_js_1.sz.address(),
30
+ data: zod_js_1.sz.hex(),
31
+ value: zod_1.z.string(),
32
+ });
33
+ const baseSchema = baseSuccessPartial.or(baseNoWay);
34
+ const baseTxSchema = baseSuccessPartial.extend({ tx: txSchema }).or(baseNoWay);
35
+ const schema = includeTransaction ? baseTxSchema : baseSchema;
36
+ return schema.transform((data) => {
37
+ if (data.status === route_status_js_1.RouteStatus.NoWay) {
38
+ return data;
39
+ }
40
+ return {
41
+ ...data,
42
+ tokenFrom: data.tokens[data.tokenFrom],
43
+ tokenTo: data.tokens[data.tokenTo],
44
+ };
45
+ });
46
+ }
4
47
  async function getSwap(params, options) {
5
48
  const url = new URL(`swap/v5/${params.chainId}`, 'https://api.sushi.com');
6
49
  url.searchParams.append('tokenIn', params.tokenIn);
7
50
  url.searchParams.append('tokenOut', params.tokenOut);
8
51
  url.searchParams.append('amount', params.amount.toString());
9
52
  url.searchParams.append('maxSlippage', params.maxSlippage.toString());
10
- if (params?.maxPriceImpact)
53
+ if (params.maxPriceImpact) {
11
54
  url.searchParams.append('maxPriceImpact', params.maxPriceImpact.toString());
12
- if (params?.gasPrice)
13
- url.searchParams.append('gasPrice', params.gasPrice.toString());
14
- if (params?.to)
55
+ }
56
+ if (params.to) {
15
57
  url.searchParams.append('to', params.to);
16
- if (params?.enableFee && params?.fee && params?.feeReceiver) {
17
- url.searchParams.append('enableFee', params.enableFee.toString());
18
- url.searchParams.append('fee', params.fee.toString());
19
- url.searchParams.append('feeReceiver', params.feeReceiver);
20
- if (params?.feeBy)
21
- url.searchParams.append('feeBy', params.feeBy);
22
58
  }
23
- if (params?.includeTransaction)
59
+ if (params.fee?.enableFee) {
60
+ url.searchParams.append('enableFee', params.fee.enableFee.toString());
61
+ url.searchParams.append('fee', params.fee.fee.toString());
62
+ url.searchParams.append('feeReceiver', params.fee.feeReceiver);
63
+ if (params.fee.feeBy) {
64
+ url.searchParams.append('feeBy', params.fee.feeBy);
65
+ }
66
+ }
67
+ if (params.includeTransaction) {
24
68
  url.searchParams.append('includeTransaction', params.includeTransaction.toString());
69
+ }
70
+ url.searchParams.append('referrer', params.referrer ?? `sushi-sdk/${package_json_1.version}`);
25
71
  const res = await fetch(url.toString(), options);
26
- return res.json();
72
+ if (!res.ok) {
73
+ throw new Error(`Failed to fetch swap: ${await res.text()}`);
74
+ }
75
+ return swapResponseSchema(params.includeTransaction).parse(await res.json());
27
76
  }
28
77
  //# sourceMappingURL=swap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":";;AAgCA,0BAyBC;AAzBM,KAAK,UAAU,OAAO,CAAC,MAAmB,EAAE,OAAqB;IAEtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAA;IACzE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrE,IAAI,MAAM,EAAE,cAAc;QACxB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,IAAI,MAAM,EAAE,QAAQ;QAClB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACjE,IAAI,MAAM,EAAE,EAAE;QAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;IACxD,IAAI,MAAM,EAAE,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAC1D,IAAI,MAAM,EAAE,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,MAAM,EAAE,kBAAkB;QAC5B,GAAG,CAAC,YAAY,CAAC,MAAM,CACrB,oBAAoB,EACpB,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACrC,CAAA;IACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,GAAG,CAAC,IAAI,EAA2B,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":";;AAqGA,0BAiDC;AArJD,6BAAuB;AAEvB,kDAAyC;AACzC,+DAAuD;AAEvD,+CAAuC;AAmCvC,SAAS,kBAAkB,CACzB,kBAAuC;IAEvC,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;QAClC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,6BAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAC,CAAC,OAAO,CAAC,6BAAW,CAAC,OAAO,CAAC,CAAC;QACzE,MAAM,EAAE,OAAC,CAAC,KAAK,CACb,OAAC,CAAC,MAAM,CAAC;YACP,OAAO,EAAE,WAAE,CAAC,OAAO,EAAE;YACrB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;YACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;YAClB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;SACjB,CAAC,CACH;QACD,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;QACrB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;QAEnB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QAEvB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;QACpB,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;KAC7B,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,OAAC,CAAC,MAAM,CAAC;QACzB,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,6BAAW,CAAC,KAAK,CAAC;KACrC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,OAAC,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,WAAE,CAAC,OAAO,EAAE;QAClB,EAAE,EAAE,WAAE,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,WAAE,CAAC,GAAG,EAAE;QACd,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;IACnD,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;IAM9E,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAE,UAAqB,CAAA;IAEzE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,6BAAW,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACtC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACnC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAMM,KAAK,UAAU,OAAO,CAI3B,MAAkD,EAClD,OAAqB;IAGrB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAA;IAEzE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IAErE,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC;QAC1B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QACzD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAE9D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACrB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,GAAG,CAAC,YAAY,CAAC,MAAM,CACrB,oBAAoB,EACpB,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACrC,CAAA;IACH,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,IAAI,aAAa,sBAAO,EAAE,CAAC,CAAA;IAE9E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;IAEhD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAC9E,CAAC"}
@@ -18,4 +18,5 @@ __exportStar(require("./isPromiseFulfilled.js"), exports);
18
18
  __exportStar(require("./isPromiseRejected.js"), exports);
19
19
  __exportStar(require("./isZero.js"), exports);
20
20
  __exportStar(require("./isAddressFast.js"), exports);
21
+ __exportStar(require("./zod.js"), exports);
21
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAuC;AACvC,yDAAsC;AACtC,8CAA2B;AAC3B,qDAAkC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAuC;AACvC,yDAAsC;AACtC,8CAA2B;AAC3B,qDAAkC;AAClC,2CAAwB"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sz = exports.hex = exports.address = void 0;
4
+ const viem_1 = require("viem");
5
+ const zod_1 = require("zod");
6
+ const address = () => zod_1.z.string().refine((value) => (0, viem_1.isAddress)(value, { strict: false }), {
7
+ message: 'Invalid address',
8
+ });
9
+ exports.address = address;
10
+ const hex = () => zod_1.z
11
+ .string()
12
+ .refine((value) => /^0x[0-9a-fA-F]*$/.test(value), {
13
+ message: 'Invalid hex',
14
+ })
15
+ .transform((value) => value.toLowerCase());
16
+ exports.hex = hex;
17
+ exports.sz = {
18
+ address: exports.address,
19
+ hex: exports.hex,
20
+ };
21
+ //# sourceMappingURL=zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../../validate/zod.ts"],"names":[],"mappings":";;;AACA,+BAAgC;AAChC,6BAAuB;AAEhB,MAAM,OAAO,GAAG,GAAG,EAAE,CAC1B,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,gBAAS,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;IAChE,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAA;AAHS,QAAA,OAAO,WAGhB;AAEG,MAAM,GAAG,GAAG,GAAG,EAAE,CACtB,OAAC;KACE,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IACjD,OAAO,EAAE,aAAa;CACvB,CAAC;KACD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAS,CAAC,CAAA;AANxC,QAAA,GAAG,OAMqC;AAExC,QAAA,EAAE,GAAG;IAChB,OAAO,EAAP,eAAO;IACP,GAAG,EAAH,WAAG;CACJ,CAAA"}
package/_esm/api/swap.js CHANGED
@@ -1,3 +1,47 @@
1
+ import { z } from 'zod';
2
+ import { version } from '../package.json';
3
+ import { RouteStatus } from '../router/route-status.js';
4
+ import { TransferValue } from '../router/transfer-value.js';
5
+ import { sz } from '../validate/zod.js';
6
+ function swapResponseSchema(includeTransaction) {
7
+ const baseSuccessPartial = z.object({
8
+ status: z.literal(RouteStatus.Success).or(z.literal(RouteStatus.Partial)),
9
+ tokens: z.array(z.object({
10
+ address: sz.address(),
11
+ decimals: z.number(),
12
+ symbol: z.string(),
13
+ name: z.string(),
14
+ })),
15
+ tokenFrom: z.number(),
16
+ tokenTo: z.number(),
17
+ swapPrice: z.number(),
18
+ priceImpact: z.number(),
19
+ amountIn: z.string(),
20
+ assumedAmountOut: z.string(),
21
+ });
22
+ const baseNoWay = z.object({
23
+ status: z.literal(RouteStatus.NoWay),
24
+ });
25
+ const txSchema = z.object({
26
+ from: sz.address(),
27
+ to: sz.address(),
28
+ data: sz.hex(),
29
+ value: z.string(),
30
+ });
31
+ const baseSchema = baseSuccessPartial.or(baseNoWay);
32
+ const baseTxSchema = baseSuccessPartial.extend({ tx: txSchema }).or(baseNoWay);
33
+ const schema = includeTransaction ? baseTxSchema : baseSchema;
34
+ return schema.transform((data) => {
35
+ if (data.status === RouteStatus.NoWay) {
36
+ return data;
37
+ }
38
+ return {
39
+ ...data,
40
+ tokenFrom: data.tokens[data.tokenFrom],
41
+ tokenTo: data.tokens[data.tokenTo],
42
+ };
43
+ });
44
+ }
1
45
  export async function getSwap(params, options) {
2
46
  // TODO: VALIDATE PARAMS
3
47
  const url = new URL(`swap/v5/${params.chainId}`, 'https://api.sushi.com');
@@ -5,22 +49,28 @@ export async function getSwap(params, options) {
5
49
  url.searchParams.append('tokenOut', params.tokenOut);
6
50
  url.searchParams.append('amount', params.amount.toString());
7
51
  url.searchParams.append('maxSlippage', params.maxSlippage.toString());
8
- if (params?.maxPriceImpact)
52
+ if (params.maxPriceImpact) {
9
53
  url.searchParams.append('maxPriceImpact', params.maxPriceImpact.toString());
10
- if (params?.gasPrice)
11
- url.searchParams.append('gasPrice', params.gasPrice.toString());
12
- if (params?.to)
54
+ }
55
+ if (params.to) {
13
56
  url.searchParams.append('to', params.to);
14
- if (params?.enableFee && params?.fee && params?.feeReceiver) {
15
- url.searchParams.append('enableFee', params.enableFee.toString());
16
- url.searchParams.append('fee', params.fee.toString());
17
- url.searchParams.append('feeReceiver', params.feeReceiver);
18
- if (params?.feeBy)
19
- url.searchParams.append('feeBy', params.feeBy);
20
57
  }
21
- if (params?.includeTransaction)
58
+ if (params.fee?.enableFee) {
59
+ url.searchParams.append('enableFee', params.fee.enableFee.toString());
60
+ url.searchParams.append('fee', params.fee.fee.toString());
61
+ url.searchParams.append('feeReceiver', params.fee.feeReceiver);
62
+ if (params.fee.feeBy) {
63
+ url.searchParams.append('feeBy', params.fee.feeBy);
64
+ }
65
+ }
66
+ if (params.includeTransaction) {
22
67
  url.searchParams.append('includeTransaction', params.includeTransaction.toString());
68
+ }
69
+ url.searchParams.append('referrer', params.referrer ?? `sushi-sdk/${version}`);
23
70
  const res = await fetch(url.toString(), options);
24
- return res.json();
71
+ if (!res.ok) {
72
+ throw new Error(`Failed to fetch swap: ${await res.text()}`);
73
+ }
74
+ return swapResponseSchema(params.includeTransaction).parse(await res.json());
25
75
  }
26
76
  //# sourceMappingURL=swap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAmB,EAAE,OAAqB;IACtE,wBAAwB;IACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAA;IACzE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrE,IAAI,MAAM,EAAE,cAAc;QACxB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7E,IAAI,MAAM,EAAE,QAAQ;QAClB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACjE,IAAI,MAAM,EAAE,EAAE;QAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;IACxD,IAAI,MAAM,EAAE,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACjE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAC1D,IAAI,MAAM,EAAE,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,MAAM,EAAE,kBAAkB;QAC5B,GAAG,CAAC,YAAY,CAAC,MAAM,CACrB,oBAAoB,EACpB,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACrC,CAAA;IACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,GAAG,CAAC,IAAI,EAA2B,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"swap.js","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,5 @@ export * from './isPromiseFulfilled.js';
2
2
  export * from './isPromiseRejected.js';
3
3
  export * from './isZero.js';
4
4
  export * from './isAddressFast.js';
5
+ export * from './zod.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,UAAU,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { isAddress } from 'viem';
2
+ import { z } from 'zod';
3
+ export const address = () => z.string().refine((value) => isAddress(value, { strict: false }), {
4
+ message: 'Invalid address',
5
+ });
6
+ export const hex = () => z
7
+ .string()
8
+ .refine((value) => /^0x[0-9a-fA-F]*$/.test(value), {
9
+ message: 'Invalid hex',
10
+ })
11
+ .transform((value) => value.toLowerCase());
12
+ export const sz = {
13
+ address,
14
+ hex,
15
+ };
16
+ //# sourceMappingURL=zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../../validate/zod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAC1B,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;IAChE,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,CACtB,CAAC;KACE,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IACjD,OAAO,EAAE,aAAa;CACvB,CAAC;KACD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAS,CAAC,CAAA;AAErD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,OAAO;IACP,GAAG;CACJ,CAAA"}
@@ -1,36 +1,557 @@
1
1
  import type { Address } from 'viem';
2
- import type { Hex } from 'viem';
3
- import type { RouteStatus } from '../router/route-status.js';
4
- import type { TransferValue } from '../router/transfer-value.js';
5
- export interface SwapRequest {
6
- chainId: number;
2
+ import { z } from 'zod';
3
+ import type { ExtractorSupportedChainId } from '../config/index.js';
4
+ import { RouteStatus } from '../router/route-status.js';
5
+ import { TransferValue } from '../router/transfer-value.js';
6
+ type To<Required extends boolean> = Required extends true ? {
7
+ to: Address;
8
+ } : {
9
+ to?: Address;
10
+ };
11
+ type Fee<Enabled extends boolean> = Enabled extends true ? {
12
+ enableFee: Enabled;
13
+ fee: bigint;
14
+ feeReceiver: Address;
15
+ feeBy?: TransferValue;
16
+ } : {
17
+ enableFee?: Enabled;
18
+ fee?: bigint;
19
+ feeReceiver?: Address;
20
+ feeBy?: TransferValue;
21
+ };
22
+ export type SwapRequest<IncludeTransaction extends boolean, EnableFee extends boolean> = {
23
+ chainId: ExtractorSupportedChainId;
7
24
  tokenIn: Address;
8
25
  tokenOut: Address;
9
26
  amount: bigint;
10
27
  maxSlippage: number;
11
28
  maxPriceImpact?: number;
12
- gasPrice?: bigint;
13
- to?: Address;
14
- enableFee?: boolean;
15
- feeReceiver?: Address;
16
- fee?: bigint;
17
- feeBy?: TransferValue;
18
- includeTransaction?: boolean;
19
- }
20
- export type SwapResponse = {
21
- status: typeof RouteStatus.NoWay;
29
+ includeTransaction?: IncludeTransaction;
30
+ fee?: Fee<EnableFee>;
31
+ referrer?: string;
32
+ } & To<IncludeTransaction>;
33
+ declare function swapResponseSchema<IncludeTransaction extends boolean>(includeTransaction?: IncludeTransaction): z.ZodEffects<z.ZodUnion<[z.ZodObject<{
34
+ status: z.ZodUnion<[z.ZodLiteral<RouteStatus.Success>, z.ZodLiteral<RouteStatus.Partial>]>;
35
+ tokens: z.ZodArray<z.ZodObject<{
36
+ address: z.ZodEffects<z.ZodString, `0x${string}`, string>;
37
+ decimals: z.ZodNumber;
38
+ symbol: z.ZodString;
39
+ name: z.ZodString;
40
+ }, "strip", z.ZodTypeAny, {
41
+ symbol: string;
42
+ name: string;
43
+ address: `0x${string}`;
44
+ decimals: number;
45
+ }, {
46
+ symbol: string;
47
+ name: string;
48
+ address: string;
49
+ decimals: number;
50
+ }>, "many">;
51
+ tokenFrom: z.ZodNumber;
52
+ tokenTo: z.ZodNumber;
53
+ swapPrice: z.ZodNumber;
54
+ priceImpact: z.ZodNumber;
55
+ amountIn: z.ZodString;
56
+ assumedAmountOut: z.ZodString;
57
+ }, "strip", z.ZodTypeAny, {
58
+ status: RouteStatus.Success | RouteStatus.Partial;
59
+ tokens: {
60
+ symbol: string;
61
+ name: string;
62
+ address: `0x${string}`;
63
+ decimals: number;
64
+ }[];
65
+ tokenFrom: number;
66
+ tokenTo: number;
67
+ swapPrice: number;
68
+ priceImpact: number;
69
+ amountIn: string;
70
+ assumedAmountOut: string;
71
+ }, {
72
+ status: RouteStatus.Success | RouteStatus.Partial;
73
+ tokens: {
74
+ symbol: string;
75
+ name: string;
76
+ address: string;
77
+ decimals: number;
78
+ }[];
79
+ tokenFrom: number;
80
+ tokenTo: number;
81
+ swapPrice: number;
82
+ priceImpact: number;
83
+ amountIn: string;
84
+ assumedAmountOut: string;
85
+ }>, z.ZodObject<{
86
+ status: z.ZodLiteral<RouteStatus.NoWay>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ status: RouteStatus.NoWay;
89
+ }, {
90
+ status: RouteStatus.NoWay;
91
+ }>]>, {
92
+ status: RouteStatus.NoWay;
93
+ } | {
94
+ tokenFrom: {
95
+ symbol: string;
96
+ name: string;
97
+ address: `0x${string}`;
98
+ decimals: number;
99
+ } | {
100
+ symbol: string;
101
+ name: string;
102
+ address: `0x${string}`;
103
+ decimals: number;
104
+ } | undefined;
105
+ tokenTo: {
106
+ symbol: string;
107
+ name: string;
108
+ address: `0x${string}`;
109
+ decimals: number;
110
+ } | {
111
+ symbol: string;
112
+ name: string;
113
+ address: `0x${string}`;
114
+ decimals: number;
115
+ } | undefined;
116
+ status: RouteStatus.Success | RouteStatus.Partial;
117
+ tokens: {
118
+ symbol: string;
119
+ name: string;
120
+ address: `0x${string}`;
121
+ decimals: number;
122
+ }[];
123
+ swapPrice: number;
124
+ priceImpact: number;
125
+ amountIn: string;
126
+ assumedAmountOut: string;
22
127
  } | {
23
- status: typeof RouteStatus.Success | typeof RouteStatus.Partial;
128
+ tokenFrom: {
129
+ symbol: string;
130
+ name: string;
131
+ address: `0x${string}`;
132
+ decimals: number;
133
+ } | {
134
+ symbol: string;
135
+ name: string;
136
+ address: `0x${string}`;
137
+ decimals: number;
138
+ } | undefined;
139
+ tokenTo: {
140
+ symbol: string;
141
+ name: string;
142
+ address: `0x${string}`;
143
+ decimals: number;
144
+ } | {
145
+ symbol: string;
146
+ name: string;
147
+ address: `0x${string}`;
148
+ decimals: number;
149
+ } | undefined;
150
+ status: RouteStatus.Success | RouteStatus.Partial;
151
+ tokens: {
152
+ symbol: string;
153
+ name: string;
154
+ address: `0x${string}`;
155
+ decimals: number;
156
+ }[];
24
157
  swapPrice: number;
25
158
  priceImpact: number;
26
159
  amountIn: string;
27
160
  assumedAmountOut: string;
28
161
  tx: {
29
- from: Address;
30
- to: Address;
31
- data: Hex;
32
- value: bigint;
162
+ value: string;
163
+ from: `0x${string}`;
164
+ to: `0x${string}`;
165
+ data: `0x${string}`;
33
166
  };
34
- };
35
- export declare function getSwap(params: SwapRequest, options?: RequestInit): Promise<SwapResponse>;
167
+ }, {
168
+ status: RouteStatus.Success | RouteStatus.Partial;
169
+ tokens: {
170
+ symbol: string;
171
+ name: string;
172
+ address: string;
173
+ decimals: number;
174
+ }[];
175
+ tokenFrom: number;
176
+ tokenTo: number;
177
+ swapPrice: number;
178
+ priceImpact: number;
179
+ amountIn: string;
180
+ assumedAmountOut: string;
181
+ } | {
182
+ status: RouteStatus.NoWay;
183
+ }> | z.ZodEffects<z.ZodUnion<[z.ZodObject<z.objectUtil.extendShape<{
184
+ status: z.ZodUnion<[z.ZodLiteral<RouteStatus.Success>, z.ZodLiteral<RouteStatus.Partial>]>;
185
+ tokens: z.ZodArray<z.ZodObject<{
186
+ address: z.ZodEffects<z.ZodString, `0x${string}`, string>;
187
+ decimals: z.ZodNumber;
188
+ symbol: z.ZodString;
189
+ name: z.ZodString;
190
+ }, "strip", z.ZodTypeAny, {
191
+ symbol: string;
192
+ name: string;
193
+ address: `0x${string}`;
194
+ decimals: number;
195
+ }, {
196
+ symbol: string;
197
+ name: string;
198
+ address: string;
199
+ decimals: number;
200
+ }>, "many">;
201
+ tokenFrom: z.ZodNumber;
202
+ tokenTo: z.ZodNumber;
203
+ swapPrice: z.ZodNumber;
204
+ priceImpact: z.ZodNumber;
205
+ amountIn: z.ZodString;
206
+ assumedAmountOut: z.ZodString;
207
+ }, {
208
+ tx: z.ZodObject<{
209
+ from: z.ZodEffects<z.ZodString, `0x${string}`, string>;
210
+ to: z.ZodEffects<z.ZodString, `0x${string}`, string>;
211
+ data: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, `0x${string}`, string>;
212
+ value: z.ZodString;
213
+ }, "strip", z.ZodTypeAny, {
214
+ value: string;
215
+ from: `0x${string}`;
216
+ to: `0x${string}`;
217
+ data: `0x${string}`;
218
+ }, {
219
+ value: string;
220
+ from: string;
221
+ to: string;
222
+ data: string;
223
+ }>;
224
+ }>, "strip", z.ZodTypeAny, {
225
+ status: RouteStatus.Success | RouteStatus.Partial;
226
+ tokens: {
227
+ symbol: string;
228
+ name: string;
229
+ address: `0x${string}`;
230
+ decimals: number;
231
+ }[];
232
+ tokenFrom: number;
233
+ tokenTo: number;
234
+ swapPrice: number;
235
+ priceImpact: number;
236
+ amountIn: string;
237
+ assumedAmountOut: string;
238
+ tx: {
239
+ value: string;
240
+ from: `0x${string}`;
241
+ to: `0x${string}`;
242
+ data: `0x${string}`;
243
+ };
244
+ }, {
245
+ status: RouteStatus.Success | RouteStatus.Partial;
246
+ tokens: {
247
+ symbol: string;
248
+ name: string;
249
+ address: string;
250
+ decimals: number;
251
+ }[];
252
+ tokenFrom: number;
253
+ tokenTo: number;
254
+ swapPrice: number;
255
+ priceImpact: number;
256
+ amountIn: string;
257
+ assumedAmountOut: string;
258
+ tx: {
259
+ value: string;
260
+ from: string;
261
+ to: string;
262
+ data: string;
263
+ };
264
+ }>, z.ZodObject<{
265
+ status: z.ZodLiteral<RouteStatus.NoWay>;
266
+ }, "strip", z.ZodTypeAny, {
267
+ status: RouteStatus.NoWay;
268
+ }, {
269
+ status: RouteStatus.NoWay;
270
+ }>]>, {
271
+ status: RouteStatus.NoWay;
272
+ } | {
273
+ tokenFrom: {
274
+ symbol: string;
275
+ name: string;
276
+ address: `0x${string}`;
277
+ decimals: number;
278
+ } | {
279
+ symbol: string;
280
+ name: string;
281
+ address: `0x${string}`;
282
+ decimals: number;
283
+ } | undefined;
284
+ tokenTo: {
285
+ symbol: string;
286
+ name: string;
287
+ address: `0x${string}`;
288
+ decimals: number;
289
+ } | {
290
+ symbol: string;
291
+ name: string;
292
+ address: `0x${string}`;
293
+ decimals: number;
294
+ } | undefined;
295
+ status: RouteStatus.Success | RouteStatus.Partial;
296
+ tokens: {
297
+ symbol: string;
298
+ name: string;
299
+ address: `0x${string}`;
300
+ decimals: number;
301
+ }[];
302
+ swapPrice: number;
303
+ priceImpact: number;
304
+ amountIn: string;
305
+ assumedAmountOut: string;
306
+ } | {
307
+ tokenFrom: {
308
+ symbol: string;
309
+ name: string;
310
+ address: `0x${string}`;
311
+ decimals: number;
312
+ } | {
313
+ symbol: string;
314
+ name: string;
315
+ address: `0x${string}`;
316
+ decimals: number;
317
+ } | undefined;
318
+ tokenTo: {
319
+ symbol: string;
320
+ name: string;
321
+ address: `0x${string}`;
322
+ decimals: number;
323
+ } | {
324
+ symbol: string;
325
+ name: string;
326
+ address: `0x${string}`;
327
+ decimals: number;
328
+ } | undefined;
329
+ status: RouteStatus.Success | RouteStatus.Partial;
330
+ tokens: {
331
+ symbol: string;
332
+ name: string;
333
+ address: `0x${string}`;
334
+ decimals: number;
335
+ }[];
336
+ swapPrice: number;
337
+ priceImpact: number;
338
+ amountIn: string;
339
+ assumedAmountOut: string;
340
+ tx: {
341
+ value: string;
342
+ from: `0x${string}`;
343
+ to: `0x${string}`;
344
+ data: `0x${string}`;
345
+ };
346
+ }, {
347
+ status: RouteStatus.Success | RouteStatus.Partial;
348
+ tokens: {
349
+ symbol: string;
350
+ name: string;
351
+ address: string;
352
+ decimals: number;
353
+ }[];
354
+ tokenFrom: number;
355
+ tokenTo: number;
356
+ swapPrice: number;
357
+ priceImpact: number;
358
+ amountIn: string;
359
+ assumedAmountOut: string;
360
+ tx: {
361
+ value: string;
362
+ from: string;
363
+ to: string;
364
+ data: string;
365
+ };
366
+ } | {
367
+ status: RouteStatus.NoWay;
368
+ }> | z.ZodEffects<z.ZodUnion<[z.ZodObject<z.objectUtil.extendShape<{
369
+ status: z.ZodUnion<[z.ZodLiteral<RouteStatus.Success>, z.ZodLiteral<RouteStatus.Partial>]>;
370
+ tokens: z.ZodArray<z.ZodObject<{
371
+ address: z.ZodEffects<z.ZodString, `0x${string}`, string>;
372
+ decimals: z.ZodNumber;
373
+ symbol: z.ZodString;
374
+ name: z.ZodString;
375
+ }, "strip", z.ZodTypeAny, {
376
+ symbol: string;
377
+ name: string;
378
+ address: `0x${string}`;
379
+ decimals: number;
380
+ }, {
381
+ symbol: string;
382
+ name: string;
383
+ address: string;
384
+ decimals: number;
385
+ }>, "many">;
386
+ tokenFrom: z.ZodNumber;
387
+ tokenTo: z.ZodNumber;
388
+ swapPrice: z.ZodNumber;
389
+ priceImpact: z.ZodNumber;
390
+ amountIn: z.ZodString;
391
+ assumedAmountOut: z.ZodString;
392
+ }, {
393
+ tx: z.ZodObject<{
394
+ from: z.ZodEffects<z.ZodString, `0x${string}`, string>;
395
+ to: z.ZodEffects<z.ZodString, `0x${string}`, string>;
396
+ data: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, `0x${string}`, string>;
397
+ value: z.ZodString;
398
+ }, "strip", z.ZodTypeAny, {
399
+ value: string;
400
+ from: `0x${string}`;
401
+ to: `0x${string}`;
402
+ data: `0x${string}`;
403
+ }, {
404
+ value: string;
405
+ from: string;
406
+ to: string;
407
+ data: string;
408
+ }>;
409
+ }>, "strip", z.ZodTypeAny, {
410
+ status: RouteStatus.Success | RouteStatus.Partial;
411
+ tokens: {
412
+ symbol: string;
413
+ name: string;
414
+ address: `0x${string}`;
415
+ decimals: number;
416
+ }[];
417
+ tokenFrom: number;
418
+ tokenTo: number;
419
+ swapPrice: number;
420
+ priceImpact: number;
421
+ amountIn: string;
422
+ assumedAmountOut: string;
423
+ tx: {
424
+ value: string;
425
+ from: `0x${string}`;
426
+ to: `0x${string}`;
427
+ data: `0x${string}`;
428
+ };
429
+ }, {
430
+ status: RouteStatus.Success | RouteStatus.Partial;
431
+ tokens: {
432
+ symbol: string;
433
+ name: string;
434
+ address: string;
435
+ decimals: number;
436
+ }[];
437
+ tokenFrom: number;
438
+ tokenTo: number;
439
+ swapPrice: number;
440
+ priceImpact: number;
441
+ amountIn: string;
442
+ assumedAmountOut: string;
443
+ tx: {
444
+ value: string;
445
+ from: string;
446
+ to: string;
447
+ data: string;
448
+ };
449
+ }>, z.ZodObject<{
450
+ status: z.ZodLiteral<RouteStatus.NoWay>;
451
+ }, "strip", z.ZodTypeAny, {
452
+ status: RouteStatus.NoWay;
453
+ }, {
454
+ status: RouteStatus.NoWay;
455
+ }>]>, {
456
+ status: RouteStatus.NoWay;
457
+ } | {
458
+ tokenFrom: {
459
+ symbol: string;
460
+ name: string;
461
+ address: `0x${string}`;
462
+ decimals: number;
463
+ } | {
464
+ symbol: string;
465
+ name: string;
466
+ address: `0x${string}`;
467
+ decimals: number;
468
+ } | undefined;
469
+ tokenTo: {
470
+ symbol: string;
471
+ name: string;
472
+ address: `0x${string}`;
473
+ decimals: number;
474
+ } | {
475
+ symbol: string;
476
+ name: string;
477
+ address: `0x${string}`;
478
+ decimals: number;
479
+ } | undefined;
480
+ status: RouteStatus.Success | RouteStatus.Partial;
481
+ tokens: {
482
+ symbol: string;
483
+ name: string;
484
+ address: `0x${string}`;
485
+ decimals: number;
486
+ }[];
487
+ swapPrice: number;
488
+ priceImpact: number;
489
+ amountIn: string;
490
+ assumedAmountOut: string;
491
+ } | {
492
+ tokenFrom: {
493
+ symbol: string;
494
+ name: string;
495
+ address: `0x${string}`;
496
+ decimals: number;
497
+ } | {
498
+ symbol: string;
499
+ name: string;
500
+ address: `0x${string}`;
501
+ decimals: number;
502
+ } | undefined;
503
+ tokenTo: {
504
+ symbol: string;
505
+ name: string;
506
+ address: `0x${string}`;
507
+ decimals: number;
508
+ } | {
509
+ symbol: string;
510
+ name: string;
511
+ address: `0x${string}`;
512
+ decimals: number;
513
+ } | undefined;
514
+ status: RouteStatus.Success | RouteStatus.Partial;
515
+ tokens: {
516
+ symbol: string;
517
+ name: string;
518
+ address: `0x${string}`;
519
+ decimals: number;
520
+ }[];
521
+ swapPrice: number;
522
+ priceImpact: number;
523
+ amountIn: string;
524
+ assumedAmountOut: string;
525
+ tx: {
526
+ value: string;
527
+ from: `0x${string}`;
528
+ to: `0x${string}`;
529
+ data: `0x${string}`;
530
+ };
531
+ }, {
532
+ status: RouteStatus.NoWay;
533
+ } | {
534
+ status: RouteStatus.Success | RouteStatus.Partial;
535
+ tokens: {
536
+ symbol: string;
537
+ name: string;
538
+ address: string;
539
+ decimals: number;
540
+ }[];
541
+ tokenFrom: number;
542
+ tokenTo: number;
543
+ swapPrice: number;
544
+ priceImpact: number;
545
+ amountIn: string;
546
+ assumedAmountOut: string;
547
+ tx: {
548
+ value: string;
549
+ from: string;
550
+ to: string;
551
+ data: string;
552
+ };
553
+ }>;
554
+ export type SwapResponse<IncludeTransaction extends boolean> = z.infer<ReturnType<typeof swapResponseSchema<IncludeTransaction>>>;
555
+ export declare function getSwap<IncludeTransaction extends boolean = false, EnableFee extends boolean = false>(params: SwapRequest<IncludeTransaction, EnableFee>, options?: RequestInit): Promise<SwapResponse<IncludeTransaction>>;
556
+ export {};
36
557
  //# sourceMappingURL=swap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEhE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,OAAO,WAAW,CAAC,KAAK,CAAA;CAAE,GACpC;IACE,MAAM,EAAE,OAAO,WAAW,CAAC,OAAO,GAAG,OAAO,WAAW,CAAC,OAAO,CAAA;IAC/D,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,EAAE,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7D,CAAA;AAEL,wBAAsB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,WAAW,yBAyBvE"}
1
+ {"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../api/swap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAG3D,KAAK,EAAE,CAAC,QAAQ,SAAS,OAAO,IAAI,QAAQ,SAAS,IAAI,GACrD;IAAE,EAAE,EAAE,OAAO,CAAA;CAAE,GACf;IAAE,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEpB,KAAK,GAAG,CAAC,OAAO,SAAS,OAAO,IAAI,OAAO,SAAS,IAAI,GACpD;IACE,SAAS,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,GACD;IACE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,CAAA;AAEL,MAAM,MAAM,WAAW,CACrB,kBAAkB,SAAS,OAAO,EAClC,SAAS,SAAS,OAAO,IACvB;IACF,OAAO,EAAE,yBAAyB,CAAA;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAA;AAE1B,iBAAS,kBAAkB,CAAC,kBAAkB,SAAS,OAAO,EAC5D,kBAAkB,CAAC,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDxC;AAED,MAAM,MAAM,YAAY,CAAC,kBAAkB,SAAS,OAAO,IAAI,CAAC,CAAC,KAAK,CACpE,UAAU,CAAC,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAC1D,CAAA;AAED,wBAAsB,OAAO,CAC3B,kBAAkB,SAAS,OAAO,GAAG,KAAK,EAC1C,SAAS,SAAS,OAAO,GAAG,KAAK,EAEjC,MAAM,EAAE,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAClD,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CA2C3C"}
@@ -20,9 +20,9 @@ export declare const swapSchema: z.ZodObject<{
20
20
  feeReceiver: z.ZodOptional<z.ZodType<`0x${string}`, z.ZodTypeDef, `0x${string}`>>;
21
21
  feeBy: z.ZodDefault<z.ZodOptional<z.ZodNativeEnum<typeof TransferValue>>>;
22
22
  }, "strip", z.ZodTypeAny, {
23
+ amount: bigint;
23
24
  tokenIn: `0x${string}`;
24
25
  tokenOut: `0x${string}`;
25
- amount: bigint;
26
26
  maxSlippage: number;
27
27
  fee: number;
28
28
  feeBy: TransferValue;
@@ -32,24 +32,24 @@ export declare const swapSchema: z.ZodObject<{
32
32
  includeRouteProcessorParams: boolean;
33
33
  includeTokens: boolean;
34
34
  includeRoute: boolean;
35
- maxPriceImpact?: number | undefined;
36
- gasPrice?: number | undefined;
37
35
  to?: `0x${string}` | undefined;
36
+ maxPriceImpact?: number | undefined;
38
37
  enableFee?: boolean | undefined;
39
38
  feeReceiver?: `0x${string}` | undefined;
39
+ gasPrice?: number | undefined;
40
40
  }, {
41
+ amount: bigint;
41
42
  tokenIn: `0x${string}`;
42
43
  tokenOut: `0x${string}`;
43
- amount: bigint;
44
+ to?: `0x${string}` | undefined;
44
45
  maxSlippage?: number | undefined;
45
46
  maxPriceImpact?: number | undefined;
46
- gasPrice?: number | undefined;
47
- to?: `0x${string}` | undefined;
48
47
  enableFee?: unknown;
49
48
  fee?: number | undefined;
50
49
  feeReceiver?: `0x${string}` | undefined;
51
50
  feeBy?: TransferValue | undefined;
52
51
  includeTransaction?: unknown;
52
+ gasPrice?: number | undefined;
53
53
  source?: RouterLiquiditySource | undefined;
54
54
  preferSushi?: unknown;
55
55
  includeRouteProcessorParams?: unknown;
@@ -2,4 +2,5 @@ export * from './isPromiseFulfilled.js';
2
2
  export * from './isPromiseRejected.js';
3
3
  export * from './isZero.js';
4
4
  export * from './isAddressFast.js';
5
+ export * from './zod.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,UAAU,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const address: () => z.ZodEffects<z.ZodString, `0x${string}`, string>;
3
+ export declare const hex: () => z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, `0x${string}`, string>;
4
+ export declare const sz: {
5
+ address: () => z.ZodEffects<z.ZodString, `0x${string}`, string>;
6
+ hex: () => z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, `0x${string}`, string>;
7
+ };
8
+ //# sourceMappingURL=zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../validate/zod.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,OAAO,wDAGhB,CAAA;AAEJ,eAAO,MAAM,GAAG,sFAMqC,CAAA;AAErD,eAAO,MAAM,EAAE;;;CAGd,CAAA"}
package/api/swap.ts CHANGED
@@ -1,58 +1,151 @@
1
1
  import type { Address } from 'viem'
2
- import type { Hex } from 'viem'
3
- import type { RouteStatus } from '../router/route-status.js'
4
- import type { TransferValue } from '../router/transfer-value.js'
2
+ import { z } from 'zod'
3
+ import type { ExtractorSupportedChainId } from '../config/index.js'
4
+ import { version } from '../package.json'
5
+ import { RouteStatus } from '../router/route-status.js'
6
+ import { TransferValue } from '../router/transfer-value.js'
7
+ import { sz } from '../validate/zod.js'
5
8
 
6
- export interface SwapRequest {
7
- chainId: number
9
+ type To<Required extends boolean> = Required extends true
10
+ ? { to: Address }
11
+ : { to?: Address }
12
+
13
+ type Fee<Enabled extends boolean> = Enabled extends true
14
+ ? {
15
+ enableFee: Enabled
16
+ fee: bigint
17
+ feeReceiver: Address
18
+ feeBy?: TransferValue
19
+ }
20
+ : {
21
+ enableFee?: Enabled
22
+ fee?: bigint
23
+ feeReceiver?: Address
24
+ feeBy?: TransferValue
25
+ }
26
+
27
+ export type SwapRequest<
28
+ IncludeTransaction extends boolean,
29
+ EnableFee extends boolean,
30
+ > = {
31
+ chainId: ExtractorSupportedChainId
8
32
  tokenIn: Address
9
33
  tokenOut: Address
10
34
  amount: bigint
11
35
  maxSlippage: number
12
36
  maxPriceImpact?: number
13
- gasPrice?: bigint
14
- to?: Address
15
- enableFee?: boolean
16
- feeReceiver?: Address
17
- fee?: bigint
18
- feeBy?: TransferValue
19
- includeTransaction?: boolean
20
- }
37
+ includeTransaction?: IncludeTransaction
38
+ fee?: Fee<EnableFee>
39
+ referrer?: string
40
+ } & To<IncludeTransaction>
41
+
42
+ function swapResponseSchema<IncludeTransaction extends boolean>(
43
+ includeTransaction?: IncludeTransaction,
44
+ ) {
45
+ const baseSuccessPartial = z.object({
46
+ status: z.literal(RouteStatus.Success).or(z.literal(RouteStatus.Partial)),
47
+ tokens: z.array(
48
+ z.object({
49
+ address: sz.address(),
50
+ decimals: z.number(),
51
+ symbol: z.string(),
52
+ name: z.string(),
53
+ }),
54
+ ),
55
+ tokenFrom: z.number(),
56
+ tokenTo: z.number(),
57
+
58
+ swapPrice: z.number(),
59
+ priceImpact: z.number(),
60
+
61
+ amountIn: z.string(),
62
+ assumedAmountOut: z.string(),
63
+ })
21
64
 
22
- export type SwapResponse =
23
- | { status: typeof RouteStatus.NoWay }
24
- | {
25
- status: typeof RouteStatus.Success | typeof RouteStatus.Partial
26
- swapPrice: number
27
- priceImpact: number
28
- amountIn: string
29
- assumedAmountOut: string
30
- tx: { from: Address; to: Address; data: Hex; value: bigint }
65
+ const baseNoWay = z.object({
66
+ status: z.literal(RouteStatus.NoWay),
67
+ })
68
+
69
+ const txSchema = z.object({
70
+ from: sz.address(),
71
+ to: sz.address(),
72
+ data: sz.hex(),
73
+ value: z.string(),
74
+ })
75
+
76
+ const baseSchema = baseSuccessPartial.or(baseNoWay)
77
+ const baseTxSchema = baseSuccessPartial.extend({ tx: txSchema }).or(baseNoWay)
78
+
79
+ type Result = IncludeTransaction extends true
80
+ ? typeof baseTxSchema
81
+ : typeof baseSchema
82
+
83
+ const schema = includeTransaction ? baseTxSchema : (baseSchema as Result)
84
+
85
+ return schema.transform((data) => {
86
+ if (data.status === RouteStatus.NoWay) {
87
+ return data
88
+ }
89
+
90
+ return {
91
+ ...data,
92
+ tokenFrom: data.tokens[data.tokenFrom],
93
+ tokenTo: data.tokens[data.tokenTo],
31
94
  }
95
+ })
96
+ }
32
97
 
33
- export async function getSwap(params: SwapRequest, options?: RequestInit) {
98
+ export type SwapResponse<IncludeTransaction extends boolean> = z.infer<
99
+ ReturnType<typeof swapResponseSchema<IncludeTransaction>>
100
+ >
101
+
102
+ export async function getSwap<
103
+ IncludeTransaction extends boolean = false,
104
+ EnableFee extends boolean = false,
105
+ >(
106
+ params: SwapRequest<IncludeTransaction, EnableFee>,
107
+ options?: RequestInit,
108
+ ): Promise<SwapResponse<IncludeTransaction>> {
34
109
  // TODO: VALIDATE PARAMS
35
110
  const url = new URL(`swap/v5/${params.chainId}`, 'https://api.sushi.com')
111
+
36
112
  url.searchParams.append('tokenIn', params.tokenIn)
37
113
  url.searchParams.append('tokenOut', params.tokenOut)
38
114
  url.searchParams.append('amount', params.amount.toString())
39
115
  url.searchParams.append('maxSlippage', params.maxSlippage.toString())
40
- if (params?.maxPriceImpact)
116
+
117
+ if (params.maxPriceImpact) {
41
118
  url.searchParams.append('maxPriceImpact', params.maxPriceImpact.toString())
42
- if (params?.gasPrice)
43
- url.searchParams.append('gasPrice', params.gasPrice.toString())
44
- if (params?.to) url.searchParams.append('to', params.to)
45
- if (params?.enableFee && params?.fee && params?.feeReceiver) {
46
- url.searchParams.append('enableFee', params.enableFee.toString())
47
- url.searchParams.append('fee', params.fee.toString())
48
- url.searchParams.append('feeReceiver', params.feeReceiver)
49
- if (params?.feeBy) url.searchParams.append('feeBy', params.feeBy)
50
119
  }
51
- if (params?.includeTransaction)
120
+
121
+ if (params.to) {
122
+ url.searchParams.append('to', params.to)
123
+ }
124
+
125
+ if (params.fee?.enableFee) {
126
+ url.searchParams.append('enableFee', params.fee.enableFee.toString())
127
+ url.searchParams.append('fee', params.fee.fee.toString())
128
+ url.searchParams.append('feeReceiver', params.fee.feeReceiver)
129
+
130
+ if (params.fee.feeBy) {
131
+ url.searchParams.append('feeBy', params.fee.feeBy)
132
+ }
133
+ }
134
+
135
+ if (params.includeTransaction) {
52
136
  url.searchParams.append(
53
137
  'includeTransaction',
54
138
  params.includeTransaction.toString(),
55
139
  )
140
+ }
141
+
142
+ url.searchParams.append('referrer', params.referrer ?? `sushi-sdk/${version}`)
143
+
56
144
  const res = await fetch(url.toString(), options)
57
- return res.json() as Promise<SwapResponse>
145
+
146
+ if (!res.ok) {
147
+ throw new Error(`Failed to fetch swap: ${await res.text()}`)
148
+ }
149
+
150
+ return swapResponseSchema(params.includeTransaction).parse(await res.json())
58
151
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sushi",
3
3
  "description": "Sushi",
4
- "version": "5.0.9",
4
+ "version": "5.0.10",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
package/validate/index.ts CHANGED
@@ -2,3 +2,4 @@ export * from './isPromiseFulfilled.js'
2
2
  export * from './isPromiseRejected.js'
3
3
  export * from './isZero.js'
4
4
  export * from './isAddressFast.js'
5
+ export * from './zod.js'
@@ -0,0 +1,21 @@
1
+ import type { Hex } from 'viem'
2
+ import { isAddress } from 'viem'
3
+ import { z } from 'zod'
4
+
5
+ export const address = () =>
6
+ z.string().refine((value) => isAddress(value, { strict: false }), {
7
+ message: 'Invalid address',
8
+ })
9
+
10
+ export const hex = () =>
11
+ z
12
+ .string()
13
+ .refine((value) => /^0x[0-9a-fA-F]*$/.test(value), {
14
+ message: 'Invalid hex',
15
+ })
16
+ .transform((value) => value.toLowerCase() as Hex)
17
+
18
+ export const sz = {
19
+ address,
20
+ hex,
21
+ }