github.com/ebakus/go-ebakus@v1.0.5-0.20200520105415-dbccef9ec421/internal/web3ext/web3ext.go (about) 1 // Copyright 2019 The ebakus/go-ebakus Authors 2 // This file is part of the ebakus/go-ebakus library. 3 // 4 // The ebakus/go-ebakus library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The ebakus/go-ebakus library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the ebakus/go-ebakus library. If not, see <http://www.gnu.org/licenses/>. 16 17 // package web3ext contains geth specific web3.js extensions. 18 package web3ext 19 20 var Modules = map[string]string{ 21 "accounting": AccountingJs, 22 "admin": AdminJs, 23 "chequebook": ChequebookJs, 24 "clique": CliqueJs, 25 "db": DBJs, 26 "dpos": DposJs, 27 "debug": DebugJs, 28 "eth": EthJs, 29 "miner": MinerJs, 30 "net": NetJs, 31 "personal": PersonalJs, 32 "rpc": RpcJs, 33 "shh": ShhJs, 34 "swarmfs": SwarmfsJs, 35 "txpool": TxpoolJs, 36 "les": LESJs, 37 } 38 39 const ChequebookJs = ` 40 web3._extend({ 41 property: 'chequebook', 42 methods: [ 43 new web3._extend.Method({ 44 name: 'deposit', 45 call: 'chequebook_deposit', 46 params: 1, 47 inputFormatter: [null] 48 }), 49 new web3._extend.Property({ 50 name: 'balance', 51 getter: 'chequebook_balance', 52 outputFormatter: web3._extend.utils.toDecimal 53 }), 54 new web3._extend.Method({ 55 name: 'cash', 56 call: 'chequebook_cash', 57 params: 1, 58 inputFormatter: [null] 59 }), 60 new web3._extend.Method({ 61 name: 'issue', 62 call: 'chequebook_issue', 63 params: 2, 64 inputFormatter: [null, null] 65 }), 66 ] 67 }); 68 ` 69 70 const CliqueJs = ` 71 web3._extend({ 72 property: 'clique', 73 methods: [ 74 new web3._extend.Method({ 75 name: 'getSnapshot', 76 call: 'clique_getSnapshot', 77 params: 1, 78 inputFormatter: [null] 79 }), 80 new web3._extend.Method({ 81 name: 'getSnapshotAtHash', 82 call: 'clique_getSnapshotAtHash', 83 params: 1 84 }), 85 new web3._extend.Method({ 86 name: 'getSigners', 87 call: 'clique_getSigners', 88 params: 1, 89 inputFormatter: [null] 90 }), 91 new web3._extend.Method({ 92 name: 'getSignersAtHash', 93 call: 'clique_getSignersAtHash', 94 params: 1 95 }), 96 new web3._extend.Method({ 97 name: 'propose', 98 call: 'clique_propose', 99 params: 2 100 }), 101 new web3._extend.Method({ 102 name: 'discard', 103 call: 'clique_discard', 104 params: 1 105 }), 106 ], 107 properties: [ 108 new web3._extend.Property({ 109 name: 'proposals', 110 getter: 'clique_proposals' 111 }), 112 ] 113 }); 114 ` 115 116 const DposJs = ` 117 web3._extend({ 118 property: 'dpos', 119 methods: [ 120 new web3._extend.Method({ 121 name: 'getDelegates', 122 call: 'dpos_getDelegates', 123 params: 1, 124 inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter] 125 }), 126 new web3._extend.Method({ 127 name: 'getBlockDensity', 128 call: 'dpos_getBlockDensity', 129 params: 2, 130 inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, null] 131 }), 132 ] 133 }); 134 ` 135 136 const AdminJs = ` 137 web3._extend({ 138 property: 'admin', 139 methods: [ 140 new web3._extend.Method({ 141 name: 'addPeer', 142 call: 'admin_addPeer', 143 params: 1 144 }), 145 new web3._extend.Method({ 146 name: 'removePeer', 147 call: 'admin_removePeer', 148 params: 1 149 }), 150 new web3._extend.Method({ 151 name: 'addTrustedPeer', 152 call: 'admin_addTrustedPeer', 153 params: 1 154 }), 155 new web3._extend.Method({ 156 name: 'removeTrustedPeer', 157 call: 'admin_removeTrustedPeer', 158 params: 1 159 }), 160 new web3._extend.Method({ 161 name: 'exportChain', 162 call: 'admin_exportChain', 163 params: 1, 164 inputFormatter: [null] 165 }), 166 new web3._extend.Method({ 167 name: 'importChain', 168 call: 'admin_importChain', 169 params: 1 170 }), 171 new web3._extend.Method({ 172 name: 'sleepBlocks', 173 call: 'admin_sleepBlocks', 174 params: 2 175 }), 176 new web3._extend.Method({ 177 name: 'startRPC', 178 call: 'admin_startRPC', 179 params: 4, 180 inputFormatter: [null, null, null, null] 181 }), 182 new web3._extend.Method({ 183 name: 'stopRPC', 184 call: 'admin_stopRPC' 185 }), 186 new web3._extend.Method({ 187 name: 'startWS', 188 call: 'admin_startWS', 189 params: 4, 190 inputFormatter: [null, null, null, null] 191 }), 192 new web3._extend.Method({ 193 name: 'stopWS', 194 call: 'admin_stopWS' 195 }), 196 ], 197 properties: [ 198 new web3._extend.Property({ 199 name: 'nodeInfo', 200 getter: 'admin_nodeInfo' 201 }), 202 new web3._extend.Property({ 203 name: 'peers', 204 getter: 'admin_peers' 205 }), 206 new web3._extend.Property({ 207 name: 'datadir', 208 getter: 'admin_datadir' 209 }), 210 ] 211 }); 212 ` 213 214 const DebugJs = ` 215 web3._extend({ 216 property: 'debug', 217 methods: [ 218 new web3._extend.Method({ 219 name: 'printBlock', 220 call: 'debug_printBlock', 221 params: 1 222 }), 223 new web3._extend.Method({ 224 name: 'getBlockRlp', 225 call: 'debug_getBlockRlp', 226 params: 1 227 }), 228 new web3._extend.Method({ 229 name: 'testSignCliqueBlock', 230 call: 'debug_testSignCliqueBlock', 231 params: 2, 232 inputFormatters: [web3._extend.formatters.inputAddressFormatter, null], 233 }), 234 new web3._extend.Method({ 235 name: 'setHead', 236 call: 'debug_setHead', 237 params: 1 238 }), 239 new web3._extend.Method({ 240 name: 'seedHash', 241 call: 'debug_seedHash', 242 params: 1 243 }), 244 new web3._extend.Method({ 245 name: 'dumpBlock', 246 call: 'debug_dumpBlock', 247 params: 1 248 }), 249 new web3._extend.Method({ 250 name: 'chaindbProperty', 251 call: 'debug_chaindbProperty', 252 params: 1, 253 outputFormatter: console.log 254 }), 255 new web3._extend.Method({ 256 name: 'chaindbCompact', 257 call: 'debug_chaindbCompact', 258 }), 259 new web3._extend.Method({ 260 name: 'verbosity', 261 call: 'debug_verbosity', 262 params: 1 263 }), 264 new web3._extend.Method({ 265 name: 'vmodule', 266 call: 'debug_vmodule', 267 params: 1 268 }), 269 new web3._extend.Method({ 270 name: 'backtraceAt', 271 call: 'debug_backtraceAt', 272 params: 1, 273 }), 274 new web3._extend.Method({ 275 name: 'stacks', 276 call: 'debug_stacks', 277 params: 0, 278 outputFormatter: console.log 279 }), 280 new web3._extend.Method({ 281 name: 'freeOSMemory', 282 call: 'debug_freeOSMemory', 283 params: 0, 284 }), 285 new web3._extend.Method({ 286 name: 'setGCPercent', 287 call: 'debug_setGCPercent', 288 params: 1, 289 }), 290 new web3._extend.Method({ 291 name: 'memStats', 292 call: 'debug_memStats', 293 params: 0, 294 }), 295 new web3._extend.Method({ 296 name: 'gcStats', 297 call: 'debug_gcStats', 298 params: 0, 299 }), 300 new web3._extend.Method({ 301 name: 'cpuProfile', 302 call: 'debug_cpuProfile', 303 params: 2 304 }), 305 new web3._extend.Method({ 306 name: 'startCPUProfile', 307 call: 'debug_startCPUProfile', 308 params: 1 309 }), 310 new web3._extend.Method({ 311 name: 'stopCPUProfile', 312 call: 'debug_stopCPUProfile', 313 params: 0 314 }), 315 new web3._extend.Method({ 316 name: 'goTrace', 317 call: 'debug_goTrace', 318 params: 2 319 }), 320 new web3._extend.Method({ 321 name: 'startGoTrace', 322 call: 'debug_startGoTrace', 323 params: 1 324 }), 325 new web3._extend.Method({ 326 name: 'stopGoTrace', 327 call: 'debug_stopGoTrace', 328 params: 0 329 }), 330 new web3._extend.Method({ 331 name: 'blockProfile', 332 call: 'debug_blockProfile', 333 params: 2 334 }), 335 new web3._extend.Method({ 336 name: 'setBlockProfileRate', 337 call: 'debug_setBlockProfileRate', 338 params: 1 339 }), 340 new web3._extend.Method({ 341 name: 'writeBlockProfile', 342 call: 'debug_writeBlockProfile', 343 params: 1 344 }), 345 new web3._extend.Method({ 346 name: 'mutexProfile', 347 call: 'debug_mutexProfile', 348 params: 2 349 }), 350 new web3._extend.Method({ 351 name: 'setMutexProfileFraction', 352 call: 'debug_setMutexProfileFraction', 353 params: 1 354 }), 355 new web3._extend.Method({ 356 name: 'writeMutexProfile', 357 call: 'debug_writeMutexProfile', 358 params: 1 359 }), 360 new web3._extend.Method({ 361 name: 'writeMemProfile', 362 call: 'debug_writeMemProfile', 363 params: 1 364 }), 365 new web3._extend.Method({ 366 name: 'traceBlock', 367 call: 'debug_traceBlock', 368 params: 2, 369 inputFormatter: [null, null] 370 }), 371 new web3._extend.Method({ 372 name: 'traceBlockFromFile', 373 call: 'debug_traceBlockFromFile', 374 params: 2, 375 inputFormatter: [null, null] 376 }), 377 new web3._extend.Method({ 378 name: 'traceBadBlock', 379 call: 'debug_traceBadBlock', 380 params: 1, 381 inputFormatter: [null] 382 }), 383 new web3._extend.Method({ 384 name: 'standardTraceBadBlockToFile', 385 call: 'debug_standardTraceBadBlockToFile', 386 params: 2, 387 inputFormatter: [null, null] 388 }), 389 new web3._extend.Method({ 390 name: 'standardTraceBlockToFile', 391 call: 'debug_standardTraceBlockToFile', 392 params: 2, 393 inputFormatter: [null, null] 394 }), 395 new web3._extend.Method({ 396 name: 'traceBlockByNumber', 397 call: 'debug_traceBlockByNumber', 398 params: 2, 399 inputFormatter: [null, null] 400 }), 401 new web3._extend.Method({ 402 name: 'traceBlockByHash', 403 call: 'debug_traceBlockByHash', 404 params: 2, 405 inputFormatter: [null, null] 406 }), 407 new web3._extend.Method({ 408 name: 'traceTransaction', 409 call: 'debug_traceTransaction', 410 params: 2, 411 inputFormatter: [null, null] 412 }), 413 new web3._extend.Method({ 414 name: 'preimage', 415 call: 'debug_preimage', 416 params: 1, 417 inputFormatter: [null] 418 }), 419 new web3._extend.Method({ 420 name: 'getBadBlocks', 421 call: 'debug_getBadBlocks', 422 params: 0, 423 }), 424 new web3._extend.Method({ 425 name: 'storageRangeAt', 426 call: 'debug_storageRangeAt', 427 params: 5, 428 }), 429 new web3._extend.Method({ 430 name: 'getModifiedAccountsByNumber', 431 call: 'debug_getModifiedAccountsByNumber', 432 params: 2, 433 inputFormatter: [null, null], 434 }), 435 new web3._extend.Method({ 436 name: 'getModifiedAccountsByHash', 437 call: 'debug_getModifiedAccountsByHash', 438 params: 2, 439 inputFormatter:[null, null], 440 }), 441 ], 442 properties: [] 443 }); 444 ` 445 446 const EthJs = ` 447 web3._extend({ 448 property: 'eth', 449 methods: [ 450 new web3._extend.Method({ 451 name: 'chainId', 452 call: 'eth_chainId', 453 params: 0 454 }), 455 new web3._extend.Method({ 456 name: 'sign', 457 call: 'eth_sign', 458 params: 2, 459 inputFormatter: [web3._extend.formatters.inputAddressFormatter, null] 460 }), 461 new web3._extend.Method({ 462 name: 'resend', 463 call: 'eth_resend', 464 params: 3, 465 inputFormatter: [web3._extend.formatters.inputTransactionFormatter, web3._extend.utils.fromDecimal, web3._extend.utils.fromDecimal] 466 }), 467 new web3._extend.Method({ 468 name: 'calculateWorkNonce', 469 call: 'eth_calculateWorkNonce', 470 params: 2, 471 inputFormatter: [web3._extend.formatters.inputTransactionFormatter,web3._extend.utils.fromFloat] 472 }), 473 new web3._extend.Method({ 474 name: 'suggestDifficulty', 475 call: 'eth_suggestDifficulty', 476 params: 1, 477 inputFormatter: [web3._extend.formatters.inputAddressFormatter] 478 outputFormatter: web3._extend.utils.toFloat 479 }), 480 new web3._extend.Method({ 481 name: 'signTransaction', 482 call: 'eth_signTransaction', 483 params: 1, 484 inputFormatter: [web3._extend.formatters.inputTransactionFormatter] 485 }), 486 new web3._extend.Method({ 487 name: 'submitTransaction', 488 call: 'eth_submitTransaction', 489 params: 1, 490 inputFormatter: [web3._extend.formatters.inputTransactionFormatter] 491 }), 492 new web3._extend.Method({ 493 name: 'fillTransaction', 494 call: 'eth_fillTransaction', 495 params: 1, 496 inputFormatter: [web3._extend.formatters.inputTransactionFormatter] 497 }), 498 new web3._extend.Method({ 499 name: 'getHeaderByNumber', 500 call: 'eth_getHeaderByNumber', 501 params: 1 502 }), 503 new web3._extend.Method({ 504 name: 'getHeaderByHash', 505 call: 'eth_getHeaderByHash', 506 params: 1 507 }), 508 new web3._extend.Method({ 509 name: 'getBlockByNumber', 510 call: 'eth_getBlockByNumber', 511 params: 2 512 }), 513 new web3._extend.Method({ 514 name: 'getBlockByHash', 515 call: 'eth_getBlockByHash', 516 params: 2 517 }), 518 new web3._extend.Method({ 519 name: 'getRawTransaction', 520 call: 'eth_getRawTransactionByHash', 521 params: 1 522 }), 523 new web3._extend.Method({ 524 name: 'getRawTransactionFromBlock', 525 call: function(args) { 526 return (web3._extend.utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getRawTransactionByBlockHashAndIndex' : 'eth_getRawTransactionByBlockNumberAndIndex'; 527 }, 528 params: 2, 529 inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] 530 }), 531 new web3._extend.Method({ 532 name: 'getProof', 533 call: 'eth_getProof', 534 params: 3, 535 inputFormatter: [web3._extend.formatters.inputAddressFormatter, null, web3._extend.formatters.inputBlockNumberFormatter] 536 }), 537 new web3._extend.Method({ 538 name: 'getStaked', 539 call: 'eth_getStaked', 540 params: 2, 541 inputFormatter: [web3._extend.formatters.inputAddressFormatter, web3._extend.formatters.inputBlockNumberFormatter] 542 }), 543 new web3._extend.Method({ 544 name: 'getAbiForAddress', 545 call: 'eth_getAbiForAddress', 546 params: 1, 547 inputFormatter: [web3._extend.formatters.inputAddressFormatter] 548 }), 549 new web3._extend.Method({ 550 name: 'getVirtualDifficultyFactor', 551 call: 'eth_getVirtualDifficultyFactor', 552 params: 2, 553 inputFormatter: [web3._extend.formatters.inputAddressFormatter, web3._extend.formatters.inputBlockNumberFormatter], 554 outputFormatter: web3._extend.utils.toFloat 555 }), 556 ], 557 properties: [ 558 new web3._extend.Property({ 559 name: 'pendingTransactions', 560 getter: 'eth_pendingTransactions', 561 outputFormatter: function(txs) { 562 var formatted = []; 563 for (var i = 0; i < txs.length; i++) { 564 formatted.push(web3._extend.formatters.outputTransactionFormatter(txs[i])); 565 formatted[i].blockHash = null; 566 } 567 return formatted; 568 } 569 }), 570 ] 571 }); 572 ` 573 574 const MinerJs = ` 575 web3._extend({ 576 property: 'miner', 577 methods: [ 578 new web3._extend.Method({ 579 name: 'start', 580 call: 'miner_start', 581 params: 1, 582 inputFormatter: [null] 583 }), 584 new web3._extend.Method({ 585 name: 'stop', 586 call: 'miner_stop' 587 }), 588 new web3._extend.Method({ 589 name: 'setEtherbase', 590 call: 'miner_setEtherbase', 591 params: 1, 592 inputFormatter: [web3._extend.formatters.inputAddressFormatter] 593 }), 594 new web3._extend.Method({ 595 name: 'setGasPrice', 596 call: 'miner_setGasPrice', 597 params: 1, 598 inputFormatter: [web3._extend.utils.fromDecimal] 599 }), 600 new web3._extend.Method({ 601 name: 'getHashrate', 602 call: 'miner_getHashrate' 603 }), 604 ], 605 properties: [] 606 }); 607 ` 608 609 const NetJs = ` 610 web3._extend({ 611 property: 'net', 612 methods: [], 613 properties: [ 614 new web3._extend.Property({ 615 name: 'version', 616 getter: 'net_version' 617 }), 618 ] 619 }); 620 ` 621 622 const PersonalJs = ` 623 web3._extend({ 624 property: 'personal', 625 methods: [ 626 new web3._extend.Method({ 627 name: 'importRawKey', 628 call: 'personal_importRawKey', 629 params: 2 630 }), 631 new web3._extend.Method({ 632 name: 'sign', 633 call: 'personal_sign', 634 params: 3, 635 inputFormatter: [null, web3._extend.formatters.inputAddressFormatter, null] 636 }), 637 new web3._extend.Method({ 638 name: 'ecRecover', 639 call: 'personal_ecRecover', 640 params: 2 641 }), 642 new web3._extend.Method({ 643 name: 'openWallet', 644 call: 'personal_openWallet', 645 params: 2 646 }), 647 new web3._extend.Method({ 648 name: 'deriveAccount', 649 call: 'personal_deriveAccount', 650 params: 3 651 }), 652 new web3._extend.Method({ 653 name: 'signTransaction', 654 call: 'personal_signTransaction', 655 params: 2, 656 inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] 657 }), 658 new web3._extend.Method({ 659 name: 'unpair', 660 call: 'personal_unpair', 661 params: 2 662 }), 663 new web3._extend.Method({ 664 name: 'initializeWallet', 665 call: 'personal_initializeWallet', 666 params: 1 667 }) 668 ], 669 properties: [ 670 new web3._extend.Property({ 671 name: 'listWallets', 672 getter: 'personal_listWallets' 673 }), 674 ] 675 }) 676 ` 677 678 const RpcJs = ` 679 web3._extend({ 680 property: 'rpc', 681 methods: [], 682 properties: [ 683 new web3._extend.Property({ 684 name: 'modules', 685 getter: 'rpc_modules' 686 }), 687 ] 688 }); 689 ` 690 691 const ShhJs = ` 692 web3._extend({ 693 property: 'shh', 694 methods: [ 695 ], 696 properties: 697 [ 698 new web3._extend.Property({ 699 name: 'version', 700 getter: 'shh_version', 701 outputFormatter: web3._extend.utils.toDecimal 702 }), 703 new web3._extend.Property({ 704 name: 'info', 705 getter: 'shh_info' 706 }), 707 ] 708 }); 709 ` 710 711 const SwarmfsJs = ` 712 web3._extend({ 713 property: 'swarmfs', 714 methods: 715 [ 716 new web3._extend.Method({ 717 name: 'mount', 718 call: 'swarmfs_mount', 719 params: 2 720 }), 721 new web3._extend.Method({ 722 name: 'unmount', 723 call: 'swarmfs_unmount', 724 params: 1 725 }), 726 new web3._extend.Method({ 727 name: 'listmounts', 728 call: 'swarmfs_listmounts', 729 params: 0 730 }), 731 ] 732 }); 733 ` 734 735 const TxpoolJs = ` 736 web3._extend({ 737 property: 'txpool', 738 methods: [], 739 properties: 740 [ 741 new web3._extend.Property({ 742 name: 'content', 743 getter: 'txpool_content' 744 }), 745 new web3._extend.Property({ 746 name: 'inspect', 747 getter: 'txpool_inspect' 748 }), 749 new web3._extend.Property({ 750 name: 'status', 751 getter: 'txpool_status', 752 outputFormatter: function(status) { 753 status.pending = web3._extend.utils.toDecimal(status.pending); 754 status.queued = web3._extend.utils.toDecimal(status.queued); 755 return status; 756 } 757 }), 758 ] 759 }); 760 ` 761 762 const AccountingJs = ` 763 web3._extend({ 764 property: 'accounting', 765 methods: [ 766 new web3._extend.Property({ 767 name: 'balance', 768 getter: 'account_balance' 769 }), 770 new web3._extend.Property({ 771 name: 'balanceCredit', 772 getter: 'account_balanceCredit' 773 }), 774 new web3._extend.Property({ 775 name: 'balanceDebit', 776 getter: 'account_balanceDebit' 777 }), 778 new web3._extend.Property({ 779 name: 'bytesCredit', 780 getter: 'account_bytesCredit' 781 }), 782 new web3._extend.Property({ 783 name: 'bytesDebit', 784 getter: 'account_bytesDebit' 785 }), 786 new web3._extend.Property({ 787 name: 'msgCredit', 788 getter: 'account_msgCredit' 789 }), 790 new web3._extend.Property({ 791 name: 'msgDebit', 792 getter: 'account_msgDebit' 793 }), 794 new web3._extend.Property({ 795 name: 'peerDrops', 796 getter: 'account_peerDrops' 797 }), 798 new web3._extend.Property({ 799 name: 'selfDrops', 800 getter: 'account_selfDrops' 801 }), 802 ] 803 }); 804 ` 805 806 const LESJs = ` 807 web3._extend({ 808 property: 'les', 809 methods: 810 [ 811 new web3._extend.Method({ 812 name: 'getCheckpoint', 813 call: 'les_getCheckpoint', 814 params: 1 815 }), 816 ], 817 properties: 818 [ 819 new web3._extend.Property({ 820 name: 'latestCheckpoint', 821 getter: 'les_latestCheckpoint' 822 }), 823 new web3._extend.Property({ 824 name: 'checkpointContractAddress', 825 getter: 'les_getCheckpointContractAddress' 826 }), 827 ] 828 }); 829 ` 830 831 const DBJs = ` 832 web3._extend({ 833 property: 'db', 834 methods: [ 835 new web3._extend.Method({ 836 name: 'get', 837 call: 'db_get', 838 params: 5, 839 inputFormatter: [web3._extend.formatters.inputAddressFormatter, null, null, null, web3._extend.formatters.inputBlockNumberFormatter] 840 }), 841 new web3._extend.Method({ 842 name: 'select', 843 call: 'db_select', 844 params: 5, 845 inputFormatter: [web3._extend.formatters.inputAddressFormatter, null, null, null, web3._extend.formatters.inputBlockNumberFormatter] 846 }), 847 new web3._extend.Method({ 848 name: 'next', 849 call: 'db_next', 850 params: 1, 851 inputFormatter: [null] 852 }), 853 new web3._extend.Method({ 854 name: 'releaseIterator', 855 call: 'db_releaseIterator', 856 params: 1, 857 inputFormatter: [null] 858 }), 859 ], 860 }); 861 `