├── .editorconfig ├── .gitignore ├── license ├── package.json ├── readme.md ├── src ├── detokenize.ts ├── index.ts ├── lookup.ts ├── parse.ts ├── stringify.ts ├── strip │ ├── index.ts │ ├── parser.ts │ └── tokens.ts ├── tokenize │ ├── context.ts │ ├── grammar.ts │ ├── index.ts │ ├── parser.ts │ └── tokens.ts ├── types.ts ├── utils.ts └── validate.ts ├── tasks ├── benchmark.js ├── sample_invalid.json ├── sample_with_comments.json ├── sample_with_errors.json └── sample_without_comments.json ├── test └── lib │ ├── fixtures.js │ └── index.js └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.err 3 | *.log 4 | ._* 5 | .cache 6 | .fseventsd 7 | .DocumentRevisions* 8 | .DS_Store 9 | .TemporaryItems 10 | .Trashes 11 | Thumbs.db 12 | 13 | dist 14 | node_modules 15 | package-lock.json 16 | test262 17 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021-present Fabio Spampinato 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a 6 | copy of this software and associated documentation files (the "Software"), 7 | to deal in the Software without restriction, including without limitation 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 | and/or sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 | DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsonc-simple-parser", 3 | "repository": "github:fabiospampinato/jsonc-simple-parser", 4 | "description": "A simple JSON parser that supports comments and optional trailing commas.", 5 | "version": "3.0.0", 6 | "type": "module", 7 | "main": "dist/index.js", 8 | "exports": "./dist/index.js", 9 | "types": "./dist/index.d.ts", 10 | "scripts": { 11 | "benchmark": "tsex benchmark", 12 | "benchmark:watch": "tsex benchmark --watch", 13 | "clean": "tsex clean", 14 | "compile": "tsex compile", 15 | "compile:watch": "tsex compile --watch", 16 | "test:test262:init": "git clone https://github.com/tc39/test262.git ./test/test262 && rm ./test/test262/test/built-ins/JSON/parse/name.js", 17 | "test:test262:prelude": "{ echo 'var module = {}, exports = {};' && esbuild dist/index.js --bundle --format=cjs --minify --target=es2016 && echo 'JSON.parse=module.exports.default.parse;JSON.stringify=module.exports.default.stringify;' } > test/test262/prelude.js", 18 | "test:test262:execute": "test262-harness -t 8 --prelude ./test/test262/prelude.js ./test/test262/test/built-ins/JSON/parse/*.js ./test/test262/test/built-ins/JSON/stringify/*.js", 19 | "test:test262": "npm run test:test262:prelude && npm run test:test262:execute", 20 | "test:lib": "fava '**/test/lib/*'", 21 | "test:lib:watch": "fava --watch '**/test/lib/*'", 22 | "test": "npm run test:test262 && npm run test:lib", 23 | "prepublishOnly": "npm run clean && npm run compile && npm run test" 24 | }, 25 | "keywords": [ 26 | "jsonc", 27 | "json", 28 | "comments", 29 | "trailing commas", 30 | "commas", 31 | "parser", 32 | "parse", 33 | "stringify", 34 | "tiny", 35 | "simple" 36 | ], 37 | "dependencies": { 38 | "reghex": "^3.0.2" 39 | }, 40 | "devDependencies": { 41 | "fava": "^0.0.6", 42 | "benchloop": "^2.1.0", 43 | "esbuild": "^0.15.13", 44 | "json5": "^2.2.1", 45 | "jsonc-parser": "^3.2.0", 46 | "lodash": "^4.17.21", 47 | "test262-harness": "^7.5.2", 48 | "type-fest": "^3.2.0", 49 | "tsex": "^1.1.2", 50 | "typescript": "^4.8.4" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # JSONC Simple Parser 2 | 3 | A simple JSON parser that supports comments and optional trailing commas. 4 | 5 | ## Features 6 | 7 | - **Tiny**: 8 | - It's ~3.5kb minified and gzipped, if you aren't already using [RegHex](https://github.com/kitten/reghex), otherwise it's just ~2kb. 9 | - Even if you aren't using [RegHex](https://github.com/kitten/reghex) already (you should) that's ~32% smaller than VS Code's [jsonc-parser](https://www.npmjs.com/package/jsonc-parser) and ~62% smaller than [JSON5](https://www.npmjs.com/package/json5). 10 | - **Performant**: 11 | - When parsing regular JSON it's ~10x faster than VS Code's [jsonc-parser](https://www.npmjs.com/package/jsonc-parser), ~70x faster than [JSON5](https://www.npmjs.com/package/json5) and just as fast as the native `JSON.parse`. 12 | - When parsing JSON with comments or trailing commas it's just as fast as VS Code's [jsonc-parser](https://www.npmjs.com/package/jsonc-parser) and ~6x faster than [JSON5](https://www.npmjs.com/package/json5). 13 | - **Tested**: 14 | - It passes all 274 tests regarding JSON from ECMA's [test262](https://github.com/tc39/test262) test suite. 15 | - The parser is obviously not spec compliant but this means that while adding support for comments and trailing commas probably nothing else got broken. 16 | 17 | ## Install 18 | 19 | ```sh 20 | npm install --save jsonc-simple-parser 21 | ``` 22 | 23 | ## Usage 24 | 25 | ```ts 26 | import JSONC from 'jsonc-simple-parser'; 27 | 28 | const source = ` 29 | { // This is an example 30 | "foo": 123, 31 | /* TRAILING COMMAS */ 32 | "bar": [1, 2, 3,], 33 | } 34 | `; 35 | 36 | const result = { 37 | foo: 123, 38 | bar: [1, 2, 3] 39 | }; 40 | 41 | JSONC.parse ( source ); // => returns an object that's deeply equal to `result` 42 | JSONC.stringify ( result ); // => same as calling `JSON.stringify` 43 | ``` 44 | 45 | ## License 46 | 47 | MIT © Fabio Spampinato 48 | -------------------------------------------------------------------------------- /src/detokenize.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {Token, LookupToken} from './types'; 5 | 6 | /* MAIN */ 7 | 8 | const detokenize = ( token: Token | LookupToken ): string => { 9 | 10 | if ( 'source' in token ) return token.source; 11 | 12 | return token.children.map ( detokenize ).join ( '' ); 13 | 14 | }; 15 | 16 | /* EXPORT */ 17 | 18 | export default detokenize; 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import detokenize from './detokenize'; 5 | import lookup from './lookup'; 6 | import parse from './parse'; 7 | import stringify from './stringify'; 8 | import strip from './strip'; 9 | import tokenize from './tokenize'; 10 | import validate from './validate'; 11 | 12 | /* MAIN */ 13 | 14 | const JSONC = { 15 | ast: { 16 | parse: tokenize, 17 | stringify: detokenize 18 | }, 19 | lookup, 20 | parse, 21 | stringify, 22 | strip, 23 | validate 24 | }; 25 | 26 | /* EXPORT */ 27 | 28 | export default JSONC; 29 | -------------------------------------------------------------------------------- /src/lookup.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {JSONValue} from './types'; 5 | import type {ChildToken, ParentToken, AST} from './types'; 6 | import type {LookupChildToken, LookupParentToken, LookupPath, LookupResultToken, LookupResult} from './types'; 7 | import detokenize from './detokenize'; 8 | import parse from './parse'; 9 | import tokenize from './tokenize'; 10 | import Utils from './utils'; 11 | 12 | /* MAIN */ 13 | 14 | //FIXME: This is wonky, it should be much more robust, it should probably be rewritten from scratch 15 | 16 | const getLookupToken = ( ast: AST, position: number ): LookupChildToken | null => { 17 | 18 | let tokenPosition: LookupChildToken | null = null; 19 | let offsetCurrent = 0; 20 | 21 | const checkPositionToken = ( token: LookupChildToken ): void => { 22 | if ( token.start > position ) return; 23 | if ( token.end <= ( position - 1 ) ) return; 24 | if ( tokenPosition && Utils.isTokenLiteral ( tokenPosition ) ) return; 25 | if ( tokenPosition && Utils.isTokenIgnored ( token ) ) return; 26 | tokenPosition = token; 27 | }; 28 | 29 | const parseChild = ( token: ChildToken, parent: LookupParentToken | null, depth: number, index: number ): LookupChildToken => { 30 | const {type, source} = token; 31 | const start = offsetCurrent; 32 | const end = ( offsetCurrent += source.length ); 33 | const ltoken: LookupChildToken = {type, source, token, parent, depth, index, start, end}; 34 | checkPositionToken ( ltoken ); 35 | return ltoken; 36 | }; 37 | 38 | const parseParent = ( token: ParentToken, parent: LookupParentToken | null, depth: number, index: number ): LookupParentToken => { 39 | const {type} = token; 40 | const ltoken: LookupParentToken = {type, children: [], token, parent, depth, index}; 41 | ltoken.children = token.children.map ( ( child, index ) => parseToken ( child, ltoken, depth + 1, index ) ).filter ( Utils.isTokenLiteral ); 42 | ltoken.children.forEach ( ( token, index ) => token.index = index ); 43 | return ltoken; 44 | }; 45 | 46 | const parseToken = ( token: ChildToken | ParentToken, parent: LookupParentToken | null, depth: number, index: number ): LookupChildToken | LookupParentToken => { 47 | if ( 'children' in token ) return parseParent ( token, parent, depth, index ); 48 | return parseChild ( token, parent, depth, index ); 49 | }; 50 | 51 | parseToken ( ast, null, -1, -1 ); 52 | 53 | return tokenPosition; 54 | 55 | }; 56 | 57 | const getLookupPath = ( token: LookupChildToken | null ): LookupPath => { 58 | 59 | if ( !token ) return []; 60 | 61 | const path: LookupPath = []; 62 | 63 | while ( token ) { 64 | 65 | const parent = token.parent; 66 | 67 | if ( !parent ) break; 68 | 69 | if ( Utils.isTokenLiteral ( token ) ) { 70 | 71 | if ( parent.type === 'Object' ) { 72 | 73 | if ( Utils.isEven ( token.index ) ) { 74 | 75 | path.unshift ( JSON.parse ( token.source ) ); 76 | 77 | } else { 78 | 79 | path.unshift ( JSON.parse ( parent.children[token.index - 1].source ) ); 80 | 81 | } 82 | 83 | } else if ( parent.type === 'Array' ) { 84 | 85 | path.unshift ( token.index ); 86 | 87 | } 88 | 89 | } 90 | 91 | token = parent; 92 | 93 | } 94 | 95 | return path; 96 | 97 | }; 98 | 99 | const getLookupIsInsideProperty = ( token: LookupChildToken | null ): boolean => { 100 | 101 | if ( !token ) return false; 102 | 103 | const parentType = token.parent?.type; 104 | 105 | if ( parentType === 'Object' ) return Utils.isTokenLiteral ( token ) ? Utils.isEven ( token.index ) : token.parent?.parent?.type === 'Array'; 106 | 107 | if ( parentType === 'Array' ) return Utils.isTokenLiteral ( token ) || token.parent?.parent?.type === 'Array'; 108 | 109 | return false; 110 | 111 | }; 112 | 113 | const getLookupIsInsideValue = ( token: LookupChildToken | null ): boolean => { 114 | 115 | if ( !token ) return false; 116 | 117 | const isParentEmpty = !token.parent?.children.length; 118 | const parentType = token.parent?.type; 119 | 120 | if ( parentType === 'Object' ) return isParentEmpty || Utils.isTokenDelimiter ( token ) || ( Utils.isTokenLiteral ( token ) && Utils.isOdd ( token.index ) ); 121 | 122 | if ( parentType === 'Array' ) return ( token.depth > 1 ); 123 | 124 | return false; 125 | 126 | }; 127 | 128 | const getLookupProperty = ( token: LookupChildToken | null, isInsideProperty: boolean ): string | number | undefined => { 129 | 130 | if ( !isInsideProperty || !token ) return; 131 | 132 | const parentType = token.parent?.type; 133 | 134 | if ( Utils.isTokenLiteral ( token ) ) { 135 | 136 | if ( parentType === 'Array' ) return token.index; 137 | 138 | return parse ( detokenize ( token ) ); 139 | 140 | } else { 141 | 142 | if ( parentType === 'Array' ) return token.parent?.index; 143 | 144 | } 145 | 146 | }; 147 | 148 | const getLookupValue = ( token: LookupChildToken | null, isInsideValue: boolean, usePartialScanning: boolean ): JSONValue | undefined => { 149 | 150 | if ( !isInsideValue || !token ) return; 151 | 152 | if ( Utils.isTokenLiteral ( token ) ) return parse ( detokenize ( token ) ); 153 | 154 | if ( usePartialScanning ) return; 155 | 156 | const {parent} = token; 157 | 158 | if ( !parent || !parent.token ) return; 159 | 160 | if ( parent.type !== 'Array' && parent.type !== 'Object' ) return; 161 | 162 | return parse ( detokenize ( parent.token ) ); 163 | 164 | }; 165 | 166 | const lookup = ( text: string, position: number, usePartialScanning: boolean = true ): LookupResult => { 167 | 168 | const limit = usePartialScanning ? position : Infinity; 169 | const ast = tokenize ( text, limit ); 170 | const token = getLookupToken ( ast, position ); 171 | const path = getLookupPath ( token ); 172 | const isInsideProperty = getLookupIsInsideProperty ( token ); 173 | const isInsideValue = getLookupIsInsideValue ( token ); 174 | const property = getLookupProperty ( token, isInsideProperty ); 175 | const value = getLookupValue ( token, isInsideValue, usePartialScanning ); 176 | const t = token ? { type: token.type, start: token.start, end: token.end, source: token.source } as LookupResultToken : undefined; 177 | const result: LookupResult = {path, property, value, token: t, isInsideProperty, isInsideValue}; 178 | 179 | return result; 180 | 181 | }; 182 | 183 | /* EXPORT */ 184 | 185 | export default lookup; 186 | -------------------------------------------------------------------------------- /src/parse.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import strip from './strip'; 5 | 6 | /* HELPERS */ 7 | 8 | const _parse = JSON.parse; 9 | 10 | /* MAIN */ 11 | 12 | const parse = ( text: string, reviver?: ( this: any, key: string, value: any ) => any ): any => { 13 | 14 | text = `${text}`; // "text" can actually be anything, but we need a string here 15 | 16 | if ( reviver ) { // A "reviver" could have side effects, it may not be safe to call it twice 17 | 18 | return _parse ( strip ( text ), reviver ); 19 | 20 | } else { 21 | 22 | try { // Shortcut in case there are no comments or trailing commas 23 | 24 | return _parse ( text ); 25 | 26 | } catch ( error ) { // Stripping out any potential comments and trailing commas and trying again 27 | 28 | const textStripped = strip ( text ); 29 | 30 | if ( text === textStripped ) { // Parsing it again would inevitably lead to the same error 31 | 32 | throw error; 33 | 34 | } else { 35 | 36 | return _parse ( textStripped ); 37 | 38 | } 39 | 40 | } 41 | 42 | } 43 | 44 | }; 45 | 46 | /* EXPORT */ 47 | 48 | export default parse; 49 | -------------------------------------------------------------------------------- /src/stringify.ts: -------------------------------------------------------------------------------- 1 | 2 | /* EXPORT */ 3 | 4 | export default JSON.stringify; 5 | -------------------------------------------------------------------------------- /src/strip/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import Context from '../tokenize/context'; 5 | import parser from './parser'; 6 | 7 | /* MAIN */ 8 | 9 | const strip = ( text: string ): string => { 10 | 11 | Context.init (); 12 | 13 | return parser ( text ); 14 | 15 | }; 16 | 17 | /* EXPORT */ 18 | 19 | export default strip; 20 | -------------------------------------------------------------------------------- /src/strip/parser.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import {parse} from 'reghex'; 5 | import grammar from '../tokenize/grammar'; 6 | import tokens from './tokens'; 7 | 8 | /* MAIN */ 9 | 10 | const parser = parse ( grammar ( tokens ) ); 11 | 12 | /* EXPORT */ 13 | 14 | export default parser; 15 | -------------------------------------------------------------------------------- /src/strip/tokens.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {ParseTokensMap} from '../types'; 5 | import Context from '../tokenize/context'; 6 | import TokenizeTokens from '../tokenize/tokens'; 7 | 8 | /* HELPERS */ 9 | 10 | const Delete = ( values: [string] ): string => { 11 | Context.offset += values[0].length; 12 | return ''; 13 | }; 14 | 15 | const Passthrough = ( values: string[] ): string => { 16 | const source = values.join ( '' ); 17 | Context.offset += source.length; 18 | return source; 19 | }; 20 | 21 | const Unwrapped = ( quasis: string[], token: RegExp | string ): RegExp | string => { 22 | return token; 23 | }; 24 | 25 | Unwrapped.unwrapped = true; 26 | 27 | /* MAIN */ 28 | 29 | const Tokens: ParseTokensMap = { 30 | ...TokenizeTokens, 31 | Passthrough, 32 | Newline: Delete, 33 | Whitespace: Delete, 34 | CommentLine: Delete, 35 | CommentBlock: Delete, 36 | Comma: Unwrapped, 37 | CommaTrailing: Delete, 38 | Colon: Unwrapped, 39 | Null: Unwrapped, 40 | True: Unwrapped, 41 | False: Unwrapped, 42 | Number: Unwrapped, 43 | String: Unwrapped, 44 | ArrayOpen: Unwrapped, 45 | ArrayClose: Unwrapped, 46 | Array: Passthrough, 47 | ObjectOpen: Unwrapped, 48 | ObjectClose: Unwrapped, 49 | Object: Passthrough, 50 | Root: Passthrough 51 | }; 52 | 53 | /* EXPORT */ 54 | 55 | export default Tokens; 56 | -------------------------------------------------------------------------------- /src/tokenize/context.ts: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | const Context = { 5 | 6 | /* VARIABLES */ 7 | 8 | offset: 0, 9 | offsetMax: Infinity, 10 | 11 | /* API */ 12 | 13 | init: ( limit: number = Infinity ): void => { 14 | 15 | Context.offset = 0; 16 | Context.offsetMax = limit; 17 | 18 | } 19 | 20 | }; 21 | 22 | /* EXPORT */ 23 | 24 | export default Context; 25 | -------------------------------------------------------------------------------- /src/tokenize/grammar.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {ParseTokensMap, ParseMatchersMap} from '../types'; 5 | import Utils from '../utils'; 6 | 7 | /* MAIN */ 8 | 9 | const grammar = ( tokens: ParseTokensMap ) => { 10 | 11 | /* MATCHERS */ 12 | 13 | const $ = Utils.tokens2matchers ( tokens ); 14 | 15 | /* EARLY RETURN */ 16 | 17 | const EarlyReturn 18 | = $.EarlyReturn`${''}`; 19 | 20 | /* INSUFFICIENT */ 21 | 22 | const Insufficient 23 | = $.Insufficient`${/[^]?/}`; 24 | 25 | /* INVALID */ 26 | 27 | const Invalid 28 | = $.Invalid`${/[^]/}`; 29 | 30 | /* TRIVIA */ 31 | 32 | const Newline 33 | = $.Newline`${/\r?\n|\r/}`; 34 | 35 | const Whitespace 36 | = $.Whitespace`${/[ \t]+/}`; 37 | 38 | const CommentLine 39 | = $.CommentLine`${/\/\/.*/}`; 40 | 41 | const CommentBlock 42 | = $.CommentBlock`${/\/\*[^]*?\*\//}`; 43 | 44 | const Trivia 45 | = $.Passthrough`${Newline} | ${Whitespace} | ${CommentLine} | ${CommentBlock}`; 46 | 47 | /* _ */ 48 | 49 | const _Separated 50 | = $.Passthrough`${Trivia}*`; 51 | 52 | const _Merged 53 | = $.Whitespace`${/(?:[ \t\r\n]|\/\/.*|\/\*[^]*?\*\/)*/}`; 54 | 55 | const _ = $.Newline === $.Whitespace && $.Whitespace === $.CommentLine && $.CommentLine === $.CommentBlock ? _Merged : _Separated; 56 | 57 | /* COMMA */ 58 | 59 | const Comma 60 | = $.Comma`${','}`; 61 | 62 | const CommaTrailing 63 | = $.CommaTrailing`${','}`; 64 | 65 | /* COLON */ 66 | 67 | const Colon 68 | = $.Colon`${':'}`; 69 | 70 | /* NULL */ 71 | 72 | const Null 73 | = $.Null`${'null'}`; 74 | 75 | /* BOOLEAN */ 76 | 77 | const True 78 | = $.True`${'true'}`; 79 | 80 | const False 81 | = $.False`${'false'}`; 82 | 83 | const Boolean 84 | = $.Passthrough`${True} | ${False}`; 85 | 86 | /* NUMBER */ 87 | 88 | const Number 89 | = $.Number`${/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][-+]?\d+)?/}`; 90 | 91 | /* STRING */ 92 | 93 | const String 94 | = $.String`${/"(?:[^\u0000-\u001F\\"]|\\["bfnrt\\/]|\\u[0-9a-fA-F]{4})*"/}`; 95 | 96 | /* ARRAY */ 97 | 98 | const ArrayOpen 99 | = $.ArrayOpen`${'['}`; 100 | 101 | const ArrayClose 102 | = $.ArrayClose`${']'}`; 103 | 104 | const ArrayMember 105 | = $.Passthrough`${_} ${() => Literal} ${_}`; 106 | 107 | const ArrayMembers 108 | = $.Passthrough`${ArrayMember} (!${EarlyReturn} ${Comma} ${ArrayMember})* ${CommaTrailing}?`; 109 | 110 | const Array 111 | = $.Array`${ArrayOpen} ${_} ${ArrayMembers}? ${_} (${EarlyReturn} | ${ArrayClose})`; 112 | 113 | /* OBJECT */ 114 | 115 | const ObjectOpen 116 | = $.ObjectOpen`${'{'}`; 117 | 118 | const ObjectClose 119 | = $.ObjectClose`${'}'}`; 120 | 121 | const ObjectMember 122 | = $.Passthrough`${_} ${String} (${EarlyReturn} | ${_} ${Colon} ${_} ${() => Literal} ${_})`; 123 | 124 | const ObjectMembers 125 | = $.Passthrough`${ObjectMember} (!${EarlyReturn} ${Comma} ${ObjectMember})* ${CommaTrailing}?`; 126 | 127 | const Object 128 | = $.Object`${ObjectOpen} ${_} ${ObjectMembers}? ${_} (${EarlyReturn} | ${ObjectClose})`; 129 | 130 | /* LITERAL */ 131 | 132 | const Literal 133 | = $.Passthrough`${Null} | ${Boolean} | ${Number} | ${String} | ${Object} | ${Array}`; 134 | 135 | /* ROOT */ 136 | 137 | const Root 138 | = $.Root`${_} (${Literal} | ${Insufficient}) (${EarlyReturn} | ${_} ${Invalid}?)`; 139 | 140 | /* RETURN */ 141 | 142 | return Root; 143 | 144 | }; 145 | 146 | /* EXPORT */ 147 | 148 | export default grammar; 149 | -------------------------------------------------------------------------------- /src/tokenize/index.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {AST} from '../types'; 5 | import Context from './context'; 6 | import parser from './parser'; 7 | 8 | /* MAIN */ 9 | 10 | const tokenize = ( text: string, limit?: number ): AST => { 11 | 12 | Context.init ( limit ); 13 | 14 | return parser ( text ); 15 | 16 | }; 17 | 18 | /* EXPORT */ 19 | 20 | export default tokenize; 21 | -------------------------------------------------------------------------------- /src/tokenize/parser.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import {parse} from 'reghex'; 5 | import grammar from './grammar'; 6 | import tokens from './tokens'; 7 | 8 | /* MAIN */ 9 | 10 | const parser = parse ( grammar ( tokens ) ); 11 | 12 | /* EXPORT */ 13 | 14 | export default parser; 15 | -------------------------------------------------------------------------------- /src/tokenize/tokens.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import type {ParseTokensMap, ChildToken, ParentToken, NewlineToken, WhitespaceToken, CommentLineToken, CommentBlockToken, CommaToken, CommaTrailingToken, ColonToken, NullToken, TrueToken, FalseToken, NumberToken, StringToken, ArrayOpenToken, ArrayCloseToken, ArrayToken, ObjectOpenToken, ObjectCloseToken, ObjectToken, RootToken, Token} from '../types'; 5 | import Utils from '../utils'; 6 | import Context from './context'; 7 | 8 | /* HELPERS */ 9 | 10 | const makeChild = ( type: string ) => ( values: [string] ): T => { 11 | const source = values[0]; 12 | Context.offset += source.length; 13 | return {type, source} as T; 14 | }; 15 | 16 | const makeParent = ( type: string ) => ( values: (Token | Token[])[] ): T => { 17 | const children = values.flat (); 18 | return {type, children} as T; 19 | }; 20 | 21 | /* MAIN */ 22 | 23 | const Tokens: ParseTokensMap = { 24 | EarlyReturn: (): [] | undefined => { 25 | if ( Context.offset > Context.offsetMax ) return []; 26 | }, 27 | Insufficient: ( values: [string] ): never => { 28 | if ( values[0].length ) Tokens.Invalid ( values ); 29 | throw new SyntaxError ( 'Unexpected end of JSONC input' ); 30 | }, 31 | Invalid: ( values: [string] ): never => { 32 | throw new SyntaxError ( `Unexpected token ${values[0]} in JSONC at position ${Context.offset}` ); 33 | }, 34 | Passthrough: ( values: (string | string[] | Token | Token[])[] ): Token[] => { 35 | return values.flat ().filter ( Utils.isToken ); 36 | }, 37 | Newline: makeChild ( 'Newline' ), 38 | Whitespace: makeChild ( 'Whitespace' ), 39 | CommentLine: makeChild ( 'CommentLine' ), 40 | CommentBlock: makeChild ( 'CommentBlock' ), 41 | Comma: makeChild ( 'Comma' ), 42 | CommaTrailing: makeChild ( 'CommaTrailing' ), 43 | Colon: makeChild ( 'Colon' ), 44 | Null: makeChild ( 'Null' ), 45 | True: makeChild ( 'True' ), 46 | False: makeChild ( 'False' ), 47 | Number: makeChild ( 'Number' ), 48 | String: makeChild ( 'String' ), 49 | ArrayOpen: makeChild ( 'ArrayOpen' ), 50 | ArrayClose: makeChild ( 'ArrayClose' ), 51 | Array: makeParent ( 'Array' ), 52 | ObjectOpen: makeChild ( 'ObjectOpen' ), 53 | ObjectClose: makeChild ( 'ObjectClose' ), 54 | Object: makeParent ( 'Object' ), 55 | Root: makeParent ( 'Root' ) 56 | }; 57 | 58 | /* EXPORT */ 59 | 60 | export default Tokens; 61 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | 2 | /* HELPERS */ 3 | 4 | type JSONValue = import ( 'type-fest' ).JsonValue; 5 | 6 | type Matcher = ( quasis: TemplateStringsArray, ...re: (string | RegExp | (() => string | RegExp))[] ) => any; 7 | 8 | /* MAIN */ 9 | 10 | type ChildToken = { 11 | type: string, 12 | source: string 13 | }; 14 | 15 | type ParentToken = { 16 | type: string, 17 | children: Token[] 18 | }; 19 | 20 | type NewlineToken = ChildToken & { 21 | type: 'Newline' 22 | }; 23 | 24 | type WhitespaceToken = ChildToken & { 25 | type: 'Whitespace' 26 | }; 27 | 28 | type CommentLineToken = ChildToken & { 29 | type: 'CommentLine' 30 | }; 31 | 32 | type CommentBlockToken = ChildToken & { 33 | type: 'CommentBlock' 34 | }; 35 | 36 | type CommaToken = ChildToken & { 37 | type: 'Comma' 38 | }; 39 | 40 | type CommaTrailingToken = ChildToken & { 41 | type: 'CommaTrailing' 42 | }; 43 | 44 | type ColonToken = ChildToken & { 45 | type: 'Colon' 46 | }; 47 | 48 | type NullToken = ChildToken & { 49 | type: 'Null' 50 | }; 51 | 52 | type TrueToken = ChildToken & { 53 | type: 'True' 54 | }; 55 | 56 | type FalseToken = ChildToken & { 57 | type: 'False' 58 | }; 59 | 60 | type NumberToken = ChildToken & { 61 | type: 'Number' 62 | }; 63 | 64 | type StringToken = ChildToken & { 65 | type: 'String' 66 | }; 67 | 68 | type ArrayOpenToken = ChildToken & { 69 | type: 'ArrayOpen' 70 | }; 71 | 72 | type ArrayCloseToken = ChildToken & { 73 | type: 'ArrayClose' 74 | }; 75 | 76 | type ArrayToken = ParentToken & { 77 | type: 'Array' 78 | }; 79 | 80 | type ObjectOpenToken = ChildToken & { 81 | type: 'ObjectOpen' 82 | }; 83 | 84 | type ObjectCloseToken = ChildToken & { 85 | type: 'ObjectClose' 86 | }; 87 | 88 | type ObjectToken = ParentToken & { 89 | type: 'Object' 90 | }; 91 | 92 | type RootToken = ParentToken & { 93 | type: 'Root' 94 | }; 95 | 96 | /* TOKENS GROUPS */ 97 | 98 | type AbstractToken = ChildToken | ParentToken; 99 | type IgnoredToken = TriviaToken | SeparationToken; 100 | type LiteralToken = NullToken | TrueToken | FalseToken | NumberToken | StringToken | ArrayToken | ObjectToken; 101 | type TriviaToken = NewlineToken | WhitespaceToken | CommentLineToken | CommentBlockToken; 102 | type OpenToken = ArrayOpenToken | ObjectOpenToken; 103 | type CloseToken = ArrayCloseToken | ObjectCloseToken; 104 | type DelimiterToken = OpenToken | CloseToken; 105 | type SeparationToken = CommaToken | CommaTrailingToken | ColonToken; 106 | type SpecialToken = RootToken; 107 | type Token = AbstractToken | LiteralToken | TriviaToken | DelimiterToken | SeparationToken | SpecialToken; 108 | type AST = RootToken; 109 | 110 | /* TOKENS MAPS */ 111 | 112 | type ParseTokensType = 'EarlyReturn' | 'Passthrough' | 'Insufficient' | 'Invalid' | 'Newline' | 'Whitespace' | 'CommentLine' | 'CommentBlock' | 'Comma' | 'CommaTrailing' | 'Colon' | 'Null' | 'True' | 'False' | 'Number' | 'String' | 'ArrayOpen' | 'ArrayClose' | 'Array' | 'ObjectOpen' | 'ObjectClose' | 'Object' | 'Root'; 113 | type ParseTokensMap = Record; 114 | type ParseMatchersMap = Record; 115 | 116 | /* LOOKUP */ 117 | 118 | type LookupChildToken = { 119 | type: string, 120 | source: string, 121 | token: ChildToken, 122 | parent: LookupParentToken | null, 123 | depth: number, 124 | index: number, 125 | start: number, 126 | end: number 127 | }; 128 | 129 | type LookupParentToken = { 130 | type: string, 131 | children: LookupToken[], 132 | token: ParentToken, 133 | parent: LookupParentToken | null, 134 | depth: number, 135 | index: number 136 | }; 137 | 138 | type LookupToken = LookupChildToken | LookupParentToken; 139 | 140 | type LookupPath = (string | number)[]; 141 | 142 | type LookupResultToken = { 143 | type: ParseTokensType, 144 | source: string, 145 | start: number, 146 | end: number 147 | }; 148 | 149 | type LookupResult = { 150 | path: LookupPath, 151 | property: string | number | undefined, 152 | value: JSONValue | undefined, 153 | token: LookupResultToken | undefined, 154 | isInsideProperty: boolean, 155 | isInsideValue: boolean 156 | }; 157 | 158 | /* EXPORT */ 159 | 160 | export type {JSONValue}; 161 | export type {ChildToken, ParentToken, NewlineToken, WhitespaceToken, CommentLineToken, CommentBlockToken, CommaToken, CommaTrailingToken, ColonToken, NullToken, TrueToken, FalseToken, NumberToken, StringToken, ArrayOpenToken, ArrayCloseToken, ArrayToken, ObjectOpenToken, ObjectCloseToken, ObjectToken, RootToken}; 162 | export type {AbstractToken, IgnoredToken, LiteralToken, TriviaToken, OpenToken, CloseToken, DelimiterToken, SeparationToken, SpecialToken, Token, AST}; 163 | export type {ParseTokensMap, ParseMatchersMap}; 164 | export type {LookupChildToken, LookupParentToken, LookupToken, LookupPath, LookupResultToken, LookupResult}; 165 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import {match} from 'reghex'; 5 | import type {DelimiterToken, IgnoredToken, LiteralToken, Token, ParseTokensMap, LookupToken} from './types'; 6 | 7 | /* MAIN */ 8 | 9 | const Utils = { 10 | 11 | /* VARIABLES */ 12 | 13 | tokenDelimiterTypes: new Set ([ 'ArrayOpen', 'ArrayClose', 'ObjectOpen', 'ObjectClose' ]), 14 | tokenIgnoredTypes: new Set ([ 'Newline', 'Whitespace', 'CommentLine', 'CommentBlock', 'Comma', 'CommaTrailing', 'Colon' ]), 15 | tokenLiteralTypes: new Set ([ 'Null', 'True', 'False', 'Number', 'String', 'Array', 'Object' ]), 16 | 17 | /* API */ 18 | 19 | isEven: ( number: number ): boolean => { 20 | 21 | return !( number % 2 ); 22 | 23 | }, 24 | 25 | isOdd: ( number: number ): boolean => { 26 | 27 | return !Utils.isEven ( number ); 28 | 29 | }, 30 | 31 | isString: ( value: any ): value is string => { 32 | 33 | return typeof value === 'string'; 34 | 35 | }, 36 | 37 | isToken: ( value: Token | string ): value is Token => { 38 | 39 | return !Utils.isString ( value ); 40 | 41 | }, 42 | 43 | isTokenDelimiter: ( token: Token | LookupToken ): token is DelimiterToken => { 44 | 45 | return Utils.tokenDelimiterTypes.has ( token.type ); 46 | 47 | }, 48 | 49 | isTokenIgnored: ( token: Token | LookupToken ): token is IgnoredToken => { 50 | 51 | return Utils.tokenIgnoredTypes.has ( token.type ); 52 | 53 | }, 54 | 55 | isTokenLiteral: ( token: Token | LookupToken ): token is LiteralToken => { 56 | 57 | return Utils.tokenLiteralTypes.has ( token.type ); 58 | 59 | }, 60 | 61 | tokens2matchers: ( tokens: Tokens ): Matchers => { 62 | 63 | const cache = new Map (); 64 | 65 | return Object.keys ( tokens ).reduce ( ( acc, type ) => { 66 | 67 | const transformer = tokens[type]; 68 | 69 | const matcher = transformer.unwrapped ? transformer : cache.get ( transformer ) || match ( type, transformer ); 70 | 71 | cache.set ( transformer, matcher ); 72 | 73 | acc[type] = matcher; 74 | 75 | return acc; 76 | 77 | }, {} as Matchers ); 78 | 79 | } 80 | 81 | }; 82 | 83 | /* EXPORT */ 84 | 85 | export default Utils; 86 | -------------------------------------------------------------------------------- /src/validate.ts: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import parse from './parse'; 5 | 6 | /* MAIN */ 7 | 8 | const validate = ( text: string ): boolean => { 9 | 10 | try { 11 | 12 | parse ( text ); 13 | 14 | return true; 15 | 16 | } catch { 17 | 18 | return false; 19 | 20 | } 21 | 22 | }; 23 | 24 | /* EXPORT */ 25 | 26 | export default validate; 27 | -------------------------------------------------------------------------------- /tasks/benchmark.js: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import benchmark from 'benchloop'; 5 | import JSON5 from 'json5'; 6 | import VSCJSONC from 'jsonc-parser'; 7 | import fs from 'node:fs'; 8 | import path from 'node:path'; 9 | import JSONC from '../dist/index.js'; 10 | 11 | const sampleInvalidPath = path.resolve ( process.cwd (), 'tasks', 'sample_invalid.json' ); 12 | const sampleInvalid = fs.readFileSync ( sampleInvalidPath, 'utf8' ); 13 | const sampleWithCommentsPath = path.resolve ( process.cwd (), 'tasks', 'sample_with_comments.json' ); 14 | const sampleWithComments = fs.readFileSync ( sampleWithCommentsPath, 'utf8' ); 15 | const sampleWithErrorsPath = path.resolve ( process.cwd (), 'tasks', 'sample_with_errors.json' ); 16 | const sampleWithErrors = fs.readFileSync ( sampleWithErrorsPath, 'utf8' ); 17 | const sampleWithoutCommentsPath = path.resolve ( process.cwd (), 'tasks', 'sample_without_comments.json' ); 18 | const sampleWithoutComments = fs.readFileSync ( sampleWithoutCommentsPath, 'utf8' ); 19 | 20 | /* MAIN */ 21 | 22 | benchmark.config ({ 23 | iterations: 7 24 | }); 25 | 26 | benchmark.group ( 'Parse', () => { 27 | 28 | benchmark.group ( 'Invalid', () => { 29 | 30 | benchmark ({ 31 | name: 'JSONC.parse', 32 | fn: () => { 33 | try { 34 | JSONC.parse ( sampleInvalid ); 35 | } catch {} 36 | } 37 | }); 38 | 39 | benchmark ({ 40 | name: 'JSONC.parse (VSC)', 41 | fn: () => { 42 | try { 43 | VSCJSONC.parse ( sampleInvalid ); 44 | } catch {} 45 | } 46 | }); 47 | 48 | benchmark ({ 49 | name: 'JSON5.parse', 50 | fn: () => { 51 | try { 52 | JSON5.parse ( sampleInvalid ); 53 | } catch {} 54 | } 55 | }); 56 | 57 | }); 58 | 59 | benchmark.group ( 'With Comments', () => { 60 | 61 | benchmark ({ 62 | name: 'JSONC.parse', 63 | fn: () => { 64 | JSONC.parse ( sampleWithComments ); 65 | } 66 | }); 67 | 68 | benchmark ({ 69 | name: 'JSONC.parse (VSC)', 70 | fn: () => { 71 | VSCJSONC.parse ( sampleWithComments ); 72 | } 73 | }); 74 | 75 | benchmark ({ 76 | name: 'JSON5.parse', 77 | fn: () => { 78 | JSON5.parse ( sampleWithComments ); 79 | } 80 | }); 81 | 82 | }); 83 | 84 | benchmark.group ( 'Without Comments', () => { 85 | 86 | benchmark ({ 87 | name: 'JSONC.parse', 88 | fn: () => { 89 | JSONC.parse ( sampleWithoutComments ); 90 | } 91 | }); 92 | 93 | benchmark ({ 94 | name: 'JSONC.parse (VSC)', 95 | fn: () => { 96 | VSCJSONC.parse ( sampleWithoutComments ); 97 | } 98 | }); 99 | 100 | benchmark ({ 101 | name: 'JSON5.parse', 102 | fn: () => { 103 | JSON5.parse ( sampleWithoutComments ); 104 | } 105 | }); 106 | 107 | benchmark ({ 108 | name: 'JSON.parse', 109 | fn: () => { 110 | JSON.parse ( sampleWithoutComments ); 111 | } 112 | }); 113 | 114 | }); 115 | 116 | }); 117 | 118 | benchmark.group ( 'Lookup', () => { 119 | 120 | benchmark.group ( 'Start', () => { 121 | 122 | benchmark ({ 123 | name: 'JSONC.lookup', 124 | fn: () => { 125 | JSONC.lookup ( sampleWithoutComments, 150 ); 126 | } 127 | }); 128 | 129 | benchmark ({ 130 | name: 'JSONC.lookup (VSC)', 131 | fn: () => { 132 | VSCJSONC.getLocation ( sampleWithoutComments, 150 ) 133 | } 134 | }); 135 | 136 | }); 137 | 138 | benchmark.group ( 'Middle', () => { 139 | 140 | benchmark ({ 141 | name: 'JSONC.lookup', 142 | fn: () => { 143 | JSONC.lookup ( sampleWithoutComments, 41111 ); 144 | } 145 | }); 146 | 147 | benchmark ({ 148 | name: 'JSONC.lookup (VSC)', 149 | fn: () => { 150 | VSCJSONC.getLocation ( sampleWithoutComments, 41111 ) 151 | } 152 | }); 153 | 154 | }); 155 | 156 | benchmark.group ( 'End', () => { 157 | 158 | benchmark ({ 159 | name: 'JSONC.lookup', 160 | fn: () => { 161 | JSONC.lookup ( sampleWithoutComments, 92900 ); 162 | } 163 | }); 164 | 165 | benchmark ({ 166 | name: 'JSONC.lookup (VSC)', 167 | fn: () => { 168 | VSCJSONC.getLocation ( sampleWithoutComments, 92900 ) 169 | } 170 | }); 171 | 172 | }); 173 | 174 | }); 175 | 176 | benchmark.group ( 'Validate', () => { 177 | 178 | benchmark ({ 179 | name: 'JSON', 180 | fn: () => { 181 | JSONC.validate ( sampleWithoutComments ); 182 | } 183 | }); 184 | 185 | benchmark ({ 186 | name: 'JSONC', 187 | fn: () => { 188 | JSONC.validate ( sampleWithComments ); 189 | } 190 | }); 191 | 192 | benchmark ({ 193 | name: 'Errors', 194 | fn: () => { 195 | JSONC.validate ( sampleWithErrors ); 196 | } 197 | }); 198 | 199 | }); 200 | -------------------------------------------------------------------------------- /tasks/sample_invalid.json: -------------------------------------------------------------------------------- 1 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " 2 | -------------------------------------------------------------------------------- /tasks/sample_without_comments.json: -------------------------------------------------------------------------------- 1 | { 2 | "txs":[ 3 | 4 | { 5 | "lock_time":0, 6 | "ver":1, 7 | "size":317, 8 | "inputs":[ 9 | { 10 | "sequence":4294967295, 11 | "witness":"304402202a187817bcd50c1d9b997e6cd588d9981d0c8e200d454094bd33e00429763514022028472fae97235000e5820e4d43337a9f6c07035336ad10df1cffaad7c2261e0401", 12 | "prev_out":{ 13 | "spent":true, 14 | "spending_outpoints":[ 15 | { 16 | "tx_index":0, 17 | "n":0 18 | } 19 | ], 20 | "tx_index":0, 21 | "type":0, 22 | "addr":"3QS8mSeJHxXMKYrt8Rxow83gC9M3j6itdo", 23 | "value":16789000, 24 | "n":2, 25 | "script":"a914f97a5dad27ef45407a3ebc857c86422ff4902bc387" 26 | }, 27 | "script":"1600145aadc4dc8a4b8fcf52a374fa9808f4b85913f738" 28 | } 29 | ], 30 | "weight":941, 31 | "time":1615209731, 32 | "tx_index":0, 33 | "vin_sz":1, 34 | "hash":"1447a654e8fa83cbec7f9c7bf01c59f34bc9355bbe7a5a41daaf641d47666dfc", 35 | "vout_sz":4, 36 | "relayed_by":"0.0.0.0", 37 | "out":[ 38 | { 39 | "spent":false, 40 | "tx_index":0, 41 | "type":0, 42 | "addr":"19wHj7jUGjoJqbXEtyUHENhCAHcSrDmVxm", 43 | "value":10214, 44 | "n":0, 45 | "script":"76a91462056e343ede6b112462c8f7beb47bb035201e9d88ac" 46 | }, 47 | { 48 | "spent":false, 49 | "tx_index":0, 50 | "type":0, 51 | "addr":"19wHj7jUGjoJqbXEtyUHENhCAHcSrDmVxm", 52 | "value":73539, 53 | "n":1, 54 | "script":"76a91462056e343ede6b112462c8f7beb47bb035201e9d88ac" 55 | }, 56 | { 57 | "spent":false, 58 | "tx_index":0, 59 | "type":0, 60 | "addr":"1K3x6Dx6mqjaEYutFRbyQCKHiW92cp5LaN", 61 | "value":8724000, 62 | "n":2, 63 | "script":"76a914c601153898a8850ce8f7625e3c1101b0e76161c588ac" 64 | }, 65 | { 66 | "spent":false, 67 | "tx_index":0, 68 | "type":0, 69 | "addr":"3QS8mSeJHxXMKYrt8Rxow83gC9M3j6itdo", 70 | "value":7969484, 71 | "n":3, 72 | "script":"a914f97a5dad27ef45407a3ebc857c86422ff4902bc387" 73 | } 74 | ] 75 | }, 76 | 77 | { 78 | "lock_time":673713, 79 | "ver":1, 80 | "size":404, 81 | "inputs":[ 82 | { 83 | "sequence":4294967295, 84 | "witness":"", 85 | "prev_out":{ 86 | "spent":true, 87 | "spending_outpoints":[ 88 | { 89 | "tx_index":0, 90 | "n":0 91 | } 92 | ], 93 | "tx_index":0, 94 | "type":0, 95 | "addr":"3HWfbLRKNLQSczg4uxCqMXUsRV6p4jYMcc", 96 | "value":34458303, 97 | "n":1, 98 | "script":"a914ad8ce19db63593d5f59a64432cff4406089edded87" 99 | }, 100 | "script":"22002063ed802dfba5828b6e9f7fb2525327bfd2d85fbec8b69c7fefc2e32680281876" 101 | } 102 | ], 103 | "weight":854, 104 | "time":1615209731, 105 | "tx_index":0, 106 | "vin_sz":1, 107 | "hash":"1e5c3961e95262ee9e1c8e29631e8a21e5b5718c623e868586338f9ade3ddac1", 108 | "vout_sz":2, 109 | "relayed_by":"0.0.0.0", 110 | "out":[ 111 | { 112 | "spent":false, 113 | "tx_index":0, 114 | "type":0, 115 | "addr":"364a5HDLudu8iuhdMiy5b6urnwLt48QoTB", 116 | "value":147212, 117 | "n":0, 118 | "script":"a9142ff4138a3899b73d266e6f9914cc727c7431229f87" 119 | }, 120 | { 121 | "spent":false, 122 | "tx_index":0, 123 | "type":0, 124 | "addr":"39jMddbFfkZbNU1CnVS8B2LX3aowTUVg9N", 125 | "value":34304396, 126 | "n":1, 127 | "script":"a91458324a3a0b68a1e91de127f6de819c5efc3df9c987" 128 | } 129 | ] 130 | }, 131 | 132 | { 133 | "lock_time":673713, 134 | "ver":1, 135 | "size":706, 136 | "inputs":[ 137 | { 138 | "sequence":4294967295, 139 | "witness":"", 140 | "prev_out":{ 141 | "spent":true, 142 | "spending_outpoints":[ 143 | { 144 | "tx_index":0, 145 | "n":0 146 | } 147 | ], 148 | "tx_index":0, 149 | "type":0, 150 | "value":15660711, 151 | "n":2, 152 | "script":"0020698b5d434c1c9e9935bfa4f8426ff53c18ec51fac94b2c295230a6cfe71b634a" 153 | }, 154 | "script":"" 155 | }, 156 | { 157 | "sequence":4294967295, 158 | "witness":"", 159 | "prev_out":{ 160 | "spent":true, 161 | "spending_outpoints":[ 162 | { 163 | "tx_index":0, 164 | "n":0 165 | } 166 | ], 167 | "tx_index":0, 168 | "type":0, 169 | "value":23714204, 170 | "n":8, 171 | "script":"0020692e92da4e7f75db5a4032a8087be48e55b8ac20bcc9b755b69cf0886de7ef77" 172 | }, 173 | "script":"" 174 | } 175 | ], 176 | "weight":1303, 177 | "time":1615209731, 178 | "tx_index":0, 179 | "vin_sz":2, 180 | "hash":"56372830bcff29b55e905b2591c5430eaf50b1cc6c50b1890925b2103db401ad", 181 | "vout_sz":3, 182 | "relayed_by":"0.0.0.0", 183 | "out":[ 184 | { 185 | "spent":false, 186 | "tx_index":0, 187 | "type":0, 188 | "addr":"3NfazvS3sprsicnkpstwaBpCdMfx4HAT97", 189 | "value":8075117, 190 | "n":0, 191 | "script":"a914e6156b6875aff2ed820c10ff33a218d19a86c92587" 192 | }, 193 | { 194 | "spent":false, 195 | "tx_index":0, 196 | "type":0, 197 | "value":14266914, 198 | "n":1, 199 | "script":"0020eb78fa5dc7fae4d8f0637d16ad6334b4977e1651a3f7ef661869d94720ace1c6" 200 | }, 201 | { 202 | "spent":false, 203 | "tx_index":0, 204 | "type":0, 205 | "addr":"3Lp8FYs8tPLTsDn5dzNiptXJkmmFNsqKGL", 206 | "value":17000000, 207 | "n":2, 208 | "script":"a914d1c2956eadf7f615241832a3a437711c6c18b98b87" 209 | } 210 | ] 211 | }, 212 | 213 | { 214 | "ver":1, 215 | "inputs":[ 216 | { 217 | "sequence":4294967293, 218 | "witness":"30450221008b131357e2d4b65e7b7c44646b52ae204b8f3f63bc50617d3df39913ee9a19fb022005f5ff2b0cc2344716a38fb769efe6b56001d77545a914d23284575ac55578d901", 219 | "prev_out":{ 220 | "spent":true, 221 | "spending_outpoints":[ 222 | { 223 | "tx_index":0, 224 | "n":0 225 | } 226 | ], 227 | "tx_index":0, 228 | "type":0, 229 | "value":504448659, 230 | "n":0, 231 | "script":"0014876bbe7c5f6e526abe29639ac7e11a27fef86d9b" 232 | }, 233 | "script":"" 234 | } 235 | ], 236 | "weight":562, 237 | "relayed_by":"0.0.0.0", 238 | "out":[ 239 | { 240 | "spent":false, 241 | "tx_index":0, 242 | "type":0, 243 | "value":4400000, 244 | "n":0, 245 | "script":"0014c2b8ac0c2251adb041b0561b5c8e7cc2cfbf5f0a" 246 | }, 247 | { 248 | "spent":false, 249 | "tx_index":0, 250 | "type":0, 251 | "value":500032723, 252 | "n":1, 253 | "script":"0014ff71e224d8a011dcac658612a16bcd642bea2bc6" 254 | } 255 | ], 256 | "lock_time":0, 257 | "size":223, 258 | "rbf":true, 259 | "time":1615209731, 260 | "tx_index":0, 261 | "vin_sz":1, 262 | "hash":"cf1eea2be5f57d28c55255d90790350e7acacce28ffb282e6440aca3443a89a2", 263 | "vout_sz":2 264 | }, 265 | 266 | { 267 | "lock_time":673713, 268 | "ver":1, 269 | "size":1511, 270 | "inputs":[ 271 | { 272 | "sequence":4294967295, 273 | "witness":"", 274 | "prev_out":{ 275 | "spent":true, 276 | "spending_outpoints":[ 277 | { 278 | "tx_index":0, 279 | "n":0 280 | } 281 | ], 282 | "tx_index":0, 283 | "type":0, 284 | "value":31040419, 285 | "n":14, 286 | "script":"00205ce760e70d57d6a5570d5346eb9aa7872b32ba7b730a708556e101efe979e6a6" 287 | }, 288 | "script":"" 289 | }, 290 | { 291 | "sequence":4294967295, 292 | "witness":"", 293 | "prev_out":{ 294 | "spent":true, 295 | "spending_outpoints":[ 296 | { 297 | "tx_index":0, 298 | "n":0 299 | } 300 | ], 301 | "tx_index":0, 302 | "type":0, 303 | "value":34466685, 304 | "n":21, 305 | "script":"002027b16fbd9682e150e66aee6af35a3b88d2d8a915e6c22a7d2a568df58f9f8d43" 306 | }, 307 | "script":"" 308 | }, 309 | { 310 | "sequence":4294967295, 311 | "witness":"", 312 | "prev_out":{ 313 | "spent":true, 314 | "spending_outpoints":[ 315 | { 316 | "tx_index":0, 317 | "n":0 318 | } 319 | ], 320 | "tx_index":0, 321 | "type":0, 322 | "value":571710, 323 | "n":0, 324 | "script":"002024b9e3ba3f3af23e37089b6793cdff9abdf87b26fe73181157fccd51ee1a1949" 325 | }, 326 | "script":"" 327 | }, 328 | { 329 | "sequence":4294967295, 330 | "witness":"", 331 | "prev_out":{ 332 | "spent":true, 333 | "spending_outpoints":[ 334 | { 335 | "tx_index":0, 336 | "n":0 337 | } 338 | ], 339 | "tx_index":0, 340 | "type":0, 341 | "value":35782808, 342 | "n":48, 343 | "script":"0020d811a84294182126bfc28c0654cbcf5bacf46feda8afaa076c4aea95d1920294" 344 | }, 345 | "script":"" 346 | }, 347 | { 348 | "sequence":4294967295, 349 | "witness":"", 350 | "prev_out":{ 351 | "spent":true, 352 | "spending_outpoints":[ 353 | { 354 | "tx_index":0, 355 | "n":0 356 | } 357 | ], 358 | "tx_index":0, 359 | "type":0, 360 | "value":24915746, 361 | "n":6, 362 | "script":"0020010b063e58c65077b7b5126163a278524a14ca927305980139b1c38784070187" 363 | }, 364 | "script":"" 365 | } 366 | ], 367 | "weight":2252, 368 | "time":1615209731, 369 | "tx_index":0, 370 | "vin_sz":5, 371 | "hash":"5ed57aa7be5d470bd8179f549de40b2b69296839d4821a8cc608d69fdf24f988", 372 | "vout_sz":1, 373 | "relayed_by":"0.0.0.0", 374 | "out":[ 375 | { 376 | "spent":false, 377 | "tx_index":0, 378 | "type":0, 379 | "addr":"3E88vPFsAjCPmgdBqeqKPGEyevJ8tkDqiY", 380 | "value":126759419, 381 | "n":0, 382 | "script":"a9148861bfdce660c071e340bb208f27b2cadbe12f2e87" 383 | } 384 | ] 385 | }, 386 | 387 | { 388 | "lock_time":673713, 389 | "ver":1, 390 | "size":1421, 391 | "inputs":[ 392 | { 393 | "sequence":4294967295, 394 | "witness":"", 395 | "prev_out":{ 396 | "spent":true, 397 | "spending_outpoints":[ 398 | { 399 | "tx_index":0, 400 | "n":0 401 | } 402 | ], 403 | "tx_index":0, 404 | "type":0, 405 | "addr":"31v8hMySh2JF4AVzNUSoonx8VoW3TXSYo4", 406 | "value":19947, 407 | "n":0, 408 | "script":"a914027b0fa42325b38c98d04d66aa6de594a924e29287" 409 | }, 410 | "script":"22002037dd00f27a22a5a2c28396fb80d3c4b9aee454cbdfc9cff7009666f1ff582a63" 411 | }, 412 | { 413 | "sequence":4294967295, 414 | "witness":"", 415 | "prev_out":{ 416 | "spent":true, 417 | "spending_outpoints":[ 418 | { 419 | "tx_index":0, 420 | "n":0 421 | } 422 | ], 423 | "tx_index":0, 424 | "type":0, 425 | "addr":"3GpF1SwqQqNmWvVTo13gpwyNnwKDdVU2q3", 426 | "value":10000, 427 | "n":0, 428 | "script":"a914a5e7b88ec7934db076e519059d3dcb8f6464df0687" 429 | }, 430 | "script":"2200206be0502d1e901f4aaa48fee6c1efad36af1ecc107160ed2e02e9d7a3195411ba" 431 | }, 432 | { 433 | "sequence":4294967295, 434 | "witness":"", 435 | "prev_out":{ 436 | "spent":true, 437 | "spending_outpoints":[ 438 | { 439 | "tx_index":0, 440 | "n":0 441 | } 442 | ], 443 | "tx_index":0, 444 | "type":0, 445 | "addr":"33UgydRr191ividx7nmmwr5SUVM2KzVrwT", 446 | "value":1565602, 447 | "n":0, 448 | "script":"a914139b71abc5a3126e2bbca11ecd2331b21dfd179987" 449 | }, 450 | "script":"2200203532e9f1a0f10e688e89bbccbed30f60ee9a6f8391b145e74c71eb47e79cc012" 451 | }, 452 | { 453 | "sequence":4294967295, 454 | "witness":"", 455 | "prev_out":{ 456 | "spent":true, 457 | "spending_outpoints":[ 458 | { 459 | "tx_index":0, 460 | "n":0 461 | } 462 | ], 463 | "tx_index":0, 464 | "type":0, 465 | "addr":"36iCaA88EbhhjsUeMRsngYyHXn45goEN4P", 466 | "value":14910, 467 | "n":214, 468 | "script":"a9143711ef0ed90dc78492d415bc8380eb95702fdf8787" 469 | }, 470 | "script":"2200209a9b20d8f51d958ceb6b698a17b9898bdfdfc43e8e867f36909bd81b0bae66a5" 471 | } 472 | ], 473 | "weight":2651, 474 | "time":1615209731, 475 | "tx_index":0, 476 | "vin_sz":4, 477 | "hash":"efa5fcd4f3b87cc32df2f7a17257e25222da2a100b54204c9ec0f89f76779386", 478 | "vout_sz":3, 479 | "relayed_by":"0.0.0.0", 480 | "out":[ 481 | { 482 | "spent":false, 483 | "tx_index":0, 484 | "type":0, 485 | "addr":"3KipDs4r4xHBnLLL63vW694k5BZ3KrNBMQ", 486 | "value":72644, 487 | "n":0, 488 | "script":"a914c5c95405f692ebcdd4a9f03693b194405b6b3b9d87" 489 | }, 490 | { 491 | "spent":false, 492 | "tx_index":0, 493 | "type":0, 494 | "addr":"3AtVtfayAesMm72gYy1Nuvd83K2u8CBNgP", 495 | "value":253000, 496 | "n":1, 497 | "script":"a91464e50dc7f7c58d34ff282f1d922a5de1e47453a787" 498 | }, 499 | { 500 | "spent":false, 501 | "tx_index":0, 502 | "type":0, 503 | "addr":"3HHYFv2KHeFZrp5bMrW4iYQF5E4zh2Y3Dc", 504 | "value":1264000, 505 | "n":2, 506 | "script":"a914ab1159dac9839e5b8e7f3b82d5d52d88bdc7e27787" 507 | } 508 | ] 509 | }, 510 | 511 | { 512 | "lock_time":0, 513 | "ver":1, 514 | "size":224, 515 | "inputs":[ 516 | { 517 | "sequence":4294967295, 518 | "witness":"", 519 | "prev_out":{ 520 | "spent":true, 521 | "spending_outpoints":[ 522 | { 523 | "tx_index":0, 524 | "n":0 525 | } 526 | ], 527 | "tx_index":0, 528 | "type":0, 529 | "addr":"1FbPa9bz2TSpu7fuXoAa3VMNDVvKBM2CU4", 530 | "value":226844596, 531 | "n":1, 532 | "script":"76a914a012bed4a51d91b841101a11b59aee4859fff96688ac" 533 | }, 534 | "script":"483045022100d753d6801fd2b8e9367ae6b5b80102a9421be65f74ecc1f7622bf878df52bd5d022006e7947cd8f0054c185936d8841600a0954f4391389b5e0e69cdc8bc81085724012102ee8908f1832233b6ffdddbdb860fe6049b2c8f532ab2eff7df1eed8e050816f9" 535 | } 536 | ], 537 | "weight":896, 538 | "time":1615209731, 539 | "tx_index":0, 540 | "vin_sz":1, 541 | "hash":"e9e0ddcffa9d472cd15e6cf39677236e80a5d17c5650b4f579ef496dfd04ce69", 542 | "vout_sz":2, 543 | "relayed_by":"0.0.0.0", 544 | "out":[ 545 | { 546 | "spent":false, 547 | "tx_index":0, 548 | "type":0, 549 | "addr":"3Lf9WMT86ytFW1fiPLkSMjeGLXhY6GquHV", 550 | "value":5331359, 551 | "n":0, 552 | "script":"a914d00fe34bcba413e3801d5fa1ab8ddb74d085f27c87" 553 | }, 554 | { 555 | "spent":false, 556 | "tx_index":0, 557 | "type":0, 558 | "addr":"1HP11idENKdmXEZmDrdRNQdVTQ3JopXSVe", 559 | "value":221503237, 560 | "n":1, 561 | "script":"76a914b3ab2c8d25af37171ad10c1014c272f7e7b3707288ac" 562 | } 563 | ] 564 | }, 565 | 566 | { 567 | "lock_time":0, 568 | "ver":1, 569 | "size":189, 570 | "inputs":[ 571 | { 572 | "sequence":4294967295, 573 | "witness":"", 574 | "prev_out":{ 575 | "spent":true, 576 | "spending_outpoints":[ 577 | { 578 | "tx_index":0, 579 | "n":0 580 | } 581 | ], 582 | "tx_index":0, 583 | "type":0, 584 | "addr":"16jEAxEydewhJrqzzcQQ3zspRUx1G7yUU5", 585 | "value":1162707, 586 | "n":1, 587 | "script":"76a9143ed5182b0972b16bbb76289217d87908882c14af88ac" 588 | }, 589 | "script":"483045022100c5a3d875fc7008cf01af8753a7f47023e446ff32022522e988e6968ccb8f7ab002205aa316ad00fce27f1adce92d9f2c3e27f4e1c6a65883d38c20269c5eb60228130121022e75acf0c387e0de96d4e3b53d1fa7424662197dbb8f573575a57e1b3336a64d" 590 | } 591 | ], 592 | "weight":756, 593 | "time":1615209731, 594 | "tx_index":0, 595 | "vin_sz":1, 596 | "hash":"5d4cc0f32bbc9be03fe7d1117bec33dce9fd4a9facbae969c384e4d41843335a", 597 | "vout_sz":1, 598 | "relayed_by":"0.0.0.0", 599 | "out":[ 600 | { 601 | "spent":false, 602 | "tx_index":0, 603 | "type":0, 604 | "value":1159460, 605 | "n":0, 606 | "script":"0014ce15b8f4af06400b89113e57b99e3d60ebd7e0e4" 607 | } 608 | ] 609 | }, 610 | 611 | { 612 | "lock_time":0, 613 | "ver":1, 614 | "size":225, 615 | "inputs":[ 616 | { 617 | "sequence":4294967295, 618 | "witness":"30440220125822b53a240d4db2bac9833fba8aef9b7ca44452effa375c274597976595d4022030d24c943d7502b8193af393c96dc7406956e71718c2f307a273d299039d334001", 619 | "prev_out":{ 620 | "spent":true, 621 | "spending_outpoints":[ 622 | { 623 | "tx_index":0, 624 | "n":0 625 | } 626 | ], 627 | "tx_index":0, 628 | "type":0, 629 | "value":445700, 630 | "n":0, 631 | "script":"001404e5d6a6674f34a70631f9672ccc4f242b149c57" 632 | }, 633 | "script":"" 634 | } 635 | ], 636 | "weight":573, 637 | "time":1615209731, 638 | "tx_index":0, 639 | "vin_sz":1, 640 | "hash":"1649b26ed437a676f5278c930adfa02d96d34672f1f17841306177de86bdbc52", 641 | "vout_sz":2, 642 | "relayed_by":"0.0.0.0", 643 | "out":[ 644 | { 645 | "spent":false, 646 | "tx_index":0, 647 | "type":0, 648 | "addr":"12BbaMSMMdheh9hqtqw12mCwdp6fGe5wPJ", 649 | "value":197949, 650 | "n":0, 651 | "script":"76a9140cf925ae63a8d454cd82c0acdbd43acfd2d3558988ac" 652 | }, 653 | { 654 | "spent":false, 655 | "tx_index":0, 656 | "type":0, 657 | "value":244300, 658 | "n":1, 659 | "script":"00146d6c66b670fdc1f82c9d6d356df0dd4f093fb44b" 660 | } 661 | ] 662 | }, 663 | 664 | { 665 | "lock_time":0, 666 | "ver":1, 667 | "size":616, 668 | "inputs":[ 669 | { 670 | "sequence":4294967295, 671 | "witness":"", 672 | "prev_out":{ 673 | "spent":true, 674 | "spending_outpoints":[ 675 | { 676 | "tx_index":0, 677 | "n":0 678 | } 679 | ], 680 | "tx_index":0, 681 | "type":0, 682 | "value":79369946, 683 | "n":5, 684 | "script":"0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d" 685 | }, 686 | "script":"" 687 | } 688 | ], 689 | "weight":1702, 690 | "time":1615209731, 691 | "tx_index":0, 692 | "vin_sz":1, 693 | "hash":"893a122f514947a23795f83e13601f3fcc723f9114cb30fca30790306368034d", 694 | "vout_sz":9, 695 | "relayed_by":"0.0.0.0", 696 | "out":[ 697 | { 698 | "spent":false, 699 | "tx_index":0, 700 | "type":0, 701 | "addr":"16G7t31NCoSABF5uKi4pxjJsU57erePn8b", 702 | "value":2106222, 703 | "n":0, 704 | "script":"76a91439b49c84e28922cbecf42944f3ba812051f4891688ac" 705 | }, 706 | { 707 | "spent":false, 708 | "tx_index":0, 709 | "type":0, 710 | "addr":"38AKTS4jTsVQrGYu3gFDPgmwC1pj5o9DZ4", 711 | "value":2900000, 712 | "n":1, 713 | "script":"a91446fa9f02147ae54c481a0ea6f0eea9ec3609ed0f87" 714 | }, 715 | { 716 | "spent":false, 717 | "tx_index":0, 718 | "type":0, 719 | "addr":"17wgcPaEavReFFmSjc6RC9xv9iFAh1eHig", 720 | "value":7631142, 721 | "n":2, 722 | "script":"76a9144c284812a3bfd3a5c747210758eb473bd0a3bfd488ac" 723 | }, 724 | { 725 | "spent":false, 726 | "tx_index":0, 727 | "type":0, 728 | "addr":"1LtmndtiMXkHcS5iAZzyEd9osfRMi4v8kN", 729 | "value":3550000, 730 | "n":3, 731 | "script":"76a914da34fd7782b591b4f7f6530bcf98d34a4440eadd88ac" 732 | }, 733 | { 734 | "spent":false, 735 | "tx_index":0, 736 | "type":0, 737 | "addr":"3BHBzeihYhDqAK4ddsU3QjVtkW6913kVuo", 738 | "value":200000, 739 | "n":4, 740 | "script":"a914692fae737a709b08776f257d643f6f1815ddaab987" 741 | }, 742 | { 743 | "spent":false, 744 | "tx_index":0, 745 | "type":0, 746 | "addr":"1MXHg2bcuarvi94Ym7yZ85GvR9oSenBR6a", 747 | "value":8230316, 748 | "n":5, 749 | "script":"76a914e11ce99023ba51d19fca6b1cfbd53d31ce42e7dd88ac" 750 | }, 751 | { 752 | "spent":false, 753 | "tx_index":0, 754 | "type":0, 755 | "addr":"15GdK4qahpCobDux9EFLKw7QjFkjPzqnRL", 756 | "value":17270800, 757 | "n":6, 758 | "script":"76a9142ed50dca027c545d01389bd85a39f5809fbeb8c188ac" 759 | }, 760 | { 761 | "spent":false, 762 | "tx_index":0, 763 | "type":0, 764 | "addr":"1B5YJw3z1vR1qs5thSZxJA1DzJSpC4bgzs", 765 | "value":20000000, 766 | "n":7, 767 | "script":"76a9146e8d0ea8e71d47cdcae1224d00dd5fef92b949e388ac" 768 | }, 769 | { 770 | "spent":false, 771 | "tx_index":0, 772 | "type":0, 773 | "value":17404786, 774 | "n":8, 775 | "script":"0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d" 776 | } 777 | ] 778 | }, 779 | 780 | { 781 | "ver":2, 782 | "inputs":[ 783 | { 784 | "sequence":4294967293, 785 | "witness":"", 786 | "prev_out":{ 787 | "spent":true, 788 | "spending_outpoints":[ 789 | { 790 | "tx_index":0, 791 | "n":0 792 | } 793 | ], 794 | "tx_index":0, 795 | "type":0, 796 | "addr":"1KqXMTbmurTPpSosiPPEgqWThDa92Z4uuW", 797 | "value":24613000, 798 | "n":23, 799 | "script":"76a914ce9f91451d28b293e1e305f40ca3d1778ffadfd788ac" 800 | }, 801 | "script":"4730440220620ccff2126e6ff3e89a2b22b16946694ddcfb6016c62dbca4f7f0918ea1bae4022044430f1f80d19ff479c6a29c403b66a3dae37b55ec8dc9d7cf16aba4e0e4b3c40121038d92f039c34ece9ffa860ecbeff180eb3caa4f9328772e1be6ee8032e584547b" 802 | } 803 | ], 804 | "weight":764, 805 | "relayed_by":"0.0.0.0", 806 | "out":[ 807 | { 808 | "spent":false, 809 | "tx_index":0, 810 | "type":0, 811 | "addr":"12rhddaTCSGNNvGh3V788yqMQMWhUVXr8n", 812 | "value":24585160, 813 | "n":0, 814 | "script":"76a914145e6ce91a7faa68c448b56d57e83680c4085d0c88ac" 815 | } 816 | ], 817 | "lock_time":673713, 818 | "size":191, 819 | "rbf":true, 820 | "time":1615209731, 821 | "tx_index":0, 822 | "vin_sz":1, 823 | "hash":"8b6c49ee2d75784f9a6a941bbfa3fca5c90f230eeaed1c9095caf08f769b0b39", 824 | "vout_sz":1 825 | }, 826 | 827 | { 828 | "lock_time":0, 829 | "ver":1, 830 | "size":396, 831 | "inputs":[ 832 | { 833 | "sequence":4294967295, 834 | "witness":"304402201980c86e11b4ac065edfa4c0532177849a92e0afbc59754ff51e83766dc348e8022039ed22f0c2b43caa68e6d415794045c7b97ddc621138e34d5ed28c224e1e681801", 835 | "prev_out":{ 836 | "spent":true, 837 | "spending_outpoints":[ 838 | { 839 | "tx_index":0, 840 | "n":0 841 | } 842 | ], 843 | "tx_index":0, 844 | "type":0, 845 | "addr":"3CBcXJkpCkDgiJTjapHcisRyicboRHWq5u", 846 | "value":345997, 847 | "n":0, 848 | "script":"a9147319c96fe44a11c1b3c1aacf60a9bf9188965fe287" 849 | }, 850 | "script":"160014d902aea765518432bcae285af8bf55e2d658ccab" 851 | }, 852 | { 853 | "sequence":4294967295, 854 | "witness":"", 855 | "prev_out":{ 856 | "spent":true, 857 | "spending_outpoints":[ 858 | { 859 | "tx_index":0, 860 | "n":0 861 | } 862 | ], 863 | "tx_index":0, 864 | "type":0, 865 | "addr":"1QC6xiNcUBAVdycfbvhrTWLvKELJGWxaaS", 866 | "value":91811, 867 | "n":35, 868 | "script":"76a914fe6471b9f29e200da537d354840c99ef6075e49888ac" 869 | }, 870 | "script":"483045022100ac32df189c391773967d419988b8d6628489fbbdd4557899f7e5c730afaddb200220250593396bdd4de8cbb1368dba60bbffb423060225207357a891f428e9011d9c012102ecbf1e3a8940f80371330b3a3ad9b70297239f3416eb4bd6569b2d123ecaf95d" 871 | } 872 | ], 873 | "weight":1254, 874 | "time":1615209731, 875 | "tx_index":0, 876 | "vin_sz":2, 877 | "hash":"f96dd3e012c716bda53c7a272843f153b8003076ae52206b8940da2e04fc8d0f", 878 | "vout_sz":2, 879 | "relayed_by":"0.0.0.0", 880 | "out":[ 881 | { 882 | "spent":false, 883 | "tx_index":0, 884 | "type":0, 885 | "addr":"36QXvLJBVSZSThM3kthDmY8QP1jSDPG6rT", 886 | "value":400000, 887 | "n":0, 888 | "script":"a91433ba98e76f68b4e93efbce422831edb5a223d0b687" 889 | }, 890 | { 891 | "spent":false, 892 | "tx_index":0, 893 | "type":0, 894 | "addr":"3DHodKesbXg1tixJ7JiTAE1Bo4QKxGXNCL", 895 | "value":33951, 896 | "n":1, 897 | "script":"a9147f3dad65ac8fd3782b28fce188cc03037e6b8e6a87" 898 | } 899 | ] 900 | }, 901 | 902 | { 903 | "lock_time":0, 904 | "ver":2, 905 | "size":225, 906 | "inputs":[ 907 | { 908 | "sequence":4294967295, 909 | "witness":"30440220462ec477a75a6527367b3b442f465259e74e8979db03e866c251f0da72194cc5022036337c2bbd34ef6c15a27c8c8532dfcef07926a638b56664e1e7709a98dcaa3c01", 910 | "prev_out":{ 911 | "spent":true, 912 | "spending_outpoints":[ 913 | { 914 | "tx_index":0, 915 | "n":0 916 | } 917 | ], 918 | "tx_index":0, 919 | "type":0, 920 | "value":36542541, 921 | "n":0, 922 | "script":"0014677e6035ee69ea4b3944aaa856e0a92c403977f2" 923 | }, 924 | "script":"" 925 | } 926 | ], 927 | "weight":573, 928 | "time":1615209730, 929 | "tx_index":0, 930 | "vin_sz":1, 931 | "hash":"153a661ba91c538691b5d28f9e954fe4aac0b6fcc2c41dc8f46bb473c6741c9e", 932 | "vout_sz":2, 933 | "relayed_by":"0.0.0.0", 934 | "out":[ 935 | { 936 | "spent":false, 937 | "tx_index":0, 938 | "type":0, 939 | "addr":"1HhtZXE6RN7nmEfXNXtYCvpstbRGWwgsrH", 940 | "value":306875, 941 | "n":0, 942 | "script":"76a914b73db114dbfbdc96666a5f855347cf5428c5884688ac" 943 | }, 944 | { 945 | "spent":false, 946 | "tx_index":0, 947 | "type":0, 948 | "value":36220999, 949 | "n":1, 950 | "script":"0014677e6035ee69ea4b3944aaa856e0a92c403977f2" 951 | } 952 | ] 953 | }, 954 | 955 | { 956 | "lock_time":0, 957 | "ver":1, 958 | "size":371, 959 | "inputs":[ 960 | { 961 | "sequence":4294967295, 962 | "witness":"304402206cd616cb81bf68d9f64d993973d488ae86692783b6a9e03f8bd05ff103c4a326022003993eb4ff2956d95e257723b5e0e97cbee1ffbdd99e86f5b80c66fd2beadae501", 963 | "prev_out":{ 964 | "spent":true, 965 | "spending_outpoints":[ 966 | { 967 | "tx_index":0, 968 | "n":0 969 | } 970 | ], 971 | "tx_index":0, 972 | "type":0, 973 | "value":45829, 974 | "n":1, 975 | "script":"00148271f7f3008ac0fb6243268709ff49e0609eb78d" 976 | }, 977 | "script":"" 978 | }, 979 | { 980 | "sequence":4294967295, 981 | "witness":"304502210090ed61becdb7e75852a9f28ab1cf4cd6be25f4d7a21fa6bc8a79b43f37ac9c68022029bf460719bfb1a92ecc3354f97132401d05162dd4457797cffd9316f43e760401", 982 | "prev_out":{ 983 | "spent":true, 984 | "spending_outpoints":[ 985 | { 986 | "tx_index":0, 987 | "n":0 988 | } 989 | ], 990 | "tx_index":0, 991 | "type":0, 992 | "value":205689, 993 | "n":1, 994 | "script":"00143effd623bfa957a92e01b60b8fc662e1314daf37" 995 | }, 996 | "script":"" 997 | } 998 | ], 999 | "weight":833, 1000 | "time":1615209730, 1001 | "tx_index":0, 1002 | "vin_sz":2, 1003 | "hash":"611a82bb4f0355da61a37d503e6f54e72ca24207f8f067a1c15dd9e1b78de777", 1004 | "vout_sz":2, 1005 | "relayed_by":"0.0.0.0", 1006 | "out":[ 1007 | { 1008 | "spent":false, 1009 | "tx_index":0, 1010 | "type":0, 1011 | "value":38262, 1012 | "n":0, 1013 | "script":"0014304103f3ddf99a78b4012444679bebd5d822c655" 1014 | }, 1015 | { 1016 | "spent":false, 1017 | "tx_index":0, 1018 | "type":0, 1019 | "value":189206, 1020 | "n":1, 1021 | "script":"0014cd89cc0eab728cd8ff8951125706dd72a5a4b8c7" 1022 | } 1023 | ] 1024 | }, 1025 | 1026 | { 1027 | "ver":2, 1028 | "inputs":[ 1029 | { 1030 | "sequence":4294967293, 1031 | "witness":"30440220779935e51f126b8d455f67586f5c6a7a13e5c7567d8f8b4f82d040fb4a4f17a502206d2b862a1bd5c02667ead099c7818a756bbf18525a76f83fdfcb63251231e44c01", 1032 | "prev_out":{ 1033 | "spent":true, 1034 | "spending_outpoints":[ 1035 | { 1036 | "tx_index":0, 1037 | "n":0 1038 | } 1039 | ], 1040 | "tx_index":0, 1041 | "type":0, 1042 | "addr":"35TviLjv9zD91Q9N7X3kcqstZdBusTpqNe", 1043 | "value":2096237, 1044 | "n":1, 1045 | "script":"a9142966bf081f79c57ffc13638fd1533dc20b760cc687" 1046 | }, 1047 | "script":"1600141b9fa097890cbfdc0031aab4c39009fc1337eff2" 1048 | } 1049 | ], 1050 | "weight":661, 1051 | "relayed_by":"0.0.0.0", 1052 | "out":[ 1053 | { 1054 | "spent":false, 1055 | "tx_index":0, 1056 | "type":0, 1057 | "addr":"39Ygzjzh231PHwUuTpXVSdK4TctDnsiVpD", 1058 | "value":266621, 1059 | "n":0, 1060 | "script":"a914562de0ebdb169db9c383fc60f77aa1b3977bf5fb87" 1061 | }, 1062 | { 1063 | "spent":false, 1064 | "tx_index":0, 1065 | "type":0, 1066 | "addr":"3BPWAHHUL9uPpVsToev2n15zNMpdUMDo4n", 1067 | "value":1824924, 1068 | "n":1, 1069 | "script":"a9146a61576a79906a4ccc3f7d58bf05826ccb4e209187" 1070 | } 1071 | ], 1072 | "lock_time":673625, 1073 | "size":247, 1074 | "rbf":true, 1075 | "time":1615209730, 1076 | "tx_index":0, 1077 | "vin_sz":1, 1078 | "hash":"2bcd4039ebd0596461b03f64f7e0061bfcdf294a7ce822eec0e1f51078d3c459", 1079 | "vout_sz":2 1080 | }, 1081 | 1082 | { 1083 | "ver":2, 1084 | "inputs":[ 1085 | { 1086 | "sequence":4294967293, 1087 | "witness":"304402203e829952aa07aaff5616fafcb27cf1ae81a40d3d9723a8486fd2d34a55c68b5c02206479c37c5e6af5ca548a9d345b4ff60b3f1fddea66bf649603d8bb3170dc1c3001", 1088 | "prev_out":{ 1089 | "spent":true, 1090 | "spending_outpoints":[ 1091 | { 1092 | "tx_index":0, 1093 | "n":0 1094 | } 1095 | ], 1096 | "tx_index":0, 1097 | "type":0, 1098 | "addr":"3M92sq9ssFaNbEwF47uteVKJsbw125juS7", 1099 | "value":21261782, 1100 | "n":0, 1101 | "script":"a914d55600283b297e12a0a8e1a92da7c03c0bcb6c5287" 1102 | }, 1103 | "script":"160014f8513401ea5e9dcd57597e8a736f162572d19079" 1104 | } 1105 | ], 1106 | "weight":661, 1107 | "relayed_by":"0.0.0.0", 1108 | "out":[ 1109 | { 1110 | "spent":false, 1111 | "tx_index":0, 1112 | "type":0, 1113 | "addr":"37vf14HgK8Re2yPm84UDtHbLZtCza6z3Nw", 1114 | "value":8280000, 1115 | "n":0, 1116 | "script":"a91444651cfb986421ca12505ed9b51fe0d8561c9d4587" 1117 | }, 1118 | { 1119 | "spent":false, 1120 | "tx_index":0, 1121 | "type":0, 1122 | "addr":"3M92sq9ssFaNbEwF47uteVKJsbw125juS7", 1123 | "value":12961696, 1124 | "n":1, 1125 | "script":"a914d55600283b297e12a0a8e1a92da7c03c0bcb6c5287" 1126 | } 1127 | ], 1128 | "lock_time":0, 1129 | "size":247, 1130 | "rbf":true, 1131 | "time":1615209730, 1132 | "tx_index":0, 1133 | "vin_sz":1, 1134 | "hash":"db1ba786b39c10cd92775abd8b85b6d7611609aa7ae9f337aec5b6c7b685a757", 1135 | "vout_sz":2 1136 | }, 1137 | 1138 | { 1139 | "ver":2, 1140 | "inputs":[ 1141 | { 1142 | "sequence":4294967293, 1143 | "witness":"304402202cfe340e8e517953c24354574d282ebc6e69e2b55cccd75c7f80dd35ce1978fa022039d5c27f90b9d6c4b651c0ba04997218d56a7255f9d2a976ffebbeb5f990437e01", 1144 | "prev_out":{ 1145 | "spent":true, 1146 | "spending_outpoints":[ 1147 | { 1148 | "tx_index":0, 1149 | "n":0 1150 | } 1151 | ], 1152 | "tx_index":0, 1153 | "type":0, 1154 | "value":20164, 1155 | "n":0, 1156 | "script":"001459fdc8513ba4f45b911472ebe3785c51532d9a40" 1157 | }, 1158 | "script":"" 1159 | }, 1160 | { 1161 | "sequence":4294967293, 1162 | "witness":"304402205f2d0e9af9ec1618fe96333670fa36fcb2be9122d779f1b51e479ff7cca28452022075d0a276d67aa2940afaa7723d73225f2c665c5b944280dbf1ab5086c3fb4d1101", 1163 | "prev_out":{ 1164 | "spent":true, 1165 | "spending_outpoints":[ 1166 | { 1167 | "tx_index":0, 1168 | "n":0 1169 | } 1170 | ], 1171 | "tx_index":0, 1172 | "type":0, 1173 | "value":77884, 1174 | "n":0, 1175 | "script":"0014317a0dc629a56a8ff330bcd4bdd5cb3d8ad80619" 1176 | }, 1177 | "script":"" 1178 | } 1179 | ], 1180 | "weight":712, 1181 | "relayed_by":"0.0.0.0", 1182 | "out":[ 1183 | { 1184 | "spent":false, 1185 | "tx_index":0, 1186 | "type":0, 1187 | "addr":"3P6Mf1BzoLdLHgKd4K5AixBbaN3Hy9WHE7", 1188 | "value":77563, 1189 | "n":0, 1190 | "script":"a914eac4ae1a2d58682a146b210692d0547f8f927d4887" 1191 | } 1192 | ], 1193 | "lock_time":673713, 1194 | "size":340, 1195 | "rbf":true, 1196 | "time":1615209730, 1197 | "tx_index":0, 1198 | "vin_sz":2, 1199 | "hash":"93a3cc5fb9379322a5533c693b6ff4923e5dd9091e8e3d31bcde970dfe340039", 1200 | "vout_sz":1 1201 | }, 1202 | 1203 | { 1204 | "lock_time":0, 1205 | "ver":1, 1206 | "size":223, 1207 | "inputs":[ 1208 | { 1209 | "sequence":4294967295, 1210 | "witness":"", 1211 | "prev_out":{ 1212 | "spent":true, 1213 | "spending_outpoints":[ 1214 | { 1215 | "tx_index":0, 1216 | "n":0 1217 | } 1218 | ], 1219 | "tx_index":0, 1220 | "type":0, 1221 | "addr":"1BzUTsEspyhJc2gsCSVAsEKajUAuMbPnAd", 1222 | "value":761155, 1223 | "n":1, 1224 | "script":"76a914788fe48e17e069d4c8f6c0a3c8cd10afb3dcbcc988ac" 1225 | }, 1226 | "script":"4730440220784e0d52afaf51881d75a00e7e91a90acd592ff64a7c91163dbdb6959d46218402202f73ff3803e1432f4ea9a844a83ce181380c6d60dc788ef50b2b84df7d3cef780121033a00880e7afadef0ac332c4360a965fc9b138d420046ff399643d40705c446e4" 1227 | } 1228 | ], 1229 | "weight":892, 1230 | "time":1615209730, 1231 | "tx_index":0, 1232 | "vin_sz":1, 1233 | "hash":"ae935448933318fc022eef9b9481e7a3b576e821e72d933443292fa85a1e1024", 1234 | "vout_sz":2, 1235 | "relayed_by":"0.0.0.0", 1236 | "out":[ 1237 | { 1238 | "spent":false, 1239 | "tx_index":0, 1240 | "type":0, 1241 | "addr":"3EmFxWHYt8byuY2RBsjLeUL9w3tvYmn7Pq", 1242 | "value":119000, 1243 | "n":0, 1244 | "script":"a9148f67038dfd245a22ca1325aa2273285dea32f9e187" 1245 | }, 1246 | { 1247 | "spent":false, 1248 | "tx_index":0, 1249 | "type":0, 1250 | "addr":"1D6b8aC9sJEpmqc7Yyg8UwicP4VxV5h1Rx", 1251 | "value":620007, 1252 | "n":1, 1253 | "script":"76a91484b01478ca58ede47dc13463ee8f2ca368bd57e688ac" 1254 | } 1255 | ] 1256 | }, 1257 | 1258 | { 1259 | "ver":1, 1260 | "inputs":[ 1261 | { 1262 | "sequence":4294967293, 1263 | "witness":"", 1264 | "prev_out":{ 1265 | "spent":true, 1266 | "spending_outpoints":[ 1267 | { 1268 | "tx_index":0, 1269 | "n":0 1270 | } 1271 | ], 1272 | "tx_index":0, 1273 | "type":0, 1274 | "addr":"3HgJfRZRmDXKTgrp3eN3M8uGKf2mfZXykp", 1275 | "value":234168, 1276 | "n":8, 1277 | "script":"a914af5f91e23cf20220d0c6c8fa385f80468969724287" 1278 | }, 1279 | "script":"2200205a769b818211343c4e264ea014d1f8f7cb7364a8172d19e0fa9dc0bcae54b2b7" 1280 | } 1281 | ], 1282 | "weight":898, 1283 | "relayed_by":"0.0.0.0", 1284 | "out":[ 1285 | { 1286 | "spent":false, 1287 | "tx_index":0, 1288 | "type":0, 1289 | "addr":"3FRsWFbuWsgGRFqZQYJb3bzGBRYV53Xvog", 1290 | "value":141827, 1291 | "n":0, 1292 | "script":"a91496b47e6e8ea17651740031babd53c8a9046a0dbb87" 1293 | }, 1294 | { 1295 | "spent":false, 1296 | "tx_index":0, 1297 | "type":0, 1298 | "value":84097, 1299 | "n":1, 1300 | "script":"00208fc2ebfdcc9f192d682e247a6eab3002f6b4d13a9b76dd3af9ad5d2511d41f3f" 1301 | } 1302 | ], 1303 | "lock_time":0, 1304 | "size":415, 1305 | "rbf":true, 1306 | "time":1615209730, 1307 | "tx_index":0, 1308 | "vin_sz":1, 1309 | "hash":"3412f31d5dc8080c7e27269f096aaec68c7078c468c2b52a6938069701bd3d20", 1310 | "vout_sz":2 1311 | }, 1312 | 1313 | { 1314 | "lock_time":673713, 1315 | "ver":2, 1316 | "size":245, 1317 | "inputs":[ 1318 | { 1319 | "sequence":4294967294, 1320 | "witness":"3044022041a54048ad26d47d35aa1b880063ce7711e9019d6052dc0e3e5db2162f147157022026205d35f7a2cd6c67bfc107e09a9a765a387efb65ccdcd08e0139ee36929b8601", 1321 | "prev_out":{ 1322 | "spent":true, 1323 | "spending_outpoints":[ 1324 | { 1325 | "tx_index":0, 1326 | "n":0 1327 | } 1328 | ], 1329 | "tx_index":0, 1330 | "type":0, 1331 | "addr":"3E8P2ugT4tW7kXDxnxQ8FrWkFASqFr73PQ", 1332 | "value":19929723, 1333 | "n":1, 1334 | "script":"a914886d87acbf5eedff2338afb502463f565720040287" 1335 | }, 1336 | "script":"1600146f2d2eebe3f92d7072996a256f7055ab106ab282" 1337 | } 1338 | ], 1339 | "weight":653, 1340 | "time":1615209730, 1341 | "tx_index":0, 1342 | "vin_sz":1, 1343 | "hash":"db5c1a541c4c399adabb780f49264220ffbc3602401058ba217fa6d5c6df5119", 1344 | "vout_sz":2, 1345 | "relayed_by":"0.0.0.0", 1346 | "out":[ 1347 | { 1348 | "spent":false, 1349 | "tx_index":0, 1350 | "type":0, 1351 | "value":5100365, 1352 | "n":0, 1353 | "script":"0014ae5ee169547eeaf181749f3042cc0ab080ee547f" 1354 | }, 1355 | { 1356 | "spent":false, 1357 | "tx_index":0, 1358 | "type":0, 1359 | "value":14819254, 1360 | "n":1, 1361 | "script":"00143b413fd4a7ddea8a02b0cc01bd526a103e518507" 1362 | } 1363 | ] 1364 | }, 1365 | 1366 | { 1367 | "lock_time":0, 1368 | "ver":1, 1369 | "size":225, 1370 | "inputs":[ 1371 | { 1372 | "sequence":4294967295, 1373 | "witness":"", 1374 | "prev_out":{ 1375 | "spent":true, 1376 | "spending_outpoints":[ 1377 | { 1378 | "tx_index":0, 1379 | "n":0 1380 | } 1381 | ], 1382 | "tx_index":0, 1383 | "type":0, 1384 | "addr":"1LsC36zhbjjeZvjFiUrzDpSXZGdA26Empq", 1385 | "value":4007241, 1386 | "n":17, 1387 | "script":"76a914d9e8668d2468cc6283ba7373d773f7504912387688ac" 1388 | }, 1389 | "script":"4730440220759d565228b3112228228e58dc5fb9d06a30412ffb4addd6fdd304aef2bea514022048256efa85782b03f32d6f2e30e21d53df8bb3455ae24df31538779da34781d5012102441bb8296959238e1f9698440afbf93a26683aeb1eacb507e71d22878888a47e" 1390 | } 1391 | ], 1392 | "weight":900, 1393 | "time":1615209729, 1394 | "tx_index":0, 1395 | "vin_sz":1, 1396 | "hash":"07e0c741dfe6054192a4c5906f56a09213c37b95ed50a53e85b8a5c71dcc5a8d", 1397 | "vout_sz":2, 1398 | "relayed_by":"0.0.0.0", 1399 | "out":[ 1400 | { 1401 | "spent":false, 1402 | "tx_index":0, 1403 | "type":0, 1404 | "addr":"12RkN2sdGzYXbL52C5DS9ghVDxFYtDyYZU", 1405 | "value":987070, 1406 | "n":0, 1407 | "script":"76a9140fa64e60bfb6b184cf539b175017af266d62178688ac" 1408 | }, 1409 | { 1410 | "spent":false, 1411 | "tx_index":0, 1412 | "type":0, 1413 | "addr":"1KLxx3xKRWbd8TwLm6a9BQEm4xZ6j6tDE8", 1414 | "value":2998023, 1415 | "n":1, 1416 | "script":"76a914c938df1300381c8200ac8edc171f80746c35a58a88ac" 1417 | } 1418 | ] 1419 | }, 1420 | 1421 | { 1422 | "lock_time":0, 1423 | "ver":1, 1424 | "size":339, 1425 | "inputs":[ 1426 | { 1427 | "sequence":4294967295, 1428 | "witness":"", 1429 | "prev_out":{ 1430 | "spent":true, 1431 | "spending_outpoints":[ 1432 | { 1433 | "tx_index":0, 1434 | "n":0 1435 | } 1436 | ], 1437 | "tx_index":0, 1438 | "type":0, 1439 | "addr":"125j43PogpJuDWvdtStnuBufWpEidoVvLJ", 1440 | "value":1418698, 1441 | "n":2, 1442 | "script":"76a9140bdce4ab22c8f3a76255aab598d358ae2040d0d388ac" 1443 | }, 1444 | "script":"473044022057aa04fddee158b62863801a0750a91e62ac6cf90b0549d0cc034896145e8cf002205afb9dbe9fbc15f9290b68d2bcb5d6e81e8ed4d20afcad5bb85e99cafb9b0447012103ed1f5d778ca21165948c0161b9ffc30fffd3b7e2027a34689e7190002c0b8780" 1445 | }, 1446 | { 1447 | "sequence":4294967295, 1448 | "witness":"", 1449 | "prev_out":{ 1450 | "spent":true, 1451 | "spending_outpoints":[ 1452 | { 1453 | "tx_index":0, 1454 | "n":0 1455 | } 1456 | ], 1457 | "tx_index":0, 1458 | "type":0, 1459 | "addr":"17u6MTupKPG5kBRGDUd2QPPd7oDNKxbBWA", 1460 | "value":1447325, 1461 | "n":1, 1462 | "script":"76a9144baada603a2aebb1fbf49ac3088cbeae61c07e8088ac" 1463 | }, 1464 | "script":"483045022100c090259ffa6b4d1cb1c27c5d6cd6cf5c6debaf90e47f207f72560c4c24be45d7022056db2198dd78f93277e2a2837ed8b5e9c3c63ba69703dfc982f54396d60798cd01210388b3f64387a74be17057dec2038efdc1252750b0098e339b27f60820dc7fb641" 1465 | } 1466 | ], 1467 | "weight":1356, 1468 | "time":1615209729, 1469 | "tx_index":0, 1470 | "vin_sz":2, 1471 | "hash":"d19fa68485c87ab1b43c22439a22a766a23793e9a691ca7a6da2b744baf4dd60", 1472 | "vout_sz":1, 1473 | "relayed_by":"0.0.0.0", 1474 | "out":[ 1475 | { 1476 | "spent":false, 1477 | "tx_index":0, 1478 | "type":0, 1479 | "addr":"1HpytmEQTYT8r1vCgeduKUMaapDHJ2koj9", 1480 | "value":2859665, 1481 | "n":0, 1482 | "script":"76a914b8950dde92450873d94763092f9eaa5ea9a0f77188ac" 1483 | } 1484 | ] 1485 | }, 1486 | 1487 | { 1488 | "lock_time":0, 1489 | "ver":1, 1490 | "size":225, 1491 | "inputs":[ 1492 | { 1493 | "sequence":4294967295, 1494 | "witness":"", 1495 | "prev_out":{ 1496 | "spent":true, 1497 | "spending_outpoints":[ 1498 | { 1499 | "tx_index":0, 1500 | "n":0 1501 | } 1502 | ], 1503 | "tx_index":0, 1504 | "type":0, 1505 | "addr":"1E8y4tnkz1bzxb4Nc69hZaLvW5WLUSfrp1", 1506 | "value":3646771, 1507 | "n":1, 1508 | "script":"76a914901b5972005ac8fa20627633254a884d1c17c8af88ac" 1509 | }, 1510 | "script":"473044022025f20c69fb5903e5af3864dbd84755066ca25d133ad146e6a8fd561b9e5d4a2402200ac89b086e8665863ea074712bda5c59c8bbc396d3ac2e6a2be22e2fbf0bf25a01210387546dadc3c47fcb5dd5589b87e97f6dc56759fc7b2fc8dd0c9fa8f93366f1b9" 1511 | } 1512 | ], 1513 | "weight":900, 1514 | "time":1615209729, 1515 | "tx_index":0, 1516 | "vin_sz":1, 1517 | "hash":"6ee0d969d6549681e88b2f89693f2e6d36cd6649687d47065b8cc98a16968d47", 1518 | "vout_sz":2, 1519 | "relayed_by":"0.0.0.0", 1520 | "out":[ 1521 | { 1522 | "spent":false, 1523 | "tx_index":0, 1524 | "type":0, 1525 | "addr":"12JzsbGdjnVZGU7K7Rs3WexWHigyjCxn4b", 1526 | "value":99188, 1527 | "n":0, 1528 | "script":"76a9140e5f81a7696ef909d5e6d61488f1bbb602dd7a6188ac" 1529 | }, 1530 | { 1531 | "spent":false, 1532 | "tx_index":0, 1533 | "type":0, 1534 | "addr":"1E8y4tnkz1bzxb4Nc69hZaLvW5WLUSfrp1", 1535 | "value":3543758, 1536 | "n":1, 1537 | "script":"76a914901b5972005ac8fa20627633254a884d1c17c8af88ac" 1538 | } 1539 | ] 1540 | }, 1541 | 1542 | { 1543 | "lock_time":673713, 1544 | "ver":2, 1545 | "size":246, 1546 | "inputs":[ 1547 | { 1548 | "sequence":4294967294, 1549 | "witness":"3045022100e1cddae510eed3ea30d9fc63d4dcd0a511289434b51ddfdcafaf8df5a41b3d2e0220609e1d644d40bbc6812e98d5f0f76dd965465cdebe36e31a0e9a34993a431b7c01", 1550 | "prev_out":{ 1551 | "spent":true, 1552 | "spending_outpoints":[ 1553 | { 1554 | "tx_index":0, 1555 | "n":0 1556 | } 1557 | ], 1558 | "tx_index":0, 1559 | "type":0, 1560 | "addr":"3L2UudnDHu4veMNcSBQYQwrS1X3sJvoDfm", 1561 | "value":8233888, 1562 | "n":0, 1563 | "script":"a914c920b1592ea1ed4ba17cc0a30027f157baeba6eb87" 1564 | }, 1565 | "script":"16001471e5876f360625a4607d62fb04221846d0038710" 1566 | } 1567 | ], 1568 | "weight":654, 1569 | "time":1615209728, 1570 | "tx_index":0, 1571 | "vin_sz":1, 1572 | "hash":"672b1a90a5bf465de506478c3e3f20a89c978ebed5a5e7c4654e0435bd4e14be", 1573 | "vout_sz":2, 1574 | "relayed_by":"0.0.0.0", 1575 | "out":[ 1576 | { 1577 | "spent":false, 1578 | "tx_index":0, 1579 | "type":0, 1580 | "value":8114464, 1581 | "n":0, 1582 | "script":"00146359cec21d7a3308972ce59dbafd90f9cdf1ec9a" 1583 | }, 1584 | { 1585 | "spent":false, 1586 | "tx_index":0, 1587 | "type":0, 1588 | "value":100400, 1589 | "n":1, 1590 | "script":"00148d8caa079d0c64993f9278f1fc1fad6d7d26c3cf" 1591 | } 1592 | ] 1593 | }, 1594 | 1595 | { 1596 | "ver":2, 1597 | "inputs":[ 1598 | { 1599 | "sequence":4294967293, 1600 | "witness":"3044022036b6c8c70e3031a01c4fc73dbae09dd5277b5cce08841ec2dcef18eaeced325a0220706ce8b5c020bd01bbbcdfeda8b191c4cdfb3c4c5ac80e0806d410cd191b2f9301", 1601 | "prev_out":{ 1602 | "spent":true, 1603 | "spending_outpoints":[ 1604 | { 1605 | "tx_index":0, 1606 | "n":0 1607 | } 1608 | ], 1609 | "tx_index":0, 1610 | "type":0, 1611 | "value":1205120, 1612 | "n":1, 1613 | "script":"00146a20d80e8189ad5ac916cfad07fddd987d1545fa" 1614 | }, 1615 | "script":"" 1616 | } 1617 | ], 1618 | "weight":573, 1619 | "relayed_by":"0.0.0.0", 1620 | "out":[ 1621 | { 1622 | "spent":false, 1623 | "tx_index":0, 1624 | "type":0, 1625 | "value":1151721, 1626 | "n":0, 1627 | "script":"00145ee3603fb99ced29df94107c983c1f7f5515ad95" 1628 | }, 1629 | { 1630 | "spent":false, 1631 | "tx_index":0, 1632 | "type":0, 1633 | "addr":"1J9fB9Df7wdWNj1sEhBKQS9cQBVjp47cz", 1634 | "value":39517, 1635 | "n":1, 1636 | "script":"76a914033e4c80d9cb4f638ef11fc7cc2a3d91e5d178f888ac" 1637 | } 1638 | ], 1639 | "lock_time":673713, 1640 | "size":225, 1641 | "rbf":true, 1642 | "time":1615209728, 1643 | "tx_index":0, 1644 | "vin_sz":1, 1645 | "hash":"c7f9f73c21f795f4a3526c3b4272981154f17ff38f3e226f41548fdc2766fe99", 1646 | "vout_sz":2 1647 | }, 1648 | 1649 | { 1650 | "lock_time":0, 1651 | "ver":2, 1652 | "size":222, 1653 | "inputs":[ 1654 | { 1655 | "sequence":4294967295, 1656 | "witness":"3044022039614826a262e1451249c6b5fbb7fda5b08592a49cb2d36182fabbbdea9507e80220395f2fe4fac1fe4c9adc81a99ed1fb033c2dbc48005143ce294d4e7c53b6c4f801", 1657 | "prev_out":{ 1658 | "spent":true, 1659 | "spending_outpoints":[ 1660 | { 1661 | "tx_index":0, 1662 | "n":0 1663 | } 1664 | ], 1665 | "tx_index":0, 1666 | "type":0, 1667 | "value":17807666, 1668 | "n":1, 1669 | "script":"0014c3330912f22bda37b444bcf83de8d08b502d95a6" 1670 | }, 1671 | "script":"" 1672 | } 1673 | ], 1674 | "weight":561, 1675 | "time":1615209728, 1676 | "tx_index":0, 1677 | "vin_sz":1, 1678 | "hash":"7d0b30890bec3385b7f397e6e6581e6ba20baff43fd761a9bf129e3f3211224c", 1679 | "vout_sz":2, 1680 | "relayed_by":"0.0.0.0", 1681 | "out":[ 1682 | { 1683 | "spent":false, 1684 | "tx_index":0, 1685 | "type":0, 1686 | "value":2740876, 1687 | "n":0, 1688 | "script":"001401d20f5ebb3c24d6702bb73f9b7d839f876d2886" 1689 | }, 1690 | { 1691 | "spent":false, 1692 | "tx_index":0, 1693 | "type":0, 1694 | "value":15052429, 1695 | "n":1, 1696 | "script":"00147d17e11b492c7268590770338f2b53bcbccad839" 1697 | } 1698 | ] 1699 | }, 1700 | 1701 | { 1702 | "lock_time":0, 1703 | "ver":2, 1704 | "size":1046, 1705 | "inputs":[ 1706 | { 1707 | "sequence":4294967295, 1708 | "witness":"30440220499c9ddacd039563cfe2db8c860a2ffba736a18e1917a63691bd56a3b2a0b108022006bc7b909e666c4e6fecb5cd1ca6ebb50068a50c25589a494ac10504d37f63b001", 1709 | "prev_out":{ 1710 | "spent":true, 1711 | "spending_outpoints":[ 1712 | { 1713 | "tx_index":0, 1714 | "n":0 1715 | } 1716 | ], 1717 | "tx_index":0, 1718 | "type":0, 1719 | "addr":"35HRBCwUm1CBD5Dc9XYYTkxyksnferqBaD", 1720 | "value":15386, 1721 | "n":1, 1722 | "script":"a9142769ee368657a931b128553c2f45be29e4bad56f87" 1723 | }, 1724 | "script":"1600144e10a77311129c2ed11b2a90177020f0dd5027cf" 1725 | }, 1726 | { 1727 | "sequence":4294967295, 1728 | "witness":"3044022070aae3905f16f960fff3a82cd15762239276b7b22260538b1d45b0a176426c5002207ae2a5982a7fabadd2bc94b6f49c9b05f8351c27c02fd4244bdcd7108ae443f801", 1729 | "prev_out":{ 1730 | "spent":true, 1731 | "spending_outpoints":[ 1732 | { 1733 | "tx_index":0, 1734 | "n":0 1735 | } 1736 | ], 1737 | "tx_index":0, 1738 | "type":0, 1739 | "addr":"3NyhQa7ZV1GAEf2JV9982zBi2yWJQEwwbn", 1740 | "value":40157, 1741 | "n":54, 1742 | "script":"a914e982417bf61d51feab40a85d84491b22d55c9b1787" 1743 | }, 1744 | "script":"1600149724a496c1b6deac30becdf24874ddfc1d163415" 1745 | }, 1746 | { 1747 | "sequence":4294967295, 1748 | "witness":"30440220583cc80a1ba6a0f1e1e99d49a0cb4337816442be516286bed7d1487d0deecb9d0220569f26ceba94b9c7ff0c59a8fbba28cc857e5e01d5fc2ea24ec9c3086b69aad701", 1749 | "prev_out":{ 1750 | "spent":true, 1751 | "spending_outpoints":[ 1752 | { 1753 | "tx_index":0, 1754 | "n":0 1755 | } 1756 | ], 1757 | "tx_index":0, 1758 | "type":0, 1759 | "addr":"3Gvk6vKHXJr9bgzwXP3yNr4bjPjfXibiWi", 1760 | "value":34619, 1761 | "n":0, 1762 | "script":"a914a72280e10a42b2d4228f4e4a8d0421bd9ac54db387" 1763 | }, 1764 | "script":"16001431162995c3d1e4aca2109c1df1ef3e541cc6d587" 1765 | }, 1766 | { 1767 | "sequence":4294967295, 1768 | "witness":"304402207724684d9b287c0d675ebdc7a33b6b7855511d240ee1f96227fc3220fdafbac7022076234e9e8bd775842d6a441da8c8553d8f36af6a7957cfa347c248e918befe0401", 1769 | "prev_out":{ 1770 | "spent":true, 1771 | "spending_outpoints":[ 1772 | { 1773 | "tx_index":0, 1774 | "n":0 1775 | } 1776 | ], 1777 | "tx_index":0, 1778 | "type":0, 1779 | "addr":"3Qm66VN98NH6DYvoMiYmMY74K64zX37VFJ", 1780 | "value":47226, 1781 | "n":33, 1782 | "script":"a914fd1009ff718cd7f9a22753040304b4abae2b013787" 1783 | }, 1784 | "script":"1600143b1f3d0b1bb1e6e133cccba06741faedff517975" 1785 | }, 1786 | { 1787 | "sequence":4294967295, 1788 | "witness":"30440220637fc27d4e348a8e04b973e5113472cb9a1442a2b632ed2f862f6f05d38139530220023471dc23e624657d01f130cfc453323a7495793ff729db4a8e0d11e59d6db201", 1789 | "prev_out":{ 1790 | "spent":true, 1791 | "spending_outpoints":[ 1792 | { 1793 | "tx_index":0, 1794 | "n":0 1795 | } 1796 | ], 1797 | "tx_index":0, 1798 | "type":0, 1799 | "value":3564, 1800 | "n":0, 1801 | "script":"0014de4b57833238e6c2b99f059942a31df5659671bc" 1802 | }, 1803 | "script":"" 1804 | }, 1805 | { 1806 | "sequence":4294967295, 1807 | "witness":"3044022012d2cd06c526f303df7a74a933f8ae7a8f45951fd155670157727389b8e2b02702201d581b6bbd1560f6d60f468efecb4acf6e541b6f8eb5c6903361ccdf5f9b8d0e01", 1808 | "prev_out":{ 1809 | "spent":true, 1810 | "spending_outpoints":[ 1811 | { 1812 | "tx_index":0, 1813 | "n":0 1814 | } 1815 | ], 1816 | "tx_index":0, 1817 | "type":0, 1818 | "addr":"3EDGq7GswrsJis1Uc2UC49FscApgFFkBMy", 1819 | "value":46780, 1820 | "n":5, 1821 | "script":"a914895a6e70d5208a3b1ae3358bd8ea82b25aecbe2187" 1822 | }, 1823 | "script":"1600147381704eec0a2e8efd09e48670b1d2eff2b9cc30" 1824 | } 1825 | ], 1826 | "weight":2252, 1827 | "time":1615209727, 1828 | "tx_index":0, 1829 | "vin_sz":6, 1830 | "hash":"1ea1b89cf3af3c9427cf2be36e23873b60a70c4ee5d53ac3929841547384a2d3", 1831 | "vout_sz":1, 1832 | "relayed_by":"0.0.0.0", 1833 | "out":[ 1834 | { 1835 | "spent":false, 1836 | "tx_index":0, 1837 | "type":0, 1838 | "value":181412, 1839 | "n":0, 1840 | "script":"0014828456ed612226c3ea8b8e67def64ebfa0f48bfa" 1841 | } 1842 | ] 1843 | }, 1844 | 1845 | { 1846 | "lock_time":0, 1847 | "ver":1, 1848 | "size":340, 1849 | "inputs":[ 1850 | { 1851 | "sequence":4294967295, 1852 | "witness":"", 1853 | "prev_out":{ 1854 | "spent":true, 1855 | "spending_outpoints":[ 1856 | { 1857 | "tx_index":0, 1858 | "n":0 1859 | } 1860 | ], 1861 | "tx_index":0, 1862 | "type":0, 1863 | "addr":"1LSpcZvbY68GYKAZX9ETo8dGZZ7U3PJGZE", 1864 | "value":684255, 1865 | "n":10, 1866 | "script":"76a914d54c88d2a0240af4cd74e2c3eb170696d09cd4e488ac" 1867 | }, 1868 | "script":"483045022100b14cebcd5d3a567edd8cbda9adc2c28f8206585005189e0c4ab82e2b28b95d510220133f730da240bc9c4515db96ed6dd3c072221daa121eb7272a7653c249d3700401210251122a4b8bac9bd5dcee4bdeb54e2a178cffde6e440b5db7b845ffcd2608584f" 1869 | }, 1870 | { 1871 | "sequence":4294967295, 1872 | "witness":"", 1873 | "prev_out":{ 1874 | "spent":true, 1875 | "spending_outpoints":[ 1876 | { 1877 | "tx_index":0, 1878 | "n":0 1879 | } 1880 | ], 1881 | "tx_index":0, 1882 | "type":0, 1883 | "addr":"12mxTjpYW8Eaao5mbMJuLqh2ejgQNJVjxB", 1884 | "value":94341, 1885 | "n":20, 1886 | "script":"76a9141378b9808c228c7fdb844338d9f50b427bae08b188ac" 1887 | }, 1888 | "script":"483045022100cdbb4423c0b8daa1ffd98923a69560018497d5cc466b58b83781e73e173e89f4022023b7d63fe38a689427d52b6c5ae0203feb53a395ea4ff49dffc82cfde6768a0301210314c6c2500a405fb5807479505e10765fd7f6ce106a458bf49b8ed97936f2fa7c" 1889 | } 1890 | ], 1891 | "weight":1360, 1892 | "time":1615209727, 1893 | "tx_index":0, 1894 | "vin_sz":2, 1895 | "hash":"fdfc4f71ec8c98f7844a79f806e0f7c37b068b7021f4c42485b954d54fe835bc", 1896 | "vout_sz":1, 1897 | "relayed_by":"0.0.0.0", 1898 | "out":[ 1899 | { 1900 | "spent":false, 1901 | "tx_index":0, 1902 | "type":0, 1903 | "addr":"17KQDrZNn9tmnWAup38wWAFfqgkYPNMpXw", 1904 | "value":772225, 1905 | "n":0, 1906 | "script":"76a914454ba05f4c49788af29def97ae42e3cd4a40616e88ac" 1907 | } 1908 | ] 1909 | }, 1910 | 1911 | { 1912 | "lock_time":673713, 1913 | "ver":2, 1914 | "size":249, 1915 | "inputs":[ 1916 | { 1917 | "sequence":4294967294, 1918 | "witness":"3044022076f673fababb51bd52e4a8f3221a178e9c760a3fd5200f44d80a0909b482295e0220399bcc011e3771373c4a9a28da806b097809baeaab544646480ed01fadd8862601", 1919 | "prev_out":{ 1920 | "spent":true, 1921 | "spending_outpoints":[ 1922 | { 1923 | "tx_index":0, 1924 | "n":0 1925 | } 1926 | ], 1927 | "tx_index":0, 1928 | "type":0, 1929 | "addr":"3EfG9bb6EQaCQQ9y4d5KmyYqnft9pmST1H", 1930 | "value":1106425258, 1931 | "n":1, 1932 | "script":"a9148e44ad80cbd3c871d9ce56013793da51990b3f3787" 1933 | }, 1934 | "script":"1600148b2b69a69e797d012ea03699e75859c637c1818c" 1935 | } 1936 | ], 1937 | "weight":669, 1938 | "time":1615209727, 1939 | "tx_index":0, 1940 | "vin_sz":1, 1941 | "hash":"c43fcb7fd6c7d7080b8da9ecaac9d6aeb078d507aca0ca62fd77c9eb64191da1", 1942 | "vout_sz":2, 1943 | "relayed_by":"0.0.0.0", 1944 | "out":[ 1945 | { 1946 | "spent":false, 1947 | "tx_index":0, 1948 | "type":0, 1949 | "addr":"15gVevvYsxQDYfXWfL9ZwzNVkRbPRbcCRg", 1950 | "value":106061, 1951 | "n":0, 1952 | "script":"76a9143358a50f6c710bf0393ceefcefed3155176b24a688ac" 1953 | }, 1954 | { 1955 | "spent":false, 1956 | "tx_index":0, 1957 | "type":0, 1958 | "addr":"3PfoWZyJaRHQcF3UJpCfCcCstVsmds42i6", 1959 | "value":1106293997, 1960 | "n":1, 1961 | "script":"a914f117fd3804f769f4832bd172a28cc951c56de4cf87" 1962 | } 1963 | ] 1964 | }, 1965 | 1966 | { 1967 | "lock_time":0, 1968 | "ver":2, 1969 | "size":224, 1970 | "inputs":[ 1971 | { 1972 | "sequence":4294967294, 1973 | "witness":"304402201e2fca000f4d65fec2918056f2b6abfad9cecc5518287cc56ffae8ee00693ff302203f5223d15238393e89c8e27f4bd14c254e592df362d091512da0e9a56c7d348101", 1974 | "prev_out":{ 1975 | "spent":true, 1976 | "spending_outpoints":[ 1977 | { 1978 | "tx_index":0, 1979 | "n":0 1980 | } 1981 | ], 1982 | "tx_index":0, 1983 | "type":0, 1984 | "value":3250542, 1985 | "n":0, 1986 | "script":"0014766c01b8d55f03c3df93459c860fa52090051325" 1987 | }, 1988 | "script":"" 1989 | } 1990 | ], 1991 | "weight":569, 1992 | "time":1615209727, 1993 | "tx_index":0, 1994 | "vin_sz":1, 1995 | "hash":"e9b3573b1d14592126ee25a5a21f3bda4b7c77d890e7e3e418f056f11089cc6d", 1996 | "vout_sz":2, 1997 | "relayed_by":"0.0.0.0", 1998 | "out":[ 1999 | { 2000 | "spent":false, 2001 | "tx_index":0, 2002 | "type":0, 2003 | "addr":"3N2EarNkd6rSagvU2MevR1ruELWYMZ7R8j", 2004 | "value":159938, 2005 | "n":0, 2006 | "script":"a914df04fcc5d16fbb2d08aec40b46a8ba3137df9dab87" 2007 | }, 2008 | { 2009 | "spent":false, 2010 | "tx_index":0, 2011 | "type":0, 2012 | "addr":"3HFYYijQ7ZHVyoZH5zLFwhpRgSz8dH8xnz", 2013 | "value":3076818, 2014 | "n":1, 2015 | "script":"a914aab0c2ccef8a683b51026c8fd857c4ef1575d48787" 2016 | } 2017 | ] 2018 | }, 2019 | 2020 | { 2021 | "lock_time":0, 2022 | "ver":1, 2023 | "size":223, 2024 | "inputs":[ 2025 | { 2026 | "sequence":4294967295, 2027 | "witness":"", 2028 | "prev_out":{ 2029 | "spent":true, 2030 | "spending_outpoints":[ 2031 | { 2032 | "tx_index":0, 2033 | "n":0 2034 | } 2035 | ], 2036 | "tx_index":0, 2037 | "type":0, 2038 | "addr":"17wgtuNHQ5JgSjuWsNS2aFXGg61KsB9krC", 2039 | "value":72203, 2040 | "n":1, 2041 | "script":"76a9144c2884eaa9ce972cbd9a410606c4ad0fc3ef8ad388ac" 2042 | }, 2043 | "script":"483045022100ce98bd9b8c7cc9f06aeeaf93fc9b219e668c91f976915d0990f9c1241bcb8e2e02205139f083727669db31580613a4064a5160c7653206fb8df9c8b789c505f1a0c501210259fbce3d6bbcaeff199d3a07866d40762a752d0e06967efe35794a62f68854dd" 2044 | } 2045 | ], 2046 | "weight":892, 2047 | "time":1615209727, 2048 | "tx_index":0, 2049 | "vin_sz":1, 2050 | "hash":"554a57ca59c3bf71b62d70ec0ef186bd7645682a508b70b696bb0d6031f85a64", 2051 | "vout_sz":2, 2052 | "relayed_by":"0.0.0.0", 2053 | "out":[ 2054 | { 2055 | "spent":false, 2056 | "tx_index":0, 2057 | "type":0, 2058 | "addr":"1HwszroKQbHzfhRuLkhAGc2qeSdAUDB2Xz", 2059 | "value":26837, 2060 | "n":0, 2061 | "script":"76a914b9e30b8b8a8edec4e47403249d3b16016ee5af7f88ac" 2062 | }, 2063 | { 2064 | "spent":false, 2065 | "tx_index":0, 2066 | "type":0, 2067 | "value":41592, 2068 | "n":1, 2069 | "script":"0014d7eabb222971e1740f4a00321507c7a3385810cc" 2070 | } 2071 | ] 2072 | }, 2073 | 2074 | { 2075 | "lock_time":0, 2076 | "ver":1, 2077 | "size":223, 2078 | "inputs":[ 2079 | { 2080 | "sequence":4294967295, 2081 | "witness":"", 2082 | "prev_out":{ 2083 | "spent":true, 2084 | "spending_outpoints":[ 2085 | { 2086 | "tx_index":0, 2087 | "n":0 2088 | } 2089 | ], 2090 | "tx_index":0, 2091 | "type":0, 2092 | "addr":"1JXWkbsTKC2d2k3rvqKeoUNQkpPgY5kWM1", 2093 | "value":89500, 2094 | "n":0, 2095 | "script":"76a914c03f73e316a3fc2ce00120231ad7db4b5c693be988ac" 2096 | }, 2097 | "script":"47304402206f50d76ef327d16208e4b0c27fe90969fa0c4e9220dc56d98021c73df285e41d022021bb34fc4ab98fedbb69f561255d32ebec436e1af122fe271c84ffcdc2d51599012102f7a3ed7dd0608ed04d4261c9b3b0be7519fd90948e5d46a8c5dd3267fb229ca3" 2098 | } 2099 | ], 2100 | "weight":892, 2101 | "time":1615209727, 2102 | "tx_index":0, 2103 | "vin_sz":1, 2104 | "hash":"b1b3023b6e2a6268c499e0a07cee3f7017c1c7370181abaa90f3945c2d55f25c", 2105 | "vout_sz":2, 2106 | "relayed_by":"0.0.0.0", 2107 | "out":[ 2108 | { 2109 | "spent":false, 2110 | "tx_index":0, 2111 | "type":0, 2112 | "addr":"1NNDVs1w3csSfUMjbxBumj4oaWuVNZnaSa", 2113 | "value":35913, 2114 | "n":0, 2115 | "script":"76a914ea5dcf2478ac996f27c840ec073d61c5d91085a388ac" 2116 | }, 2117 | { 2118 | "spent":false, 2119 | "tx_index":0, 2120 | "type":0, 2121 | "addr":"3BYr4AdiVzoqCg4zayXmY8y9kmVkRxYN2w", 2122 | "value":49728, 2123 | "n":1, 2124 | "script":"a9146c25b13933f4360e6b025d6cd714ae25d7fc94f587" 2125 | } 2126 | ] 2127 | }, 2128 | 2129 | { 2130 | "lock_time":0, 2131 | "ver":1, 2132 | "size":223, 2133 | "inputs":[ 2134 | { 2135 | "sequence":4294967295, 2136 | "witness":"", 2137 | "prev_out":{ 2138 | "spent":true, 2139 | "spending_outpoints":[ 2140 | { 2141 | "tx_index":0, 2142 | "n":0 2143 | } 2144 | ], 2145 | "tx_index":0, 2146 | "type":0, 2147 | "addr":"1Nazvb8JbiE9ib4GFhGeAMWwrCQ6PNEGDJ", 2148 | "value":19561762, 2149 | "n":1, 2150 | "script":"76a914ecc8b87d985cb80c6038803d4628aaa595d3a1eb88ac" 2151 | }, 2152 | "script":"47304402205200946e750dd70764f4d0a54886b16c982874faf8eab7c8d3eb83fecc30e6c202207b9d7e914ffea6aa29ce4ebbe43748a6072812f02499b12edb20b7b7e9572871012103aac6fa5ae7c8efdfd46e3fb53a8eddd8fff16e1ef92e723257d92453fff49ed8" 2153 | } 2154 | ], 2155 | "weight":892, 2156 | "time":1615209727, 2157 | "tx_index":0, 2158 | "vin_sz":1, 2159 | "hash":"459588cf273b1bd4f128a079219f51f3823ef406f8b0cff004bf6f12a3bcba46", 2160 | "vout_sz":2, 2161 | "relayed_by":"0.0.0.0", 2162 | "out":[ 2163 | { 2164 | "spent":false, 2165 | "tx_index":0, 2166 | "type":0, 2167 | "addr":"3LoK34ELN7LEEn3qHBp6g1qc1q9MVHpz2W", 2168 | "value":2183463, 2169 | "n":0, 2170 | "script":"a914d19b2b979726e11028af0b3396cb9d1e9c4784a487" 2171 | }, 2172 | { 2173 | "spent":false, 2174 | "tx_index":0, 2175 | "type":0, 2176 | "addr":"1Nazvb8JbiE9ib4GFhGeAMWwrCQ6PNEGDJ", 2177 | "value":17356445, 2178 | "n":1, 2179 | "script":"76a914ecc8b87d985cb80c6038803d4628aaa595d3a1eb88ac" 2180 | } 2181 | ] 2182 | }, 2183 | 2184 | { 2185 | "lock_time":0, 2186 | "ver":1, 2187 | "size":224, 2188 | "inputs":[ 2189 | { 2190 | "sequence":4294967295, 2191 | "witness":"", 2192 | "prev_out":{ 2193 | "spent":true, 2194 | "spending_outpoints":[ 2195 | { 2196 | "tx_index":0, 2197 | "n":0 2198 | } 2199 | ], 2200 | "tx_index":0, 2201 | "type":0, 2202 | "addr":"1NVh14zWv1GBdSHB6z1U9AUecVxQnSfaJq", 2203 | "value":4579615, 2204 | "n":48, 2205 | "script":"76a914ebc7ae00b70e41822f52bc071315c89de3bfe89888ac" 2206 | }, 2207 | "script":"483045022100f86fdcdc63bb90d435a3be33a6b750f818e060058ca7f5a857639b94f845eec90220372a5d7efebf86af8d361b7832056156b515c5c3e1345f8ee8bcdd8e4b2bf17c01210266cf6f6f09062f01c3ec47687f033173e1ac1b1bca4438ac66b547055a565ded" 2208 | } 2209 | ], 2210 | "weight":896, 2211 | "time":1615209727, 2212 | "tx_index":0, 2213 | "vin_sz":1, 2214 | "hash":"5789bbbd8c3fc8de78e99d8d0715e289425ba1f6d5f60d8c49cb475fe9a6e22a", 2215 | "vout_sz":2, 2216 | "relayed_by":"0.0.0.0", 2217 | "out":[ 2218 | { 2219 | "spent":false, 2220 | "tx_index":0, 2221 | "type":0, 2222 | "addr":"1KLWNfPQiY8Y86CdxjniPvQm7cdyc432zr", 2223 | "value":599496, 2224 | "n":0, 2225 | "script":"76a914c922afe7a244cebd6bf4f969ba1481a067bfb9be88ac" 2226 | }, 2227 | { 2228 | "spent":false, 2229 | "tx_index":0, 2230 | "type":0, 2231 | "addr":"3HvTZDtJYgydhaouUvkQK7CKKsNA6oBkAA", 2232 | "value":3976277, 2233 | "n":1, 2234 | "script":"a914b20cd11ff42dd34e9a2822928f15387cfb23c5ff87" 2235 | } 2236 | ] 2237 | }, 2238 | 2239 | { 2240 | "lock_time":0, 2241 | "ver":1, 2242 | "size":225, 2243 | "inputs":[ 2244 | { 2245 | "sequence":4294967295, 2246 | "witness":"", 2247 | "prev_out":{ 2248 | "spent":true, 2249 | "spending_outpoints":[ 2250 | { 2251 | "tx_index":0, 2252 | "n":0 2253 | } 2254 | ], 2255 | "tx_index":0, 2256 | "type":0, 2257 | "addr":"1CFq5bbyyC31zBQJYq3BKYxjoEoZVftJeb", 2258 | "value":1476495, 2259 | "n":1, 2260 | "script":"76a9147b775774ba2d39b865ab864cc08519064327189c88ac" 2261 | }, 2262 | "script":"47304402205df61b4afaf3bb83912cab3a5b9666a76127248af200f38a1919df7f9e72e68602201e02242fb7a1d979ca8de07f78c1b9b12601a58b2afaef8f6b8ead4b09ffe06901210241fd620ffbcf975633227299aa47b6903bca3b38d462dac6eab31822d18b11b3" 2263 | } 2264 | ], 2265 | "weight":900, 2266 | "time":1615209727, 2267 | "tx_index":0, 2268 | "vin_sz":1, 2269 | "hash":"18406741e7185ade359d7a151c0d2640f614e00acbe43d749363ceb854a3db00", 2270 | "vout_sz":2, 2271 | "relayed_by":"0.0.0.0", 2272 | "out":[ 2273 | { 2274 | "spent":false, 2275 | "tx_index":0, 2276 | "type":0, 2277 | "addr":"1N9uLaZyriNpbAa3Gowqrvjd22b1C31vWm", 2278 | "value":679048, 2279 | "n":0, 2280 | "script":"76a914e809a889cddf3c2f3e152354adc742afcf2ff26488ac" 2281 | }, 2282 | { 2283 | "spent":false, 2284 | "tx_index":0, 2285 | "type":0, 2286 | "addr":"1H52DMcA8Ap9tzBPrLiDHa8R74Vxfp9wRD", 2287 | "value":793605, 2288 | "n":1, 2289 | "script":"76a914b044b0602b0ab15ecabaf118991eec602343fa1688ac" 2290 | } 2291 | ] 2292 | }, 2293 | 2294 | { 2295 | "lock_time":0, 2296 | "ver":1, 2297 | "size":372, 2298 | "inputs":[ 2299 | { 2300 | "sequence":4294967295, 2301 | "witness":"", 2302 | "prev_out":{ 2303 | "spent":true, 2304 | "spending_outpoints":[ 2305 | { 2306 | "tx_index":0, 2307 | "n":0 2308 | } 2309 | ], 2310 | "tx_index":0, 2311 | "type":0, 2312 | "addr":"1k1KSe2r7sQN3c8dqF2otvAbbBnED8zxL", 2313 | "value":211684, 2314 | "n":51, 2315 | "script":"76a914082226db2c0fe5edc2c8a93ed2bab8d51334587888ac" 2316 | }, 2317 | "script":"473044022005e0d07481ac58bd514938aab580e15e231b708d24e40c39f56a646eaa00b0310220745de06d06b6d15b1bdea625b0b3eb4b3499d823353e69d2b4428fd028bb5499012102eb2e9b1950756cb73931c0515f73285d79902ef307b89be4183224b455970546" 2318 | }, 2319 | { 2320 | "sequence":4294967295, 2321 | "witness":"", 2322 | "prev_out":{ 2323 | "spent":true, 2324 | "spending_outpoints":[ 2325 | { 2326 | "tx_index":0, 2327 | "n":0 2328 | } 2329 | ], 2330 | "tx_index":0, 2331 | "type":0, 2332 | "addr":"13juq9JnQzpERFeNi5DBmyYbMeyF3Rg18z", 2333 | "value":10407, 2334 | "n":0, 2335 | "script":"76a9141e0dd2806d3a41569cc5f93baabe4bf95e4dbc9a88ac" 2336 | }, 2337 | "script":"47304402201572da17b31ba7e32023074d395d8d23cbfbb9f2e31fd48ed71fbabedc108891022026e1e381a863a0fa52b5a4fdfd4f662dd3d20efddd26b439cbcd6a5617836d0d0121036a4d5dae536f94e4e403fa7cb3b46842664769c194fb094b5f7ad447ae63c3ba" 2338 | } 2339 | ], 2340 | "weight":1488, 2341 | "time":1615209726, 2342 | "tx_index":0, 2343 | "vin_sz":2, 2344 | "hash":"18d7c57fd8d37dd49c0ac2cadae0002c60b6a376b807c277ec4b2fc527346ed9", 2345 | "vout_sz":2, 2346 | "relayed_by":"0.0.0.0", 2347 | "out":[ 2348 | { 2349 | "spent":false, 2350 | "tx_index":0, 2351 | "type":0, 2352 | "addr":"1CSgGQK23KBH8ACPU67Jr7GgW5pCtoPbqf", 2353 | "value":98847, 2354 | "n":0, 2355 | "script":"76a9147d848f556708f957545d54e3cbae48bd33d134ba88ac" 2356 | }, 2357 | { 2358 | "spent":false, 2359 | "tx_index":0, 2360 | "type":0, 2361 | "addr":"1AkqqqLQpDbeKCNr8FQTFhsREEKsAqnMsL", 2362 | "value":116920, 2363 | "n":1, 2364 | "script":"76a9146b03ca249e79f06b056bd906ff5f0cf15f72bd4188ac" 2365 | } 2366 | ] 2367 | }, 2368 | 2369 | { 2370 | "lock_time":0, 2371 | "ver":1, 2372 | "size":248, 2373 | "inputs":[ 2374 | { 2375 | "sequence":4294967295, 2376 | "witness":"30450221008b825cab88b03444cb83fc6b331fb8763dca695bcdc4c801a3834dc3141e880c02206231cbda864fea5613086c56757765257d1de90e318ee3974110d4ded33759ed01", 2377 | "prev_out":{ 2378 | "spent":true, 2379 | "spending_outpoints":[ 2380 | { 2381 | "tx_index":0, 2382 | "n":0 2383 | } 2384 | ], 2385 | "tx_index":0, 2386 | "type":0, 2387 | "addr":"32dsUjdJGrDz5AiHCNHQW6ASaer51wHpWU", 2388 | "value":22869000, 2389 | "n":1, 2390 | "script":"a9140a5fd411c3e2aff85fe0bd7e9fa6f27e039d947f87" 2391 | }, 2392 | "script":"16001427b9cd927db9597ee33e964f0b31fa67c55a3b3f" 2393 | } 2394 | ], 2395 | "weight":662, 2396 | "time":1615209726, 2397 | "tx_index":0, 2398 | "vin_sz":1, 2399 | "hash":"1a5432be0408584edf0b5a1a5b0a203f25f427afdbfbe632a4502fa6ea11f102", 2400 | "vout_sz":2, 2401 | "relayed_by":"0.0.0.0", 2402 | "out":[ 2403 | { 2404 | "spent":false, 2405 | "tx_index":0, 2406 | "type":0, 2407 | "addr":"3GoatJ7c1bVwkHbUamoCBNpzi4vDNKb18F", 2408 | "value":1425263, 2409 | "n":0, 2410 | "script":"a914a5c7e5ae1bcd347154de30df262ab4ff8f59ec0d87" 2411 | }, 2412 | { 2413 | "spent":false, 2414 | "tx_index":0, 2415 | "type":0, 2416 | "addr":"3DwbXCAmn89VKPUeqFbEhHGRHVaB7rPiB9", 2417 | "value":21427538, 2418 | "n":1, 2419 | "script":"a914866360ea3356c4ce6747e13a33f74c66fc34b92887" 2420 | } 2421 | ] 2422 | }, 2423 | 2424 | { 2425 | "ver":1, 2426 | "inputs":[ 2427 | { 2428 | "sequence":4294967293, 2429 | "witness":"3045022100ff935760bcff3d6d1ea28882f1b043628e28d785608989779e95cf86ad4efa90022031c73981dc3bb076d45105a594d82e1473bb4a0010f28ef39dbe74d0a9928c2c01", 2430 | "prev_out":{ 2431 | "spent":true, 2432 | "spending_outpoints":[ 2433 | { 2434 | "tx_index":0, 2435 | "n":0 2436 | } 2437 | ], 2438 | "tx_index":0, 2439 | "type":0, 2440 | "addr":"3L1p2tUHPwrRN3qgf4Hm1R73e29hFshbnp", 2441 | "value":18307442, 2442 | "n":1, 2443 | "script":"a914c9003dd968df7175c44163ea9b933e785a39dc8e87" 2444 | }, 2445 | "script":"160014bf1e4e383be05ae5e56e716ec8d1757b6f4c5c25" 2446 | } 2447 | ], 2448 | "weight":806, 2449 | "relayed_by":"0.0.0.0", 2450 | "out":[ 2451 | { 2452 | "spent":false, 2453 | "tx_index":0, 2454 | "type":0, 2455 | "addr":"1Nofy63ZL27TvmpyimFCNC8FdZxajaAaX6", 2456 | "value":160785, 2457 | "n":0, 2458 | "script":"76a914ef2e4dc12ffb4a2afe94ee2b16c1d26456f8ab0888ac" 2459 | }, 2460 | { 2461 | "spent":false, 2462 | "tx_index":0, 2463 | "type":0, 2464 | "addr":"1NTPbFG7PKBo3SaRDDYFBZKqquHZ1kGwkm", 2465 | "value":1189931, 2466 | "n":1, 2467 | "script":"76a914eb585063a6af7b28c66aa3936020e32e06a2dab388ac" 2468 | }, 2469 | { 2470 | "spent":false, 2471 | "tx_index":0, 2472 | "type":0, 2473 | "addr":"3L1p2tUHPwrRN3qgf4Hm1R73e29hFshbnp", 2474 | "value":16921838, 2475 | "n":2, 2476 | "script":"a914c9003dd968df7175c44163ea9b933e785a39dc8e87" 2477 | } 2478 | ], 2479 | "lock_time":0, 2480 | "size":284, 2481 | "rbf":true, 2482 | "time":1615209725, 2483 | "tx_index":0, 2484 | "vin_sz":1, 2485 | "hash":"551eded6ea5fe18344eb67b35dd0eb4886de868c98e07dceea2a3f424cad0fec", 2486 | "vout_sz":3 2487 | }, 2488 | 2489 | { 2490 | "lock_time":0, 2491 | "ver":1, 2492 | "size":1771, 2493 | "inputs":[ 2494 | { 2495 | "sequence":4294967295, 2496 | "witness":"3045022100dd63cc0e5901365a29b443f49c8574d4d6be4c9fbf99d647b1edf5ae59b82b09022055d1be0e5c20394d618e80ecf35dea7ebc44a5e394cabaf183ec404777039ee401", 2497 | "prev_out":{ 2498 | "spent":true, 2499 | "spending_outpoints":[ 2500 | { 2501 | "tx_index":0, 2502 | "n":0 2503 | } 2504 | ], 2505 | "tx_index":0, 2506 | "type":0, 2507 | "value":116951302, 2508 | "n":21, 2509 | "script":"00140c473318cc02dd8cfa522de2a189440b2f69f462" 2510 | }, 2511 | "script":"" 2512 | } 2513 | ], 2514 | "weight":6754, 2515 | "time":1615209726, 2516 | "tx_index":0, 2517 | "vin_sz":1, 2518 | "hash":"367906f80b90694bab0555d6d94da7493862c76d4a4f2c62653a84901369f585", 2519 | "vout_sz":49, 2520 | "relayed_by":"0.0.0.0", 2521 | "out":[ 2522 | { 2523 | "spent":false, 2524 | "tx_index":0, 2525 | "type":0, 2526 | "value":54410770, 2527 | "n":0, 2528 | "script":"0014b1f2c2e862697445c13841daba25ec7731fb8d17" 2529 | }, 2530 | { 2531 | "spent":false, 2532 | "tx_index":0, 2533 | "type":0, 2534 | "addr":"1NbPL1F4tL4E9gK8SfogYCNRh2UshKPzN9", 2535 | "value":986195, 2536 | "n":1, 2537 | "script":"76a914ecdb6c1f2cff5edb443ad9d468bc925d953769d988ac" 2538 | }, 2539 | { 2540 | "spent":false, 2541 | "tx_index":0, 2542 | "type":0, 2543 | "addr":"353G6ZD6fWtTeeEDqantpTLH9ymJTTS4j2", 2544 | "value":99158, 2545 | "n":2, 2546 | "script":"a91424bc86fd2bfb09dca25b25451a92b5df6c39f8b587" 2547 | }, 2548 | { 2549 | "spent":false, 2550 | "tx_index":0, 2551 | "type":0, 2552 | "addr":"3FA7YzabtK7TxqTV6sCJbC21NEvnu75HMK", 2553 | "value":1052706, 2554 | "n":3, 2555 | "script":"a91493b9908621deaa82d1fffd7e9987075bc9aa452b87" 2556 | }, 2557 | { 2558 | "spent":false, 2559 | "tx_index":0, 2560 | "type":0, 2561 | "addr":"1NadXv9bM2mm2viQcvaXguQsvu4RhKoRnd", 2562 | "value":49575, 2563 | "n":4, 2564 | "script":"76a914ecb6dd4c40cb19d73ae1eb665cbb39dc67c2ed9e88ac" 2565 | }, 2566 | { 2567 | "spent":false, 2568 | "tx_index":0, 2569 | "type":0, 2570 | "value":49662, 2571 | "n":5, 2572 | "script":"00149b6e8215c4f8b69d01521e766f1379c43d8724b9" 2573 | }, 2574 | { 2575 | "spent":false, 2576 | "tx_index":0, 2577 | "type":0, 2578 | "addr":"3DEQgguB8F37EFz33m74JFxRAD643eBCYH", 2579 | "value":11754, 2580 | "n":6, 2581 | "script":"a9147e99474962fc85ff9c79348bb5977124ad79d44787" 2582 | }, 2583 | { 2584 | "spent":false, 2585 | "tx_index":0, 2586 | "type":0, 2587 | "addr":"1VPhBfaTPRska8S5YBPFt2Bh6YvzkEMPP", 2588 | "value":582242, 2589 | "n":7, 2590 | "script":"76a914055e9706c284988c39c93585258f457a18fa3d6588ac" 2591 | }, 2592 | { 2593 | "spent":false, 2594 | "tx_index":0, 2595 | "type":0, 2596 | "value":77332, 2597 | "n":8, 2598 | "script":"0014129d320769428a2312991bff672601f447da8338" 2599 | }, 2600 | { 2601 | "spent":false, 2602 | "tx_index":0, 2603 | "type":0, 2604 | "addr":"17EE5kx3tvPjjwa6oFfoA5bS6hVgz1ycHs", 2605 | "value":693460, 2606 | "n":9, 2607 | "script":"76a91444511520fe2791194cfe461801076f3f27b2ffde88ac" 2608 | }, 2609 | { 2610 | "spent":false, 2611 | "tx_index":0, 2612 | "type":0, 2613 | "addr":"1GgnPxS9m6Wm5zuz97TmDAdUhvJyYdn7xs", 2614 | "value":274357, 2615 | "n":10, 2616 | "script":"76a914ac1000f69624292146d0539be58dd257da8b42e088ac" 2617 | }, 2618 | { 2619 | "spent":false, 2620 | "tx_index":0, 2621 | "type":0, 2622 | "addr":"15EcnefHg3tP73TNf9xfUthaensGH9yvFa", 2623 | "value":473218, 2624 | "n":11, 2625 | "script":"76a9142e73c8bf50876d3326e997fc09022e1a0700a87388ac" 2626 | }, 2627 | { 2628 | "spent":false, 2629 | "tx_index":0, 2630 | "type":0, 2631 | "addr":"34rwKtjnHUiCTf4gmTwpsCZgQ14BttgyDB", 2632 | "value":31892, 2633 | "n":12, 2634 | "script":"a91422c8b300a15886e225a24f0aeb2289b4d9cc3e7287" 2635 | }, 2636 | { 2637 | "spent":false, 2638 | "tx_index":0, 2639 | "type":0, 2640 | "addr":"3KXBw38jzFhzWM15XzxPdKRumzA4ubBot1", 2641 | "value":418459, 2642 | "n":13, 2643 | "script":"a914c396758ca5a42008d3153a465a7d81844b65a2b487" 2644 | }, 2645 | { 2646 | "spent":false, 2647 | "tx_index":0, 2648 | "type":0, 2649 | "addr":"3GAyUBfhGGP2TzFT1M5iQuoMu9TvsXHZL2", 2650 | "value":70302, 2651 | "n":14, 2652 | "script":"a9149edb5be89b6ac76f214221e498750d7d19dfc1ea87" 2653 | }, 2654 | { 2655 | "spent":false, 2656 | "tx_index":0, 2657 | "type":0, 2658 | "addr":"3MQzDG7fdeyLU9vkum12nUUDd5EQmZUaoy", 2659 | "value":5834119, 2660 | "n":15, 2661 | "script":"a914d85a6e6ec955ad2d29e0e054ca082fe386a9b97e87" 2662 | }, 2663 | { 2664 | "spent":false, 2665 | "tx_index":0, 2666 | "type":0, 2667 | "addr":"3GmJ8t8R3yfM2aKY3E1eNsxazwDsE7u3iE", 2668 | "value":2366869, 2669 | "n":16, 2670 | "script":"a914a559159584300fe3235982f0c1efcfa048f790ea87" 2671 | }, 2672 | { 2673 | "spent":false, 2674 | "tx_index":0, 2675 | "type":0, 2676 | "addr":"3FZkVFbYw1zGRMBqBQr1z8j2EpZG22KKxU", 2677 | "value":65000, 2678 | "n":17, 2679 | "script":"a9149831f6c020f65d8fdaca1e8041d4f9d65ff975b287" 2680 | }, 2681 | { 2682 | "spent":false, 2683 | "tx_index":0, 2684 | "type":0, 2685 | "addr":"14AzUt1bGfaDLA3kzfaHJ82nnEfhb7og3d", 2686 | "value":47022, 2687 | "n":18, 2688 | "script":"76a91422cc1a7c9384dc5de0ffc5a5c608974f0b65e2ed88ac" 2689 | }, 2690 | { 2691 | "spent":false, 2692 | "tx_index":0, 2693 | "type":0, 2694 | "addr":"1LumY4uohSUNDDNa8acxQcyJxa86tSCGFk", 2695 | "value":298999, 2696 | "n":19, 2697 | "script":"76a914da6532469089243fb468e7be4a93f2e813a08cc888ac" 2698 | }, 2699 | { 2700 | "spent":false, 2701 | "tx_index":0, 2702 | "type":0, 2703 | "addr":"1LtNsZvao3VmQJee7ELTxZFtqLRXAwCud6", 2704 | "value":66724, 2705 | "n":20, 2706 | "script":"76a914da21dc9507db801dc81612db4a6efff5b1d24c2788ac" 2707 | }, 2708 | { 2709 | "spent":false, 2710 | "tx_index":0, 2711 | "type":0, 2712 | "addr":"3CMjpw6u3yafgFWYNBvRwy2oivPKEE27M2", 2713 | "value":181460, 2714 | "n":21, 2715 | "script":"a91475040b214b2d56beaf4d04b324b2563659808da487" 2716 | }, 2717 | { 2718 | "spent":false, 2719 | "tx_index":0, 2720 | "type":0, 2721 | "addr":"1Cxs5AeGaqfxdHJ7TZqNTPnRDJ1bLY7y6N", 2722 | "value":1407312, 2723 | "n":22, 2724 | "script":"76a914833a0f338c7941b2043081b48b5db7157019776d88ac" 2725 | }, 2726 | { 2727 | "spent":false, 2728 | "tx_index":0, 2729 | "type":0, 2730 | "addr":"132985ztzVwRRwxTHUDsP6adbK4YLYTLd5", 2731 | "value":382435, 2732 | "n":23, 2733 | "script":"76a9141627729499d2288bc5e0a519064a906a8f9d6c0688ac" 2734 | }, 2735 | { 2736 | "spent":false, 2737 | "tx_index":0, 2738 | "type":0, 2739 | "value":272992, 2740 | "n":24, 2741 | "script":"0014060ef1c2579018b21b8a18397d45799e5f0b0dcd" 2742 | }, 2743 | { 2744 | "spent":false, 2745 | "tx_index":0, 2746 | "type":0, 2747 | "addr":"1FXBgqP15u2Uv4zLN27aS62h9u9rVUnCtd", 2748 | "value":328485, 2749 | "n":25, 2750 | "script":"76a9149f4729248dbee0d0751c3ca77164e049907e05b488ac" 2751 | }, 2752 | { 2753 | "spent":false, 2754 | "tx_index":0, 2755 | "type":0, 2756 | "addr":"3F1wY434S1vbtGTuD3jfeatjo2wF234Zkn", 2757 | "value":11886, 2758 | "n":26, 2759 | "script":"a914922de0305dd06fc1803731f45a93b48e2be7e6bd87" 2760 | }, 2761 | { 2762 | "spent":false, 2763 | "tx_index":0, 2764 | "type":0, 2765 | "addr":"1MwXb6HyB3rcqhwwiEhYgiXyNEJyPSVBk2", 2766 | "value":4222534, 2767 | "n":27, 2768 | "script":"76a914e5b282d13d01b29e54da383adb5e65a1b0f4ba5d88ac" 2769 | }, 2770 | { 2771 | "spent":false, 2772 | "tx_index":0, 2773 | "type":0, 2774 | "addr":"1Hr7fNNs5u7YCfwdg1yL8C6Qf9D31hEQZy", 2775 | "value":148726, 2776 | "n":28, 2777 | "script":"76a914b8cbf4971dbd3f45a9f4a019fb10ea94c1a24bab88ac" 2778 | }, 2779 | { 2780 | "spent":false, 2781 | "tx_index":0, 2782 | "type":0, 2783 | "addr":"3AZPtX4kqyvXEnymZJQ71cb2RtDusDnnvD", 2784 | "value":1751117, 2785 | "n":29, 2786 | "script":"a914614823d03f06a51a558d12b6a8af87b3aabde13187" 2787 | }, 2788 | { 2789 | "spent":false, 2790 | "tx_index":0, 2791 | "type":0, 2792 | "addr":"38BpeSet8t1cw3MTZJVtBVmK26m4o7yuCA", 2793 | "value":35603, 2794 | "n":30, 2795 | "script":"a9144743674dc55f73658350611aab3afe8bc7f7e97b87" 2796 | }, 2797 | { 2798 | "spent":false, 2799 | "tx_index":0, 2800 | "type":0, 2801 | "addr":"1JPFprhFBwCLqZD2JEHB9AARGHm2qkBuHZ", 2802 | "value":1650368, 2803 | "n":31, 2804 | "script":"76a914beafaa34cbd264fb7946aa128309df5b64d6df7988ac" 2805 | }, 2806 | { 2807 | "spent":false, 2808 | "tx_index":0, 2809 | "type":0, 2810 | "addr":"3GzZmMGNNKZPeGBccJUrAUtEa3kVFCV1ju", 2811 | "value":1751482, 2812 | "n":32, 2813 | "script":"a914a7db89bd5024f867ebb5554da7d67412be6128a787" 2814 | }, 2815 | { 2816 | "spent":false, 2817 | "tx_index":0, 2818 | "type":0, 2819 | "addr":"17kiTWRC5xgwtiw4a2gwxUiGELi38zJzUv", 2820 | "value":88883, 2821 | "n":33, 2822 | "script":"76a9144a153f652d11b8acde6afe41828587e5e7de040088ac" 2823 | }, 2824 | { 2825 | "spent":false, 2826 | "tx_index":0, 2827 | "type":0, 2828 | "addr":"1H4bS9jmwhN2eRcZdrnFzPUkYDc9JJrvzM", 2829 | "value":26884338, 2830 | "n":34, 2831 | "script":"76a914b03001118e7a808b616cd39ecec815cd763a760088ac" 2832 | }, 2833 | { 2834 | "spent":false, 2835 | "tx_index":0, 2836 | "type":0, 2837 | "addr":"3CPaJueNPXYrMcKFPaJ7rqC3s6Hdw2uFyn", 2838 | "value":49493, 2839 | "n":35, 2840 | "script":"a914755cee31b04eef57757eee07a01eb85e3a9b083b87" 2841 | }, 2842 | { 2843 | "spent":false, 2844 | "tx_index":0, 2845 | "type":0, 2846 | "addr":"33z4VzyzpshmhCwGtKotFjayomwcGT4R1R", 2847 | "value":455612, 2848 | "n":36, 2849 | "script":"a914192979553399eeb273c00042f731b78f9a54b15087" 2850 | }, 2851 | { 2852 | "spent":false, 2853 | "tx_index":0, 2854 | "type":0, 2855 | "addr":"3Bt6uS4xBTKZAuQcDXte1gnrv1trj7gNBB", 2856 | "value":135668, 2857 | "n":37, 2858 | "script":"a9146fc9fdc0acff93fdce753d33fd2e5c9b2ef97e3587" 2859 | }, 2860 | { 2861 | "spent":false, 2862 | "tx_index":0, 2863 | "type":0, 2864 | "addr":"1KbfCwkGwD21Pq6Lth8u7KxpeAbvui3J8g", 2865 | "value":1972391, 2866 | "n":38, 2867 | "script":"76a914cc004cacd9d07a66a5764d4da3a171321fa42bb288ac" 2868 | }, 2869 | { 2870 | "spent":false, 2871 | "tx_index":0, 2872 | "type":0, 2873 | "addr":"32tw1syWajYNWjYXpexYF6UQCK6pAsRkhn", 2874 | "value":157791, 2875 | "n":39, 2876 | "script":"a9140d3905347d2f97a84735ec27700afbc2dedb842487" 2877 | }, 2878 | { 2879 | "spent":false, 2880 | "tx_index":0, 2881 | "type":0, 2882 | "addr":"1LxkdNaFLckxcXihLyjpYzMeUWAtWaRoW9", 2883 | "value":108778, 2884 | "n":40, 2885 | "script":"76a914daf5af949dc2b0b50947b338f519e995bc285c3788ac" 2886 | }, 2887 | { 2888 | "spent":false, 2889 | "tx_index":0, 2890 | "type":0, 2891 | "addr":"373XReYb6UzKTyRAD1K3qdAgedXNAFX7pU", 2892 | "value":246300, 2893 | "n":41, 2894 | "script":"a9143ab993344e6b34ea56c5d3cc023953c62d04f3a387" 2895 | }, 2896 | { 2897 | "spent":false, 2898 | "tx_index":0, 2899 | "type":0, 2900 | "addr":"19d9fzdKcVCTA2uRDMwMioVMbWVMumCxVX", 2901 | "value":118343, 2902 | "n":42, 2903 | "script":"76a9145e97385cf3e716b3f6924e882ccc049b8cfa7a7988ac" 2904 | }, 2905 | { 2906 | "spent":false, 2907 | "tx_index":0, 2908 | "type":0, 2909 | "addr":"34JgA8cPAFV5k8mxuo9tizHYsW3jvd6eq5", 2910 | "value":35487, 2911 | "n":43, 2912 | "script":"a9141caeba027992016239daa1af725d1ad23a20283e87" 2913 | }, 2914 | { 2915 | "spent":false, 2916 | "tx_index":0, 2917 | "type":0, 2918 | "addr":"1LJFNvu1xAuyoGGbaCVLWgH4aLxbf6328u", 2919 | "value":128922, 2920 | "n":44, 2921 | "script":"76a914d3ad76a5d39442a964c1e836c90df5bcebb4997588ac" 2922 | }, 2923 | { 2924 | "spent":false, 2925 | "tx_index":0, 2926 | "type":0, 2927 | "addr":"1FsWiL1fr3d5J1DFHuvJqfMmFHocxhSsLs", 2928 | "value":4952866, 2929 | "n":45, 2930 | "script":"76a914a31f5ca2186cf75b0e2f11d161fc22c94b266ae788ac" 2931 | }, 2932 | { 2933 | "spent":false, 2934 | "tx_index":0, 2935 | "type":0, 2936 | "addr":"32Hp3yW4CAZSySLowTa89vhTMYMyV2AZnJ", 2937 | "value":1190961, 2938 | "n":46, 2939 | "script":"a9140694a60567aafbe6970582e30d724ad3df4cdb2d87" 2940 | }, 2941 | { 2942 | "spent":false, 2943 | "tx_index":0, 2944 | "type":0, 2945 | "addr":"3QhfHBsbPSUXc35mHQqABnzpgoarAFDJK5", 2946 | "value":100831, 2947 | "n":47, 2948 | "script":"a914fc6a138186cd51d4e1690a55db33e4024d5f747b87" 2949 | }, 2950 | { 2951 | "spent":false, 2952 | "tx_index":0, 2953 | "type":0, 2954 | "addr":"1KNRECGDQTZjQGDHY2g2GeERnDFmawaLN2", 2955 | "value":57096, 2956 | "n":48, 2957 | "script":"76a914c97f39303c2dfa56b4aa7a7a3e4ce669049d7bb788ac" 2958 | } 2959 | ] 2960 | }, 2961 | 2962 | { 2963 | "lock_time":0, 2964 | "ver":1, 2965 | "size":189, 2966 | "inputs":[ 2967 | { 2968 | "sequence":4294967295, 2969 | "witness":"", 2970 | "prev_out":{ 2971 | "spent":true, 2972 | "spending_outpoints":[ 2973 | { 2974 | "tx_index":0, 2975 | "n":0 2976 | } 2977 | ], 2978 | "tx_index":0, 2979 | "type":0, 2980 | "addr":"1KpW3RNcWHWKR1iABiugd4axzudYSUhabp", 2981 | "value":4967, 2982 | "n":0, 2983 | "script":"76a914ce6e0e9fc9cef9056bff5e267b4a75bd98f07ecc88ac" 2984 | }, 2985 | "script":"473044022004623a70ef1879910720553d408fb42ebc65f5a609a4afeae58b299dc1706f4202205e649138850d7cb8dbc4bb902257f698096be26772acc36f1a87a8b5a78f707201210256722e6ec41fbc3d6af547e51dbc6c0a7280fe5083f244ed4f873455beb6be05" 2986 | } 2987 | ], 2988 | "weight":756, 2989 | "time":1615209725, 2990 | "tx_index":0, 2991 | "vin_sz":1, 2992 | "hash":"222525345d7d87e1d772aa9be0c96ef4c3321c55f2ddfab7c881bba61708fe6a", 2993 | "vout_sz":1, 2994 | "relayed_by":"0.0.0.0", 2995 | "out":[ 2996 | { 2997 | "spent":false, 2998 | "tx_index":0, 2999 | "type":0, 3000 | "addr":"36EA9VceWCpq2Zut8dL5cxYbfSF9SNq2my", 3001 | "value":591, 3002 | "n":0, 3003 | "script":"a91431c4432cc0310345ac666d7e0a045da41156547787" 3004 | } 3005 | ] 3006 | }, 3007 | 3008 | { 3009 | "ver":2, 3010 | "inputs":[ 3011 | { 3012 | "sequence":0, 3013 | "witness":"304402202eef2c78fadda65130b26d3a89a53d269414a6b5ddf867ff158155518dd4a98f02203ca13207611beaea100f22b815443681c284b0c5fc25aff8d961c34d0303deb401", 3014 | "prev_out":{ 3015 | "spent":true, 3016 | "spending_outpoints":[ 3017 | { 3018 | "tx_index":0, 3019 | "n":0 3020 | } 3021 | ], 3022 | "tx_index":0, 3023 | "type":0, 3024 | "addr":"31rSwRYts26MKLBcwxV2fvu6auwFQx7oRv", 3025 | "value":149801, 3026 | "n":4, 3027 | "script":"a91401c8a0120aaa789521aae54e5a6beaf7ec03249787" 3028 | }, 3029 | "script":"160014aeaa39c118b9ba1931f993f40d518b984d07dd1b" 3030 | } 3031 | ], 3032 | "weight":661, 3033 | "relayed_by":"0.0.0.0", 3034 | "out":[ 3035 | { 3036 | "spent":false, 3037 | "tx_index":0, 3038 | "type":0, 3039 | "addr":"3N5AuUVXEtaZexDHmvHVUmCZ2H9iewAvoG", 3040 | "value":77491, 3041 | "n":0, 3042 | "script":"a914df932a0dba335ec000ae636df0123f239e036eed87" 3043 | }, 3044 | { 3045 | "spent":false, 3046 | "tx_index":0, 3047 | "type":0, 3048 | "addr":"3GrXwNcC5kojJBMiFP2aWyjxK7LQN2w4Fn", 3049 | "value":56800, 3050 | "n":1, 3051 | "script":"a914a656af62270f846517342e386be9db8255eb517887" 3052 | } 3053 | ], 3054 | "lock_time":0, 3055 | "size":247, 3056 | "rbf":true, 3057 | "time":1615209726, 3058 | "tx_index":0, 3059 | "vin_sz":1, 3060 | "hash":"08f7f8431d62ed90a1ad7185f0a0e20610114d47a70636ad1100b8c1e63ef918", 3061 | "vout_sz":2 3062 | }, 3063 | 3064 | { 3065 | "lock_time":0, 3066 | "ver":2, 3067 | "size":284, 3068 | "inputs":[ 3069 | { 3070 | "sequence":4294967295, 3071 | "witness":"3045022100a80cbde5c498f867a0db7d27d305eac7238e1e9c8cce17c609ac41e7c46c0c460220675c2d9910cdf2a24b6ed4cbaa3cd92179ffb82554ec3095680085de88c7590001", 3072 | "prev_out":{ 3073 | "spent":true, 3074 | "spending_outpoints":[ 3075 | { 3076 | "tx_index":0, 3077 | "n":0 3078 | } 3079 | ], 3080 | "tx_index":0, 3081 | "type":0, 3082 | "addr":"3Ln4TRYaFsdPCErG1PK7ukAwmfq3D1xbuv", 3083 | "value":175206, 3084 | "n":0, 3085 | "script":"a914d15e956a87ca88ce7ff6f79c79820b274ac04dc687" 3086 | }, 3087 | "script":"1600147bb69868e0832ef40db0cc619a6a70678432424c" 3088 | } 3089 | ], 3090 | "weight":806, 3091 | "time":1615209724, 3092 | "tx_index":0, 3093 | "vin_sz":1, 3094 | "hash":"b7e2440ecf4568eec51884006d77e9367f86b52b7c191de4b3dd267e4d153590", 3095 | "vout_sz":3, 3096 | "relayed_by":"0.0.0.0", 3097 | "out":[ 3098 | { 3099 | "spent":false, 3100 | "tx_index":0, 3101 | "type":0, 3102 | "addr":"3GawU5Fuk1Y9Xk48Wszq8u4o1V8orAhaQg", 3103 | "value":108800, 3104 | "n":0, 3105 | "script":"a914a363abc64abb41c7bf0fc244a0d237e83ee8cfc887" 3106 | }, 3107 | { 3108 | "spent":false, 3109 | "tx_index":0, 3110 | "type":0, 3111 | "addr":"1KMb5ZpsfAg1mCgD3SQ7bJCUtm96fgwar4", 3112 | "value":45600, 3113 | "n":1, 3114 | "script":"76a914c95707e4703a87c75b25d16eeffcaf08ebc8fa7888ac" 3115 | }, 3116 | { 3117 | "spent":false, 3118 | "tx_index":0, 3119 | "type":0, 3120 | "addr":"1DsFaBU9sWE2cPkqiN9qkMfArbJxnfuSuc", 3121 | "value":806, 3122 | "n":2, 3123 | "script":"76a9148d2278be35b5c5b89f7c2f576d5b08d453fb806888ac" 3124 | } 3125 | ] 3126 | }, 3127 | 3128 | { 3129 | "lock_time":0, 3130 | "ver":1, 3131 | "size":192, 3132 | "inputs":[ 3133 | { 3134 | "sequence":4294967295, 3135 | "witness":"", 3136 | "prev_out":{ 3137 | "spent":true, 3138 | "spending_outpoints":[ 3139 | { 3140 | "tx_index":0, 3141 | "n":0 3142 | } 3143 | ], 3144 | "tx_index":0, 3145 | "type":0, 3146 | "addr":"1KQKKridwsWeAfcUn6oTpkbgBprt2fx5hy", 3147 | "value":497049, 3148 | "n":0, 3149 | "script":"76a914c9db20d6776092c463e27cfa461df422d919cc7988ac" 3150 | }, 3151 | "script":"4830450221009831a8ccc96ef9dc82dfa9c3bb4e395beff5d4edbde60d636d2bd84c05e74e7002203a3665dbf0bb17ca66777634da00629c3867364727a5f417068c82cffc3453e0012103ea2453eb7e3e5067c49f5c722455caf3a058e57125c94d895dd882e339017974" 3152 | } 3153 | ], 3154 | "weight":768, 3155 | "time":1615209724, 3156 | "tx_index":0, 3157 | "vin_sz":1, 3158 | "hash":"2f377e39d7f028e1a1c0a7b9e0e20df0e61223cfcfdcd5b2aacd449e32cd4246", 3159 | "vout_sz":1, 3160 | "relayed_by":"0.0.0.0", 3161 | "out":[ 3162 | { 3163 | "spent":false, 3164 | "tx_index":0, 3165 | "type":0, 3166 | "addr":"14FngTp9VnuiNLxpADivEGYWd1hRNKhLWj", 3167 | "value":493207, 3168 | "n":0, 3169 | "script":"76a91423b45537aec3911ebdb23973e529c1e69e63597188ac" 3170 | } 3171 | ] 3172 | }, 3173 | 3174 | { 3175 | "ver":2, 3176 | "inputs":[ 3177 | { 3178 | "sequence":4294967293, 3179 | "witness":"30440220487ebf710a9c994d07fb53e324b861dbda493dd877c5417db8bd6c1023dad4b502206dd64fa89e090864b9e255366c67d95dc19f5108e86338fd9ee6c0b5e900e2a901", 3180 | "prev_out":{ 3181 | "spent":true, 3182 | "spending_outpoints":[ 3183 | { 3184 | "tx_index":0, 3185 | "n":0 3186 | } 3187 | ], 3188 | "tx_index":0, 3189 | "type":0, 3190 | "addr":"35TviLjv9zD91Q9N7X3kcqstZdBusTpqNe", 3191 | "value":945105, 3192 | "n":1, 3193 | "script":"a9142966bf081f79c57ffc13638fd1533dc20b760cc687" 3194 | }, 3195 | "script":"1600141b9fa097890cbfdc0031aab4c39009fc1337eff2" 3196 | }, 3197 | { 3198 | "sequence":4294967293, 3199 | "witness":"304402202659bf0da29c9a8ee804ab83c1ed2acf7541aee48ae9ab493cf038c943a9ad99022077eb990921858e8af2009b025c4a86878820d8dd690f7d77b252b9fb7058357101", 3200 | "prev_out":{ 3201 | "spent":true, 3202 | "spending_outpoints":[ 3203 | { 3204 | "tx_index":0, 3205 | "n":0 3206 | } 3207 | ], 3208 | "tx_index":0, 3209 | "type":0, 3210 | "addr":"35TviLjv9zD91Q9N7X3kcqstZdBusTpqNe", 3211 | "value":565903, 3212 | "n":1, 3213 | "script":"a9142966bf081f79c57ffc13638fd1533dc20b760cc687" 3214 | }, 3215 | "script":"1600141b9fa097890cbfdc0031aab4c39009fc1337eff2" 3216 | } 3217 | ], 3218 | "weight":1032, 3219 | "relayed_by":"0.0.0.0", 3220 | "out":[ 3221 | { 3222 | "spent":false, 3223 | "tx_index":0, 3224 | "type":0, 3225 | "addr":"121VVZqFJPaPPHnAtB48LddGHUhX48UaDB", 3226 | "value":501897, 3227 | "n":0, 3228 | "script":"76a9140b0fe8fef542d1840d2c2e439ff81fbaecbb0e2288ac" 3229 | }, 3230 | { 3231 | "spent":false, 3232 | "tx_index":0, 3233 | "type":0, 3234 | "addr":"3HmDvbWEJpov8ueHRLzYoXkX5qRkb6NzBw", 3235 | "value":1001819, 3236 | "n":1, 3237 | "script":"a914b04db1b91e9b2521ee7e9c348bc23df175ca9e1a87" 3238 | } 3239 | ], 3240 | "lock_time":673642, 3241 | "size":420, 3242 | "rbf":true, 3243 | "time":1615209724, 3244 | "tx_index":0, 3245 | "vin_sz":2, 3246 | "hash":"cd8a2a5310519f8b8f4e16cc3672af192e2c177b7e180682516fa54e439e401e", 3247 | "vout_sz":2 3248 | }, 3249 | 3250 | { 3251 | "lock_time":0, 3252 | "ver":1, 3253 | "size":225, 3254 | "inputs":[ 3255 | { 3256 | "sequence":4294967295, 3257 | "witness":"", 3258 | "prev_out":{ 3259 | "spent":true, 3260 | "spending_outpoints":[ 3261 | { 3262 | "tx_index":0, 3263 | "n":0 3264 | } 3265 | ], 3266 | "tx_index":0, 3267 | "type":0, 3268 | "addr":"1Jjn8MK3vkgpQLxrzvSnNRjruVwDqQwDKV", 3269 | "value":30060421, 3270 | "n":1, 3271 | "script":"76a914c2914753464c716a23bca8dbc9e41f133a5c502188ac" 3272 | }, 3273 | "script":"473044022046cdb2e3b1a3826097454cf8ec5c6fe0cfb36790320039b742d54dedb1dcfb680220174e10bfdb72ce0fe58b0595163e4c1667a677e06830fa2acffce3a21487a31f012102d147d0878d6ccb9a0ff7b37b12a5e0f6e5d0ffb1d78e6cdf0eca6600495f8536" 3274 | } 3275 | ], 3276 | "weight":900, 3277 | "time":1615209724, 3278 | "tx_index":0, 3279 | "vin_sz":1, 3280 | "hash":"c1a2984b6c1cd9664e7b2aef6f1627c33cbb7a70d5e21cfb4804a9e6b016e00a", 3281 | "vout_sz":2, 3282 | "relayed_by":"0.0.0.0", 3283 | "out":[ 3284 | { 3285 | "spent":false, 3286 | "tx_index":0, 3287 | "type":0, 3288 | "addr":"144iZnhXM5RM5SfTjG2RUhyboLQjtRDxh7", 3289 | "value":180000, 3290 | "n":0, 3291 | "script":"76a914219c527c4c238a439dd33223eb8cf4166fb8a6dc88ac" 3292 | }, 3293 | { 3294 | "spent":false, 3295 | "tx_index":0, 3296 | "type":0, 3297 | "addr":"1Jjn8MK3vkgpQLxrzvSnNRjruVwDqQwDKV", 3298 | "value":29857471, 3299 | "n":1, 3300 | "script":"76a914c2914753464c716a23bca8dbc9e41f133a5c502188ac" 3301 | } 3302 | ] 3303 | }, 3304 | 3305 | { 3306 | "lock_time":0, 3307 | "ver":1, 3308 | "size":223, 3309 | "inputs":[ 3310 | { 3311 | "sequence":4294967295, 3312 | "witness":"", 3313 | "prev_out":{ 3314 | "spent":true, 3315 | "spending_outpoints":[ 3316 | { 3317 | "tx_index":0, 3318 | "n":0 3319 | } 3320 | ], 3321 | "tx_index":0, 3322 | "type":0, 3323 | "addr":"1MZ8vuSGUgFu5ZexGCZWxhdq7AjSts3qaE", 3324 | "value":3538419, 3325 | "n":1, 3326 | "script":"76a914e1767210a0c4c9fe454e865d3167ee2165085c0688ac" 3327 | }, 3328 | "script":"473044022025691615cb730317a18680eb0548d6406a7f89cd3f5920fd6671b57f12d026d60220256d29d4e9fe5c3a1ee3d3cadb88cfe25d1c070adae47a0d2a37016dfa8253fc01210317de63144fd2ec317e64b920d28439d8f8849b86864c84c2ada54d001637e562" 3329 | } 3330 | ], 3331 | "weight":892, 3332 | "time":1615209723, 3333 | "tx_index":0, 3334 | "vin_sz":1, 3335 | "hash":"10398e8884979ff49b6b9e35634a3e8627dbc277e155f933cdaa496f3e4530cd", 3336 | "vout_sz":2, 3337 | "relayed_by":"0.0.0.0", 3338 | "out":[ 3339 | { 3340 | "spent":false, 3341 | "tx_index":0, 3342 | "type":0, 3343 | "addr":"1MZ8vuSGUgFu5ZexGCZWxhdq7AjSts3qaE", 3344 | "value":1547416, 3345 | "n":0, 3346 | "script":"76a914e1767210a0c4c9fe454e865d3167ee2165085c0688ac" 3347 | }, 3348 | { 3349 | "spent":false, 3350 | "tx_index":0, 3351 | "type":0, 3352 | "addr":"3L6Tn3J9kkdxHuSXRopuU12zh8iNjSL3ZJ", 3353 | "value":1987144, 3354 | "n":1, 3355 | "script":"a914c9e1699d0cc07dede8a6a1af0c52f70b1b146ddc87" 3356 | } 3357 | ] 3358 | }, 3359 | 3360 | { 3361 | "lock_time":0, 3362 | "ver":1, 3363 | "size":225, 3364 | "inputs":[ 3365 | { 3366 | "sequence":4294967295, 3367 | "witness":"", 3368 | "prev_out":{ 3369 | "spent":true, 3370 | "spending_outpoints":[ 3371 | { 3372 | "tx_index":0, 3373 | "n":0 3374 | } 3375 | ], 3376 | "tx_index":0, 3377 | "type":0, 3378 | "addr":"1MTzk4KwifEnZFBtbYkZEpKBGw9R6Viivq", 3379 | "value":300000, 3380 | "n":5, 3381 | "script":"76a914e07d8815ddef0e9b3f159105e7a076e502a3125288ac" 3382 | }, 3383 | "script":"47304402205f2e4d987b5cc0460e4b7237aba6c147a50d7a419aa79ecc5fbc670acb728b1d02205cb2f3819325f45797804988b9d8925d7acaec651cfdcdc95da96766426941c101210238db8e96fcbc74542588e206eb9ffe9cabaef953d140dc84fdc87cbade56cb05" 3384 | } 3385 | ], 3386 | "weight":900, 3387 | "time":1615209723, 3388 | "tx_index":0, 3389 | "vin_sz":1, 3390 | "hash":"718f5b53be34e2e58c41312068dddf58bef1a9fceb45f2fa7f0e900e54c8ecb2", 3391 | "vout_sz":2, 3392 | "relayed_by":"0.0.0.0", 3393 | "out":[ 3394 | { 3395 | "spent":false, 3396 | "tx_index":0, 3397 | "type":0, 3398 | "addr":"12nMy5hLvFmSXH6AW3bsyRfcDpFP3wzaJ1", 3399 | "value":1600, 3400 | "n":0, 3401 | "script":"76a914138c58ab2cb7408531192aa2b79c401bfe10620088ac" 3402 | }, 3403 | { 3404 | "spent":false, 3405 | "tx_index":0, 3406 | "type":0, 3407 | "addr":"1NcwySQ3GhNqk2x52UyfK4KGJwx4LBN6Ux", 3408 | "value":293880, 3409 | "n":1, 3410 | "script":"76a914ed2716de271a1706ce46ff5776a5ec3f80e848e388ac" 3411 | } 3412 | ] 3413 | }, 3414 | 3415 | { 3416 | "lock_time":0, 3417 | "ver":2, 3418 | "size":191, 3419 | "inputs":[ 3420 | { 3421 | "sequence":4294967295, 3422 | "witness":"", 3423 | "prev_out":{ 3424 | "spent":true, 3425 | "spending_outpoints":[ 3426 | { 3427 | "tx_index":0, 3428 | "n":0 3429 | } 3430 | ], 3431 | "tx_index":0, 3432 | "type":0, 3433 | "addr":"18edoqBXsA5niTVqwTubycU1hvsqv2i1Kh", 3434 | "value":5280000, 3435 | "n":1, 3436 | "script":"76a91453e6ff11c18f52932df7c9ebd81f01b3290df83488ac" 3437 | }, 3438 | "script":"47304402203c59911c3ff23e7e99e7247ddf3e618406387dc4d919906ba88f49e6fffb67ff0220387ebb63a76487f15183553b244a64a3622f6cd97a6041c0d9b5d0c72381b705012103d2a24e86b6840ebd4dd1dbacbf77621ba246ac08d0f0551672473f0285da0e42" 3439 | } 3440 | ], 3441 | "weight":764, 3442 | "time":1615209723, 3443 | "tx_index":0, 3444 | "vin_sz":1, 3445 | "hash":"dbbe6e872d06ce47e127392599c145d6c54773900c2f5c236c39d9dc4e65afa0", 3446 | "vout_sz":1, 3447 | "relayed_by":"0.0.0.0", 3448 | "out":[ 3449 | { 3450 | "spent":false, 3451 | "tx_index":0, 3452 | "type":0, 3453 | "addr":"1ztUiwM5jU46fwf2vZH3EQ5y7V8BAqB4F", 3454 | "value":5261760, 3455 | "n":0, 3456 | "script":"76a9140af2ae75636775e68d6264bc0e2cbc3124b924e988ac" 3457 | } 3458 | ] 3459 | }] 3460 | } 3461 | -------------------------------------------------------------------------------- /test/lib/fixtures.js: -------------------------------------------------------------------------------- 1 | 2 | /* MAIN */ 3 | 4 | const Fixtures = { 5 | errors: { 6 | comment: '// asd', 7 | empty: '', 8 | prefix: 'invalid 123', 9 | suffix: '123 invalid' 10 | }, 11 | ast: { 12 | input: ` 13 | // Example // Yes 14 | /* EXAMPLE */ /* YES */ 15 | { 16 | "one": {}, 17 | "two" :{}, 18 | "three": { 19 | "one": null, 20 | "two" :true, 21 | "three": false, 22 | "four": "asd\\n\\u0022\\"", 23 | "five": -123.123e10, 24 | "six": [ 123, true, [],], 25 | }, 26 | } 27 | // Example // Yes 28 | /* EXAMPLE */ /* YES */ 29 | `, 30 | output: { 31 | type: 'Root', 32 | children: [ 33 | { 34 | type: 'Newline', 35 | source: '\n' 36 | }, 37 | { 38 | type: 'Whitespace', 39 | source: ' ' 40 | }, 41 | { 42 | type: 'CommentLine', 43 | source: '// Example // Yes' 44 | }, 45 | { 46 | type: 'Newline', 47 | source: '\n' 48 | }, 49 | { 50 | type: 'Whitespace', 51 | source: ' ' 52 | }, 53 | { 54 | type: 'CommentBlock', 55 | source: '/* EXAMPLE */' 56 | }, 57 | { 58 | type: 'Whitespace', 59 | source: ' ' 60 | }, 61 | { 62 | type: 'CommentBlock', 63 | source: '/* YES */' 64 | }, 65 | { 66 | type: 'Newline', 67 | source: '\n' 68 | }, 69 | { 70 | type: 'Whitespace', 71 | source: ' ' 72 | }, 73 | { 74 | type: 'Object', 75 | children: [ 76 | { 77 | type: 'ObjectOpen', 78 | source: '{' 79 | }, 80 | { 81 | type: 'Newline', 82 | source: '\n' 83 | }, 84 | { 85 | type: 'Whitespace', 86 | source: ' ' 87 | }, 88 | { 89 | type: 'String', 90 | source: '"one"' 91 | }, 92 | { 93 | type: 'Colon', 94 | source: ':' 95 | }, 96 | { 97 | type: 'Whitespace', 98 | source: ' ' 99 | }, 100 | { 101 | type: 'Object', 102 | children: [ 103 | { 104 | type: 'ObjectOpen', 105 | source: '{' 106 | }, 107 | { 108 | type: 'ObjectClose', 109 | source: '}' 110 | } 111 | ] 112 | }, 113 | { 114 | type: 'Comma', 115 | source: ',' 116 | }, 117 | { 118 | type: 'Newline', 119 | source: '\n' 120 | }, 121 | { 122 | type: 'Whitespace', 123 | source: ' ' 124 | }, 125 | { 126 | type: 'String', 127 | source: '"two"' 128 | }, 129 | { 130 | type: 'Whitespace', 131 | source: ' ' 132 | }, 133 | { 134 | type: 'Colon', 135 | source: ':' 136 | }, 137 | { 138 | type: 'Object', 139 | children: [ 140 | { 141 | type: 'ObjectOpen', 142 | source: '{' 143 | }, 144 | { 145 | type: 'ObjectClose', 146 | source: '}' 147 | } 148 | ] 149 | }, 150 | { 151 | type: 'Comma', 152 | source: ',' 153 | }, 154 | { 155 | type: 'Newline', 156 | source: '\n' 157 | }, 158 | { 159 | type: 'Whitespace', 160 | source: ' ' 161 | }, 162 | { 163 | type: 'String', 164 | source: '"three"' 165 | }, 166 | { 167 | type: 'Colon', 168 | source: ':' 169 | }, 170 | { 171 | type: 'Whitespace', 172 | source: ' ' 173 | }, 174 | { 175 | type: 'Object', 176 | children: [ 177 | { 178 | type: 'ObjectOpen', 179 | source: '{' 180 | }, 181 | { 182 | type: 'Newline', 183 | source: '\n' 184 | }, 185 | { 186 | type: 'Whitespace', 187 | source: ' ' 188 | }, 189 | { 190 | type: 'String', 191 | source: '"one"' 192 | }, 193 | { 194 | type: 'Colon', 195 | source: ':' 196 | }, 197 | { 198 | type: 'Whitespace', 199 | source: ' ' 200 | }, 201 | { 202 | type: 'Null', 203 | source: 'null' 204 | }, 205 | { 206 | type: 'Comma', 207 | source: ',' 208 | }, 209 | { 210 | type: 'Newline', 211 | source: '\n' 212 | }, 213 | { 214 | type: 'Whitespace', 215 | source: ' ' 216 | }, 217 | { 218 | type: 'String', 219 | source: '"two"' 220 | }, 221 | { 222 | type: 'Whitespace', 223 | source: ' ' 224 | }, 225 | { 226 | type: 'Colon', 227 | source: ':' 228 | }, 229 | { 230 | type: 'True', 231 | source: 'true' 232 | }, 233 | { 234 | type: 'Comma', 235 | source: ',' 236 | }, 237 | { 238 | type: 'Newline', 239 | source: '\n' 240 | }, 241 | { 242 | type: 'Whitespace', 243 | source: ' ' 244 | }, 245 | { 246 | type: 'String', 247 | source: '"three"' 248 | }, 249 | { 250 | type: 'Colon', 251 | source: ':' 252 | }, 253 | { 254 | type: 'Whitespace', 255 | source: ' ' 256 | }, 257 | { 258 | type: 'False', 259 | source: 'false' 260 | }, 261 | { 262 | type: 'Comma', 263 | source: ',' 264 | }, 265 | { 266 | type: 'Newline', 267 | source: '\n' 268 | }, 269 | { 270 | type: 'Whitespace', 271 | source: ' ' 272 | }, 273 | { 274 | type: 'String', 275 | source: '"four"' 276 | }, 277 | { 278 | type: 'Colon', 279 | source: ':' 280 | }, 281 | { 282 | type: 'Whitespace', 283 | source: ' ' 284 | }, 285 | { 286 | type: 'String', 287 | source: '"asd\\n\\u0022\\""' 288 | }, 289 | { 290 | type: 'Comma', 291 | source: ',' 292 | }, 293 | { 294 | type: 'Newline', 295 | source: '\n' 296 | }, 297 | { 298 | type: 'Whitespace', 299 | source: ' ' 300 | }, 301 | { 302 | type: 'String', 303 | source: '"five"' 304 | }, 305 | { 306 | type: 'Colon', 307 | source: ':' 308 | }, 309 | { 310 | type: 'Whitespace', 311 | source: ' ' 312 | }, 313 | { 314 | type: 'Number', 315 | source: '-123.123e10' 316 | }, 317 | { 318 | type: 'Comma', 319 | source: ',' 320 | }, 321 | { 322 | type: 'Newline', 323 | source: '\n' 324 | }, 325 | { 326 | type: 'Whitespace', 327 | source: ' ' 328 | }, 329 | { 330 | type: 'String', 331 | source: '"six"' 332 | }, 333 | { 334 | type: 'Colon', 335 | source: ':' 336 | }, 337 | { 338 | type: 'Whitespace', 339 | source: ' ' 340 | }, 341 | { 342 | type: 'Array', 343 | children: [ 344 | { 345 | type: 'ArrayOpen', 346 | source: '[' 347 | }, 348 | { 349 | type: 'Whitespace', 350 | source: ' ' 351 | }, 352 | { 353 | type: 'Number', 354 | source: '123' 355 | }, 356 | { 357 | type: 'Comma', 358 | source: ',' 359 | }, 360 | { 361 | type: 'Whitespace', 362 | source: ' ' 363 | }, 364 | { 365 | type: 'True', 366 | source: 'true' 367 | }, 368 | { 369 | type: 'Comma', 370 | source: ',' 371 | }, 372 | { 373 | type: 'Whitespace', 374 | source: ' ' 375 | }, 376 | { 377 | type: 'Array', 378 | children: [ 379 | { 380 | type: 'ArrayOpen', 381 | source: '[' 382 | }, 383 | { 384 | type: 'ArrayClose', 385 | source: ']' 386 | } 387 | ] 388 | }, 389 | { 390 | type: 'CommaTrailing', 391 | source: ',' 392 | }, 393 | { 394 | type: 'ArrayClose', 395 | source: ']' 396 | } 397 | ] 398 | }, 399 | { 400 | type: 'CommaTrailing', 401 | source: ',' 402 | }, 403 | { 404 | type: 'Newline', 405 | source: '\n' 406 | }, 407 | { 408 | type: 'Whitespace', 409 | source: ' ' 410 | }, 411 | { 412 | type: 'ObjectClose', 413 | source: '}' 414 | } 415 | ] 416 | }, 417 | { 418 | type: 'CommaTrailing', 419 | source: ',' 420 | }, 421 | { 422 | type: 'Newline', 423 | source: '\n' 424 | }, 425 | { 426 | type: 'Whitespace', 427 | source: ' ' 428 | }, 429 | { 430 | type: 'ObjectClose', 431 | source: '}' 432 | } 433 | ] 434 | }, 435 | { 436 | type: 'Newline', 437 | source: '\n' 438 | }, 439 | { 440 | type: 'Whitespace', 441 | source: ' ' 442 | }, 443 | { 444 | type: 'CommentLine', 445 | source: '// Example // Yes' 446 | }, 447 | { 448 | type: 'Newline', 449 | source: '\n' 450 | }, 451 | { 452 | type: 'Whitespace', 453 | source: ' ' 454 | }, 455 | { 456 | type: 'CommentBlock', 457 | source: '/* EXAMPLE */' 458 | }, 459 | { 460 | type: 'Whitespace', 461 | source: ' ' 462 | }, 463 | { 464 | type: 'CommentBlock', 465 | source: '/* YES */' 466 | }, 467 | { 468 | type: 'Newline', 469 | source: '\n' 470 | }, 471 | { 472 | type: 'Whitespace', 473 | source: ' ' 474 | } 475 | ] 476 | } 477 | }, 478 | lookup: { 479 | object: ` 480 | // Example // Yes 481 | /* EXAMPLE */ /* YES */ 482 | { 483 | "one": {}, 484 | "two" :{}, 485 | "three": { 486 | "one": null, 487 | "two" :true, 488 | "three": false, 489 | "four": "asd\\n\\u0022\\"", 490 | "five": -123.123e10, 491 | "six": [ 123, true, [],], 492 | }, 493 | } 494 | // Example // Yes 495 | /* EXAMPLE */ /* YES */ 496 | `, 497 | objectPartial: `{ "foo" }`, 498 | array: ` 499 | // Example // Yes 500 | /* EXAMPLE */ /* YES */ 501 | [ 502 | { "foo": 123, 503 | "bar": [123] } 504 | ] 505 | // Example // Yes 506 | /* EXAMPLE */ /* YES */ 507 | ` 508 | }, 509 | parse: { 510 | input: ` 511 | // Example // Yes 512 | /* EXAMPLE */ /* YES */ 513 | { 514 | "one": {}, 515 | "two" :{}, 516 | "three": { 517 | "one": null, 518 | "two" :true, 519 | "three": false, 520 | "four": "asd\\n\\u0022\\"", 521 | "five": -123.123e10, 522 | "six": [ 123, true, [],], 523 | }, 524 | } 525 | // Example // Yes 526 | /* EXAMPLE */ /* YES */ 527 | `, 528 | output: { 529 | one: {}, 530 | two: {}, 531 | three: { 532 | one: null, 533 | two: true, 534 | three: false, 535 | four: "asd\n\u0022\"", 536 | five: -123.123e10, 537 | six: [123, true, []] 538 | } 539 | } 540 | }, 541 | strip: { 542 | input: ` 543 | { // This is an example // Example 544 | "foo" : 123, 545 | "// tricky": "/* tricky */", 546 | /* TRAILING COMMAS BELOW */ /* EXAMPLE */ 547 | "bar": [1, 2 , 3,], 548 | /* TRAILING COMMAS ABOVE */ 549 | } 550 | `, 551 | output: '{"foo":123,"// tricky":"/* tricky */","bar":[1,2,3]}' 552 | } 553 | }; 554 | 555 | /* EXPORT */ 556 | 557 | export default Fixtures; 558 | -------------------------------------------------------------------------------- /test/lib/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* IMPORT */ 3 | 4 | import _ from 'lodash'; 5 | import {describe} from 'fava'; 6 | import JSONC from '../../dist/index.js'; 7 | import Fixtures from './fixtures.js'; 8 | 9 | /* MAIN */ 10 | 11 | describe ( 'JSONC', () => { 12 | 13 | describe ( 'ast.parse', it => { 14 | 15 | it ( 'converts a string into an AST', t => { 16 | 17 | const {input, output} = Fixtures.ast; 18 | 19 | t.deepEqual ( JSONC.ast.parse ( input ), output ); 20 | 21 | }); 22 | 23 | it ( 'throws on invalid input', t => { 24 | 25 | const {prefix, suffix} = Fixtures.errors; 26 | 27 | t.throws ( () => JSONC.ast.parse ( prefix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 0' } ); 28 | t.throws ( () => JSONC.ast.parse ( suffix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 4' } ); 29 | 30 | }); 31 | 32 | it ( 'throws on insufficient input', t => { 33 | 34 | const {comment, empty} = Fixtures.errors; 35 | 36 | t.throws ( () => JSONC.ast.parse ( comment ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 37 | t.throws ( () => JSONC.ast.parse ( empty ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 38 | 39 | }); 40 | 41 | }); 42 | 43 | describe ( 'ast.stringify', it => { 44 | 45 | it ( 'converts an AST into a string', t => { 46 | 47 | const {input, output} = Fixtures.ast; 48 | 49 | t.is ( JSONC.ast.stringify ( output ), input ); 50 | 51 | }); 52 | 53 | }); 54 | 55 | describe ( 'lookup', it => { 56 | 57 | it ( 'returns an object describing a location in a JSONC string', t => { 58 | 59 | const lookup = ( target, index, usePartialScanning ) => _.omit ( JSONC.lookup ( target, index, usePartialScanning ), ['token'] ); //TODO: Actually match against the token object too 60 | 61 | const {object} = Fixtures.lookup; 62 | 63 | t.deepEqual ( lookup ( object, 5, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 64 | t.deepEqual ( lookup ( object, 10, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 65 | 66 | t.deepEqual ( lookup ( object, 70, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 67 | t.deepEqual ( lookup ( object, 71, false ), { path: ['one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 68 | t.deepEqual ( lookup ( object, 72, false ), { path: ['one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 69 | t.deepEqual ( lookup ( object, 75, false ), { path: ['one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 70 | t.deepEqual ( lookup ( object, 76, false ), { path: ['one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 71 | t.deepEqual ( lookup ( object, 77, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 72 | t.deepEqual ( lookup ( object, 78, false ), { path: ['one'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 73 | t.deepEqual ( lookup ( object, 79, false ), { path: ['one'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 74 | t.deepEqual ( lookup ( object, 80, false ), { path: ['one'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 75 | t.deepEqual ( lookup ( object, 81, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 76 | 77 | t.deepEqual ( lookup ( object, 89, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 78 | t.deepEqual ( lookup ( object, 90, false ), { path: ['two'], property: 'two', value: undefined, isInsideProperty: true, isInsideValue: false } ); 79 | t.deepEqual ( lookup ( object, 91, false ), { path: ['two'], property: 'two', value: undefined, isInsideProperty: true, isInsideValue: false } ); 80 | t.deepEqual ( lookup ( object, 94, false ), { path: ['two'], property: 'two', value: undefined, isInsideProperty: true, isInsideValue: false } ); 81 | t.deepEqual ( lookup ( object, 95, false ), { path: ['two'], property: 'two', value: undefined, isInsideProperty: true, isInsideValue: false } ); 82 | t.deepEqual ( lookup ( object, 96, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 83 | t.deepEqual ( lookup ( object, 97, false ), { path: ['two'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 84 | t.deepEqual ( lookup ( object, 98, false ), { path: ['two'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 85 | t.deepEqual ( lookup ( object, 99, false ), { path: ['two'], property: undefined, value: {}, isInsideProperty: false, isInsideValue: true } ); 86 | t.deepEqual ( lookup ( object, 100, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 87 | 88 | t.deepEqual ( lookup ( object, 123, false ), { path: ['three'], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 89 | 90 | t.deepEqual ( lookup ( object, 130, false ), { path: ['three', 'one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 91 | t.deepEqual ( lookup ( object, 131, false ), { path: ['three', 'one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 92 | t.deepEqual ( lookup ( object, 134, false ), { path: ['three', 'one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 93 | t.deepEqual ( lookup ( object, 135, false ), { path: ['three', 'one'], property: 'one', value: undefined, isInsideProperty: true, isInsideValue: false } ); 94 | t.deepEqual ( lookup ( object, 137, false ), { path: ['three', 'one'], property: undefined, value: null, isInsideProperty: false, isInsideValue: true } ); 95 | t.deepEqual ( lookup ( object, 141, false ), { path: ['three', 'one'], property: undefined, value: null, isInsideProperty: false, isInsideValue: true } ); 96 | t.deepEqual ( lookup ( object, 142, false ), { path: ['three'], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 97 | 98 | t.deepEqual ( lookup ( object, 202, false ), { path: ['three', 'four'], property: 'four', value: undefined, isInsideProperty: true, isInsideValue: false } ); 99 | t.deepEqual ( lookup ( object, 203, false ), { path: ['three', 'four'], property: 'four', value: undefined, isInsideProperty: true, isInsideValue: false } ); 100 | t.deepEqual ( lookup ( object, 207, false ), { path: ['three', 'four'], property: 'four', value: undefined, isInsideProperty: true, isInsideValue: false } ); 101 | t.deepEqual ( lookup ( object, 208, false ), { path: ['three', 'four'], property: 'four', value: undefined, isInsideProperty: true, isInsideValue: false } ); 102 | t.deepEqual ( lookup ( object, 209, false ), { path: ['three'], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 103 | 104 | t.deepEqual ( lookup ( object, 210, false ), { path: ['three', 'four'], property: undefined, value: 'asd\n\u0022\"', isInsideProperty: false, isInsideValue: true } ); 105 | t.deepEqual ( lookup ( object, 211, false ), { path: ['three', 'four'], property: undefined, value: 'asd\n\u0022\"', isInsideProperty: false, isInsideValue: true } ); 106 | t.deepEqual ( lookup ( object, 224, false ), { path: ['three', 'four'], property: undefined, value: 'asd\n\u0022\"', isInsideProperty: false, isInsideValue: true } ); 107 | t.deepEqual ( lookup ( object, 225, false ), { path: ['three', 'four'], property: undefined, value: 'asd\n\u0022\"', isInsideProperty: false, isInsideValue: true } ); 108 | t.deepEqual ( lookup ( object, 226, false ), { path: ['three'], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 109 | 110 | t.deepEqual ( lookup ( object, 275, false ), { path: ['three', 'six'], property: undefined, value: [123, true, []], isInsideProperty: false, isInsideValue: true } ); 111 | t.deepEqual ( lookup ( object, 276, false ), { path: ['three', 'six'], property: undefined, value: [123, true, []], isInsideProperty: false, isInsideValue: true } ); 112 | 113 | t.deepEqual ( lookup ( object, 277, false ), { path: ['three', 'six', 0], property: 0, value: 123, isInsideProperty: true, isInsideValue: true } ); 114 | t.deepEqual ( lookup ( object, 280, false ), { path: ['three', 'six', 0], property: 0, value: 123, isInsideProperty: true, isInsideValue: true } ); 115 | t.deepEqual ( lookup ( object, 281, false ), { path: ['three', 'six'], property: undefined, value: [123, true, []], isInsideProperty: false, isInsideValue: true } ); 116 | 117 | t.deepEqual ( lookup ( object, 289, false ), { path: ['three', 'six', 2], property: 2, value: [], isInsideProperty: true, isInsideValue: true } ); 118 | 119 | const {array} = Fixtures.lookup; 120 | 121 | t.deepEqual ( lookup ( array, 5, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 122 | t.deepEqual ( lookup ( array, 10, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 123 | t.deepEqual ( lookup ( array, 61, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 124 | t.deepEqual ( lookup ( array, 67, false ), { path: [], property: undefined, value: undefined, isInsideProperty: false, isInsideValue: false } ); 125 | 126 | t.deepEqual ( lookup ( array, 71, false ), { path: [0], property: undefined, value: { foo: 123, bar: [123] }, isInsideProperty: true, isInsideValue: true } ); 127 | t.deepEqual ( lookup ( array, 72, false ), { path: [0], property: undefined, value: { foo: 123, bar: [123] }, isInsideProperty: true, isInsideValue: true } ); 128 | 129 | t.deepEqual ( lookup ( array, 73, false ), { path: [0, 'foo'], property: 'foo', value: undefined, isInsideProperty: true, isInsideValue: false } ); 130 | t.deepEqual ( lookup ( array, 78, false ), { path: [0, 'foo'], property: 'foo', value: undefined, isInsideProperty: true, isInsideValue: false } ); 131 | 132 | t.deepEqual ( lookup ( array, 80, false ), { path: [0, 'foo'], property: undefined, value: 123, isInsideProperty: false, isInsideValue: true } ); 133 | t.deepEqual ( lookup ( array, 83, false ), { path: [0, 'foo'], property: undefined, value: 123, isInsideProperty: false, isInsideValue: true } ); 134 | 135 | t.deepEqual ( lookup ( array, 98, false ), { path: [0, 'bar'], property: 'bar', value: undefined, isInsideProperty: true, isInsideValue: false } ); 136 | 137 | t.deepEqual ( lookup ( array, 100, false ), { path: [0, 'bar'], property: undefined, value: [123], isInsideProperty: false, isInsideValue: true } ); 138 | 139 | t.deepEqual ( lookup ( array, 101, false ), { path: [0, 'bar', 0], property: 0, value: 123, isInsideProperty: true, isInsideValue: true } ); 140 | 141 | }); 142 | 143 | it ( 'supports partial objects where only the property is available', t => { 144 | 145 | const lookup = ( target, index, usePartialScanning ) => _.omit ( JSONC.lookup ( target, index, usePartialScanning ), ['token'] ); //TODO: Actually match against the token object too 146 | 147 | const {objectPartial} = Fixtures.lookup; 148 | 149 | t.deepEqual ( lookup ( objectPartial, 3, true ), { path: ['foo'], property: 'foo', value: undefined, isInsideProperty: true, isInsideValue: false } ); 150 | 151 | }); 152 | 153 | it ( 'throws on invalid input', t => { 154 | 155 | const {prefix, suffix} = Fixtures.errors; 156 | 157 | t.throws ( () => JSONC.lookup ( prefix, 0, false ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 0' } ); 158 | t.throws ( () => JSONC.lookup ( suffix, 0, false ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 4' } ); 159 | 160 | }); 161 | 162 | it ( 'throws on insufficient input', t => { 163 | 164 | const {comment, empty} = Fixtures.errors; 165 | 166 | t.throws ( () => JSONC.lookup ( comment, 0, false ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 167 | t.throws ( () => JSONC.lookup ( empty, 0, false ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 168 | 169 | }); 170 | 171 | }); 172 | 173 | describe ( 'parse', it => { 174 | 175 | it ( 'supports strings with comments and trailing commas', t => { 176 | 177 | const {input, output} = Fixtures.parse; 178 | 179 | t.deepEqual ( JSONC.parse ( input ), output ); 180 | 181 | }); 182 | 183 | it ( 'throws on invalid input', t => { 184 | 185 | const {prefix, suffix} = Fixtures.errors; 186 | 187 | t.throws ( () => JSONC.parse ( prefix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 0' } ); 188 | t.throws ( () => JSONC.parse ( suffix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 4' } ); 189 | 190 | }); 191 | 192 | it ( 'throws on insufficient input', t => { 193 | 194 | const {comment, empty} = Fixtures.errors; 195 | 196 | t.throws ( () => JSONC.parse ( comment ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 197 | t.throws ( () => JSONC.parse ( empty ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 198 | 199 | }); 200 | 201 | }); 202 | 203 | describe ( 'stringify', it => { 204 | 205 | it ( 'supports serializing a value to a string', t => { 206 | 207 | const {output} = Fixtures.parse; 208 | 209 | t.is ( JSONC.stringify ( output ), JSON.stringify ( output ) ); 210 | t.is ( JSONC.stringify, JSON.stringify ); 211 | 212 | }); 213 | 214 | }); 215 | 216 | describe ( 'strip', it => { 217 | 218 | it ( 'supports stripping out comments and trailing commas', t => { 219 | 220 | const {input, output} = Fixtures.strip; 221 | 222 | t.is ( JSONC.strip ( input ), output ); 223 | 224 | }); 225 | 226 | it ( 'throws on invalid input', t => { 227 | 228 | const {prefix, suffix} = Fixtures.errors; 229 | 230 | t.throws ( () => JSONC.strip ( prefix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 0' } ); 231 | t.throws ( () => JSONC.strip ( suffix ), { instanceOf: SyntaxError, message: 'Unexpected token i in JSONC at position 4' } ); 232 | 233 | }); 234 | 235 | it ( 'throws on insufficient input', t => { 236 | 237 | const {comment, empty} = Fixtures.errors; 238 | 239 | t.throws ( () => JSONC.strip ( comment ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 240 | t.throws ( () => JSONC.strip ( empty ), { instanceOf: SyntaxError, message: 'Unexpected end of JSONC input' } ); 241 | 242 | }); 243 | 244 | }); 245 | 246 | describe ( 'validate', it => { 247 | 248 | it ( 'returns true for valid strings', t => { 249 | 250 | const {input} = Fixtures.ast; 251 | 252 | t.true ( JSONC.validate ( input ) ); 253 | 254 | }); 255 | 256 | it ( 'returns false on invalid input', t => { 257 | 258 | const {prefix, suffix} = Fixtures.errors; 259 | 260 | t.false ( JSONC.validate ( prefix ) ); 261 | t.false ( JSONC.validate ( suffix ) ); 262 | 263 | }); 264 | 265 | it ( 'returns false on insufficient input', t => { 266 | 267 | const {comment, empty} = Fixtures.errors; 268 | 269 | t.false ( JSONC.validate ( comment ) ); 270 | t.false ( JSONC.validate ( empty ) ); 271 | 272 | }); 273 | 274 | }); 275 | 276 | }); 277 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsex/tsconfig.json" 3 | } 4 | --------------------------------------------------------------------------------