diff --git a/.changeset/weak-guests-dream.md b/.changeset/weak-guests-dream.md new file mode 100644 index 0000000000..0ccad0e69e --- /dev/null +++ b/.changeset/weak-guests-dream.md @@ -0,0 +1,6 @@ +--- +"@near-js/accounts": patch +"near-api-js": patch +--- + +replace ajv with is-my-json-valid diff --git a/packages/accounts/package.json b/packages/accounts/package.json index cd1502cd5b..8ccc4be177 100644 --- a/packages/accounts/package.json +++ b/packages/accounts/package.json @@ -22,11 +22,10 @@ "@near-js/transactions": "workspace:*", "@near-js/types": "workspace:*", "@near-js/utils": "workspace:*", - "ajv": "8.11.2", - "ajv-formats": "2.1.1", "bn.js": "5.2.1", "borsh": "1.0.0", "depd": "2.0.0", + "is-my-json-valid": "^2.20.6", "lru_map": "0.4.1", "near-abi": "0.1.1" }, @@ -36,9 +35,9 @@ "bs58": "4.0.0", "jest": "26.0.1", "near-hello": "0.5.1", + "near-workspaces": "3.4.0", "ts-jest": "26.5.6", - "typescript": "4.9.4", - "near-workspaces": "3.4.0" + "typescript": "4.9.4" }, "files": [ "lib" diff --git a/packages/accounts/src/contract.ts b/packages/accounts/src/contract.ts index 1acfb0f2b6..c2b005429a 100644 --- a/packages/accounts/src/contract.ts +++ b/packages/accounts/src/contract.ts @@ -1,8 +1,7 @@ import { getTransactionLastResult, Logger } from '@near-js/utils'; import { ArgumentTypeError, PositionalArgsError } from '@near-js/types'; import { LocalViewExecution } from './local-view-execution'; -import Ajv from 'ajv'; -import addFormats from 'ajv-formats'; +import validator from 'is-my-json-valid' import BN from 'bn.js'; import depd from 'depd'; import { AbiFunction, AbiFunctionKind, AbiRoot, AbiSerializationType } from 'near-abi'; @@ -10,7 +9,6 @@ import { AbiFunction, AbiFunctionKind, AbiRoot, AbiSerializationType } from 'nea import { Account } from './account'; import { UnsupportedSerializationError, UnknownArgumentError, ArgumentSchemaError, ConflictingOptions } from './errors'; - // Makes `function.name` return given name function nameFunction(name: string, body: (args?: any[]) => any) { return { @@ -20,7 +18,7 @@ function nameFunction(name: string, body: (args?: any[]) => any) { }[name]; } -function validateArguments(args: object, abiFunction: AbiFunction, ajv: Ajv, abiRoot: AbiRoot) { +function validateArguments(args: object, abiFunction: AbiFunction, abiRoot: AbiRoot) { if (!isObject(args)) return; if (abiFunction.params && abiFunction.params.serialization_type !== AbiSerializationType.Json) { @@ -36,8 +34,9 @@ function validateArguments(args: object, abiFunction: AbiFunction, ajv: Ajv, abi const arg = args[p.name]; const typeSchema = p.type_schema; typeSchema.definitions = abiRoot.body.root_schema.definitions; - const validate = ajv.compile(typeSchema); - if (!validate(arg)) { + const validate = validator(typeSchema) + const valid = validate(arg) + if (!valid) { throw new ArgumentSchemaError(p.name, validate.errors); } } @@ -50,22 +49,6 @@ function validateArguments(args: object, abiFunction: AbiFunction, ajv: Ajv, abi } } -function createAjv() { - // Strict mode is disabled for now as it complains about unknown formats. We need to - // figure out if we want to support a fixed set of formats. `uint32` and `uint64` - // are added explicitly just to reduce the amount of warnings as these are very popular - // types. - const ajv = new Ajv({ - strictSchema: false, - formats: { - uint32: true, - uint64: true - } - }); - addFormats(ajv); - return ajv; -} - const isUint8Array = (x: any) => x && x.byteLength !== undefined && x.byteLength === x.length; @@ -171,7 +154,6 @@ export class Contract { .map((methodAbi) => ({ name: methodAbi.name, abi: methodAbi })); } - const ajv = createAjv(); viewMethodsWithAbi.forEach(({ name, abi }) => { Object.defineProperty(this, name, { writable: false, @@ -182,7 +164,7 @@ export class Contract { } if (abi) { - validateArguments(args, abi, ajv, abiRoot); + validateArguments(args, abi, abiRoot); } if (useLocalViewExecution) { @@ -228,7 +210,7 @@ export class Contract { } if (abi) { - validateArguments(args[0].args, abi, ajv, abiRoot); + validateArguments(args[0].args, abi, abiRoot); } return this._changeMethod({ methodName: name, ...args[0] }); diff --git a/packages/accounts/src/errors.ts b/packages/accounts/src/errors.ts index b37051625a..ea364de7ec 100644 --- a/packages/accounts/src/errors.ts +++ b/packages/accounts/src/errors.ts @@ -1,4 +1,4 @@ -import { ErrorObject } from 'ajv'; +import { ValidationError } from 'is-my-json-valid'; export class UnsupportedSerializationError extends Error { constructor(methodName: string, serializationType: string) { @@ -13,7 +13,7 @@ export class UnknownArgumentError extends Error { } export class ArgumentSchemaError extends Error { - constructor(argName: string, errors: ErrorObject[]) { + constructor(argName: string, errors: ValidationError[]) { super(`Argument '${argName}' does not conform to the specified ABI schema: '${JSON.stringify(errors)}'`); } } diff --git a/packages/near-api-js/package.json b/packages/near-api-js/package.json index 72d33a634c..616d5e7f6b 100644 --- a/packages/near-api-js/package.json +++ b/packages/near-api-js/package.json @@ -22,8 +22,6 @@ "@near-js/types": "workspace:*", "@near-js/utils": "workspace:*", "@near-js/wallet-account": "workspace:*", - "ajv": "8.11.2", - "ajv-formats": "2.1.1", "bn.js": "5.2.1", "borsh": "1.0.0", "depd": "2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b4e85e6b9..5c2c78a51c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,12 +68,6 @@ importers: '@near-js/utils': specifier: workspace:* version: link:../utils - ajv: - specifier: 8.11.2 - version: 8.11.2 - ajv-formats: - specifier: 2.1.1 - version: 2.1.1(ajv@8.11.2) bn.js: specifier: 5.2.1 version: 5.2.1 @@ -83,6 +77,9 @@ importers: depd: specifier: 2.0.0 version: 2.0.0 + is-my-json-valid: + specifier: ^2.20.6 + version: 2.20.6 lru_map: specifier: 0.4.1 version: 0.4.1 @@ -327,12 +324,6 @@ importers: '@noble/curves': specifier: 1.2.0 version: 1.2.0 - ajv: - specifier: 8.11.2 - version: 8.11.2 - ajv-formats: - specifier: 2.1.1 - version: 2.1.1(ajv@8.11.2) bn.js: specifier: 5.2.1 version: 5.2.1 @@ -1703,7 +1694,7 @@ packages: '@near-js/types': 0.0.4 '@near-js/utils': 0.0.4 ajv: 8.11.2 - ajv-formats: 2.1.1(ajv@8.11.2) + ajv-formats: 2.1.1 bn.js: 5.2.1 borsh: 0.7.0 depd: 2.0.0 @@ -2363,15 +2354,14 @@ packages: - supports-color dev: true - /ajv-formats@2.1.1(ajv@8.11.2): + /ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true dependencies: ajv: 8.11.2 + dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2389,6 +2379,7 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -4337,6 +4328,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -4581,6 +4573,18 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + + /generate-object-property@1.2.0: + resolution: {integrity: sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==} + dependencies: + is-property: 1.0.2 + dev: false + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5300,6 +5304,20 @@ packages: is-extglob: 2.1.1 dev: true + /is-my-ip-valid@1.0.1: + resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} + dev: false + + /is-my-json-valid@2.20.6: + resolution: {integrity: sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==} + dependencies: + generate-function: 2.3.1 + generate-object-property: 1.2.0 + is-my-ip-valid: 1.0.1 + jsonpointer: 5.0.1 + xtend: 4.0.2 + dev: false + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -5350,6 +5368,10 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -6037,6 +6059,7 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -6088,7 +6111,6 @@ packages: /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - dev: true /jsonwebtoken@8.5.1: resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} @@ -6699,7 +6721,7 @@ packages: '@near-js/utils': 0.0.4 '@near-js/wallet-account': 0.0.7 ajv: 8.11.2 - ajv-formats: 2.1.1(ajv@8.11.2) + ajv-formats: 2.1.1 bn.js: 5.2.1 borsh: 0.7.0 depd: 2.0.0 @@ -7296,6 +7318,7 @@ packages: /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + dev: true /pure-uuid@1.8.1: resolution: {integrity: sha512-PIwHXU7NZb/wTBwUfzCSjI85tfwx6DQOm74sRLtNLH8KHsFZEvAQbBQdz7E5ij8SNSv9WGdQPWiiM6NpNIeNfA==} @@ -7491,6 +7514,7 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + dev: true /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -8794,6 +8818,7 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 + dev: true /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} @@ -9066,7 +9091,6 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: true /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}