Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@findeth/abi

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@findeth/abi - npm Package Compare versions

Comparing version 0.3.0 to 0.3.1

src/parsers/array.test.ts

16

lib/cjs/parsers/array.js

@@ -7,3 +7,3 @@ "use strict";

exports.iterate = iterate;
exports.unpack = exports.pack = exports.getParser = exports.decodeArray = exports.encodeArray = exports.isArray = void 0;
exports.unpack = exports.pack = exports.getParser = exports.decodeArray = exports.encodeArray = exports.getType = exports.isArray = void 0;

@@ -34,3 +34,9 @@ var _buffer = require("../utils/buffer");

exports.getType = getType;
const encodeArray = (buffer, values, type) => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
const actualType = getType(type);

@@ -45,2 +51,6 @@ const length = (0, _buffer.toBuffer)(values.length);

const decodeArray = (value, buffer, type) => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
const actualType = getType(type);

@@ -127,3 +137,3 @@ const pointer = Number((0, _buffer.toNumber)(value));

const update = oldBuffer => {
return Buffer.concat([oldBuffer.subarray(0, staticOffset), (0, _buffer.toBuffer)(oldBuffer.length + offset), oldBuffer.subarray(staticOffset + 32)]);
return (0, _buffer.concatMultiple)([oldBuffer.subarray(0, staticOffset), (0, _buffer.toBuffer)(oldBuffer.length + offset), oldBuffer.subarray(staticOffset + 32)]);
};

@@ -150,3 +160,3 @@

const updatedStaticBuffer = packedUpdateFunctions.reduce((target, update) => update(target), packedStaticBuffer);
return new Uint8Array([...buffer, ...updatedStaticBuffer, ...packedDynamicBuffer]);
return (0, _buffer.concatMultiple)([buffer, updatedStaticBuffer, packedDynamicBuffer]);
};

@@ -153,0 +163,0 @@

7

lib/cjs/parsers/bytes.js

@@ -18,5 +18,6 @@ "use strict";

const decodeBytes = value => {
const length = (0, _buffer.toNumber)(value.subarray(0, 32));
return value.subarray(32, 32 + Number(length));
const decodeBytes = (value, buffer) => {
const pointer = Number((0, _buffer.toNumber)(value.subarray(0, 32)));
const length = (0, _buffer.toNumber)(value.subarray(pointer, pointer + 32));
return buffer.subarray(32, 32 + Number(length));
};

@@ -23,0 +24,0 @@

@@ -19,4 +19,4 @@ "use strict";

const decodeString = value => {
return (0, _buffer.toString)((0, _bytes.decodeBytes)(value, Buffer.alloc(0), 'bytes'));
const decodeString = (value, buffer) => {
return (0, _buffer.toString)((0, _bytes.decodeBytes)(value, buffer, 'string'));
};

@@ -23,0 +23,0 @@

@@ -6,3 +6,3 @@ "use strict";

});
exports.toHex = exports.toNumber = exports.toString = exports.toBuffer = exports.addPadding = exports.concat = void 0;
exports.toHex = exports.toNumber = exports.toString = exports.toBuffer = exports.addPadding = exports.concatMultiple = exports.concat = void 0;
const BUFFER_WIDTH = 32;

@@ -16,2 +16,13 @@

const concatMultiple = buffers => {
return buffers.reduce((target, buffer) => {
const array = new Uint8Array(target.length + buffer.length);
array.set(target, 0);
array.set(buffer, target.length);
return array;
}, new Uint8Array(0));
};
exports.concatMultiple = concatMultiple;
const addPadding = (buffer, length = 32) => {

@@ -18,0 +29,0 @@ const padding = Buffer.alloc(Math.max(length - buffer.length, 0), 0);

@@ -1,2 +0,2 @@

import { concat, toBuffer, toNumber } from '../utils/buffer';
import { concat, concatMultiple, toBuffer, toNumber } from '../utils/buffer';
import { decodeAddress, encodeAddress } from './address';

@@ -11,8 +11,10 @@ import { decodeBytes, encodeBytes } from './bytes';

};
const getType = type => {
export const getType = type => {
return type.match(ARRAY_REGEX)[1];
};
export const encodeArray = (buffer, values, type) => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
export const encodeArray = (buffer, values, type) => {
const actualType = getType(type);

@@ -24,2 +26,6 @@ const length = toBuffer(values.length);

export const decodeArray = (value, buffer, type) => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
const actualType = getType(type);

@@ -100,3 +106,3 @@ const pointer = Number(toNumber(value));

const update = oldBuffer => {
return Buffer.concat([oldBuffer.subarray(0, staticOffset), toBuffer(oldBuffer.length + offset), oldBuffer.subarray(staticOffset + 32)]);
return concatMultiple([oldBuffer.subarray(0, staticOffset), toBuffer(oldBuffer.length + offset), oldBuffer.subarray(staticOffset + 32)]);
};

@@ -123,3 +129,3 @@

const updatedStaticBuffer = packedUpdateFunctions.reduce((target, update) => update(target), packedStaticBuffer);
return new Uint8Array([...buffer, ...updatedStaticBuffer, ...packedDynamicBuffer]);
return concatMultiple([buffer, updatedStaticBuffer, packedDynamicBuffer]);
};

@@ -126,0 +132,0 @@ export function* iterate(buffer, chunkSize) {

@@ -7,6 +7,7 @@ import { addPadding, concat, toBuffer, toNumber } from '../utils/buffer';

};
export const decodeBytes = value => {
const length = toNumber(value.subarray(0, 32));
return value.subarray(32, 32 + Number(length));
export const decodeBytes = (value, buffer) => {
const pointer = Number(toNumber(value.subarray(0, 32)));
const length = toNumber(value.subarray(pointer, pointer + 32));
return buffer.subarray(32, 32 + Number(length));
};
//# sourceMappingURL=bytes.js.map

@@ -7,5 +7,5 @@ import { toString } from '../utils/buffer';

};
export const decodeString = value => {
return toString(decodeBytes(value, Buffer.alloc(0), 'bytes'));
export const decodeString = (value, buffer) => {
return toString(decodeBytes(value, buffer, 'string'));
};
//# sourceMappingURL=string.js.map

@@ -5,2 +5,10 @@ const BUFFER_WIDTH = 32;

};
export const concatMultiple = buffers => {
return buffers.reduce((target, buffer) => {
const array = new Uint8Array(target.length + buffer.length);
array.set(target, 0);
array.set(buffer, target.length);
return array;
}, new Uint8Array(0));
};
export const addPadding = (buffer, length = 32) => {

@@ -7,0 +15,0 @@ const padding = Buffer.alloc(Math.max(length - buffer.length, 0), 0);

{
"name": "@findeth/abi",
"version": "0.3.0",
"version": "0.3.1",
"description": "A tiny Solidity ABI encoder and decoder",

@@ -5,0 +5,0 @@ "author": "Maarten Zuidhoorn <maarten@zuidhoorn.com>",

@@ -15,2 +15,5 @@ import { decode, encode } from './abi';

);
expect(toHex(encode(['string[]'], ['foo', 'bar', 'baz']))).toBe(
'00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000000'
);
});

@@ -71,3 +74,6 @@

expect(decode(['uint256', 'uint256[]', 'uint256'], buffer)).toStrictEqual([12345n, [67890n, 67890n], 12345n]);
// TODO
// expect(decode(['string[]'], Buffer.from('00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f00000000000000000000000000000000000000000000000000000000000000', 'hex')))
// .toStrictEqual(['foo', 'bar', 'baz']);
});
});

@@ -1,2 +0,2 @@

import { concat, toBuffer, toNumber } from '../utils/buffer';
import { concat, concatMultiple, toBuffer, toNumber } from '../utils/buffer';
import { decodeAddress, encodeAddress } from './address';

@@ -27,3 +27,3 @@ import { decodeBytes, encodeBytes } from './bytes';

*/
const getType = (type: string): string => {
export const getType = (type: string): string => {
return type.match(ARRAY_REGEX)![1];

@@ -33,2 +33,6 @@ };

export const encodeArray: EncodeFunction = (buffer: Uint8Array, values: unknown[], type: string): Uint8Array => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
const actualType = getType(type);

@@ -43,2 +47,6 @@ const length = toBuffer(values.length);

export const decodeArray: DecodeFunction = (value: Uint8Array, buffer: Uint8Array, type: string): unknown[] => {
if (!isArray(type)) {
throw new Error('Invalid type: type is not array');
}
const actualType = getType(type);

@@ -152,3 +160,3 @@ const pointer = Number(toNumber(value));

const update = (oldBuffer: Uint8Array): Uint8Array => {
return Buffer.concat([
return concatMultiple([
oldBuffer.subarray(0, staticOffset),

@@ -179,3 +187,3 @@ toBuffer(oldBuffer.length + offset),

return new Uint8Array([...buffer, ...updatedStaticBuffer, ...packedDynamicBuffer]);
return concatMultiple([buffer, updatedStaticBuffer, packedDynamicBuffer]);
};

@@ -182,0 +190,0 @@

@@ -1,3 +0,3 @@

import { toHex, toString } from '../utils/buffer';
import { decodeBytes, encodeBytes } from './bytes';
import { toHex } from '../utils/buffer';
import { encodeBytes } from './bytes';

@@ -13,3 +13,4 @@ describe('encodeBytes', () => {

describe('decodeBytes', () => {
// TODO
/*describe('decodeBytes', () => {
it('decodes a byte array to a buffer', () => {

@@ -24,2 +25,2 @@ const buffer = Buffer.from(

});
});
});*/

@@ -6,3 +6,2 @@ import { addPadding, concat, toBuffer, toNumber } from '../utils/buffer';

const bufferValue = toBuffer(value);
const paddedSize = Math.ceil(bufferValue.byteLength / 32) * 32;

@@ -13,6 +12,8 @@

export const decodeBytes: DecodeFunction = (value: Uint8Array): Uint8Array => {
const length = toNumber(value.subarray(0, 32));
// TODO: This may not work properly yet
export const decodeBytes: DecodeFunction = (value: Uint8Array, buffer: Uint8Array): Uint8Array => {
const pointer = Number(toNumber(value.subarray(0, 32)));
const length = toNumber(value.subarray(pointer, pointer + 32));
return value.subarray(32, 32 + Number(length));
return buffer.subarray(32, 32 + Number(length));
};
import { toHex } from '../utils/buffer';
import { decodeString, encodeString } from './string';
import { encodeString } from './string';

@@ -14,3 +14,4 @@ describe('encodeString', () => {

describe('decodeString', () => {
// TODO
/*describe('decodeString', () => {
it('decodes a byte array to a buffer', () => {

@@ -25,2 +26,2 @@ const buffer = Buffer.from(

});
});
});*/

@@ -11,4 +11,4 @@ import { toString } from '../utils/buffer';

export const decodeString: DecodeFunction = (value: Uint8Array): string => {
return toString(decodeBytes(value, Buffer.alloc(0), 'bytes'));
export const decodeString: DecodeFunction = (value: Uint8Array, buffer: Uint8Array): string => {
return toString(decodeBytes(value, buffer, 'string'));
};

@@ -21,2 +21,17 @@ const BUFFER_WIDTH = 32;

/**
* Concatenates multiple buffers, compatible with Uint8Arrays of browsers.
*
* @param {Uint8Array[]} buffers
* @return {Uint8Array}
*/
export const concatMultiple = (buffers: Uint8Array[]): Uint8Array => {
return buffers.reduce((target, buffer) => {
const array = new Uint8Array(target.length + buffer.length);
array.set(target, 0);
array.set(buffer, target.length);
return array;
}, new Uint8Array(0));
};
/**
* Add padding to a buffer. If the buffer is larger than `length`, this function won't do anything. If it's smaller, the

@@ -23,0 +38,0 @@ * buffer will be padded to the specified length, with extra zeroes at the end.

@@ -9,2 +9,9 @@ import { DecodeFunction, EncodeFunction, Parser } from './parser';

export declare const isArray: (type: string) => boolean;
/**
* Get the "inner" type for an array type. E.g. `getType("uint256[]")` -> uint256.
*
* @param {string} type
* @return {string}
*/
export declare const getType: (type: string) => string;
export declare const encodeArray: EncodeFunction;

@@ -11,0 +18,0 @@ export declare const decodeArray: DecodeFunction;

@@ -12,2 +12,9 @@ /**

/**
* Concatenates multiple buffers, compatible with Uint8Arrays of browsers.
*
* @param {Uint8Array[]} buffers
* @return {Uint8Array}
*/
export declare const concatMultiple: (buffers: Uint8Array[]) => Uint8Array;
/**
* Add padding to a buffer. If the buffer is larger than `length`, this function won't do anything. If it's smaller, the

@@ -14,0 +21,0 @@ * buffer will be padded to the specified length, with extra zeroes at the end.

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc