@ckb-lumos/rpc
Advanced tools
Comparing version 0.18.0 to 0.19.0-alpha.0
@@ -1,64 +0,36 @@ | ||
import { Alert, BannedAddr, Block, BlockEconomicState, CellWithStatus, ChainInfo, Consensus, DryRunResult, Epoch, Hash, Header, HexNumber, HexString, Indexer, LocalNode, OutPoint, RemoteNode, SyncState, Transaction, TransactionProof, TransactionWithStatus, TxPoolIds, TxPoolInfo, TxPoolVerbosity } from "@ckb-lumos/base"; | ||
export declare type SerializedBlock = HexString; | ||
export declare type SerializedHeader = HexString; | ||
export declare type OutputsValidator = "well_known_scripts_only" | "passthrough"; | ||
export declare class RPC { | ||
private rpcProxy; | ||
/** | ||
* | ||
* @param uri | ||
* @param indexer Will `waitForSync` after rpc call if provided. | ||
* @param options | ||
*/ | ||
constructor(uri: string, indexer?: Indexer, { waitForSyncCheckIntervalSeconds, blockDifference, rpcOptions, }?: { | ||
waitForSyncCheckIntervalSeconds?: number; | ||
blockDifference?: number; | ||
rpcOptions?: Record<string, unknown>; | ||
}); | ||
/** | ||
* | ||
* @param indexer If not provided or be undefined, will disable `waitForSync`, and if provided, will enable `waitForSync` with provided indexer. | ||
*/ | ||
resetIndexer(indexer?: Indexer): void; | ||
get_block(block_hash: Hash, verbosity: "0x0"): Promise<SerializedBlock | null>; | ||
get_block(block_hash: Hash, verbosity?: "0x2"): Promise<Block | null>; | ||
get_block_by_number(block_number: HexNumber, verbosity: "0x0"): Promise<SerializedBlock | null>; | ||
get_block_by_number(block_number: HexNumber, verbosity?: "0x2"): Promise<Block | null>; | ||
get_header(block_hash: Hash, verbosity: "0x0"): Promise<SerializedHeader | null>; | ||
get_header(block_hash: Hash, verbosity?: "0x1"): Promise<Header | null>; | ||
get_header_by_number(block_number: HexNumber, verbosity: "0x0"): Promise<SerializedHeader | null>; | ||
get_header_by_number(block_number: HexNumber, verbosity?: "0x1"): Promise<Header | null>; | ||
get_transaction(hash: Hash): Promise<TransactionWithStatus | null>; | ||
get_block_hash(block_number: HexNumber): Promise<Hash | null>; | ||
get_tip_header(verbosity: "0x0"): Promise<SerializedHeader>; | ||
get_tip_header(verbosity?: "0x1"): Promise<Header>; | ||
get_live_cell(out_point: OutPoint, with_data: boolean): Promise<CellWithStatus>; | ||
get_tip_block_number(): Promise<HexNumber>; | ||
get_current_epoch(): Promise<Epoch>; | ||
get_epoch_by_number(epoch_number: HexNumber): Promise<Epoch | null>; | ||
get_block_economic_state(block_hash: Hash): Promise<BlockEconomicState | null>; | ||
get_transaction_proof(tx_hashes: Hash[], block_hash?: Hash): Promise<TransactionProof>; | ||
verify_transaction_proof(tx_proof: TransactionProof): Promise<Hash[]>; | ||
get_fork_block(block_hash: Hash, verbosity: "0x0"): Promise<SerializedBlock | null>; | ||
get_fork_block(block_hash: Hash, verbosity?: "0x2"): Promise<Block | null>; | ||
get_consensus(): Promise<Consensus>; | ||
dry_run_transaction(tx: Transaction): Promise<DryRunResult>; | ||
calculate_dao_maximum_withdraw(out_point: OutPoint, block_hash: Hash): Promise<HexNumber>; | ||
local_node_info(): Promise<LocalNode>; | ||
get_peers(): Promise<RemoteNode[]>; | ||
get_banned_addresses(): Promise<BannedAddr>; | ||
clear_banned_addresses(): Promise<null>; | ||
set_ban(address: string, command: string, ban_time?: HexNumber, absolute?: boolean, reason?: string): Promise<null>; | ||
sync_state(): Promise<SyncState>; | ||
set_network_active(state: boolean): Promise<null>; | ||
add_node(peer_id: string, address: string): Promise<null>; | ||
remove_node(peer_id: string): Promise<null>; | ||
ping_peers(): Promise<null>; | ||
send_transaction(tx: Transaction, outputs_validator?: OutputsValidator): Promise<Hash>; | ||
tx_pool_info(): Promise<TxPoolInfo>; | ||
clear_tx_pool(): Promise<null>; | ||
get_raw_tx_pool(verbose?: false): Promise<TxPoolIds>; | ||
get_raw_tx_pool(verbose: true): Promise<TxPoolVerbosity>; | ||
get_blockchain_info(): Promise<ChainInfo>; | ||
send_alert(alert: Alert): Promise<null>; | ||
import { Base } from "./Base"; | ||
import { Method } from "./method"; | ||
import { CKBComponents } from "./types/api"; | ||
import { formatter as paramsFormatter } from "./paramsFormatter"; | ||
import * as resultFormatter from "./resultFormatter"; | ||
export declare const ParamsFormatter: { | ||
toOptional: (format?: ((args: any) => any) | undefined) => (arg: any) => any; | ||
toArray: (format?: ((args: any) => any) | undefined) => (arg: any) => any; | ||
toHash: (hash: string) => string; | ||
toNumber: (number: string | bigint) => string; | ||
toScript: (script: CKBComponents.Script) => import("./types/rpc").RPC.Script; | ||
toOutPoint: (outPoint: CKBComponents.OutPoint | undefined) => import("./types/rpc").RPC.OutPoint | undefined; | ||
toInput: (input: CKBComponents.CellInput) => import("./types/rpc").RPC.CellInput; | ||
toOutput: (output: CKBComponents.CellOutput) => import("./types/rpc").RPC.CellOutput; | ||
toDepType: (type: CKBComponents.DepType) => "code" | "dep_group"; | ||
toCellDep: (cellDep: CKBComponents.CellDep) => import("./types/rpc").RPC.CellDep; | ||
toRawTransaction: (transaction: CKBComponents.RawTransaction) => import("./types/rpc").RPC.RawTransaction; | ||
toPageNumber: (pageNo?: string | bigint) => string; | ||
toPageSize: (pageSize?: string | bigint) => string; | ||
toReverseOrder: (reverse?: boolean) => boolean; | ||
toOutputsValidator: (outputsValidator: CKBComponents.OutputsValidator) => CKBComponents.OutputsValidator; | ||
toBoolean: (value: boolean) => boolean; | ||
toTransactionProof: (proof: CKBComponents.TransactionProof) => import("./types/rpc").RPC.TransactionProof; | ||
}; | ||
export declare const ResultFormatter: typeof resultFormatter; | ||
export declare class CKBRPC extends Base { | ||
#private; | ||
get node(): CKBComponents.Node; | ||
get paramsFormatter(): typeof paramsFormatter; | ||
get resultFormatter(): typeof resultFormatter; | ||
constructor(url: string); | ||
setNode(node: CKBComponents.Node): CKBComponents.Node; | ||
addMethod: (options: CKBComponents.Method) => void; | ||
createBatchRequest: <N extends "getTipBlockNumber" | "getTipHeader" | "getCurrentEpoch" | "getEpochByNumber" | "getBlockHash" | "getBlock" | "getHeader" | "getHeaderByNumber" | "getLiveCell" | "getTransaction" | "getCellbaseOutputCapacityDetails" | "getBlockEconomicState" | "getTransactionProof" | "verifyTransactionProof" | "getConsensus" | "getBlockByNumber" | "dryRunTransaction" | "calculateDaoMaximumWithdraw" | "localNodeInfo" | "getPeers" | "getBannedAddresses" | "clearBannedAddresses" | "setBan" | "syncState" | "setNetworkActive" | "addNode" | "removeNode" | "pingPeers" | "sendTransaction" | "txPoolInfo" | "clearTxPool" | "getRawTxPool" | "getBlockchainInfo" | "rpcProperties", P extends (string | number | object)[], R = any[]>(params?: any) => any; | ||
} | ||
export { CKBRPC as RPC }; |
338
lib/index.js
@@ -6,249 +6,173 @@ "use strict"; | ||
}); | ||
exports.RPC = void 0; | ||
exports.ResultFormatter = exports.RPC = exports.ParamsFormatter = exports.CKBRPC = void 0; | ||
var _toolkit = require("@ckb-lumos/toolkit"); | ||
var _Base = require("./Base"); | ||
var _bi = require("@ckb-lumos/bi"); | ||
var _method = require("./method"); | ||
function asyncSleep(ms = 0) { | ||
return new Promise(r => setTimeout(r, ms)); | ||
} | ||
var _paramsFormatter = require("./paramsFormatter"); | ||
const handler = { | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
get: (target, method) => { | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
return async (...params) => { | ||
const result = await target.rpc[method](...params); | ||
var resultFormatter = _interopRequireWildcard(require("./resultFormatter")); | ||
if (target.indexer) { | ||
await target.waitForBlockSync(); | ||
} | ||
var _exceptions = require("./exceptions"); | ||
return result; | ||
}; | ||
} | ||
}; | ||
var _axios = _interopRequireDefault(require("axios")); | ||
class RpcProxy { | ||
constructor(uri, indexer, { | ||
waitForSyncCheckIntervalSeconds = 1, | ||
blockDifference = 3, | ||
rpcOptions = {} | ||
} = {}) { | ||
this.rpc = new _toolkit.RPC(uri, rpcOptions); | ||
this.indexer = indexer; | ||
this.waitForSyncCheckIntervalSeconds = waitForSyncCheckIntervalSeconds; | ||
this.blockDifference = blockDifference; | ||
} | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
resetIndexer(indexer) { | ||
this.indexer = indexer; | ||
} | ||
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } | ||
getProxy() { | ||
return new Proxy(this, handler); | ||
} | ||
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
async waitForBlockSync() { | ||
if (!this.indexer) { | ||
return; | ||
} | ||
// import axios from 'axios' | ||
// import { MethodInBatchNotFoundException, PayloadInBatchException, IdNotMatchedInBatchException } from './exceptions' | ||
const ParamsFormatter = _paramsFormatter.formatter; | ||
exports.ParamsFormatter = ParamsFormatter; | ||
const ResultFormatter = resultFormatter; | ||
exports.ResultFormatter = ResultFormatter; | ||
const header = await this.rpc.get_tip_header(); | ||
class CKBRPC extends _Base.Base { | ||
#node = { | ||
url: "" | ||
}; | ||
const blockNumber = _bi.BI.from(header.number); | ||
while (true) { | ||
const tip = await this.indexer.tip(); | ||
if (tip) { | ||
if (blockNumber.sub(tip.block_number).lte(this.blockDifference)) { | ||
// TODO: do we need to handle forks? | ||
break; | ||
} | ||
} | ||
await asyncSleep(this.waitForSyncCheckIntervalSeconds * 1000); | ||
} | ||
get node() { | ||
return this.#node; | ||
} | ||
} | ||
#paramsFormatter = _paramsFormatter.formatter; | ||
class RPC { | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
/** | ||
* | ||
* @param uri | ||
* @param indexer Will `waitForSync` after rpc call if provided. | ||
* @param options | ||
*/ | ||
constructor(uri, indexer, { | ||
waitForSyncCheckIntervalSeconds = 1, | ||
blockDifference = 3, | ||
rpcOptions = {} | ||
} = {}) { | ||
this.rpcProxy = new RpcProxy(uri, indexer, { | ||
waitForSyncCheckIntervalSeconds, | ||
blockDifference, | ||
rpcOptions | ||
}).getProxy(); | ||
get paramsFormatter() { | ||
return this.#paramsFormatter; | ||
} | ||
/** | ||
* | ||
* @param indexer If not provided or be undefined, will disable `waitForSync`, and if provided, will enable `waitForSync` with provided indexer. | ||
*/ | ||
#resultFormatter = resultFormatter; | ||
resetIndexer(indexer) { | ||
this.rpcProxy.resetIndexer(indexer); | ||
} // Module Chain | ||
async get_block(block_hash, verbosity) { | ||
return this.rpcProxy.get_block(block_hash, verbosity || null); | ||
get resultFormatter() { | ||
return this.#resultFormatter; | ||
} | ||
async get_block_by_number(block_number, verbosity) { | ||
return this.rpcProxy.get_block_by_number(block_number, verbosity || null); | ||
} | ||
constructor(url) { | ||
super(); | ||
this.setNode({ | ||
url | ||
}); | ||
Object.defineProperties(this, { | ||
addMethod: { | ||
value: this.addMethod, | ||
enumerable: false, | ||
writable: false, | ||
configurable: false | ||
}, | ||
setNode: { | ||
value: this.setNode, | ||
enumerable: false, | ||
writable: false, | ||
configurable: false | ||
} // createBatchRequest: { value: this.createBatchRequest, enumerable: false, writable: false, configurable: false }, | ||
async get_header(block_hash, verbosity) { | ||
return this.rpcProxy.get_header(block_hash, verbosity || null); | ||
}); | ||
Object.keys(this.rpcProperties).forEach(name => { | ||
this.addMethod({ | ||
name, | ||
...this.rpcProperties[name] | ||
}); | ||
}); | ||
} | ||
async get_header_by_number(block_number, verbosity) { | ||
return this.rpcProxy.get_header_by_number(block_number, verbosity || null); | ||
setNode(node) { | ||
Object.assign(this.node, node); | ||
return this.node; | ||
} | ||
async get_transaction(hash) { | ||
return this.rpcProxy.get_transaction(hash); | ||
} | ||
addMethod = options => { | ||
const method = new _method.Method(this.node, options); | ||
Object.defineProperty(this, options.name, { | ||
value: method.call, | ||
enumerable: true | ||
}); | ||
}; | ||
/* eslint-disable */ | ||
async get_block_hash(block_number) { | ||
return this.rpcProxy.get_block_hash(block_number); | ||
} | ||
createBatchRequest = ( // TODO fix me | ||
// params: [method: N, ...rest: P][] = [], | ||
params = []) => { | ||
const ctx = this; // TODO fix me | ||
async get_tip_header(verbosity) { | ||
return this.rpcProxy.get_tip_header(verbosity); | ||
} | ||
const proxied = new Proxy([], { | ||
set(...p) { | ||
const methods = Object.keys(ctx); | ||
async get_live_cell(out_point, with_data) { | ||
return this.rpcProxy.get_live_cell(out_point, with_data); | ||
} | ||
if (p[1] !== "length") { | ||
var _p$; | ||
async get_tip_block_number() { | ||
return this.rpcProxy.get_tip_block_number(); | ||
} | ||
const name = p === null || p === void 0 ? void 0 : (_p$ = p[2]) === null || _p$ === void 0 ? void 0 : _p$[0]; | ||
async get_current_epoch() { | ||
return this.rpcProxy.get_current_epoch(); | ||
} | ||
if (methods.indexOf(name) === -1) { | ||
throw new _exceptions.MethodInBatchNotFoundException(name); | ||
} | ||
} | ||
async get_epoch_by_number(epoch_number) { | ||
return this.rpcProxy.get_epoch_by_number(epoch_number); | ||
} | ||
return Reflect.set(...p); | ||
} | ||
async get_block_economic_state(block_hash) { | ||
return this.rpcProxy.get_block_economic_state(block_hash); | ||
} | ||
}); | ||
Object.defineProperties(proxied, { | ||
add: { | ||
value(...args) { | ||
this.push(args); | ||
return this; | ||
} | ||
async get_transaction_proof(tx_hashes, block_hash) { | ||
return this.rpcProxy.get_transaction_proof(tx_hashes, block_hash || null); | ||
} | ||
}, | ||
remove: { | ||
value(i) { | ||
this.splice(i, 1); | ||
return this; | ||
} | ||
async verify_transaction_proof(tx_proof) { | ||
return this.rpcProxy.verify_transaction_proof(tx_proof); | ||
} | ||
}, | ||
exec: { | ||
async value() { | ||
// TODO fix me | ||
const payload = proxied.map(([f, ...p], i) => { | ||
try { | ||
const method = new _method.Method(ctx.node, { ...ctx.rpcProperties[f], | ||
name: f | ||
}); | ||
return method.getPayload(...p); | ||
} catch (err) { | ||
throw new _exceptions.PayloadInBatchException(i, err.message); | ||
} | ||
}); | ||
const batchRes = await (0, _axios.default)({ | ||
method: "POST", | ||
headers: { | ||
"content-type": "application/json" | ||
}, | ||
data: payload, | ||
url: ctx.#node.url, | ||
httpAgent: ctx.#node.httpAgent, | ||
httpsAgent: ctx.#node.httpsAgent | ||
}); | ||
return batchRes.data.map((res, i) => { | ||
var _ctx$rpcProperties$pr, _ctx$rpcProperties$pr2, _ctx$rpcProperties$pr3; | ||
async get_fork_block(block_hash, verbosity) { | ||
return this.rpcProxy.get_fork_block(block_hash, verbosity ? verbosity : null); | ||
} | ||
if (res.id !== payload[i].id) { | ||
return new _exceptions.IdNotMatchedInBatchException(i, payload[i].id, res.id); | ||
} | ||
async get_consensus() { | ||
return this.rpcProxy.get_consensus(); | ||
} // Module Experiment | ||
return (_ctx$rpcProperties$pr = (_ctx$rpcProperties$pr2 = (_ctx$rpcProperties$pr3 = ctx.rpcProperties[proxied[i][0]]).resultFormatters) === null || _ctx$rpcProperties$pr2 === void 0 ? void 0 : _ctx$rpcProperties$pr2.call(_ctx$rpcProperties$pr3, res.result)) !== null && _ctx$rpcProperties$pr !== void 0 ? _ctx$rpcProperties$pr : res.result; | ||
}); | ||
} | ||
} | ||
}); // TODO fix me | ||
async dry_run_transaction(tx) { | ||
return this.rpcProxy.dry_run_transaction(tx); | ||
} | ||
async calculate_dao_maximum_withdraw(out_point, block_hash) { | ||
return this.rpcProxy.calculate_dao_maximum_withdraw(out_point, block_hash); | ||
} // Module Net | ||
async local_node_info() { | ||
return this.rpcProxy.local_node_info(); | ||
} | ||
async get_peers() { | ||
return this.rpcProxy.get_peers(); | ||
} | ||
async get_banned_addresses() { | ||
return this.rpcProxy.get_banned_addresses(); | ||
} | ||
async clear_banned_addresses() { | ||
return this.rpcProxy.clear_banned_addresses(); | ||
} | ||
async set_ban(address, command, ban_time, absolute, reason) { | ||
return this.rpcProxy.set_ban(address, command, ban_time || null, absolute !== undefined ? absolute : null, reason || null); | ||
} | ||
async sync_state() { | ||
return this.rpcProxy.sync_state(); | ||
} | ||
async set_network_active(state) { | ||
return this.rpcProxy.set_network_active(state); | ||
} | ||
async add_node(peer_id, address) { | ||
return this.rpcProxy.add_node(peer_id, address); | ||
} | ||
async remove_node(peer_id) { | ||
return this.rpcProxy.remove_node(peer_id); | ||
} | ||
async ping_peers() { | ||
return this.rpcProxy.ping_peers(); | ||
} // Module pool | ||
async send_transaction(tx, outputs_validator) { | ||
return this.rpcProxy.send_transaction(tx, outputs_validator || null); | ||
} | ||
async tx_pool_info() { | ||
return this.rpcProxy.tx_pool_info(); | ||
} | ||
async clear_tx_pool() { | ||
return this.rpcProxy.clear_tx_pool(); | ||
} | ||
async get_raw_tx_pool(verbose) { | ||
return this.rpcProxy.get_raw_tx_pool(verbose !== undefined ? verbose : null); | ||
} // Module Stats | ||
async get_blockchain_info() { | ||
return this.rpcProxy.get_blockchain_info(); | ||
} // Module Alert | ||
async send_alert(alert) { | ||
return this.rpcProxy.send_alert(alert); | ||
} // Module Miner | ||
params.forEach(p => proxied.push(p)); | ||
return proxied; | ||
}; | ||
} | ||
exports.RPC = RPC; | ||
exports.RPC = exports.CKBRPC = CKBRPC; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@ckb-lumos/rpc", | ||
"version": "0.18.0", | ||
"version": "0.19.0-alpha.0", | ||
"description": "RPC module for CKB", | ||
"author": "Xuejie Xiao <xxuejie@gmail.com>", | ||
"homepage": "https://github.com/nervosnetwork/lumos#readme", | ||
"license": "MIT", | ||
"main": "lib/index.js", | ||
"types": "lib/index.d.ts", | ||
"engines": { | ||
@@ -15,8 +13,10 @@ "node": ">=12.0.0" | ||
"lib": "lib", | ||
"test": "tests" | ||
"test": "__tests__" | ||
}, | ||
"files": [ | ||
"lib", | ||
"src" | ||
"lib" | ||
], | ||
"publishConfig": { | ||
"access": "public" | ||
}, | ||
"repository": { | ||
@@ -26,6 +26,10 @@ "type": "git", | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/nervosnetwork/lumos/issues" | ||
}, | ||
"scripts": { | ||
"fmt": "prettier --write \"{src,tests}/**/*.ts\" package.json", | ||
"lint": "eslint -c ../../.eslintrc.js \"{src,tests}/**/*.ts\"", | ||
"test": "echo \"No tests yet!\"", | ||
"doc": "../../node_modules/.bin/typedoc --out docs --mode modules --includeDeclarations --excludeExternals --ignoreCompilerErrors --theme default", | ||
"fmt": "prettier --write \"{src,tests,examples}/**/*.ts\" package.json", | ||
"lint": "eslint -c ../../.eslintrc.js \"{src,tests,examples}/**/*.ts\"", | ||
"test": "../../node_modules/.bin/jest", | ||
"build": "npm run build:types && npm run build:js", | ||
@@ -38,22 +42,11 @@ "build:types": "tsc --declaration --emitDeclarationOnly", | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/nervosnetwork/lumos/issues" | ||
}, | ||
"dependencies": { | ||
"@ckb-lumos/base": "0.18.0", | ||
"@ckb-lumos/bi": "0.18.0", | ||
"@ckb-lumos/toolkit": "0.18.0" | ||
"@ckb-lumos/bi": "^0.19.0-alpha.0", | ||
"axios": "0.21.4", | ||
"tslib": "2.3.1" | ||
}, | ||
"ava": { | ||
"extensions": [ | ||
"ts" | ||
], | ||
"require": [ | ||
"ts-node/register" | ||
] | ||
"devDependencies": { | ||
"jest": "^28.1.3" | ||
}, | ||
"publishConfig": { | ||
"access": "public" | ||
}, | ||
"gitHead": "732d60fdd2f4cbb7401df9b67c6295ea79c99180" | ||
"gitHead": "665f4e985dc1444a27e2e1db499d0ea64cf4d5b8" | ||
} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
No contributors or author data
MaintenancePackage does not specify a list of contributors or an author in package.json.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
218061
53
2878
1
1
1
1
0
1
+ Addedaxios@0.21.4
+ Addedtslib@2.3.1
+ Added@ckb-lumos/bi@0.19.0(transitive)
+ Addedaxios@0.21.4(transitive)
+ Addedfollow-redirects@1.15.9(transitive)
+ Addedtslib@2.3.1(transitive)
- Removed@ckb-lumos/base@0.18.0
- Removed@ckb-lumos/toolkit@0.18.0
- Removed@ckb-lumos/base@0.18.0(transitive)
- Removed@ckb-lumos/bi@0.18.0(transitive)
- Removed@ckb-lumos/toolkit@0.18.0(transitive)
- Removed@types/lodash@4.17.15(transitive)
- Removed@types/lodash.isequal@4.5.8(transitive)
- Removedb4a@1.6.7(transitive)
- Removedblake2b@2.1.4(transitive)
- Removedblake2b-wasm@2.4.0(transitive)
- Removedcross-fetch@3.2.0(transitive)
- Removedjs-xxhash@1.0.4(transitive)
- Removedlodash.isequal@4.5.0(transitive)
- Removednanoassert@2.0.0(transitive)
- Removednode-fetch@2.7.0(transitive)
- Removedtr46@0.0.3(transitive)
- Removedwebidl-conversions@3.0.1(transitive)
- Removedwhatwg-url@5.0.0(transitive)