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

@ethersproject/abi

Package Overview
Dependencies
Maintainers
1
Versions
72
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ethersproject/abi - npm Package Compare versions

Comparing version 5.4.1 to 5.5.0

2

lib.esm/_version.d.ts

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

export declare const version = "abi/5.4.1";
export declare const version = "abi/5.5.0";
//# sourceMappingURL=_version.d.ts.map

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

export const version = "abi/5.4.1";
export const version = "abi/5.5.0";
//# sourceMappingURL=_version.js.map

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

minimal: "minimal",
// Human-Readble with nice spacing, including all names
// Human-Readable with nice spacing, including all names
full: "full",

@@ -243,3 +243,3 @@ // JSON-format a la Solidity

// - minimal: "tuple(uint256,address) indexed"
// - full: "tuple(uint256 foo, addres bar) indexed baz"
// - full: "tuple(uint256 foo, address bar) indexed baz"
format(format) {

@@ -246,0 +246,0 @@ if (!format) {

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

}).filter((fragment) => (fragment != null)));
defineReadOnly(this, "_abiCoder", getStatic((new.target), "getAbiCoder")());
defineReadOnly(this, "_abiCoder", getStatic(new.target, "getAbiCoder")());
defineReadOnly(this, "functions", {});

@@ -159,3 +159,3 @@ defineReadOnly(this, "errors", {});

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.functions[FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -190,3 +190,3 @@ if (!result) {

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.events[EventFragment.fromString(nameOrSignatureOrTopic).format()];

@@ -222,3 +222,3 @@ if (!result) {

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.errors[FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -435,3 +435,3 @@ if (!result) {

else if (param.baseType === "tuple" || param.baseType === "array") {
// @TOOD
// @TODO
throw new Error("not implemented");

@@ -567,3 +567,3 @@ }

// Probably not, because just because it is the only event in the ABI does
// not mean we have the full ABI; maybe jsut a fragment?
// not mean we have the full ABI; maybe just a fragment?
return new LogDescription({

@@ -570,0 +570,0 @@ eventFragment: fragment,

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

export declare const version = "abi/5.4.1";
export declare const version = "abi/5.5.0";
//# sourceMappingURL=_version.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = void 0;
exports.version = "abi/5.4.1";
exports.version = "abi/5.5.0";
//# sourceMappingURL=_version.js.map

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

logger.checkNew(_newTarget, AbiCoder);
properties_1.defineReadOnly(this, "coerceFunc", coerceFunc || null);
(0, properties_1.defineReadOnly)(this, "coerceFunc", coerceFunc || null);
}

@@ -101,3 +101,3 @@ AbiCoder.prototype._getCoder = function (param) {

var coder = new tuple_1.TupleCoder(coders, "_");
return coder.decode(this._getReader(bytes_1.arrayify(data), loose));
return coder.decode(this._getReader((0, bytes_1.arrayify)(data), loose));
};

@@ -104,0 +104,0 @@ return AbiCoder;

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

function Writer(wordSize) {
properties_1.defineReadOnly(this, "wordSize", wordSize || 32);
(0, properties_1.defineReadOnly)(this, "wordSize", wordSize || 32);
this._data = [];

@@ -56,3 +56,3 @@ this._dataLength = 0;

get: function () {
return bytes_1.hexConcat(this._data);
return (0, bytes_1.hexConcat)(this._data);
},

@@ -73,10 +73,10 @@ enumerable: false,

Writer.prototype.appendWriter = function (writer) {
return this._writeData(bytes_1.concat(writer._data));
return this._writeData((0, bytes_1.concat)(writer._data));
};
// Arrayish items; padded on the right to wordSize
Writer.prototype.writeBytes = function (value) {
var bytes = bytes_1.arrayify(value);
var bytes = (0, bytes_1.arrayify)(value);
var paddingOffset = bytes.length % this.wordSize;
if (paddingOffset) {
bytes = bytes_1.concat([bytes, this._padding.slice(paddingOffset)]);
bytes = (0, bytes_1.concat)([bytes, this._padding.slice(paddingOffset)]);
}

@@ -86,3 +86,3 @@ return this._writeData(bytes);

Writer.prototype._getValue = function (value) {
var bytes = bytes_1.arrayify(bignumber_1.BigNumber.from(value));
var bytes = (0, bytes_1.arrayify)(bignumber_1.BigNumber.from(value));
if (bytes.length > this.wordSize) {

@@ -95,3 +95,3 @@ logger.throwError("value out-of-bounds", logger_1.Logger.errors.BUFFER_OVERRUN, {

if (bytes.length % this.wordSize) {
bytes = bytes_1.concat([this._padding.slice(bytes.length % this.wordSize), bytes]);
bytes = (0, bytes_1.concat)([this._padding.slice(bytes.length % this.wordSize), bytes]);
}

@@ -118,10 +118,10 @@ return bytes;

function Reader(data, wordSize, coerceFunc, allowLoose) {
properties_1.defineReadOnly(this, "_data", bytes_1.arrayify(data));
properties_1.defineReadOnly(this, "wordSize", wordSize || 32);
properties_1.defineReadOnly(this, "_coerceFunc", coerceFunc);
properties_1.defineReadOnly(this, "allowLoose", allowLoose);
(0, properties_1.defineReadOnly)(this, "_data", (0, bytes_1.arrayify)(data));
(0, properties_1.defineReadOnly)(this, "wordSize", wordSize || 32);
(0, properties_1.defineReadOnly)(this, "_coerceFunc", coerceFunc);
(0, properties_1.defineReadOnly)(this, "allowLoose", allowLoose);
this._offset = 0;
}
Object.defineProperty(Reader.prototype, "data", {
get: function () { return bytes_1.hexlify(this._data); },
get: function () { return (0, bytes_1.hexlify)(this._data); },
enumerable: false,

@@ -128,0 +128,0 @@ configurable: true

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

try {
value = address_1.getAddress(value);
value = (0, address_1.getAddress)(value);
}

@@ -41,3 +41,3 @@ catch (error) {

AddressCoder.prototype.decode = function (reader) {
return address_1.getAddress(bytes_1.hexZeroPad(reader.readValue().toHexString(), 20));
return (0, address_1.getAddress)((0, bytes_1.hexZeroPad)(reader.readValue().toHexString(), 20));
};

@@ -44,0 +44,0 @@ return AddressCoder;

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

DynamicBytesCoder.prototype.encode = function (writer, value) {
value = bytes_1.arrayify(value);
value = (0, bytes_1.arrayify)(value);
var length = writer.writeValue(value.length);

@@ -48,3 +48,3 @@ length += writer.writeBytes(value);

BytesCoder.prototype.decode = function (reader) {
return reader.coerce(this.name, bytes_1.hexlify(_super.prototype.decode.call(this, reader)));
return reader.coerce(this.name, (0, bytes_1.hexlify)(_super.prototype.decode.call(this, reader)));
};

@@ -51,0 +51,0 @@ return BytesCoder;

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

FixedBytesCoder.prototype.encode = function (writer, value) {
var data = bytes_1.arrayify(value);
var data = (0, bytes_1.arrayify)(value);
if (data.length !== this.size) {

@@ -43,3 +43,3 @@ this._throwError("incorrect data length", value);

FixedBytesCoder.prototype.decode = function (reader) {
return reader.coerce(this.name, bytes_1.hexlify(reader.readBytes(this.size)));
return reader.coerce(this.name, (0, bytes_1.hexlify)(reader.readBytes(this.size)));
};

@@ -46,0 +46,0 @@ return FixedBytesCoder;

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

StringCoder.prototype.encode = function (writer, value) {
return _super.prototype.encode.call(this, writer, strings_1.toUtf8Bytes(value));
return _super.prototype.encode.call(this, writer, (0, strings_1.toUtf8Bytes)(value));
};
StringCoder.prototype.decode = function (reader) {
return strings_1.toUtf8String(_super.prototype.decode.call(this, reader));
return (0, strings_1.toUtf8String)(_super.prototype.decode.call(this, reader));
};

@@ -36,0 +36,0 @@ return StringCoder;

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

TupleCoder.prototype.encode = function (writer, value) {
return array_1.pack(writer, this.coders, value);
return (0, array_1.pack)(writer, this.coders, value);
};
TupleCoder.prototype.decode = function (reader) {
return reader.coerce(this.name, array_1.unpack(reader, this.coders));
return reader.coerce(this.name, (0, array_1.unpack)(reader, this.coders));
};

@@ -77,0 +77,0 @@ return TupleCoder;

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

for (var key in params) {
properties_1.defineReadOnly(object, key, params[key]);
(0, properties_1.defineReadOnly)(object, key, params[key]);
}

@@ -222,3 +222,3 @@ }

minimal: "minimal",
// Human-Readble with nice spacing, including all names
// Human-Readable with nice spacing, including all names
full: "full",

@@ -261,3 +261,3 @@ // JSON-format a la Solidity

// - minimal: "tuple(uint256,address) indexed"
// - full: "tuple(uint256 foo, addres bar) indexed baz"
// - full: "tuple(uint256 foo, address bar) indexed baz"
ParamType.prototype.format = function (format) {

@@ -264,0 +264,0 @@ if (!format) {

@@ -101,10 +101,10 @@ "use strict";

}
properties_1.defineReadOnly(this, "fragments", abi.map(function (fragment) {
(0, properties_1.defineReadOnly)(this, "fragments", abi.map(function (fragment) {
return fragments_1.Fragment.from(fragment);
}).filter(function (fragment) { return (fragment != null); }));
properties_1.defineReadOnly(this, "_abiCoder", properties_1.getStatic((_newTarget), "getAbiCoder")());
properties_1.defineReadOnly(this, "functions", {});
properties_1.defineReadOnly(this, "errors", {});
properties_1.defineReadOnly(this, "events", {});
properties_1.defineReadOnly(this, "structs", {});
(0, properties_1.defineReadOnly)(this, "_abiCoder", (0, properties_1.getStatic)(_newTarget, "getAbiCoder")());
(0, properties_1.defineReadOnly)(this, "functions", {});
(0, properties_1.defineReadOnly)(this, "errors", {});
(0, properties_1.defineReadOnly)(this, "events", {});
(0, properties_1.defineReadOnly)(this, "structs", {});
// Add all fragments by their signature

@@ -120,3 +120,3 @@ this.fragments.forEach(function (fragment) {

//checkNames(fragment, "input", fragment.inputs);
properties_1.defineReadOnly(_this, "deploy", fragment);
(0, properties_1.defineReadOnly)(_this, "deploy", fragment);
return;

@@ -147,3 +147,3 @@ case "function":

if (!this.deploy) {
properties_1.defineReadOnly(this, "deploy", fragments_1.ConstructorFragment.from({
(0, properties_1.defineReadOnly)(this, "deploy", fragments_1.ConstructorFragment.from({
payable: false,

@@ -153,3 +153,3 @@ type: "constructor"

}
properties_1.defineReadOnly(this, "_isInterface", true);
(0, properties_1.defineReadOnly)(this, "_isInterface", true);
}

@@ -175,13 +175,13 @@ Interface.prototype.format = function (format) {

Interface.getAddress = function (address) {
return address_1.getAddress(address);
return (0, address_1.getAddress)(address);
};
Interface.getSighash = function (fragment) {
return bytes_1.hexDataSlice(hash_1.id(fragment.format()), 0, 4);
return (0, bytes_1.hexDataSlice)((0, hash_1.id)(fragment.format()), 0, 4);
};
Interface.getEventTopic = function (eventFragment) {
return hash_1.id(eventFragment.format());
return (0, hash_1.id)(eventFragment.format());
};
// Find a function definition by any means necessary (unless it is ambiguous)
Interface.prototype.getFunction = function (nameOrSignatureOrSighash) {
if (bytes_1.isHexString(nameOrSignatureOrSighash)) {
if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {
for (var name_1 in this.functions) {

@@ -206,3 +206,3 @@ if (nameOrSignatureOrSighash === this.getSighash(name_1)) {

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
var result = this.functions[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -216,3 +216,3 @@ if (!result) {

Interface.prototype.getEvent = function (nameOrSignatureOrTopic) {
if (bytes_1.isHexString(nameOrSignatureOrTopic)) {
if ((0, bytes_1.isHexString)(nameOrSignatureOrTopic)) {
var topichash = nameOrSignatureOrTopic.toLowerCase();

@@ -238,3 +238,3 @@ for (var name_3 in this.events) {

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
var result = this.events[fragments_1.EventFragment.fromString(nameOrSignatureOrTopic).format()];

@@ -248,4 +248,4 @@ if (!result) {

Interface.prototype.getError = function (nameOrSignatureOrSighash) {
if (bytes_1.isHexString(nameOrSignatureOrSighash)) {
var getSighash = properties_1.getStatic(this.constructor, "getSighash");
if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {
var getSighash = (0, properties_1.getStatic)(this.constructor, "getSighash");
for (var name_5 in this.errors) {

@@ -271,3 +271,3 @@ var error = this.errors[name_5];

}
// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
var result = this.errors[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -294,3 +294,3 @@ if (!result) {

}
return properties_1.getStatic(this.constructor, "getSighash")(fragment);
return (0, properties_1.getStatic)(this.constructor, "getSighash")(fragment);
};

@@ -302,3 +302,3 @@ // Get the topic (the bytes32 hash) used by Solidity to identify an event

}
return properties_1.getStatic(this.constructor, "getEventTopic")(eventFragment);
return (0, properties_1.getStatic)(this.constructor, "getEventTopic")(eventFragment);
};

@@ -318,5 +318,5 @@ Interface.prototype._decodeParams = function (params, data) {

}
var bytes = bytes_1.arrayify(data);
if (bytes_1.hexlify(bytes.slice(0, 4)) !== this.getSighash(fragment)) {
logger.throwArgumentError("data signature does not match error " + fragment.name + ".", "data", bytes_1.hexlify(bytes));
var bytes = (0, bytes_1.arrayify)(data);
if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(fragment)) {
logger.throwArgumentError("data signature does not match error " + fragment.name + ".", "data", (0, bytes_1.hexlify)(bytes));
}

@@ -329,3 +329,3 @@ return this._decodeParams(fragment.inputs, bytes.slice(4));

}
return bytes_1.hexlify(bytes_1.concat([
return (0, bytes_1.hexlify)((0, bytes_1.concat)([
this.getSighash(fragment),

@@ -340,5 +340,5 @@ this._encodeParams(fragment.inputs, values || [])

}
var bytes = bytes_1.arrayify(data);
if (bytes_1.hexlify(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) {
logger.throwArgumentError("data signature does not match function " + functionFragment.name + ".", "data", bytes_1.hexlify(bytes));
var bytes = (0, bytes_1.arrayify)(data);
if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) {
logger.throwArgumentError("data signature does not match function " + functionFragment.name + ".", "data", (0, bytes_1.hexlify)(bytes));
}

@@ -352,3 +352,3 @@ return this._decodeParams(functionFragment.inputs, bytes.slice(4));

}
return bytes_1.hexlify(bytes_1.concat([
return (0, bytes_1.hexlify)((0, bytes_1.concat)([
this.getSighash(functionFragment),

@@ -363,3 +363,3 @@ this._encodeParams(functionFragment.inputs, values || [])

}
var bytes = bytes_1.arrayify(data);
var bytes = (0, bytes_1.arrayify)(data);
var reason = null;

@@ -377,3 +377,3 @@ var errorArgs = null;

case 4: {
var selector = bytes_1.hexlify(bytes.slice(0, 4));
var selector = (0, bytes_1.hexlify)(bytes.slice(0, 4));
var builtin = BuiltinErrors[selector];

@@ -404,3 +404,6 @@ if (builtin) {

method: functionFragment.format(),
errorArgs: errorArgs, errorName: errorName, errorSignature: errorSignature, reason: reason
errorArgs: errorArgs,
errorName: errorName,
errorSignature: errorSignature,
reason: reason
});

@@ -413,3 +416,3 @@ };

}
return bytes_1.hexlify(this._abiCoder.encode(functionFragment.outputs, values || []));
return (0, bytes_1.hexlify)(this._abiCoder.encode(functionFragment.outputs, values || []));
};

@@ -434,6 +437,6 @@ // Create the filter for the event with search criteria (e.g. for eth_filterLog)

if (param.type === "string") {
return hash_1.id(value);
return (0, hash_1.id)(value);
}
else if (param.type === "bytes") {
return keccak256_1.keccak256(bytes_1.hexlify(value));
return (0, keccak256_1.keccak256)((0, bytes_1.hexlify)(value));
}

@@ -444,3 +447,3 @@ // Check addresses are valid

}
return bytes_1.hexZeroPad(bytes_1.hexlify(value), 32);
return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);
};

@@ -492,9 +495,9 @@ values.forEach(function (value, index) {

if (param.type === "string") {
topics.push(hash_1.id(value));
topics.push((0, hash_1.id)(value));
}
else if (param.type === "bytes") {
topics.push(keccak256_1.keccak256(value));
topics.push((0, keccak256_1.keccak256)(value));
}
else if (param.baseType === "tuple" || param.baseType === "array") {
// @TOOD
// @TODO
throw new Error("not implemented");

@@ -523,3 +526,3 @@ }

var topicHash = this.getEventTopic(eventFragment);
if (!bytes_1.isHexString(topics[0], 32) || topics[0].toLowerCase() !== topicHash) {
if (!(0, bytes_1.isHexString)(topics[0], 32) || topics[0].toLowerCase() !== topicHash) {
logger.throwError("fragment/topic mismatch", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: "topics[0]", expected: topicHash, value: topics[0] });

@@ -548,3 +551,3 @@ }

});
var resultIndexed = (topics != null) ? this._abiCoder.decode(indexed, bytes_1.concat(topics)) : null;
var resultIndexed = (topics != null) ? this._abiCoder.decode(indexed, (0, bytes_1.concat)(topics)) : null;
var resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true);

@@ -635,3 +638,3 @@ var result = [];

// Probably not, because just because it is the only event in the ABI does
// not mean we have the full ABI; maybe jsut a fragment?
// not mean we have the full ABI; maybe just a fragment?
return new LogDescription({

@@ -646,3 +649,3 @@ eventFragment: fragment,

Interface.prototype.parseError = function (data) {
var hexData = bytes_1.hexlify(data);
var hexData = (0, bytes_1.hexlify)(data);
var fragment = this.getError(hexData.substring(0, 10).toLowerCase());

@@ -649,0 +652,0 @@ if (!fragment) {

{
"author": "Richard Moore <me@ricmoo.com>",
"dependencies": {
"@ethersproject/address": "^5.4.0",
"@ethersproject/bignumber": "^5.4.0",
"@ethersproject/bytes": "^5.4.0",
"@ethersproject/constants": "^5.4.0",
"@ethersproject/hash": "^5.4.0",
"@ethersproject/keccak256": "^5.4.0",
"@ethersproject/logger": "^5.4.0",
"@ethersproject/properties": "^5.4.0",
"@ethersproject/strings": "^5.4.0"
"@ethersproject/address": "^5.5.0",
"@ethersproject/bignumber": "^5.5.0",
"@ethersproject/bytes": "^5.5.0",
"@ethersproject/constants": "^5.5.0",
"@ethersproject/hash": "^5.5.0",
"@ethersproject/keccak256": "^5.5.0",
"@ethersproject/logger": "^5.5.0",
"@ethersproject/properties": "^5.5.0",
"@ethersproject/strings": "^5.5.0"
},

@@ -26,3 +26,3 @@ "description": "Utilities and Classes for parsing, formatting and managing Ethereum ABIs.",

],
"gitHead": "c41b89a0c120893062de025a17928a5f092c64b0",
"gitHead": "73a46efea32c3f9a4833ed77896a216e3d3752a0",
"keywords": [

@@ -48,5 +48,5 @@ "Ethereum",

"sideEffects": false,
"tarballHash": "0x89b79e31d806f85d8e82b0f0cdb92302bdc1a4fd9df3f2c838df55a3a190bad9",
"tarballHash": "0x32c0119e32be278064ae36bc915b7c5baf33479b8ad26dad71ee38a6f78b4296",
"types": "./lib/index.d.ts",
"version": "5.4.1"
"version": "5.5.0"
}

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

export const version = "abi/5.4.1";
export const version = "abi/5.5.0";

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

// Human-Readble with nice spacing, including all names
// Human-Readable with nice spacing, including all names
full: "full",

@@ -310,3 +310,3 @@

// - minimal: "tuple(uint256,address) indexed"
// - full: "tuple(uint256 foo, addres bar) indexed baz"
// - full: "tuple(uint256 foo, address bar) indexed baz"
format(format?: string): string {

@@ -313,0 +313,0 @@ if (!format) { format = FormatTypes.sighash; }

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

// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.functions[FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -252,3 +252,3 @@ if (!result) {

// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.events[EventFragment.fromString(nameOrSignatureOrTopic).format()];

@@ -287,3 +287,3 @@ if (!result) {

// Normlize the signature and lookup the function
// Normalize the signature and lookup the function
const result = this.errors[FunctionFragment.fromString(nameOrSignatureOrSighash).format()];

@@ -527,3 +527,3 @@ if (!result) {

} else if (param.baseType === "tuple" || param.baseType === "array") {
// @TOOD
// @TODO
throw new Error("not implemented");

@@ -665,3 +665,3 @@ } else {

// Probably not, because just because it is the only event in the ABI does
// not mean we have the full ABI; maybe jsut a fragment?
// not mean we have the full ABI; maybe just a fragment?

@@ -668,0 +668,0 @@

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

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