diff --git a/package-lock.json b/package-lock.json index 3d6c4c7..6f250d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,11 @@ "dependencies": { "@solana/web3.js": "^1.30.2", "assert": "^2.0.0", + "big-integer": "^1.6.51", "buffer": "^6.0.1" }, "devDependencies": { + "@types/big-integer": "^0.0.31", "@types/jest": "^26.0.23", "jest": "^27.3.1", "prettier": "^2.3.0", @@ -1264,6 +1266,16 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/big-integer": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/big-integer/-/big-integer-0.0.31.tgz", + "integrity": "sha512-nYrYenHwC07vTBXoQ8jUUi6sednNYHGQxh0ecvfWm46n3djgxxbe7AZIJVaGjzQaEQVEcH6KmB6VMt//vAP0AA==", + "deprecated": "This is a stub types definition for BigInteger.js (https://github.com/peterolson/BigInteger.js). BigInteger.js provides its own type definitions, so you don't need @types/big-integer installed!", + "dev": true, + "dependencies": { + "big-integer": "*" + } + }, "node_modules/@types/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", @@ -1696,6 +1708,14 @@ } ] }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -7336,6 +7356,15 @@ "@babel/types": "^7.3.0" } }, + "@types/big-integer": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/big-integer/-/big-integer-0.0.31.tgz", + "integrity": "sha512-nYrYenHwC07vTBXoQ8jUUi6sednNYHGQxh0ecvfWm46n3djgxxbe7AZIJVaGjzQaEQVEcH6KmB6VMt//vAP0AA==", + "dev": true, + "requires": { + "big-integer": "*" + } + }, "@types/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", @@ -7691,6 +7720,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", diff --git a/package.json b/package.json index 4c36fd5..4acd6d6 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ ], "license": "Apache-2.0", "devDependencies": { + "@types/big-integer": "^0.0.31", "@types/jest": "^26.0.23", "jest": "^27.3.1", "prettier": "^2.3.0", @@ -39,6 +40,7 @@ "dependencies": { "@solana/web3.js": "^1.30.2", "assert": "^2.0.0", + "big-integer": "^1.6.51", "buffer": "^6.0.1" } } diff --git a/src/readBig.ts b/src/readBig.ts index 5ec754f..581a9b6 100644 --- a/src/readBig.ts +++ b/src/readBig.ts @@ -1,4 +1,5 @@ import { Buffer } from 'buffer' +import BigInt from 'big-integer' // https://github.com/nodejs/node/blob/v14.17.0/lib/internal/errors.js#L758 const ERR_BUFFER_OUT_OF_BOUNDS = () => new Error('Attempt to access memory outside buffer bounds') @@ -36,10 +37,8 @@ export function readBigInt64LE(buffer: Buffer, offset = 0): bigint { if (first === undefined || last === undefined) boundsError(offset, buffer.length - 8) // tslint:disable-next-line:no-bitwise const val = buffer[offset + 4] + buffer[offset + 5] * 2 ** 8 + buffer[offset + 6] * 2 ** 16 + (last << 24) // Overflow - return ( - (BigInt(val) << BigInt(32)) + // tslint:disable-line:no-bitwise - BigInt(first + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + buffer[++offset] * 2 ** 24) - ) + const result = BigInt(val).shiftLeft(32).add(BigInt(first + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + buffer[++offset] * 2 ** 24)) + return result; } // https://github.com/nodejs/node/blob/v14.17.0/lib/internal/buffer.js#L89-L107 @@ -53,5 +52,5 @@ export function readBigUInt64LE(buffer: Buffer, offset = 0): bigint { const hi = buffer[++offset] + buffer[++offset] * 2 ** 8 + buffer[++offset] * 2 ** 16 + last * 2 ** 24 - return BigInt(lo) + (BigInt(hi) << BigInt(32)) // tslint:disable-line:no-bitwise + return BigInt(hi).shiftLeft(32).add(lo) // tslint:disable-line:no-bitwise } diff --git a/tsconfig.json b/tsconfig.json index e305280..e5b2280 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "module": "commonjs", "declaration": true, "outDir": "./lib", + "esModuleInterop": true, "strict": true }, "include": ["src"],