New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

gridplus-sdk

Package Overview
Dependencies
Maintainers
1
Versions
182
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

gridplus-sdk - npm Package Compare versions

Comparing version 1.2.0 to 1.2.1

2

dist/bitcoin.d.ts

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

import { Buffer } from 'buffer/';
/// <reference types="node" />
declare function getAddressFormat(path: any): 111 | 0 | 5 | 208 | 240 | 196;

@@ -3,0 +3,0 @@ declare const _default: {

@@ -9,3 +9,2 @@ "use strict";

var bs58check_1 = __importDefault(require("bs58check"));
var buffer_1 = require("buffer/");
var ripemd_1 = require("hash.js/lib/hash/ripemd");

@@ -15,3 +14,3 @@ var sha_1 = require("hash.js/lib/hash/sha");

var DEFAULT_SEQUENCE = 0xffffffff;
var DEFAULT_SIGHASH_BUFFER = buffer_1.Buffer.from('01', 'hex'); // SIGHASH_ALL = 0x01
var DEFAULT_SIGHASH_BUFFER = Buffer.from('01', 'hex'); // SIGHASH_ALL = 0x01
var PURPOSES = constants_1.BIP_CONSTANTS.PURPOSES, COINS = constants_1.BIP_CONSTANTS.COINS;

@@ -65,3 +64,3 @@ var OP = {

// Serialize the request
var payload_1 = buffer_1.Buffer.alloc(59 + 69 * prevOuts.length);
var payload_1 = Buffer.alloc(59 + 69 * prevOuts.length);
var off_1 = 0;

@@ -112,4 +111,4 @@ // Change version byte (a.k.a. address format byte)

off_1++;
if (!buffer_1.Buffer.isBuffer(input.txHash))
input.txHash = buffer_1.Buffer.from(input.txHash, 'hex');
if (!Buffer.isBuffer(input.txHash))
input.txHash = Buffer.from(input.txHash, 'hex');
input.txHash.copy(payload_1, off_1);

@@ -142,3 +141,3 @@ off_1 += input.txHash.length;

var inputs = data.inputs, outputs = data.outputs, _a = data.lockTime, lockTime = _a === void 0 ? 0 : _a;
var payload = buffer_1.Buffer.alloc(4);
var payload = Buffer.alloc(4);
var off = 0;

@@ -151,4 +150,4 @@ // Always use version 2

if (useWitness) {
payload = concat(payload, buffer_1.Buffer.from('00', 'hex')); // marker = 0x00
payload = concat(payload, buffer_1.Buffer.from('01', 'hex')); // flag = 0x01
payload = concat(payload, Buffer.from('00', 'hex')); // marker = 0x00
payload = concat(payload, Buffer.from('01', 'hex')); // flag = 0x01
}

@@ -171,3 +170,3 @@ // Serialize signed inputs

var redeemScriptLen = getVarInt(redeemScript.length);
var slice = buffer_1.Buffer.concat([redeemScriptLen, redeemScript]);
var slice = Buffer.concat([redeemScriptLen, redeemScript]);
var sliceLen = getVarInt(slice.length);

@@ -186,3 +185,3 @@ payload = concat(payload, sliceLen);

else if (scriptType === BTC_SCRIPT_TYPE_P2WPKH_V0) {
var emptyScript = buffer_1.Buffer.from('00', 'hex');
var emptyScript = Buffer.from('00', 'hex');
payload = concat(payload, emptyScript);

@@ -225,3 +224,3 @@ off += 1;

// Finish with locktime
return buffer_1.Buffer.concat([payload, getU32LE(lockTime)]).toString('hex');
return Buffer.concat([payload, getU32LE(lockTime)]).toString('hex');
};

@@ -246,3 +245,3 @@ // Convert a pubkeyhash to a bitcoin base58check address with a version byte

else {
return bs58check_1.default.encode(buffer_1.Buffer.concat([buffer_1.Buffer.from([version]), pubkeyhash]));
return bs58check_1.default.encode(Buffer.concat([Buffer.from([version]), pubkeyhash]));
}

@@ -253,5 +252,5 @@ };

function buildRedeemScript(pubkey) {
var redeemScript = buffer_1.Buffer.alloc(22);
var shaHash = buffer_1.Buffer.from((0, sha_1.sha256)().update(pubkey).digest('hex'), 'hex');
var pubkeyhash = buffer_1.Buffer.from((0, ripemd_1.ripemd160)().update(shaHash).digest('hex'), 'hex');
var redeemScript = Buffer.alloc(22);
var shaHash = Buffer.from((0, sha_1.sha256)().update(pubkey).digest('hex'), 'hex');
var pubkeyhash = Buffer.from((0, ripemd_1.ripemd160)().update(shaHash).digest('hex'), 'hex');
redeemScript.writeUInt8(OP.ZERO, 0);

@@ -264,8 +263,8 @@ redeemScript.writeUInt8(pubkeyhash.length, 1);

function buildSig(sig, pubkey) {
sig = buffer_1.Buffer.concat([sig, DEFAULT_SIGHASH_BUFFER]);
sig = Buffer.concat([sig, DEFAULT_SIGHASH_BUFFER]);
var sigLen = getVarInt(sig.length);
var pubkeyLen = getVarInt(pubkey.length);
var slice = buffer_1.Buffer.concat([sigLen, sig, pubkeyLen, pubkey]);
var slice = Buffer.concat([sigLen, sig, pubkeyLen, pubkey]);
var len = getVarInt(slice.length);
return buffer_1.Buffer.concat([len, slice]);
return Buffer.concat([len, slice]);
}

@@ -275,12 +274,12 @@ // Witness is written as a "vector", which is a list of varSlices

function buildWitness(sigs, pubkeys) {
var witness = buffer_1.Buffer.alloc(0);
var witness = Buffer.alloc(0);
// Two items in each vector (sig, pubkey)
var len = buffer_1.Buffer.alloc(1);
var len = Buffer.alloc(1);
len.writeUInt8(2, 0);
for (var i = 0; i < sigs.length; i++) {
var sig = buffer_1.Buffer.concat([sigs[i], DEFAULT_SIGHASH_BUFFER]);
var sig = Buffer.concat([sigs[i], DEFAULT_SIGHASH_BUFFER]);
var sigLen = getVarInt(sig.length);
var pubkey = pubkeys[i];
var pubkeyLen = getVarInt(pubkey.length);
witness = buffer_1.Buffer.concat([witness, len, sigLen, sig, pubkeyLen, pubkey]);
witness = Buffer.concat([witness, len, sigLen, sig, pubkeyLen, pubkey]);
}

@@ -308,3 +307,3 @@ return witness;

function buildP2pkhLockingScript(pubkeyhash) {
var out = buffer_1.Buffer.alloc(5 + pubkeyhash.length);
var out = Buffer.alloc(5 + pubkeyhash.length);
var off = 0;

@@ -326,3 +325,3 @@ out.writeUInt8(OP.DUP, off);

function buildP2shLockingScript(pubkeyhash) {
var out = buffer_1.Buffer.alloc(3 + pubkeyhash.length);
var out = Buffer.alloc(3 + pubkeyhash.length);
var off = 0;

@@ -340,3 +339,3 @@ out.writeUInt8(OP.HASH160, off);

function buildP2wpkhLockingScript(pubkeyhash) {
var out = buffer_1.Buffer.alloc(2 + pubkeyhash.length);
var out = Buffer.alloc(2 + pubkeyhash.length);
out.writeUInt8(OP.ZERO, 0);

@@ -350,6 +349,6 @@ out.writeUInt8(pubkeyhash.length, 1);

function concat(base, addition) {
return buffer_1.Buffer.concat([base, addition]);
return Buffer.concat([base, addition]);
}
function getU64LE(x) {
var buffer = buffer_1.Buffer.alloc(8);
var buffer = Buffer.alloc(8);
writeUInt64LE(x, buffer, 0);

@@ -359,3 +358,3 @@ return buffer;

function getU32LE(x) {
var buffer = buffer_1.Buffer.alloc(4);
var buffer = Buffer.alloc(4);
buffer.writeUInt32LE(x, 0);

@@ -367,7 +366,7 @@ return buffer;

if (x < 0xfd) {
buffer = buffer_1.Buffer.alloc(1);
buffer = Buffer.alloc(1);
buffer.writeUInt8(x, 0);
}
else if (x <= 0xffff) {
buffer = buffer_1.Buffer.alloc(3);
buffer = Buffer.alloc(3);
buffer.writeUInt8(0xfd, 0);

@@ -377,3 +376,3 @@ buffer.writeUInt16LE(x, 1);

else if (x < 0xffffffff) {
buffer = buffer_1.Buffer.alloc(5);
buffer = Buffer.alloc(5);
buffer.writeUInt8(0xfe, 0);

@@ -383,3 +382,3 @@ buffer.writeUInt32LE(x, 1);

else {
buffer = buffer_1.Buffer.alloc(9);
buffer = Buffer.alloc(9);
buffer.writeUInt8(0xff, 0);

@@ -394,5 +393,5 @@ buffer.writeUInt32LE(x >>> 0, 1);

n = n.toString(16);
var preBuf = buffer_1.Buffer.alloc(8);
var preBuf = Buffer.alloc(8);
var nStr = n.length % 2 === 0 ? n.toString(16) : "0".concat(n.toString(16));
var nBuf = buffer_1.Buffer.from(nStr, 'hex');
var nBuf = Buffer.from(nStr, 'hex');
nBuf.reverse().copy(preBuf, 0);

@@ -419,3 +418,3 @@ preBuf.copy(buf, off);

throw new Error("Unsupported segwit version: must be 0, got ".concat(bech32Dec.words[0]));
pkh = buffer_1.Buffer.from(bech32_1.bech32.fromWords(bech32Dec.words.slice(1)));
pkh = Buffer.from(bech32_1.bech32.fromWords(bech32Dec.words.slice(1)));
}

@@ -422,0 +421,0 @@ catch (err) {

@@ -1,22 +0,19 @@

import { Buffer } from 'buffer/';
/// <reference types="node" />
/**
* Look through an ABI definition to see if there is a function
* that matches the signature provided.
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param abi a Solidity JSON ABI structure
* (https://docs.ethers.io/v5/api/utils/abi/formats/#abi-formats--solidity)
* @returns Buffer containing RLP-serialized array of
* calldata info to pass to signing request
*/
* Look through an ABI definition to see if there is a function that matches the signature provided.
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param abi a Solidity JSON ABI structure
* (https://docs.ethers.io/v5/api/utils/abi/formats/#abi-formats--solidity)
* @returns Buffer containing RLP-serialized array of calldata info to pass to signing request
*/
export declare const parseSolidityJSONABI: (sig: string, abi: any[]) => Buffer;
/**
* Convert a canonical name into an ABI definition that can be included
* with calldata to a general signing request. Parameter names will be
* encoded in order that they are discovered (e.g. "1", "2", "2.1", "3")
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param name canonical name of the function
* @returns Buffer containing RLP-serialized array of
* calldata info to pass to signing request
*/
* Convert a canonical name into an ABI definition that can be included with calldata to a general
* signing request. Parameter names will be encoded in order that they are discovered (e.g. "1",
* "2", "2.1", "3")
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param name canonical name of the function
* @returns Buffer containing RLP-serialized array of calldata info to pass to signing request
*/
export declare const parseCanonicalName: (sig: string, name: string) => Buffer;
//# sourceMappingURL=evm.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseCanonicalName = exports.parseSolidityJSONABI = void 0;
var buffer_1 = require("buffer/");
var js_sha3_1 = require("js-sha3");
var rlp_1 = require("rlp");
/**
* Look through an ABI definition to see if there is a function
* that matches the signature provided.
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param abi a Solidity JSON ABI structure
* (https://docs.ethers.io/v5/api/utils/abi/formats/#abi-formats--solidity)
* @returns Buffer containing RLP-serialized array of
* calldata info to pass to signing request
*/
* Look through an ABI definition to see if there is a function that matches the signature provided.
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param abi a Solidity JSON ABI structure
* (https://docs.ethers.io/v5/api/utils/abi/formats/#abi-formats--solidity)
* @returns Buffer containing RLP-serialized array of calldata info to pass to signing request
*/
var parseSolidityJSONABI = function (sig, abi) {

@@ -30,3 +27,3 @@ sig = coerceSig(sig);

var def = parseDef(match).def;
return buffer_1.Buffer.from((0, rlp_1.encode)(def));
return Buffer.from((0, rlp_1.encode)(def));
}

@@ -37,10 +34,9 @@ return null;

/**
* Convert a canonical name into an ABI definition that can be included
* with calldata to a general signing request. Parameter names will be
* encoded in order that they are discovered (e.g. "1", "2", "2.1", "3")
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param name canonical name of the function
* @returns Buffer containing RLP-serialized array of
* calldata info to pass to signing request
*/
* Convert a canonical name into an ABI definition that can be included with calldata to a general
* signing request. Parameter names will be encoded in order that they are discovered (e.g. "1",
* "2", "2.1", "3")
* @param sig a 0x-prefixed hex string containing 4 bytes of info
* @param name canonical name of the function
* @returns Buffer containing RLP-serialized array of calldata info to pass to signing request
*/
var parseCanonicalName = function (sig, name) {

@@ -60,3 +56,4 @@ sig = coerceSig(sig);

var paramDef = [];
while (name.length > 1) { // scan until the terminating ')'
while (name.length > 1) {
// scan until the terminating ')'
var typeStr = popTypeStrFromCanonical(name);

@@ -67,3 +64,3 @@ paramDef = paramDef.concat(parseTypeStr(typeStr));

var parsedParamDef = parseParamDef(paramDef);
return buffer_1.Buffer.from((0, rlp_1.encode)(def.concat(parsedParamDef)));
return Buffer.from((0, rlp_1.encode)(def.concat(parsedParamDef)));
};

@@ -90,5 +87,4 @@ exports.parseCanonicalName = parseCanonicalName;

/**
* Take the next type from a canonical definition string.
* Note that the string can be that of a tuple.
* NOTE: The string should start at the index after the leading '('
* Take the next type from a canonical definition string. Note that the string can be that of a
* tuple. NOTE: The string should start at the index after the leading '('
*/

@@ -110,5 +106,4 @@ function popTypeStrFromCanonical(subName) {

/**
* Parse a type string, e.g. 'uint256'. Converts the string
* to an array of EVMParamInfo, which may have nested structure
* if there are tuples.
* Parse a type string, e.g. 'uint256'. Converts the string to an array of EVMParamInfo, which may
* have nested structure if there are tuples.
*/

@@ -159,5 +154,3 @@ function parseTypeStr(typeStr) {

param.arraySzs = getArraySzs(typeStr);
var arrStart = param.arraySzs.length > 0 ?
typeStr.indexOf('[') :
typeStr.length;
var arrStart = param.arraySzs.length > 0 ? typeStr.indexOf('[') : typeStr.length;
var typeStrNum = typeStr.slice(t.length, arrStart);

@@ -179,5 +172,4 @@ if (parseInt(typeStrNum)) {

/**
* Parse an Etherscan definition into a calldata structure that the
* Lattice EVM decoder can handle (EVMDef).
* This function may recurse if there are tuple types.
* Parse an Etherscan definition into a calldata structure that the Lattice EVM decoder can handle
* (EVMDef). This function may recurse if there are tuple types.
*/

@@ -204,4 +196,3 @@ function parseDef(item, canonicalName, def, recursed) {

canonicalName = recursed_1.canonicalName;
// Add brackets if this is a tuple array and also add
// a comma
// Add brackets if this is a tuple array and also add a comma
canonicalName += "".concat(input.type.slice(5), ",");

@@ -216,4 +207,4 @@ flatParam.push(recursed_1.def);

});
// Take off the last comma. Note that we do not want to slice
// if the last param was a tuple, since we want to keep that `)`
// Take off the last comma. Note that we do not want to slice if the last param was a tuple,
// since we want to keep that `)`
if (canonicalName[canonicalName.length - 1] === ',') {

@@ -228,6 +219,5 @@ canonicalName = canonicalName.slice(0, canonicalName.length - 1);

/**
* Convert a set of EVMParamInfo objects into an array that can
* be serialized into decoder info that can be passed with the
* signing request.
* NOTE: We do not know parameter names, so we just number them
* Convert a set of EVMParamInfo objects into an array that can be serialized into decoder info that
* can be passed with the signing request. NOTE: We do not know parameter names, so we just number
* them
*/

@@ -240,6 +230,4 @@ function parseParamDef(def, prefix) {

if (Array.isArray(param)) {
// Arrays indicate nested params inside a tuple and always come
// after the initial tuple type info.
// Recurse to parse nested tuple params and append them
// to the most recent.
// Arrays indicate nested params inside a tuple and always come after the initial tuple type
// info. Recurse to parse nested tuple params and append them to the most recent.
parsedDef[parsedDef.length - 1].push(parseParamDef(param, "".concat(i, "-")));

@@ -253,6 +241,6 @@ }

param.szBytes,
param.arraySzs
param.arraySzs,
]);
}
// Tuple
// Tuple
if (param.typeIdx === EVM_TYPES.indexOf('tuple')) {

@@ -265,4 +253,3 @@ numTuples += 1;

/**
* Convert a param into an EVMParamInfo object before flattening
* its data into an array.
* Convert a param into an EVMParamInfo object before flattening its data into an array.
*/

@@ -282,10 +269,9 @@ function getFlatParam(input) {

* Convert a param type string into an EVMParamInfo object with attributes:
* 1. paramName - name of the parameter. This piece of data is unverified,
* so it will display differently if the user has the function
* saved in secure storage.
* 1. paramName - name of the parameter. This piece of data is unverified, so it will display
* differently if the user has the function saved in secure storage.
* 2. paramType - basic type of param. Firmware has an enum with 7 values.
* 3. paramSzBytes - number of bytes representing this param. Only certain
* types can have nonzero value for this. For example, a `uint` with
* a 4 in this slot would be uint32 (8*4 = 32). Maximum number of bytes
* is always 32 because these types can only be used in single 32 byte words.
* 3. paramSzBytes - number of bytes representing this param. Only certain types can have nonzero
* value for this. For example, a `uint` with a 4 in this slot would be uint32
* (8*4 = 32). Maximum number of bytes is always 32 because these types can only
* be used in single 32 byte words.
*/

@@ -308,5 +294,3 @@ function getParamTypeInfo(type) {

// Determine where to search for expanded size
var szIdx = param.arraySzs.length > 0 ?
type.indexOf('[') :
type.length;
var szIdx = param.arraySzs.length > 0 ? type.indexOf('[') : type.length;
if (['uint', 'int', 'bytes'].indexOf(baseType) > -1) {

@@ -327,5 +311,4 @@ // If this can have a fixed size, capture that

/**
* Determine the dimensions of an array type. These dimensions can
* be either fixed or variable size. Returns an array of sizes.
* Ex: uint256[][] -> [0, 0], uint256[1][3] -> [1, 3], uint256 -> []
* Determine the dimensions of an array type. These dimensions can be either fixed or variable size.
* Returns an array of sizes. Ex: uint256[][] -> [0, 0], uint256[1][3] -> [1, 3], uint256 -> []
*/

@@ -387,3 +370,10 @@ function getArraySzs(type) {

var EVM_TYPES = [
null, 'address', 'bool', 'uint', 'int', 'bytes', 'string', 'tuple'
null,
'address',
'bool',
'uint',
'int',
'bytes',
'string',
'tuple',
];

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

/// <reference types="node" />
export declare const CALLDATA: {

@@ -5,4 +6,4 @@ EVM: {

parsers: {
parseSolidityJSONABI: (sig: string, abi: any[]) => import("buffer").Buffer;
parseCanonicalName: (sig: string, name: string) => import("buffer").Buffer;
parseSolidityJSONABI: (sig: string, abi: any[]) => Buffer;
parseCanonicalName: (sig: string, name: string) => Buffer;
};

@@ -9,0 +10,0 @@ };

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

/**
* Exports containing utils that allow inclusion of calldata
* decoder info in signing requests. If calldata decoder info
* is packed into the request, it is used to decode the calldata
* in the request. It is optional.
*/
* Exports containing utils that allow inclusion of calldata decoder info in signing requests. If
* calldata decoder info is packed into the request, it is used to decode the calldata in the
* request. It is optional.
*/
var evm_1 = require("./evm");

@@ -17,5 +16,5 @@ exports.CALLDATA = {

parseSolidityJSONABI: evm_1.parseSolidityJSONABI,
parseCanonicalName: evm_1.parseCanonicalName
}
}
parseCanonicalName: evm_1.parseCanonicalName,
},
},
};

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

/// <reference types="node" />
import { UInt4 } from 'bitwise/types';
import { Buffer } from 'buffer/';
import { KVRecord, SignData, GetKvRecordsData } from './types/client';

@@ -28,3 +28,3 @@ /**

*/
constructor({ baseUrl, name, privKey, stateData, timeout, retryCount, skipRetryOnWrongWallet }: {
constructor({ baseUrl, name, privKey, stateData, timeout, retryCount, skipRetryOnWrongWallet, }: {
/** The base URL of the signing server. */

@@ -46,4 +46,4 @@ baseUrl?: string;

/**
* Get a JSON string containing state data that can be used to rehydrate a session.
* Pass the contents of this to the constructor as `stateData` to rehydrate.
* Get a JSON string containing state data that can be used to rehydrate a session. Pass the
* contents of this to the constructor as `stateData` to rehydrate.
*/

@@ -101,5 +101,5 @@ getStateData(): string;

* `addDecoders` sends an RLP-encoded list of decoders to the Lattice. A "decoder" is a piece of
* data that can be used to decode some data in the future. The best example of this is the
* ABI defintion of a contract function. This definition is used to deserialize EVM calldata
* for future requests that call the specified function (as determined by the function selector).
* data that can be used to decode some data in the future. The best example of this is the ABI
* defintion of a contract function. This definition is used to deserialize EVM calldata for
* future requests that call the specified function (as determined by the function selector).
* @category Lattice

@@ -219,10 +219,11 @@ * @returns The decrypted response.

/**
* `_handleConnect` will call `StartPairingMode` on the device, which gives the user 60 seconds to finalize
* the pairing. This will return an ephemeral public key, which is needed for the next request.
* - If the device is already paired, this ephemPub is simply used to encrypt the next request.
* - If the device is not paired, it is needed to pair the device within 60 seconds.
* @category Device Response
* @internal
* @returns true if we are paired to the device already
*/
* `_handleConnect` will call `StartPairingMode` on the device, which gives the user 60 seconds to
* finalize the pairing. This will return an ephemeral public key, which is needed for the next
* request.
* - If the device is already paired, this ephemPub is simply used to encrypt the next request.
* - If the device is not paired, it is needed to pair the device within 60 seconds.
* @category Device Response
* @internal
* @returns true if we are paired to the device already
*/
private _handleConnect;

@@ -278,7 +279,5 @@ /**

/**
* Update the payload with the current wallet UID.
* Some (not all) requests require the active wallet UID
* in order for Lattice firmware to accept them. If we get
* a "wrong wallet" error, the SDK will automatically request
* the current wallet UID from the device and may retry the
* Update the payload with the current wallet UID. Some (not all) requests require the active
* wallet UID in order for Lattice firmware to accept them. If we get a "wrong wallet" error, the
* SDK will automatically request the current wallet UID from the device and may retry the
* request, but the original request payload must be modified.

@@ -288,9 +287,9 @@ */

/**
* Return JSON-stringified version of state data. Can be used to
* rehydrate an SDK session without reconnecting to the target Lattice.
* Return JSON-stringified version of state data. Can be used to rehydrate an SDK session without
* reconnecting to the target Lattice.
*/
private _packStateData;
/**
* Unpack a JSON-stringified version of state data and apply it to state.
* This will allow us to rehydrate an old session.
* Unpack a JSON-stringified version of state data and apply it to state. This will allow us to
* rehydrate an old session.
*/

@@ -319,4 +318,4 @@ private _unpackAndApplyStateData;

/**
* Get 64 bytes representing the public key
* This is the uncompressed key without the leading 04 byte
* Get 64 bytes representing the public key This is the uncompressed key without the leading 04
* byte
* @param LE - Whether to return the public key in little endian format.

@@ -323,0 +322,0 @@ * @returns A Buffer containing the public key.

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

SECP256K1: 0,
ED25519: 1
ED25519: 1,
},

@@ -312,4 +312,4 @@ ENCODINGS: {

EVM: 4,
}
}
},
},
};

@@ -448,3 +448,3 @@ function getFwVersionConst(v) {

exports.EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB,
exports.EXTERNAL.GET_ADDR_FLAGS.SECP256K1_PUB
exports.EXTERNAL.GET_ADDR_FLAGS.SECP256K1_PUB,
];

@@ -477,3 +477,4 @@ // We updated the max number of params in EIP712 types

exports.getFwVersionConst = getFwVersionConst;
// eslint-disable-next-line no-control-regex
var ASCII_REGEX = /^[\x00-\x7F]+$/;
exports.ASCII_REGEX = ASCII_REGEX;
/// <reference types="node" />
import { Buffer } from 'buffer/';
declare const _default: {

@@ -40,5 +39,5 @@ buildEthereumMsgRequest: (input: any) => any;

ensureHexBuffer: (x: any, zeroIsNull?: boolean) => Buffer;
ethConvertLegacyToGenericReq: (req: any) => Buffer | globalThis.Buffer | globalThis.Buffer[];
ethConvertLegacyToGenericReq: (req: any) => Buffer | Buffer[];
};
export default _default;
//# sourceMappingURL=ethereum.d.ts.map

@@ -27,15 +27,14 @@ "use strict";

// does not have browser (or, by proxy, React-Native) support.
var common_1 = __importStar(require("@ethereumjs/common"));
var tx_1 = require("@ethereumjs/tx");
var bignumber_js_1 = __importDefault(require("bignumber.js"));
var borc_1 = __importDefault(require("borc"));
var buffer_1 = require("buffer/");
//@ts-expect-error - This third-party package is not typed properly
var eth_eip712_util_browser_1 = require("eth-eip712-util-browser");
var js_sha3_1 = require("js-sha3");
var rlp_1 = require("rlp");
var rlp_browser_1 = __importDefault(require("rlp-browser")); // [TODO: Deprecate]
var rlp_1 = require("rlp");
var secp256k1_1 = __importDefault(require("secp256k1"));
var constants_1 = require("./constants");
var util_1 = require("./util");
var common_1 = __importStar(require("@ethereumjs/common"));
var tx_1 = require("@ethereumjs/tx");
var buildEthereumMsgRequest = function (input) {

@@ -76,3 +75,3 @@ if (!input.payload || !input.protocol || !input.signerPath)

? prehash
: buffer_1.Buffer.from((0, js_sha3_1.keccak256)(buffer_1.Buffer.concat([get_personal_sign_prefix(msg.length), msg])), 'hex');
: Buffer.from((0, js_sha3_1.keccak256)(Buffer.concat([get_personal_sign_prefix(msg.length), msg])), 'hex');
// Get recovery param with a `v` value of [27,28] by setting `useEIP155=false`

@@ -159,3 +158,3 @@ return addRecoveryParam(hash_1, sig, signer, {

if (isDeployment) {
toRlpElem = buffer_1.Buffer.alloc(0);
toRlpElem = Buffer.alloc(0);
toBytes = (0, util_1.ensureHexBuffer)(contractDeployKey);

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

var ETH_TX_NON_DATA_SZ = 122; // Accounts for metadata and non-data params
var txReqPayload = buffer_1.Buffer.alloc(MAX_BASE_DATA_SZ + ETH_TX_NON_DATA_SZ);
var txReqPayload = Buffer.alloc(MAX_BASE_DATA_SZ + ETH_TX_NON_DATA_SZ);
var off = 0;

@@ -311,3 +310,3 @@ // 1. EIP155 switch and chainID

var chainIdExtraSz = chainIdBufSz > 0 ? chainIdBufSz + 1 : 0;
var dataToCopy = buffer_1.Buffer.alloc(dataSz + chainIdExtraSz);
var dataToCopy = Buffer.alloc(dataSz + chainIdExtraSz);
if (chainIdExtraSz > 0) {

@@ -324,3 +323,3 @@ dataToCopy.writeUInt8(chainIdBufSz, 0);

// If this payload is too large to send, but the Lattice allows a prehashed message, do that
prehash = buffer_1.Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(rawTx, type)), 'hex');
prehash = Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(rawTx, type)), 'hex');
}

@@ -334,5 +333,5 @@ else {

frames_1.forEach(function (frame) {
var szLE = buffer_1.Buffer.alloc(4);
var szLE = Buffer.alloc(4);
szLE.writeUInt32LE(frame.length, 0);
extraDataPayloads_1.push(buffer_1.Buffer.concat([szLE, frame]));
extraDataPayloads_1.push(Buffer.concat([szLE, frame]));
});

@@ -344,3 +343,3 @@ }

// we prehash the message here.
prehash = buffer_1.Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(rawTx, type)), 'hex');
prehash = Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(rawTx, type)), 'hex');
}

@@ -395,3 +394,3 @@ // Write the data size (does *NOT* include the chainId buffer, if that exists)

// RLP-encode the data we sent to the lattice
var hash = buffer_1.Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(tx.rawTx, tx.type)), 'hex');
var hash = Buffer.from((0, js_sha3_1.keccak256)(get_rlp_encoded_preimage(tx.rawTx, tx.type)), 'hex');
var newSig = addRecoveryParam(hash, sig, address, tx);

@@ -408,4 +407,4 @@ // Use the signature to generate a new raw transaction payload

if (tx.type) {
rlpEncodedWithSig = buffer_1.Buffer.concat([
buffer_1.Buffer.from([tx.type]),
rlpEncodedWithSig = Buffer.concat([
Buffer.from([tx.type]),
rlpEncodedWithSig,

@@ -429,3 +428,3 @@ ]);

// Calculate the recovery param
var rs = new Uint8Array(buffer_1.Buffer.concat([r, s]));
var rs = new Uint8Array(Buffer.concat([r, s]));
var pubkey = secp256k1_1.default.ecdsaRecover(rs, v, hash_2, false).slice(1);

@@ -455,3 +454,3 @@ // If the first `v` value is a match, return the sig!

var hashTransaction = function (serializedTx) {
return (0, js_sha3_1.keccak256)(buffer_1.Buffer.from(serializedTx, 'hex'));
return (0, js_sha3_1.keccak256)(Buffer.from(serializedTx, 'hex'));
};

@@ -476,3 +475,3 @@ // Returns address string given public key buffer

// For ETH messages and non-EIP155 chains the set should be [27, 28] for `v`
return buffer_1.Buffer.from(new bignumber_js_1.default(v).plus(27).toString(16), 'hex');
return Buffer.from(new bignumber_js_1.default(v).plus(27).toString(16), 'hex');
}

@@ -514,7 +513,7 @@ // We will use EIP155 in most cases. Convert v to a bignum and operate on it.

if (b.length === 3) {
buf = buffer_1.Buffer.alloc(4);
buf = Buffer.alloc(4);
buf.writeUInt32BE(chainId);
}
else if (b.length <= 8) {
buf = buffer_1.Buffer.alloc(8);
buf = Buffer.alloc(8);
b.copy(buf, 8 - b.length);

@@ -566,3 +565,3 @@ }

var off = 0;
req.payload = buffer_1.Buffer.alloc(L);
req.payload = Buffer.alloc(L);
req.payload.writeUInt8(constants_1.ethMsgProtocol.SIGN_PERSONAL, 0);

@@ -583,3 +582,3 @@ off += 1;

false ===
constants_1.ASCII_REGEX.test(buffer_1.Buffer.from(input.payload.slice(2), 'hex').toString());
constants_1.ASCII_REGEX.test(Buffer.from(input.payload.slice(2), 'hex').toString());
}

@@ -589,3 +588,3 @@ else {

throw new Error('Currently, the Lattice can only display ASCII strings.');
payload = buffer_1.Buffer.from(input.payload);
payload = Buffer.from(input.payload);
}

@@ -619,3 +618,3 @@ }

off += 2;
var prehash = buffer_1.Buffer.from((0, js_sha3_1.keccak256)(buffer_1.Buffer.concat([get_personal_sign_prefix(payload.length), payload])), 'hex');
var prehash = Buffer.from((0, js_sha3_1.keccak256)(Buffer.concat([get_personal_sign_prefix(payload.length), payload])), 'hex');
prehash.copy(req.payload, off);

@@ -645,3 +644,3 @@ req.prehash = prehash;

var off = 0;
req.payload = buffer_1.Buffer.alloc(L);
req.payload = Buffer.alloc(L);
req.payload.writeUInt8(TYPED_DATA.enumIdx, 0);

@@ -671,3 +670,3 @@ off += 1;

// Now build the message to be sent to the Lattice
var payload = buffer_1.Buffer.from(borc_1.default.encode(data_1));
var payload = Buffer.from(borc_1.default.encode(data_1));
var fwConst = input.fwConstants;

@@ -721,5 +720,5 @@ var maxSzAllowed = ethMaxMsgSz + fwConst.extraDataMaxFrames * fwConst.extraDataFrameSz;

frames_2.forEach(function (frame) {
var szLE = buffer_1.Buffer.alloc(4);
var szLE = Buffer.alloc(4);
szLE.writeUInt32LE(frame.length, 0);
extraDataPayloads.push(buffer_1.Buffer.concat([szLE, frame]));
extraDataPayloads.push(Buffer.concat([szLE, frame]));
});

@@ -815,3 +814,3 @@ }

if (data.length === 0) {
data = buffer_1.Buffer.alloc(20);
data = Buffer.alloc(20);
}

@@ -830,3 +829,3 @@ if (data.length !== 20)

if (b.length === 0) {
b = buffer_1.Buffer.from('00', 'hex');
b = Buffer.from('00', 'hex');
}

@@ -858,7 +857,7 @@ // Uint256s should be encoded as bignums.

function get_personal_sign_prefix(L) {
return buffer_1.Buffer.from("\u0019Ethereum Signed Message:\n".concat(L.toString()), 'utf-8');
return Buffer.from("\u0019Ethereum Signed Message:\n".concat(L.toString()), 'utf-8');
}
function get_rlp_encoded_preimage(rawTx, txType) {
if (txType) {
return buffer_1.Buffer.concat([buffer_1.Buffer.from([txType]), rlp_browser_1.default.encode(rawTx)]);
return Buffer.concat([Buffer.from([txType]), rlp_browser_1.default.encode(rawTx)]);
}

@@ -898,3 +897,3 @@ else {

// Legacy transaction type
return buffer_1.Buffer.from((0, rlp_1.encode)(tx.getMessageToSign(false)));
return Buffer.from((0, rlp_1.encode)(tx.getMessageToSign(false)));
}

@@ -901,0 +900,0 @@ };

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

/**
Generic signing module. Any payload can be sent to the Lattice and
will be displayed in full (note that \n and \t characters will be
displayed as line breaks and tabs on the screen).
This payload should be coupled with:
* Signer's BIP44 path
* Curve on which to derive the signing key
* Hash function to use on the message
*/
import { Buffer } from 'buffer/';
/// <reference types="node" />
export declare const buildGenericSigningMsgRequest: (req: any) => {

@@ -13,0 +3,0 @@ payload: Buffer;

@@ -14,5 +14,4 @@ "use strict";

*/
var buffer_1 = require("buffer/");
var sha_1 = require("hash.js/lib/hash/sha");
var js_sha3_1 = require("js-sha3");
var sha_1 = require("hash.js/lib/hash/sha");
var constants_1 = require("./constants");

@@ -33,3 +32,6 @@ var index_1 = require("./index");

}
else if (!genericSigning || !extraDataFrameSz || !extraDataMaxFrames || !prehashAllowed) {
else if (!genericSigning ||
!extraDataFrameSz ||
!extraDataMaxFrames ||
!prehashAllowed) {
throw new Error('Unsupported. Please update your Lattice firmware.');

@@ -46,3 +48,3 @@ }

if (decoder && calldataDecoding && decoder.length <= calldataDecoding.maxSz) {
var decoderBuf = buffer_1.Buffer.alloc(8 + decoder.length);
var decoderBuf = Buffer.alloc(8 + decoder.length);
// First write th reserved word

@@ -52,4 +54,4 @@ decoderBuf.writeUInt32LE(calldataDecoding.reserved, 0);

decoderBuf.writeUInt32LE(decoder.length, 4);
buffer_1.Buffer.from(decoder).copy(decoderBuf, 8);
payloadBuf = buffer_1.Buffer.concat([payloadBuf, decoderBuf]);
Buffer.from(decoder).copy(decoderBuf, 8);
payloadBuf = Buffer.concat([payloadBuf, decoderBuf]);
}

@@ -68,3 +70,3 @@ // Ed25519 specific sanity checks

// Build the request buffer with metadata and then the payload to sign.
var buf = buffer_1.Buffer.alloc(baseReqSz);
var buf = Buffer.alloc(baseReqSz);
var off = 0;

@@ -83,3 +85,3 @@ buf.writeUInt32LE(encoding, off);

// Size of data payload that can be included in the first/base request
var maxExpandedSz = baseDataSz + (extraDataMaxFrames * extraDataFrameSz);
var maxExpandedSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz;
// Flow data into extraData requests if applicable

@@ -105,6 +107,6 @@ var extraDataPayloads = [];

else if (hashType === hashTypes.KECCAK256) {
prehash = buffer_1.Buffer.from((0, js_sha3_1.keccak256)(payloadData), 'hex');
prehash = Buffer.from((0, js_sha3_1.keccak256)(payloadData), 'hex');
}
else if (hashType === hashTypes.SHA256) {
prehash = buffer_1.Buffer.from((0, sha_1.sha256)().update(payloadData).digest('hex'), 'hex');
prehash = Buffer.from((0, sha_1.sha256)().update(payloadData).digest('hex'), 'hex');
}

@@ -119,5 +121,5 @@ else {

frames_1.forEach(function (frame) {
var szLE = buffer_1.Buffer.alloc(4);
var szLE = Buffer.alloc(4);
szLE.writeUInt32LE(frame.length, 0);
extraDataPayloads.push(buffer_1.Buffer.concat([szLE, frame]));
extraDataPayloads.push(Buffer.concat([szLE, frame]));
});

@@ -144,3 +146,3 @@ }

curveType: curveType,
omitPubkey: omitPubkey
omitPubkey: omitPubkey,
};

@@ -159,7 +161,7 @@ };

if (!omitPubkey) {
var compression = res.readUint8(off);
var compression = res.readUInt8(off);
off += 1;
if (compression === 0x02 || compression === 0x03) {
// Compressed key - only copy x
parsed.pubkey = buffer_1.Buffer.alloc(33);
parsed.pubkey = Buffer.alloc(33);
parsed.pubkey.writeUInt8(compression, 0);

@@ -170,3 +172,3 @@ res.slice(off, off + 32).copy(parsed.pubkey, 1);

// Uncompressed key
parsed.pubkey = buffer_1.Buffer.alloc(65);
parsed.pubkey = Buffer.alloc(65);
parsed.pubkey.writeUInt8(compression, 0);

@@ -194,3 +196,3 @@ res.slice(off).copy(parsed.pubkey, 1);

// Handle `GpEdDSAPubkey_t`
parsed.pubkey = buffer_1.Buffer.alloc(32);
parsed.pubkey = Buffer.alloc(32);
res.slice(off, off + 32).copy(parsed.pubkey);

@@ -221,6 +223,6 @@ }

if (typeof payload === 'string' && payload.slice(0, 2) === '0x') {
payloadBuf = buffer_1.Buffer.from(payload.slice(2), 'hex');
payloadBuf = Buffer.from(payload.slice(2), 'hex');
}
else {
payloadBuf = buffer_1.Buffer.from(payload);
payloadBuf = Buffer.from(payload);
}

@@ -227,0 +229,0 @@ // Build the request with the specified encoding type

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

export { CALLDATA as Calldata } from './calldata/index';
export { Client } from './client';
export { EXTERNAL as Constants } from './constants';
export { CALLDATA as Calldata } from './calldata/index';
//# sourceMappingURL=index.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Calldata = exports.Constants = exports.Client = void 0;
exports.Constants = exports.Client = exports.Calldata = void 0;
var index_1 = require("./calldata/index");
Object.defineProperty(exports, "Calldata", { enumerable: true, get: function () { return index_1.CALLDATA; } });
var client_1 = require("./client");

@@ -8,3 +10,1 @@ Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } });

Object.defineProperty(exports, "Constants", { enumerable: true, get: function () { return constants_1.EXTERNAL; } });
var index_1 = require("./calldata/index");
Object.defineProperty(exports, "Calldata", { enumerable: true, get: function () { return index_1.CALLDATA; } });

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

import { Buffer } from 'buffer/';
/// <reference types="node" />
import 'hash.js';

@@ -3,0 +3,0 @@ export declare type KVRecord = {

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

import { Buffer } from 'buffer/';
/// <reference types="node" />
export declare const parseLattice1Response: (r: any) => any;

@@ -3,0 +3,0 @@ export declare const checksum: (x: any) => number;

@@ -19,3 +19,2 @@ "use strict";

var bignumber_js_1 = __importDefault(require("bignumber.js"));
var buffer_1 = require("buffer/");
var crc_32_1 = __importDefault(require("crc-32"));

@@ -36,3 +35,3 @@ var elliptic_1 = __importDefault(require("elliptic"));

};
var b = buffer_1.Buffer.from(r, 'hex');
var b = Buffer.from(r, 'hex');
var off = 0;

@@ -93,4 +92,4 @@ // Get protocol version

// be right-padded with zeros so that this can be a fixed size field
var b = buffer_1.Buffer.alloc(74);
var ds = buffer_1.Buffer.from(sig.toDER());
var b = Buffer.alloc(74);
var ds = Buffer.from(sig.toDER());
ds.copy(b);

@@ -156,3 +155,3 @@ return b;

if (x === null || (x === 0 && zeroIsNull === true))
return buffer_1.Buffer.alloc(0);
return Buffer.alloc(0);
var isNumber = typeof x === 'number' || isBase10NumStr(x);

@@ -173,4 +172,4 @@ // Otherwise try to get this converted to a hex string

if (x === '00' && !isNumber)
return buffer_1.Buffer.alloc(0);
return buffer_1.Buffer.from(x, 'hex');
return Buffer.alloc(0);
return Buffer.from(x, 'hex');
}

@@ -183,3 +182,3 @@ catch (err) {

var fixLen = function (msg, length) {
var buf = buffer_1.Buffer.alloc(length);
var buf = Buffer.alloc(length);
if (msg.length < length) {

@@ -196,12 +195,12 @@ msg.copy(buf, length - msg.length);

var aes256_encrypt = function (data, key) {
var iv = buffer_1.Buffer.from(constants_1.AES_IV);
var iv = Buffer.from(constants_1.AES_IV);
var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv);
var paddedData = data.length % 16 === 0 ? data : aes_js_1.default.padding.pkcs7.pad(data);
return buffer_1.Buffer.from(aesCbc.encrypt(paddedData));
return Buffer.from(aesCbc.encrypt(paddedData));
};
exports.aes256_encrypt = aes256_encrypt;
var aes256_decrypt = function (data, key) {
var iv = buffer_1.Buffer.from(constants_1.AES_IV);
var iv = Buffer.from(constants_1.AES_IV);
var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv);
return buffer_1.Buffer.from(aesCbc.decrypt(data));
return Buffer.from(aesCbc.decrypt(data));
};

@@ -237,3 +236,3 @@ exports.aes256_decrypt = aes256_decrypt;

var buildSignerPathBuf = function (signerPath, varAddrPathSzAllowed) {
var buf = buffer_1.Buffer.alloc(24);
var buf = Buffer.alloc(24);
var off = 0;

@@ -303,3 +302,3 @@ if (varAddrPathSzAllowed && signerPath.length > 5)

var randomBytes = function (n) {
var buf = buffer_1.Buffer.alloc(n);
var buf = Buffer.alloc(n);
for (var i = 0; i < n; i++) {

@@ -306,0 +305,0 @@ buf[i] = Math.round(Math.random() * 255);

{
"name": "gridplus-sdk",
"version": "1.2.0",
"version": "1.2.1",
"description": "SDK to interact with GridPlus Lattice1 device",

@@ -8,16 +8,16 @@ "scripts": {

"commit": "git-cz",
"lint": "eslint src --ext .ts",
"lint:fix": "eslint --fix src test --ext .ts",
"lint": "eslint src test --ext .ts",
"postinstall": "",
"precommit": "npm run lint:fix && npm run test",
"prepublish": "",
"postinstall": "",
"test-signing": "ts-mocha --timeout 120000 -R spec test/signing/index.ts --recursive --exit",
"test": "ts-mocha --timeout 120000 -R spec test/testAll.ts --recursive --exit",
"test-abi": "ts-mocha --timeout 360000 -R spec test/testAbi.ts --recursive --exit",
"test-btc": "ts-mocha --timeout 180000 -R spec test/testBtc.ts --recursive --exit",
"test-abi": "ts-mocha --timeout 360000 -R spec test/testAbi.ts --recursive --exit",
"test-chaos-monkey": "ts-mocha --timeout 300000 -R spec test/testChaosMonkey.ts --recursive --exit",
"test-eth-msg": "ts-mocha --timeout 180000 -R spec test/testEthMsg.ts --recursive --exit",
"test-kv": "ts-mocha --timeout 180000 -R spec test/testKv.ts --recursive --exit",
"test-wallet-jobs": "ts-mocha --timeout 300000 -R spec test/testWalletJobs.ts --recursive --exit",
"test-non-exportable": "ts-mocha --timeout 300000 -R spec test/testNonExportable.ts --recursive --exit",
"test-chaos-monkey": "ts-mocha --timeout 300000 -R spec test/testChaosMonkey.ts --recursive --exit"
"test-signing": "ts-mocha --timeout 120000 -R spec test/signing/index.ts --recursive --exit",
"test-wallet-jobs": "ts-mocha --timeout 300000 -R spec test/testWalletJobs.ts --recursive --exit"
},

@@ -44,4 +44,4 @@ "main": "./dist/index.js",

"js-sha3": "^0.8.0",
"rlp-browser": "^1.0.1",
"rlp": "^3.0.0",
"rlp-browser": "^1.0.1",
"secp256k1": "4.0.2",

@@ -65,5 +65,5 @@ "superagent": "^3.8.3"

"ed25519-hd-key": "^1.2.0",
"eslint": "^8.7.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint": "^8.7.0",
"ethereumjs-util": "^7.1.4",

@@ -74,4 +74,4 @@ "jsonc": "^2.0.0",

"mocha": "^9.2.0",
"prettier-eslint": "^13.0.0",
"prettier": "^2.6.2",
"prettier-eslint": "^13.0.0",
"random-words": "^1.1.1",

@@ -78,0 +78,0 @@ "readline-sync": "^1.4.9",

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 too big to display

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