gamegold 4.2.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/gamegold-worker.js +19 -19
- package/lib/gamegold.js +8 -8
- package/package.json +1 -1
package/lib/gamegold.js
CHANGED
|
@@ -206,7 +206,7 @@ var r=i(128),s=r.Buffer;function n(t,e){for(var i in t)e[i]=t[i]}function a(t,e,
|
|
|
206
206
|
* pkg.js - package constants
|
|
207
207
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
208
208
|
* https://github.com/bookmansoft/gamegold
|
|
209
|
-
*/e.protocol="vallnet",e.version="v4.1
|
|
209
|
+
*/e.protocol="vallnet",e.version="v4.2.1",e.url="https://github.com/bookmansoft/gamegold"},function(t,e,i){"use strict";
|
|
210
210
|
/*!
|
|
211
211
|
* common.js - p2p constants for vallnet
|
|
212
212
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -231,7 +231,7 @@ var r=i(128),s=r.Buffer;function n(t,e){for(var i in t)e[i]=t[i]}function a(t,e,
|
|
|
231
231
|
* 钱包数据库由两张Layout组成,分别为 walletdb 和 txdb。
|
|
232
232
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
233
233
|
* https://github.com/bookmansoft/gamegold
|
|
234
|
-
*/const r=i(0);function s(t,e,i){if(Buffer.isBuffer(e))return e.copy(t,i);r("string"==typeof e),t.write(e,i,"hex")}e.walletdb={binary:!0,CV:Buffer.from([118]),version:function(t){var e=Buffer.allocUnsafe(4);return e.writeUInt32LE(t,0,!0),e},equalVersion:function(t,e){return r(Buffer.isBuffer(t)),t.readUInt32LE(0,!0)==e},P:function(t,e){r("number"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(5+e.length/2);return i[0]=80,i.writeUInt32BE(t,1,!0),i.write(e,5,"hex"),i},Pp:function(t){return r(Buffer.isBuffer(t)),r(25<=t.length),t.toString("hex",5)},R:Buffer.from([82]),V:Buffer.from([86]),a:function(t,e){r("number"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(9);return i[0]=97,i.writeUInt32BE(t,1,!0),i.writeUInt32BE(e,5,!0),i},b:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=98,e.writeUInt32BE(t,1,!0),e},bb:function(t){return r(Buffer.isBuffer(t)),r(5===t.length),t.readUInt32BE(1,!0)},g:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(1+t.length/2);return e[0]=103,e.write(t,1,"hex"),e},gs:function(t,e,i){r("string"==typeof t),r("string"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(77);return s[0]=218,s.write(t,1,"hex"),s.write(e,21,"hex"),s.write(i,57,"hex"),s},h:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=104,e.writeUInt32BE(t,1,!0),e},ha:function(t,e){r("string"==typeof e);var i=Buffer.allocUnsafe(33);return i[0]=t,i.write(e,1,"hex"),i},haa:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==33),(t=t.slice(6)).toString("hex",0)},i:function(t,e){r("number"==typeof t),r("string"==typeof e);var i=Buffer.byteLength(e,"ascii"),s=Buffer.allocUnsafe(5+i);return s[0]=105,s.writeUInt32BE(t,1,!0),0<i&&s.write(e,5,"ascii"),s},ii:function(t){return r(Buffer.isBuffer(t)),r(5<=t.length),[t.readUInt32BE(1,!0),t.toString("ascii",5)]},l:function(t){r("string"==typeof t);var e=Buffer.byteLength(t,"ascii"),i=Buffer.allocUnsafe(1+e);return i[0]=108,0<e&&i.write(t,1,"ascii"),i},ll:function(t){return r(Buffer.isBuffer(t)),r(1<=t.length),t.toString("ascii",1)},log:function(t,e,i,s){r("number"==typeof t),r("number"==typeof e),r("number"==typeof i),r("string"==typeof s),r(64==s.length);var n=Buffer.allocUnsafe(77);return n[0]=127,n.writeUInt32BE(t,1,!0),n.writeUInt32BE(e,5,!0),n.writeUInt32BE(i,9,!0),n.write(s,13,"hex"),n},ms:function(t,e){r("string"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(53);return i[0]=224,i.write(t,1,"hex"),i.write(e,21,"hex"),i},n:function(t,e){r("number"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(9);return i[0]=110,i.writeUInt32BE(t,1,!0),i.writeUInt32BE(e,5,!0),i},o:function(t,e){r("string"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(37);return i[0]=111,i.write(t,1,"hex"),i.writeUInt32BE(e,33,!0),i},oo:function(t){return r(Buffer.isBuffer(t)),r(37===t.length),[t.toString("hex",1,33),t.readUInt32BE(33,!0)]},p:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(1+t.length/2);return e[0]=112,e.write(t,1,"hex"),e},pp:function(t){return r(Buffer.isBuffer(t)),r(21<=t.length),t.toString("hex",1)},r:function(t,e,i){r("number"==typeof t),r("number"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(9+i.length/2);return s[0]=114,s.writeUInt32BE(t,1,!0),s.writeUInt32BE(e,5,!0),s.write(i,9,"hex"),s},rr:function(t){return r(Buffer.isBuffer(t)),r(29<=t.length),t.toString("hex",9)},w:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=119,e.writeUInt32BE(t,1,!0),e},ww:function(t){return r(Buffer.isBuffer(t)),r(5===t.length),t.readUInt32BE(1,!0)}},e.txdb={binary:!0,hi:function(t,e,i){r("string"==typeof e),r("number"==typeof i);var s=Buffer.allocUnsafe(37);return s[0]=t,s.write(e,1,"hex"),s.writeUInt32BE(i,33,!0),s},hii:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==37),[(t=t.slice(6)).toString("hex",0,32),t.readUInt32BE(32,!0)]},ih:function(t,e,i){r("number"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(37);return s[0]=t,s.writeUInt32BE(e,1,!0),s.write(i,5,"hex"),s},ihh:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==37),[(t=t.slice(6)).readUInt32BE(0,!0),t.toString("hex",4,36)]},iih:function(t,e,i,s){r("number"==typeof e),r("number"==typeof i),r("string"==typeof s);var n=Buffer.allocUnsafe(41);return n[0]=t,n.writeUInt32BE(e,1,!0),n.writeUInt32BE(i,5,!0),n.write(s,9,"hex"),n},iihh:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==41),[(t=t.slice(6)).readUInt32BE(0,!0),t.readUInt32BE(4,!0),t.toString("hex",8,40)]},ihi:function(t,e,i,s){r("number"==typeof e),r("string"==typeof i),r("number"==typeof s);var n=Buffer.allocUnsafe(41);return n[0]=t,n.writeUInt32BE(e,1,!0),n.write(i,5,"hex"),n.writeUInt32BE(s,37,!0),n},ihii:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==41),[(t=t.slice(6)).readUInt32BE(0,!0),t.toString("hex",4,36),t.readUInt32BE(36,!0)]},ha:function(t,e){r("string"==typeof e);var i=Buffer.allocUnsafe(33);return i[0]=t,i.write(e,1,"hex"),i},haa:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==33),(t=t.slice(6)).toString("hex",0)},AU:function(t){t=e.txdb.s2b(t,"hex");var i=Buffer.allocUnsafe(33);return i[0]=149,s(i,t,1),i},C:function(t,e,i){return this.ihi(67,t,e,i)},Cc:function(t){return this.ihii(t)},CT:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(21);return e[0]=151,e.write(t,1,"hex"),e},ER:function(t){t=e.txdb.s2b(t,"hex");var i=Buffer.allocUnsafe(33);return i[0]=152,s(i,t,1),i},ERR:function(t,e){r("string"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(66);return i[0]=217,i.write(t,1,"hex"),i.write(e,34,"hex"),i},ERA:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(33);return e[0]=216,e.write(t,1,"hex"),e},H:function(t,e,i){return this.iih(72,t,e,i)},Hh:function(t){return this.iihh(t)},M:function(t,e,i){return this.iih(77,t,e,i)},Mm:function(t){return this.iihh(t)},P:function(t,e){return this.ih(80,t,e)},Pp:function(t){return this.ihh(t)},R:Buffer.from([82]),SS:function(t,i){var n=Buffer.allocUnsafe(41);return n.fill(0),Buffer.isBuffer(t)||(r("string"==typeof t),t=e.txdb.s2b(t)),n[0]=167,s(n,t,1),n.writeUInt32BE(i,37,!0),n},SSS:function(t){return r(Buffer.isBuffer(t)),r.strictEqual(t[0],167),[(t=t.slice(1)).toString("ascii",0,36),t.readUInt32BE(36,!0)]},T:function(t,e){return this.ih(84,t,e)},Tt:function(t){return this.ihh(t)},VC:function(t,e){return this.hi(153,t,e)},VP:function(t,i="utf8"){return t=e.txdb.s2b(t,i),(i=Buffer.allocUnsafe(37))[0]=166,s(i,t,1),i},VPc:function(t){let e;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],166),37===t.length?e=t.slice(1,37):r(!1),layout.b2s(e)},VH:function(t,e){return this.hi(158,t,e)},b:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=98,e.writeUInt32BE(t,1,!0),e},bb:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==5),(t=t.slice(6)).readUInt32BE(0,!0)},c:function(t,e){return this.hi(99,t,e)},cc:function(t){return this.hii(t)},cp:function(t,i="ascii"){return r("string"==typeof t),t=e.txdb.s2b(t,i),(i=Buffer.allocUnsafe(37))[0]=211,s(i,t,1),i},cpp:function(t,i="ascii"){let s;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],211),37===t.length?s=t.slice(1,37):r(!1),e.txdb.b2s(s,i)},d:function(t,e){return this.hi(100,t,e)},dd:function(t){return this.hii(t)},de:function(t){return this.ha(201,t)},h:function(t,e){return this.ih(104,t,e)},hh:function(t){return this.ihh(t)},m:function(t,e){return this.ih(109,t,e)},mm:function(t){return this.ihh(t)},p:function(t){return this.ha(112,t)},pp:function(t){return this.haa(t)},r:function(t){return this.ha(114,t)},s:function(t,e){return this.hi(115,t,e)},ss:function(t){return this.hii(t)},t:function(t){return this.ha(116,t)},tt:function(t){return this.haa(t)},tx:function(t){return Buffer.concat([Buffer.from([236]),Buffer.from(t,"hex")])},s2b:function(t,e="ascii"){return Buffer.from(t,e)},b2s:(t,e="ascii")=>(r(Buffer.isBuffer(t)),t.toString(e)),prefix:function(t,e){r("number"==typeof t),r(Buffer.isBuffer(e));var i=Buffer.allocUnsafe(5+e.length);return i[0]=116,i.writeUInt32BE(t,1),e.copy(i,5),i},pre:function(t){return r(Buffer.isBuffer(t)),r(5<=t.length),t.readUInt32BE(1,!0)}}},function(t,e,i){"use strict";function r(t){if(t){var e,i=t;for(e in r.prototype)i[e]=r.prototype[e];return i}}i.d(e,"a",(function(){return r})),r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function i(){this.off(t,i),e.apply(this,arguments)}return i.fn=e,this.on(t,i),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)this._callbacks={};else{var i=this._callbacks["$"+t];if(i)if(1==arguments.length)delete this._callbacks["$"+t];else{for(var r,s=0;s<i.length;s++)if((r=i[s])===e||r.fn===e){i.splice(s,1);break}0===i.length&&delete this._callbacks["$"+t]}}return this},r.prototype.emitReserved=r.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),i=this._callbacks["$"+t],r=1;r<arguments.length;r++)e[r-1]=arguments[r];if(i){r=0;for(var s=(i=i.slice(0)).length;r<s;++r)i[r].apply(this,e)}return this},r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e,i){"use strict";i.r(e),i.d(e,"protocol",(function(){return d})),i.d(e,"encodePacket",(function(){return a})),i.d(e,"encodePayload",(function(){return l})),i.d(e,"decodePacket",(function(){return h})),i.d(e,"decodePayload",(function(){return p}));const r=Object.create(null),s=(r.open="0",r.close="1",r.ping="2",r.pong="3",r.message="4",r.upgrade="5",r.noop="6",Object.create(null)),n=(Object.keys(r).forEach(t=>{s[r[t]]=t}),{type:"error",data:"parser error"});var a=({type:t,data:e},i,s)=>{var n;return e instanceof ArrayBuffer||ArrayBuffer.isView(e)?s((n=n=(t=>Buffer.isBuffer(t)?t:t instanceof ArrayBuffer?Buffer.from(t):Buffer.from(t.buffer,t.byteOffset,t.byteLength))(e),i?n:"b"+n.toString("base64"))):s(r[t]+(e||""))};const o=(t,e)=>{var i=Buffer.isBuffer(t);return"arraybuffer"===e&&i?c(t):t},c=t=>{var e=new ArrayBuffer(t.length),i=new Uint8Array(e);for(let e=0;e<t.length;e++)i[e]=t[e];return e};var h=(t,e)=>{var i,r;return"string"!=typeof t?{type:"message",data:o(t,e)}:"b"===(i=t.charAt(0))?(r=Buffer.from(t.substring(1),"base64"),{type:"message",data:o(r,e)}):s[i]?1<t.length?{type:s[i],data:t.substring(1)}:{type:s[i]}:n};const u=String.fromCharCode(30),l=(t,e)=>{const i=t.length,r=new Array(i);let s=0;t.forEach((t,n)=>{a(t,!1,t=>{r[n]=t,++s===i&&e(r.join(u))})})},p=(t,e)=>{var i=t.split(u),r=[];for(let t=0;t<i.length;t++){var s=h(i[t],e);if(r.push(s),"error"===s.type)break}return r},d=4},function(t,e,i){"use strict";
|
|
234
|
+
*/const r=i(0);function s(t,e,i){if(Buffer.isBuffer(e))return e.copy(t,i);r("string"==typeof e),t.write(e,i,"hex")}e.walletdb={binary:!0,CV:Buffer.from([118]),version:function(t){var e=Buffer.allocUnsafe(4);return e.writeUInt32LE(t,0,!0),e},equalVersion:function(t,e){return r(Buffer.isBuffer(t)),t.readUInt32LE(0,!0)==e},P:function(t,e){r("number"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(5+e.length/2);return i[0]=80,i.writeUInt32BE(t,1,!0),i.write(e,5,"hex"),i},Pp:function(t){return r(Buffer.isBuffer(t)),r(25<=t.length),t.toString("hex",5)},R:Buffer.from([82]),V:Buffer.from([86]),a:function(t,e){r("number"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(9);return i[0]=97,i.writeUInt32BE(t,1,!0),i.writeUInt32BE(e,5,!0),i},b:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=98,e.writeUInt32BE(t,1,!0),e},bb:function(t){return r(Buffer.isBuffer(t)),r(5===t.length),t.readUInt32BE(1,!0)},g:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(1+t.length/2);return e[0]=103,e.write(t,1,"hex"),e},gs:function(t,e,i){r("string"==typeof t),r("string"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(77);return s[0]=218,s.write(t,1,"hex"),s.write(e,21,"hex"),s.write(i,57,"hex"),s},h:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=104,e.writeUInt32BE(t,1,!0),e},ha:function(t,e){r("string"==typeof e);var i=Buffer.allocUnsafe(33);return i[0]=t,i.write(e,1,"hex"),i},haa:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==33),(t=t.slice(6)).toString("hex",0)},i:function(t,e){r("number"==typeof t),r("string"==typeof e);var i=Buffer.byteLength(e,"ascii"),s=Buffer.allocUnsafe(5+i);return s[0]=105,s.writeUInt32BE(t,1,!0),0<i&&s.write(e,5,"ascii"),s},ii:function(t){return r(Buffer.isBuffer(t)),r(5<=t.length),[t.readUInt32BE(1,!0),t.toString("ascii",5)]},l:function(t){r("string"==typeof t);var e=Buffer.byteLength(t,"ascii"),i=Buffer.allocUnsafe(1+e);return i[0]=108,0<e&&i.write(t,1,"ascii"),i},ll:function(t){return r(Buffer.isBuffer(t)),r(1<=t.length),t.toString("ascii",1)},log:function(t,e,i,s){r("number"==typeof t),r("number"==typeof e),r("number"==typeof i),r("string"==typeof s),r(64==s.length);var n=Buffer.allocUnsafe(77);return n[0]=127,n.writeUInt32BE(t,1,!0),n.writeUInt32BE(e,5,!0),n.writeUInt32BE(i,9,!0),n.write(s,13,"hex"),n},ms:function(t,e){r("string"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(53);return i[0]=224,i.write(t,1,"hex"),i.write(e,21,"hex"),i},n:function(t,e){r("number"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(9);return i[0]=110,i.writeUInt32BE(t,1,!0),i.writeUInt32BE(e,5,!0),i},o:function(t,e){r("string"==typeof t),r("number"==typeof e);var i=Buffer.allocUnsafe(37);return i[0]=111,i.write(t,1,"hex"),i.writeUInt32BE(e,33,!0),i},oo:function(t){return r(Buffer.isBuffer(t)),r(37===t.length),[t.toString("hex",1,33),t.readUInt32BE(33,!0)]},p:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(1+t.length/2);return e[0]=112,e.write(t,1,"hex"),e},pp:function(t){return r(Buffer.isBuffer(t)),r(21<=t.length),t.toString("hex",1)},r:function(t,e,i){r("number"==typeof t),r("number"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(9+i.length/2);return s[0]=114,s.writeUInt32BE(t,1,!0),s.writeUInt32BE(e,5,!0),s.write(i,9,"hex"),s},rr:function(t){return r(Buffer.isBuffer(t)),r(29<=t.length),t.toString("hex",9)},w:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=119,e.writeUInt32BE(t,1,!0),e},ww:function(t){return r(Buffer.isBuffer(t)),r(5===t.length),t.readUInt32BE(1,!0)}},e.txdb={binary:!0,hi:function(t,e,i){r("string"==typeof e),r("number"==typeof i);var s=Buffer.allocUnsafe(37);return s[0]=t,s.write(e,1,"hex"),s.writeUInt32BE(i,33,!0),s},hii:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==37),[(t=t.slice(6)).toString("hex",0,32),t.readUInt32BE(32,!0)]},ih:function(t,e,i){r("number"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(37);return s[0]=t,s.writeUInt32BE(e,1,!0),s.write(i,5,"hex"),s},ihh:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==37),[(t=t.slice(6)).readUInt32BE(0,!0),t.toString("hex",4,36)]},iih:function(t,e,i,s){r("number"==typeof e),r("number"==typeof i),r("string"==typeof s);var n=Buffer.allocUnsafe(41);return n[0]=t,n.writeUInt32BE(e,1,!0),n.writeUInt32BE(i,5,!0),n.write(s,9,"hex"),n},iihh:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==41),[(t=t.slice(6)).readUInt32BE(0,!0),t.readUInt32BE(4,!0),t.toString("hex",8,40)]},ihi:function(t,e,i,s){r("number"==typeof e),r("string"==typeof i),r("number"==typeof s);var n=Buffer.allocUnsafe(41);return n[0]=t,n.writeUInt32BE(e,1,!0),n.write(i,5,"hex"),n.writeUInt32BE(s,37,!0),n},ihii:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==41),[(t=t.slice(6)).readUInt32BE(0,!0),t.toString("hex",4,36),t.readUInt32BE(36,!0)]},ha:function(t,e){r("string"==typeof e);var i=Buffer.allocUnsafe(33);return i[0]=t,i.write(e,1,"hex"),i},haa:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==33),(t=t.slice(6)).toString("hex",0)},AU:function(t){t=e.txdb.s2b(t,"hex");var i=Buffer.allocUnsafe(33);return i[0]=149,s(i,t,1),i},C:function(t,e,i){return this.ihi(67,t,e,i)},Cc:function(t){return this.ihii(t)},CT:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(21);return e[0]=151,e.write(t,1,"hex"),e},ER:function(t){t=e.txdb.s2b(t,"hex");var i=Buffer.allocUnsafe(33);return i[0]=152,s(i,t,1),i},ERR:function(t,e,i){r("string"==typeof t),r("string"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(98);return s[0]=217,s.write(t,1,"hex"),s.write(e,34,"hex"),s.write(i,66,"hex"),s},ERRR:function(t){return r(Buffer.isBuffer(t)),[(t=t.slice(1)).toString("hex",0,33),t.toString("hex",33,65),t.toString("hex",65,97)]},ERA:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(33);return e[0]=216,e.write(t,1,"hex"),e},H:function(t,e,i){return this.iih(72,t,e,i)},Hh:function(t){return this.iihh(t)},M:function(t,e,i){return this.iih(77,t,e,i)},Mm:function(t){return this.iihh(t)},P:function(t,e){return this.ih(80,t,e)},Pp:function(t){return this.ihh(t)},R:Buffer.from([82]),SS:function(t,i){var n=Buffer.allocUnsafe(41);return n.fill(0),Buffer.isBuffer(t)||(r("string"==typeof t),t=e.txdb.s2b(t)),n[0]=167,s(n,t,1),n.writeUInt32BE(i,37,!0),n},SSS:function(t){return r(Buffer.isBuffer(t)),r.strictEqual(t[0],167),[(t=t.slice(1)).toString("ascii",0,36),t.readUInt32BE(36,!0)]},T:function(t,e){return this.ih(84,t,e)},Tt:function(t){return this.ihh(t)},VC:function(t,e){return this.hi(153,t,e)},VP:function(t,i="utf8"){return t=e.txdb.s2b(t,i),(i=Buffer.allocUnsafe(37))[0]=166,s(i,t,1),i},VPc:function(t){let e;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],166),37===t.length?e=t.slice(1,37):r(!1),layout.b2s(e)},VH:function(t,e){return this.hi(158,t,e)},b:function(t){r("number"==typeof t);var e=Buffer.allocUnsafe(5);return e[0]=98,e.writeUInt32BE(t,1,!0),e},bb:function(t){return r(Buffer.isBuffer(t)),r(t.length-5==5),(t=t.slice(6)).readUInt32BE(0,!0)},c:function(t,e){return this.hi(99,t,e)},cc:function(t){return this.hii(t)},cp:function(t,i="ascii"){return r("string"==typeof t),t=e.txdb.s2b(t,i),(i=Buffer.allocUnsafe(37))[0]=211,s(i,t,1),i},cpp:function(t,i="ascii"){let s;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],211),37===t.length?s=t.slice(1,37):r(!1),e.txdb.b2s(s,i)},d:function(t,e){return this.hi(100,t,e)},dd:function(t){return this.hii(t)},de:function(t){return this.ha(201,t)},h:function(t,e){return this.ih(104,t,e)},hh:function(t){return this.ihh(t)},m:function(t,e){return this.ih(109,t,e)},mm:function(t){return this.ihh(t)},p:function(t){return this.ha(112,t)},pp:function(t){return this.haa(t)},r:function(t){return this.ha(114,t)},s:function(t,e){return this.hi(115,t,e)},ss:function(t){return this.hii(t)},t:function(t){return this.ha(116,t)},tt:function(t){return this.haa(t)},tx:function(t){return Buffer.concat([Buffer.from([236]),Buffer.from(t,"hex")])},s2b:function(t,e="ascii"){return Buffer.from(t,e)},b2s:(t,e="ascii")=>(r(Buffer.isBuffer(t)),t.toString(e)),prefix:function(t,e){r("number"==typeof t),r(Buffer.isBuffer(e));var i=Buffer.allocUnsafe(5+e.length);return i[0]=116,i.writeUInt32BE(t,1),e.copy(i,5),i},pre:function(t){return r(Buffer.isBuffer(t)),r(5<=t.length),t.readUInt32BE(1,!0)}}},function(t,e,i){"use strict";function r(t){if(t){var e,i=t;for(e in r.prototype)i[e]=r.prototype[e];return i}}i.d(e,"a",(function(){return r})),r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function i(){this.off(t,i),e.apply(this,arguments)}return i.fn=e,this.on(t,i),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)this._callbacks={};else{var i=this._callbacks["$"+t];if(i)if(1==arguments.length)delete this._callbacks["$"+t];else{for(var r,s=0;s<i.length;s++)if((r=i[s])===e||r.fn===e){i.splice(s,1);break}0===i.length&&delete this._callbacks["$"+t]}}return this},r.prototype.emitReserved=r.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),i=this._callbacks["$"+t],r=1;r<arguments.length;r++)e[r-1]=arguments[r];if(i){r=0;for(var s=(i=i.slice(0)).length;r<s;++r)i[r].apply(this,e)}return this},r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e,i){"use strict";i.r(e),i.d(e,"protocol",(function(){return d})),i.d(e,"encodePacket",(function(){return a})),i.d(e,"encodePayload",(function(){return l})),i.d(e,"decodePacket",(function(){return h})),i.d(e,"decodePayload",(function(){return p}));const r=Object.create(null),s=(r.open="0",r.close="1",r.ping="2",r.pong="3",r.message="4",r.upgrade="5",r.noop="6",Object.create(null)),n=(Object.keys(r).forEach(t=>{s[r[t]]=t}),{type:"error",data:"parser error"});var a=({type:t,data:e},i,s)=>{var n;return e instanceof ArrayBuffer||ArrayBuffer.isView(e)?s((n=n=(t=>Buffer.isBuffer(t)?t:t instanceof ArrayBuffer?Buffer.from(t):Buffer.from(t.buffer,t.byteOffset,t.byteLength))(e),i?n:"b"+n.toString("base64"))):s(r[t]+(e||""))};const o=(t,e)=>{var i=Buffer.isBuffer(t);return"arraybuffer"===e&&i?c(t):t},c=t=>{var e=new ArrayBuffer(t.length),i=new Uint8Array(e);for(let e=0;e<t.length;e++)i[e]=t[e];return e};var h=(t,e)=>{var i,r;return"string"!=typeof t?{type:"message",data:o(t,e)}:"b"===(i=t.charAt(0))?(r=Buffer.from(t.substring(1),"base64"),{type:"message",data:o(r,e)}):s[i]?1<t.length?{type:s[i],data:t.substring(1)}:{type:s[i]}:n};const u=String.fromCharCode(30),l=(t,e)=>{const i=t.length,r=new Array(i);let s=0;t.forEach((t,n)=>{a(t,!1,t=>{r[n]=t,++s===i&&e(r.join(u))})})},p=(t,e)=>{var i=t.split(u),r=[];for(let t=0;t<i.length;t++){var s=h(i[t],e);if(r.push(s),"error"===s.type)break}return r},d=4},function(t,e,i){"use strict";
|
|
235
235
|
/*!
|
|
236
236
|
* checkcontract.js - check contract outside of gamegold chain.
|
|
237
237
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -302,7 +302,7 @@ const r=i(21).opcodes;function s(t){let e=null;var i=s.list[t.type];return new(i
|
|
|
302
302
|
/*!
|
|
303
303
|
* wallet.js - wallet object for vallnet
|
|
304
304
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
305
|
-
*/const r=i(0);var s=i(16);const n=i(15),a=i(1),o=i(3),c=i(34),h=i(199),u=i(119).sortWithSeq,l=i(7),p=i(94),d=i(2),f=i(4),m=i(70),g=i(339);i(222);const y=i(110),v=i(73),w=i(12),b=i(60),k=i(17),x=i(223),S=i(124),E=i(26),_=i(159),R=i(340),A=i(65),C=i(28),I=i(27),O=i(6),P=i(311),T=i(39),j=S.Mnemonic,{opcodes:B,hashType:N}=i(21),F=i(167),D=i(77),L=i(78),M=i(143),H=i(46),z=i(19),U=i(43),q=i(53),{NotifyMsg:V,OrderData:K,ContractStatus:W,ContractType:G}=i(5),$=i(37).VerifyError,X=i(85).stockItem,Y=i(157).ErItem,J=i(158).ErAbolishItem,Z=i(237).EnchancementItem,Q=i(31),tt=i(69),et=i(59),it=i(82);class rt extends s{constructor(t,e){super(),r(t,"DB required."),this.db=t,this.network=t.network,this.logger=t.logger,this.readLock=new h,this.writeLock=new c,this.sendLock=new c,this.indexCache=new A(1e4),this.accountCache=new A(1e4),this.pathCache=new A(1e5),this.current=null,this.wid=0,this.id=null,this.initialized=!1,this.watchOnly=!1,this.accountDepth=0,this.token=o.ZERO_HASH,this.tokenDepth=0,this.master=new R,this.txdb=new g(this),this.account=null,e&&this.fromOptions(e)}fromOptions(t){let e,i,s=t.master;return s?("string"==typeof s&&(s=S.PrivateKey.fromBase58(s,this.network)),r(S.isPrivate(s),"Must create wallet with hd private key.")):(i=new j(t.mnemonic),s=S.fromMnemonic(i,this.network)),r(s.network===this.network,"Network mismatch for master key."),this.master.fromKey(s,i),null!=t.wid&&(r(a.isU32(t.wid)),this.wid=t.wid),t.id&&(r(v.isName(t.id),"Bad wallet ID."),e=t.id),null!=t.initialized&&(r("boolean"==typeof t.initialized),this.initialized=t.initialized),null!=t.watchOnly&&(r("boolean"==typeof t.watchOnly),this.watchOnly=t.watchOnly),null!=t.accountDepth&&(r(a.isU32(t.accountDepth)),this.accountDepth=t.accountDepth),t.token&&(r(Buffer.isBuffer(t.token)),r(32===t.token.length),this.token=t.token),e=e||this.getID(),this.id=e,this}static fromOptions(t,e){return new rt(t).fromOptions(e)}async init(t){var e=t.passphrase;r(!this.initialized),this.initialized=!0,e&&await this.master.encrypt(e),t=await this._createAccount(t,e);r(t),this.account=t,this.logger.info("Wallet initialized (%s).",this.id),await this.txdb.open()}async open(){r(this.initialized);var t=await this.getAccount(0);if(!t)throw new Error("Default account not found.");this.account=t,this.logger.info("Wallet opened (%s).",this.id),await this.txdb.open()}async ensureNotifyKey(){this.notifyKey||(await this.ensureAccount({name:"alliance",witness:!0}),this.notifyKey=await this.createReceive("alliance",1,this.master),this.notifyAddress=this.notifyKey.getAddress("string"))}async createAllianceInfo(t,e,i){var r={alliancename:t,nodeid:e};return t?(r.alliancePrivateKey=l.hash256(Buffer.concat([Buffer.from(t),this.master.key.privateKey])),i?(r.prv=Buffer.alloc(0),r.pub=Buffer.from(i,"hex"),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(this.network.type),r.mnemonic=new j):(i=l.hash256(Buffer.concat([Buffer.from(t+"-"+e),this.master.key.privateKey])),r.mnemonic=new j({entropy:i,language:this.master.mnemonic.language,passphrase:this.master.mnemonic.passphrase}),r.prv=l.hash256(Buffer.from(r.mnemonic.toSeed().toString("hex"))),r.pub=C.publicKeyCreate(r.prv,!0),t=R.fromKey(S.fromMnemonic(r.mnemonic),this.network.type).key.deriveAccount(44,0).derive(9).derive(1),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(t.publicKey),this.network.type).toString(this.network.type))):(r.mnemonic=j.fromOptions(this.master.mnemonic),r.prv=l.hash256(Buffer.from(r.mnemonic.toSeed().toString("hex"))),r.pub=C.publicKeyCreate(r.prv,!0),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(this.network.type)),r.address=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(),r}async destroy(){var t=await this.writeLock.lock(),e=await this.sendLock.lock();try{this.db.unregister(this),await this.master.destroy(),this.readLock.destroy(),this.writeLock.destroy(),this.sendLock.destroy()}finally{e(),t()}}async addSharedKey(t,e){var i=await this.writeLock.lock();try{return await this._addSharedKey(t,e)}finally{i()}}async _addSharedKey(t,e){if(e||(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");let i;this.start();try{i=await t.addSharedKey(e)}catch(t){throw this.drop(),t}return await this.commit(),i}async removeSharedKey(t,e){var i=await this.writeLock.lock();try{return await this._removeSharedKey(t,e)}finally{i()}}async _removeSharedKey(t,e){if(e||(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");let i;this.start();try{i=await t.removeSharedKey(e)}catch(t){throw this.drop(),t}return await this.commit(),i}async setPassphrase(t,e){t&&await this.decrypt(t),e&&await this.encrypt(e)}async encrypt(t){var e=await this.writeLock.lock();try{return await this._encrypt(t)}finally{e()}}async _encrypt(t){t=await this.master.encrypt(t,!0),this.start();try{await this.db.encryptKeys(this,t)}catch(e){throw p(t),this.drop(),e}p(t),this.save(),await this.commit()}async decrypt(t){var e=await this.writeLock.lock();try{return await this._decrypt(t)}finally{e()}}async _decrypt(t){t=await this.master.decrypt(t,!0),this.start();try{await this.db.decryptKeys(this,t)}catch(e){throw p(t),this.drop(),e}p(t),this.save(),await this.commit()}async rename(t){var e=await this.writeLock.lock();try{return await this.db.rename(this,t)}finally{e()}}async writeBalanceLog(t){var e=await this.writeLock.lock();try{return await this.db.writeBalanceLog(this,t)}finally{e()}}async renameAccount(t,e){var i=await this.writeLock.lock();try{return await this._renameAccount(t,e)}finally{i()}}async _renameAccount(t,e){if(!v.isName(e))throw new Error("Bad account name.");var i=await this.getAccount(t);if(!i)throw new Error("Account not found.");if(0===i.accountIndex)throw new Error("Cannot rename default account.");if(await this.hasAccount(e))throw new Error("Account name not available.");t=i.name,this.start(),this.db.renameAccount(i,e),await this.commit(),this.indexCache.remove(t),t=this.pathCache.values();for(const r of t)r.account===i.accountIndex&&(r.name=e)}async lock(){var t=await this.writeLock.lock(),e=await this.sendLock.lock();try{await this.master.lock()}finally{e(),t()}}unlock(t,e){return this.master.unlock(t,e)}getID(){r(this.master.key,"Cannot derive id.");var t,e=this.master.key.derive(44);(t=new f(37)).writeBytes(e.publicKey),t.writeU32(this.network.magic),e=l.hash160(t.render());return(t=new f(27)).writeU8(3),t.writeU8(190),t.writeU8(4),t.writeBytes(e),t.writeChecksum(),m.encode(t.render())}async createAccount(t,e){var i=await this.writeLock.lock();try{return await this._createAccount(t,e)}finally{i()}}async _createAccount(t,e){let i,s,n=t.name,o=(n=n||this.accountDepth.toString(10),0);if(0!=this.accountDepth&&(o=a.hashInt(n)),await this.hasAccountIndex(o))throw new Error("Account Index Conflict.");if(await this.hasAccount(n))throw new Error("Account already exists.");if(await this.unlock(e),this.watchOnly&&t.accountKey){if("string"==typeof(i=t.accountKey)&&(i=S.PublicKey.fromBase58(i,this.network)),!S.isPublic(i))throw new Error("Must add HD public keys to watch only wallet.");r(i.network===this.network,"Network mismatch for watch only key.")}else r(this.master.key),i=(i=this.master.key.deriveAccount(44,o)).toPublic();e={wid:this.wid,id:this.id,name:0===this.accountDepth?"default":n,witness:t.witness,watchOnly:this.watchOnly,accountKey:i,accountIndex:o,type:t.type,m:t.m,n:t.n,keys:t.keys},this.start();try{(s=_.fromOptions(this.db,e)).wallet=this,await s.init()}catch(t){throw this.drop(),t}return this.logger.info("Created account %s/%s/%d.",s.id,s.name,s.accountIndex),this.accountDepth++,this.save(),await this.commit(),s}async ensureAccount(t,e){var i=t.name;return(i=await this.getAccount(i))||this.createAccount(t,e)}getAccounts(){return this.db.getAccounts(this.wid)}getAddressHashes(t){return null!=t?this.getAccountHashes(t):this.db.getWalletHashes(this.wid)}async getAccountHashes(t){return t=await this.ensureIndex(t,!0),this.db.getAccountHashes(this.wid,t)}async getAccount(t){if(this.account&&(null==t||"default"===t||"number"==typeof t&&0===t||"string"==typeof t&&0===t.length))return this.account;if(-1===(t=await this.getAccountIndex(t)))return null;var e=await this.readLock.lock(t);try{return await this._getAccount(t)}finally{e()}}async _getAccount(t){var e=this.accountCache.get(t);return e||((e=await this.db.getAccount(this.wid,t))?(e.wallet=this,e.wid=this.wid,e.id=this.id,e.watchOnly=this.watchOnly,await e.open(),this.accountCache.set(t,e),e):null)}async getAccountIndex(t){var e;return null==t?-1:"number"==typeof t?t:null!=(e=this.indexCache.get(t))?e:-1===(e=await this.db.getAccountIndex(this.wid,t))?-1:(this.indexCache.set(t,e),e)}async getAccountName(t){var e;return"string"==typeof t?t:(e=this.accountCache.get(t))?e.name:this.db.getAccountName(this.wid,t)}async hasAccount(t){return-1!==(t=await this.getAccountIndex(t))&&(!!this.accountCache.has(t)||this.db.hasAccount(this.wid,t))}async hasAccountIndex(t){return!!this.accountCache.has(t)||this.db.hasAccount(this.wid,t)}createReceive(t,e=0,i=null){return this.createKey(t,0,e,i)}createChange(t){return this.createKey(t,1)}createNested(t){return this.createKey(t,2)}async createKey(t,e,i=0,r=null){var s=await this.writeLock.lock();try{return await this._createKey(t,e,i,r)}finally{s()}}async _createKey(t,e,i=0,r=null){if(null==e&&(e=t,t=null),!(t=await this.getAccount(t=t||0)))throw new Error("Account not found.");let s;this.start();try{s=await t.createKey(e,i,r)}catch(t){throw this.drop(),t}return await this.commit(),s}async deriveKey(t,e,i,r=null){let s=null;var n=await this.writeLock.lock();try{this.start(),s=await this._deriveKey(t,e,i,r),await this.commit()}catch(t){throw this.drop(),t}finally{n()}return s}async _deriveKey(t,e,i=0,r=null){if(null==e&&(e=t,t=null),t=t||0,t=parseInt(t),t=await this.getAccount(t))return e=await t.deriveKey(e,i,r),await t.saveKey(e),e;throw new Error("Account not found.")}save(){return this.db.save(this)}async saveAccount(t){var e=await this.writeLock.lock();try{this.start(),t._save(),await this.commit(),0==t.accountIndex&&(this.account=t)}finally{e()}}start(){return this.db.start(this)}drop(){return this.db.drop(this)}clear(){return this.db.clear(this)}commit(){return this.db.commit(this)}async hasAddress(t){return t=w.getHash(t,"hex"),null!=await this.getPath(t)}async getPath(t){return(t=await this.readPath(t))?(t.name=await this.getAccountName(t.account),r(t.name),this.pathCache.set(t.hash,t),t):null}async readPath(t){t=w.getHash(t,"hex");var e=this.pathCache.get(t);return e||((e=await this.db.getPath(this.wid,t))?(e.id=this.id,e):null)}async hasPath(t){return t=w.getHash(t,"hex"),!!this.pathCache.has(t)||this.db.hasPath(this.wid,t)}async getPaths(t){if(null!=t)return this.getAccountPaths(t);var e=[];for(const t of await this.db.getWalletPaths(this.wid))t.id=this.id,t.name=await this.getAccountName(t.account),r(t.name),this.pathCache.set(t.hash,t),e.push(t);return e}async getAccountPaths(t){var e=await this.ensureIndex(t,!0),i=await this.getAccountHashes(e),s=await this.getAccountName(t),n=(r(s),[]);for(const t of i){var a=await this.readPath(t);r(a),r(a.account===e),a.name=s,this.pathCache.set(a.hash,a),n.push(a)}return n}async importKey(t,e,i){var r=await this.writeLock.lock();try{return await this._importKey(t,e,i)}finally{r()}}async _importKey(t,e,i){if(t&&"object"==typeof t&&(i=e,e=t,t=null),null==t&&(t=0),r(e.network===this.network,"Network mismatch for key."),this.watchOnly){if(e.privateKey)throw new Error("Cannot import privkey into watch-only wallet.")}else if(!e.privateKey)throw new Error("Cannot import pubkey into non watch-only wallet.");var s=e.getHash("hex");if(await this.getPath(s))throw new Error("Key already exists.");if(!(s=await this.getAccount(t)))throw new Error("Account not found.");if(s.type!==_.types.PUBKEYHASH)throw new Error("Cannot import into non-pkh account.");await this.unlock(i),t=x.fromRing(s,e).toPath(),this.master.encrypted&&(t.data=this.master.encipher(t.data,t.hash),r(t.data),t.encrypted=!0),this.start();try{await s.savePath(t)}catch(t){throw this.drop(),t}await this.commit()}async importAddress(t,e){var i=await this.writeLock.lock();try{return await this._importAddress(t,e)}finally{i()}}async _importAddress(t,e){if(e||(e=t,t=null),null==t&&(t=0),e.network!==this.network)throw new Error("Network mismatch for address.");if(!this.watchOnly)throw new Error("Cannot import address into non watch-only wallet.");if(await this.getPath(e))throw new Error("Address already exists.");if(!(t=await this.getAccount(t)))throw new Error("Account not found.");if(t.type!==_.types.PUBKEYHASH)throw new Error("Cannot import into non-pkh account.");e=y.fromAddress(t,e),this.start();try{await t.savePath(e)}catch(t){throw this.drop(),t}await this.commit()}async fund(t,e){var i=await this.writeLock.lock();try{return await this._fund(t,e)}finally{i()}}async _fund(t,e){if(e=e||{},!this.initialized)throw new Error("Wallet is not initialized.");if(this.watchOnly)throw new Error("Cannot fund from watch-only wallet.");let i;if(null!=e.account){if(!(i=await this.getAccount(e.account)))throw new Error("Account not found.")}else i=this.account;if(!i.initialized)throw new Error("Account is not initialized.");let s,n=e.rate;return null==n&&(n=await this.db.estimateFee(e.blocks)),s=e.smart?await this.getSmartCoins(i.name):(s=await this.getCoins(i.name),this.txdb.filterConserved(s)),await t.fund(s,{allowPreInput:e.allowPreInput,noChange:e.noChange,selection:e.selection,round:e.round,depth:e.depth,hardFee:e.hardFee,subtractFee:e.subtractFee,subtractIndex:e.subtractIndex,changeAddress:i.change.getAddress(),height:this.db.curHeight,rate:n,maxFee:e.maxFee,estimate:t=>this.estimateSize(t),network:this.network}),!e.allowInfiniteFee&&e.noChange&&r(t.getFee()<=P.MAX_FEE,"TX exceeds MAX_FEE."),s}async getAccountByAddress(t){return t=w.getHash(t,"hex"),(t=await this.getPath(t))?this.getAccount(t.account):null}async estimateSize(t){var e=O.WITNESS_SCALE_FACTOR,i=w.fromScript(t);if(!i)return-1;var r=await this.getAccountByAddress(i);if(!r)return-1;let s=0;if(t.isScripthash()&&r.witness)switch(r.type){case _.types.PUBKEYHASH:s=4*(s+23);break;case _.types.MULTISIG:s=4*(s+35)}switch(r.type){case _.types.PUBKEYHASH:s=s+74+34;break;case _.types.MULTISIG:s=(s=(s=(s=(s+=1)+74*r.m)+3+1)+34*r.n)+1+1}return r.witness?s=((s+=1)+e-1)/e|0:s+=o.sizeVarint(s),s}async createTX(t){var e=t.outputs,i=new b;r(Array.isArray(e),"Outputs must be an array."),r(0<e.length,"No outputs available."),t.comment&&("object"==typeof t.comment&&(t.comment=JSON.stringify(t.comment)),i.outputs.push(E.fromScript(k.createScript(Buffer.from(t.comment),k.types.NULLDATA),0)));for(const t of e){var s=new E(t),n=s.getAddress();if(s.isDust())throw new Error("Output is dust.");if(0<s.value){if(!n)throw new Error("Cannot send to unknown address.");if(n.isNull())throw new Error("Cannot send to null address.")}i.outputs.push(s)}let a=null;if(t.inputs)for(const e of t.inputs){var o=await this.getTX(e.hash);o&&(o=q.fromTX(o.tx,e.index,-1,0))&&(a=o.getAddress(),t.allowPreInput=!0,i.addCoin(o))}else await this.fund(i,t);if(a&&((e=new E).value=i.getFee()-P.MIN_FEE,e.script.fromAddress(a),i.outputs.push(e),i.changeIndex=i.outputs.length-1),!1!==t.sort&&i.sortMembers(),null!=t.locktime&&i.setLocktime(t.locktime),r(i.isSane(),"TX failed sanity check."),r(i.verifyInputs(this.db.curHeight+1),"TX failed context check."),0===await this.template(i))throw new Error("Templating failed.");return i}async send(t,e){var i=await this.sendLock.lock();try{return await this._send(t,e)}finally{i()}}async _send(t,e){return e&&(t.account=e),e=await this.createTX(t,!0),await this.sign(e),this.sendMTX(e,{sendafter:t.sendafter})}async sendMTX(t,e={}){if(!t.isSigned())throw new Error("TX could not be fully signed.");var i=t.toTX();if(i.getSigopsCost(t.view)>I.MAX_TX_SIGOPS_COST)throw new Error("TX exceeds policy sigops.");if(i.getWeight()>I.MAX_TX_WEIGHT)throw new Error("TX exceeds policy weight.");return e.sendafter||(this.logger.debug("Sending wallet tx (%s): %s",this.id,i.txid()),await this.db.addTX(i),await this.db.send(i)),i}async resend(){var t=await this.getPending(),e=(0<t.length&&this.logger.info("Rebroadcasting %d transactions.",t.length),[]);for(const i of t)e.push(i.tx);for(const t of await u(e,this.db))await this.db.send(t);return e}async deriveInputs(t){r(t.mutable);var e=[];for(const r of await this.getInputPaths(t)){var i=await this.getAccount(r.account);i&&(i=i.derivePath(r,this.master))&&e.push(i)}return e}async getKey(t){var e;t=w.getHash(t,"hex",this.network.type);return(t=await this.getPath(t))&&(e=await this.getAccount(t.account))?e.derivePath(t,this.master):null}async exportToFile(t){if(!et.unsupported){var e=await this.db.getTip(),i=a.date();let o=1,c="",h=[a.fmt("# Wallet Dump created by %s %s",it.protocol,it.version),a.fmt("# * Created on %s",i),a.fmt("# * Best block at time of backup was %d (%s).",e.height,a.revHex(e.hash)),a.fmt("# * File: %s",t.file),""];e=a.fmt("W %s wid= %s",this.toRaw().toString("base64"),this.wid),h.push(e),e=await this.getAccounts();for(const t of e){var r=await this.getAccount(t);r=a.fmt("C %s name= %s index= %d",r.toRaw().toString("base64"),r.name,r.accountIndex);h.push(r)}for(const e of await this.getAddressHashes()){var s,n=await this.getPrivateKey(e);n&&(s=n.getAddress("string"),n=a.fmt("A %s %s label= account= %s branch= %s index= %s addr= %s",n.toSecret(),i,n.account,n.branch,n.index,s),h.push(n),1e5<h.length)&&(c=h.join("\n"),await et.writeFile(`${t.file}-${o++}.txt`,c,"utf8"),h=[])}h.push(""),h.push("# End of dump"),h.push(""),c=h.join("\n"),await et.writeFile(`${t.file}-${o++}.txt`,c,"utf8")}}async getPrivateKey(t,e){if(t=w.getHash(t,"hex"),!(t=await this.getPath(t)))return null;var i=await this.getAccount(t.account);return i?(await this.unlock(e),(e=i.derivePath(t,this.master)).privateKey?e:null):null}async getInputPaths(t){if(r(t.mutable),!t.hasCoins())throw new Error("Not all coins available.");var e=[];for(const r of t.getInputHashes("hex")){var i=await this.getPath(r);i&&e.push(i)}return e}async getOutputPaths(t){var e=[];for(const r of t.getOutputHashes("hex")){var i=await this.getPath(r);i&&e.push(i)}return e}async setLookahead(t,e){var i=await this.writeLock.lock();try{return this._setLookahead(t,e)}finally{i()}}async _setLookahead(t,e){if(null==e&&(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");this.start();try{await t.setLookahead(e)}catch(t){throw this.drop(),t}await this.commit()}async syncOutputDepth(t){var e=new Map;for(const r of t.outputs){var i=r.path;i&&-1!==i.index&&(e.has(i.account)||e.set(i.account,[]),e.get(i.account).push(i))}var s,n,a=[];for([s,n]of e){let t=-1,e=-1,i=-1;for(const r of n)switch(r.branch){case 0:r.index>t&&(t=r.index);break;case 1:r.index>e&&(e=r.index);break;case 2:r.index>i&&(i=r.index)}t+=2,e+=2,i+=2;var o=await this.getAccount(s);(o=(r(o),await o.syncDepth(t,e,i)))&&a.push(o)}return a}async getRedeem(t){"string"==typeof t&&(t=Buffer.from(t,"hex"));var e=await this.getKey(t.toString("hex"));return e?e.getRedeem(t):null}async template(t){var e=await this.deriveInputs(t);return t.sign(e)}async getOrderList(t,e){let i=[];var r=new Q;(await this.getHistory(e||"default")).reduce((t,e)=>{var{tx:e,hash:r,height:s}=e;if(e.outputs[0].getReturnType(B.OP_RETURN))try{var n,a=JSON.parse(e.outputs[0].script.code[1].toString());a&&a.oper==G.payOrder&&((n=K.fromJson(a)).hash=r,n.height=s,t.set(""+n.cid+n.sn,n),i.push(n.cid))}catch(t){}return t},r),e=r.query(t);return await this.db.flushCP(i),e.list.map(t=>{t.cp=this.db.cpList.getItem(t.cid)}),e}async propCreate(t,e){var i,s=new b;for(i of t){var n=await this.ensureCp(i.cid,!0);!n||i.cid==this.network.genesisId||(i.gold=(0|i.gold)>>>0,i.gold<O.MINPROPVALUE)||(i.pid||(i.pid=M()),s.propCreate(n.current.address,i),i.index=s.outputs.length-1)}if(0<s.outputs.length){e?await this.fund(s,{account:e}):await this.fund(s),await this.sign(s);var a,o=s.commit();for(a of(await this.db.addTX(o[0]),await this.db.send(o[0]),r(o[0].verify(o[1],k.flags.STANDARD_VERIFY_FLAGS)),t))a.hash=o[0].hash("hex"),a.txid=o[0].txid();return o}return[]}async stockAddress(t,e){return await this.ensureAccount({name:e,witness:!0}),(await this.createReceive(e,a.hashInt(t),this.master)).getAddress()}async stockOffer(t,e,i,s){r(!!t),r(!!e),r(!!i),e=(0|e)>>>0,i=(0|i)>>>0;var n=await this.ensureCp(t),a=await this.getKey(n.current.address);if(r(!!a),s&&s!==a.name)throw new D(L.errors.TYPE_ERROR,"illegal account");return a=a.signData({cid:t,type:X.RecordType.Offer,sum:e,price:i}),(t=new b).outputs.push(E.fromScript(a.data.addr,.05*e*i)),e=new V(G.stock,M(),this.db.curHeight,a),i=E.fromScript(k.createScript(e.toRaw(),k.types.NULLDATA),0),t.outputs.push(i),s?await this.fund(t,{account:s}):await this.fund(t),t.outputs.shift(),await this.sign(t),a=t.commit(),r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),e.hash=a[0].hash("hex"),e.height=-1,e.cp=n,e}async stockPurchase(t,e,i){if(r(!!t),r(!!e),(e=(0|e)>>>0)<O.STOCK_TRADE_SINGLE||e>O.STOCK_MAX_TRADE_SINGLE)throw new D(L.errors.TYPE_ERROR,"Invalid Stock Amount.");var s=await this.ensureCp(t),n=(t={type:X.RecordType.Purchase,cid:t,uid:i,seq:0,to:s.current.address,sum:e},t=(await this.addStockAccountSeq(t),await this.tokenCreate(t,i)),new b),a=(t=new V(G.stock,M(),this.db.curHeight,t),E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0));n.outputs.push(a),n.outputs.push(E.fromScript(s.current.address,e*s.stock.price)),i?await this.fund(n,{account:i}):await this.fund(n),await this.sign(n),a=n.commit();return r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),t.hash=a[0].hash("hex"),t.height=-1,t.cp=s,t}async stockPurchaseTo(t,e,i,s){if(r(!!t),r(!!e),(e=(0|e)>>>0)<O.STOCK_TRADE_SINGLE||e>O.STOCK_MAX_TRADE_SINGLE)throw new D(L.errors.TYPE_ERROR,"Invalid Stock Amount.");var n=await this.ensureCp(t),a=(t={type:X.RecordType.Purchase,cid:t,uid:i,seq:0,to:n.current.address,sum:e},t=(await this.addStockAccountSeq(t),await this.tokenCreate(t,i)),i=new b,t=new V(G.stock,M(),this.db.curHeight,t),E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0));i.outputs.push(a),i.outputs.push(E.fromScript(n.current.address,e*n.stock.price)),s?await this.fund(i,{account:s}):await this.fund(i),await this.sign(i),a=i.commit();return r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),t.hash=a[0].hash("hex"),t.height=-1,t.cp=n,t}async stockSend(t,e,i,s,n){r(!!t),r(!!e),e=(0|e)>>>0;var a=await this.ensureCp(t,!0);return a?(t={type:X.RecordType.Send,cid:t,uid:s,seq:0,sum:e,to:i},await this.addStockAccountSeq(t),e=await this.tokenCreate(t,s,n),i=new b,t=new V(G.stock,M(),this.db.curHeight,e),n=E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0),i.outputs.push(n),s?await this.fund(i,{account:s}):await this.fund(i),await this.sign(i),e=i.commit(),r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(e[0]),await this.db.send(e[0]),t.hash=e[0].hash("hex"),t.height=-1,t.cp=a,t):null}async stockBid(t,e,i,s,n){r(!!t),r(!!e),r(!!i),e=(0|e)>>>0,i=(0|i)>>>0;var a=await this.ensureCp(t,!0);return a?(t={type:X.RecordType.Bid,cid:t,uid:s,seq:0,sum:e,price:i},await this.addStockAccountSeq(t),t=await this.tokenCreate(t,s,n),(n=new b).outputs.push(E.fromScript(t.data.addr,.05*e*i)),e=new V(G.stock,M(),this.db.curHeight,t),i=E.fromScript(k.createScript(e.toRaw(),k.types.NULLDATA),0),n.outputs.push(i),s?await this.fund(n,{account:s}):await this.fund(n),n.outputs.shift(),await this.sign(n),t=n.commit(),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(t[0]),await this.db.send(t[0]),e.hash=t[0].hash("hex"),e.height=-1,e.cp=a,e):null}async stockAuction(t,e,i,s,n,a){r(!!t),r(!!e),r(!!i);var o=await this.ensureCp(t,!0);if(!o)return null;i=(0|i)>>>0;t={type:X.RecordType.Auction,cid:t,to:e,uid:n,seq:0,sum:i,price:s},await this.addStockAccountSeq(t),t=await this.tokenCreate(t,n,a),a=new b,t=new V(G.stock,M(),this.db.curHeight,t);var c=E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0);a.outputs.push(c),a.outputs.push(E.fromScript(e,i*s)),n?await this.fund(a,{account:n}):await this.fund(a),await this.sign(a),c=a.commit();return r(c[0].verify(c[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(c[0]),await this.db.send(c[0]),t.hash=c[0].hash("hex"),t.height=-1,t.cp=o,t}async sendSecret(t,e,i){let r=this.db.$contacts.get(t);if(!r||!r.sender){var s=(await this.createReceive(i)).getAddress("string");if(t==s)throw new D(L.errors.TYPE_ERROR,"Forbid Sending to Self Address.");r=await this.db.ensureContact({contact:t,messenger:s,wallet:this,account:i})}if(r)return r.send(e);throw new D(L.errors.TYPE_ERROR,"Invalid Address.")}async commNotify(t){r(!!t),r(!!t.dst),r(!!t.content);var e=new b,i=t.src||this.getReceive().toString(),s=(i=new V(G.notify,M(),this.db.curHeight,{src:i,content:t.content}),E.fromScript(k.createScript(i.toRaw(),k.types.NULLDATA),0));e.outputs.push(s),s={address:t.dst,locktime:O.BLOCK_DAY,locktype:"csb",value:.1*O.COIN},e.outputs.push(new E(s)),t.account?await this.fund(e,{account:t.account,noChange:!0,allowInfiniteFee:!0}):await this.fund(e,{noChange:!0,allowInfiniteFee:!0}),await this.sign(e),s=e.commit();return r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(s[0]),this.logger.debug("Sending tx on wallet(%s): %s",this.id,s[0].txid()),await this.db.send(s[0]),i.hash=s[0].hash("hex"),i.height=-1,i}async payOrder(t,e,i,s,n){r(!!t),r(!!e),r(!!i),r(!!s);var o=(await this.tokenCreate({cid:t,uid:e},n)).data.addr,c=(i=a.sprintf("%0-36s",i),await this.getOrderList([["cid",t],["sn",i]],n));if(0<c.list.length)return c.list[0];if((s=(0|s)>>>0)<O.MINPROPVALUE)return null;if(!(c=await this.ensureCp(t,!0)))return null;t=new K(t,e,i,s,o,"");var h=new b;e=E.fromScript(k.createScript(Buffer.from(JSON.stringify(t)),k.types.NULLDATA),0);for(h.outputs.push(e),h.outputs.push(E.fromScript(c.current.address,s)),n?await this.fund(h,{account:n}):await this.fund(h);2<h.outputs.length;)h.outputs.pop();return await this.sign(h,null,N.ZERO|N.ANYONECANPAY),i=h.commit(),r(i[0].verify(i[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(i[0]),await this.db.send(i[0]),t.hash=i[0].hash("hex"),t.height=-1,t.cp=c,t}async cpRegister(t,e,i,s){if(r(!!e&&"object"==typeof e),!await this.db.client.execute("canExecute",[{confirm:!1,cid:e.cid,name:e.name,oper:G.cpRegister}]))throw new D(L.errors.TYPE_ERROR,"Invalid CP Register Info.");const n=new b;t||(o=await this.createReceive(i),t=o.getAddress());var o=await this.getKey(t);if(!o)throw new D(L.errors.TYPE_ERROR,"Invalid CP Register Address, Not along to this wallet.");e.pubAddress=t.toString(),e.pubKey=o.getPublicKey("hex"),e.signMethod="secp256k1",o=await this.createAllianceInfo(),e.register=o.pub.toString("hex"),n.cpRegister(t,O.registerFee,e);for(let i=0;i<10;i++){var c=""+e.cid+this.network.stockFix+a.sprintf("%02d",i);c={oper:G.propCreate,pid:c,oid:e.cid,cid:e.cid,gold:O.MINPROPVALUE};n.propCreate(t,c)}if(o=async()=>{i?await this.fund(n,{account:i}):await this.fund(n),await this.sign(n);var s=n.commit();return r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(s[0]),await this.db.send(s[0]),e.txid=s[0].txid(),e.addr=t.toString(),s},!s)return o();o()}getSCAddress(t){return t=tt.fromMnemonic(j.fromOptions(O.SmartContractMnemonic),this.network).deriveAccount(44,t).derive(9).derive(1),w.fromWitnessPubkeyhash(l.hash160(t.publicKey),this.network)}async cpChange(t,e){var i=await this.ensureCp(t.cid);if(i.cid==this.network.genesisId||"ATHENA"==i.name)throw new D(L.errors.TYPE_ERROR,"Invalid cp name.");var s=await this.getTX(i.current.hash);if(!s)throw new D(L.errors.TYPE_ERROR,"Do not have permission to change this info.");if(s=s.tx,!await this.belongToAccount(e,s.outputs[0].getAddress()))throw new D(L.errors.TYPE_ERROR,"Invalid account info.");if(t.newName){if(!await this.db.client.execute("canExecute",[{confirm:!1,cid:i.cid,name:t.newName,oper:G.cpChange}]))throw new D(L.errors.TYPE_ERROR,"Invalid CP Change Info.")}else t.newName=i.name;return t.addr||(t.addr=w.fromString(i.current.address)),i=b.cpChange(s,t),e?await this.fund(i,{allowPreInput:!0,account:e}):await this.fund(i,{allowPreInput:!0}),await this.sign(i),s=i.commit(),await this.db.send(s[0]),r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),t.txid=s[0].txid(),s}async propExchangeList(t,e,i=!1){var s,n,a,o=new b,c=[];for([s,n,a]of t){var h,u=null;if(u=await this.getTX(s.hash)){if(u=u.tx,h=s.index,u&&u.outputs&&!(u.outputs.length<=h)){if(i){if(!await this.hasAddress(u.outputs[h].getAddress())){this.logger.error("not owned prop:",s.hash,s.index);continue}}else if(!await this.belongToAccount(e,u.outputs[h].getAddress())){this.logger.error("not owned prop:",s.hash,s.index);continue}var l=u.outputs[h].getReturnData();l&&(o.propExchange(u,h,n),l.index=o.outputs.length-1,l.addr=n.toString(),c.push(l))}}else this.logger.error("tx not find:",s.hash,a)}return e?await this.fund(o,{allowPreInput:!0,account:e}):await this.fund(o,{allowPreInput:!0}),await this.sign(o),t=o.commit(),await this.db.addTX(t[0]),await this.db.send(t[0]),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),t.push(c),t}async propDonate(t,e){var i=t.index;if(!(t=await this.getTX(t.hash))||!t.tx||!t.tx.outputs||t.tx.outputs.length<=i)throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(!await this.belongToAccount(e,t.tx.outputs[i].getAddress()))throw new D(L.errors.TYPE_ERROR,"Props that do not belong to you.");if(!(e=t.tx.outputs[i].getReturnData()))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(e.cid&&e.cid==this.network.genesisId)throw new $(t.tx,"invalid","Special props that can not to donate",100);var r=new b;return(t=(r.addInputFromTx(t.tx,i),r.addOutput(k.createScript(Buffer.from(JSON.stringify({value:t.tx.outputs[i].value,cid:e.cid,pid:e.pid,oid:e.oid,gaddr:this.getAddress().toString(this.network)})),k.types.NULLDATA),0),await this.sign(r,null,N.NONE|N.ANYONECANPAY),r.commit())).push(e),t}async propReceive(t,e){var i=(t=b.fromTX(t,1)).inputs[0].prevout,r=t.outputs[0].getReturnData();t.view.addOutput({hash:t.inputs[0].prevout.hash,index:t.inputs[0].prevout.index},new E({value:r.value})),t.outputs.pop();let s=this.getAddress().toString(this.network);e&&(n={cid:r.cid,uid:e},s=(n=await this.tokenCreate(n,e)).data.addr),t.outputs.push(E.fromScript(s,r.value,{oper:G.propExchange,pid:r.pid,cid:r.cid,oid:r.oid,prev:{hash:i.hash,index:i.index}})),e?await this.fund(t,{allowPreInput:!0,account:e}):await this.fund(t,{allowPreInput:!0}),await this.sign(t,null,N.ALL,[0]);var n=t.commit();return await this.db.send(n[0]),r.simAddr=s,[n[0],null,r]}async belongToAccount(t,e){return!!e&&!(!(e=await this.getAccountByAddress(e))||t&&e.name!==t)}async propExchange(t,e,i){let s=null,n=0;var a;return Array.isArray(t)?(s=t[0],n=t[1]):(a=await this.getTX(t.hash))&&(s=a.tx,n=t.index),!s||!s.outputs||s.outputs.length<=n?(this.logger.error("Invalid tx info."),null):await this.belongToAccount(i,s.outputs[n].getAddress())?(a=s.outputs[n].getReturnData())?(t=(new b).propExchange(s,n,e),a.index=t.outputs.length-1,i?await this.fund(t,{allowPreInput:!0,account:i}):await this.fund(t,{allowPreInput:!0}),await this.sign(t),e=t.commit(),await this.db.addTX(e[0]),await this.db.send(e[0]),r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS)),e.push(a),e):(this.logger.error("Invalid tx info."),null):(this.logger.error("Invalid user."),null)}async propFound(t,e){if(t=await this.getTX(t),r(t),!(t=t.tx))throw new D(L.errors.TYPE_ERROR,"Invalid hex string.");let i=0;3<=t.outputs.length&&(i=2);var s=(a=t.outputs[i]).getReturnData();if(!s||s.oper!==G.propExchange&&s.oper!==G.propCreate)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");if(s.cid==this.network.genesisId)throw new $(block,"invalid","prop found supertoken",100);var n=new b,a=(t=(n.addInputFromTx(t,i),E.fromScript(a.getAddress(),a.value)),n.outputs.push(t),e?await this.fund(n,{allowPreInput:!0,subtractFee:!0,account:e}):await this.fund(n,{allowPreInput:!0,subtractFee:!0}),await this.sign(n),n.commit());return await this.db.send(a[0]),r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),a.push(s),a}async propSale(t,e,i,s){let n=await this.getTX(t);if(!n)throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(n.getDepth(this.db.curHeight)<=0)throw new D(L.errors.TYPE_ERROR,"No enough confirmations.");if(!(n=n.tx))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");n.outputs[0].getReturnType(k.opcodes.OP_RETURN)&&(e=2);var a=n.outputs[e].getReturnData([k.opcodes.OP_PROPEXCHANGE,k.opcodes.OP_PROPCREATE]);if(!a)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");if(!await this.belongToAccount(s,n.outputs[e].getAddress()))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(!(s=await this.getCoin(t,e))||-1===s.height||-2===s.height)throw new D(L.errors.WALLET_INSUFFICIENT_FUNDS,"Invalid coin.");if(await this.txdb.isSpent(t,e))throw new D(L.errors.WALLET_INSUFFICIENT_FUNDS,"Invalid coin.");if(i<=n.outputs[e].value)throw new D(L.errors.TYPE_ERROR,"Invalid fixed price.");if(a.cid==this.network.genesisId)throw new $(n,"invalid","prop not for sale",100);return t=(s=new b).addInputFromTx(n,e),e={oper:G.propSale,pid:a.pid,prev:{hash:t.prevout.hash,index:t.prevout.index},fixed:i,period:this.db.curHeight+O.BLOCK_DAY},a=E.fromScript(k.createScript(Buffer.from(JSON.stringify(e)),k.types.NULLDATA),0),s.outputs.push(a),await this.sign(s,null,N.SINGLE|N.ANYONECANPAY),t=s.commit(),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.send(t[0]),t}async propBuy(t,e,i){if(!(t=this.db.propList.get(t))||!t.bid||!t.bid.raw)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx Hash.");var r=z.fromRaw(Buffer.from(t.bid.raw,"hex")),s=(await this.createReceive(i)).getAddress(),n=t.gold,a=w.fromString(t.current.address,this.network).getHash();if(e<n)throw new Error("wrong price");if(1<r.outputs.length&&e<r.outputs[1].value)throw new Error("low bid price than before");var o=b.fromTX(r,1);if(!o.outputs[0].getReturnType(B.OP_RETURN))throw new Error("not a sale order");return await this.remove(r.hash("hex")),o.view.addOutput({hash:o.inputs[0].prevout.hash,index:o.inputs[0].prevout.index},new E({value:t.gold})),a=E.fromScript(k.createScript(a),e),o.outputs.push(a),e={oper:G.propExchange,pid:t.pid,cid:t.cid,oid:t.oid,prev:{hash:o.inputs[0].prevout.hash,index:o.inputs[0].prevout.index}},a=E.fromScript(s,n,e),o.outputs.push(a),i?await this.fund(o,{allowPreInput:!0,account:i}):await this.fund(o,{allowPreInput:!0}),await this.sign(o,null,N.ALL,[0]),s=o.commit(),t.owned||this.db.client.watchOutpoint((new H).fromOptions(r.inputs[0].prevout)),await this.db.send(s[0]),s}async getTXByAmount(t,e){let i=null;var r;for(r of await this.getCoins(e))if(!(r.height<=0)&&r.value==t){i=r;break}return i&&(e=await this.getTX(i.hash))?[e.tx,i.index,i.height]:[]}async contractCreate(t,e,i,s,n){if(this.db.transactionList.query(t,s)!=W.None)throw new D(L.errors.TYPE_ERROR,"Contract with the same address finded.");if(0!=parseInt(e%1e3,10))throw new D(L.errors.TYPE_ERROR,"Contract source should an integer multiple of 1000.");if(!await U.checkSum(this.network,t,s))throw new D(L.errors.TYPE_ERROR,"Create contract with an invalid Address or a Address with old transations.");let a=!1,[o,c,h]=await this.getTXByAmount(e,n);if(!o){a=!0;var u=new b;let t="";t=(n?await this.createReceive(n):this).getAddress(),u.outputs.push(E.fromScript(t,e)),n?await this.fund(u,{allowPreInput:!0,account:n}):await this.fund(u,{allowPreInput:!0}),await this.sign(u),u=u.commit(),r(u[0].verify(u[1],k.flags.STANDARD_VERIFY_FLAGS)),o=u[0],c=0,h=-1}(u=new b).addInputFromTx(o,c,h);let l="";l=(n?await this.createReceive(n):this).getAddress();var p=await this.getKey(l);t={oper:G.contractCreate,type:t,addr:s,src:e,dst:i,srcact:n,alice:p.getPublicKey("hex"),period:this.db.curHeight+O.TRANSACTION_PERIOD},s=E.fromScript(k.createScript(Buffer.from(JSON.stringify(t)),k.types.NULLDATA),0),u.outputs.push(s),await this.sign(u,null,N.SINGLE|N.ANYONECANPAY),e=u.commit();return a&&await this.db.send(o),await this.db.send(e[0]),e}async contractPromise(t,e){if(!(t=this.db.transactionList.get(t))||t.transStatus!=W.CreatedOnMem)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx id.");if(!(t=z.fromRaw(Buffer.from(t.raw,"hex"))))throw new D(L.errors.TYPE_ERROR,"Invalid Tx id.");var i=U.parseContract(t);if(!i||i.oper!==G.contractCreate)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");var r=b.fromTX(t,1);if(!r.outputs[0].getReturnType(B.OP_RETURN))throw new Error("not a valid contract");r.view.addOutput({hash:r.inputs[0].prevout.hash,index:r.inputs[0].prevout.index},new E({value:i.src}));let s="";s=(e?await this.createReceive(e):this).getAddress();var n=await this.getKey(s);t={oper:G.contractPromise,prevhash:t.hash("hex"),type:i.type,addr:i.addr,dst:i.dst,srcact:i.srcact,dstact:e,bob:n.getPublicKey("hex"),period:i.period},e=new k([F.fromSymbol("promise"),F.fromData(Buffer.from(JSON.stringify(t))),F.fromSymbol("drop"),F.fromSymbol("greaterthan"),F.fromSymbol("drop"),F.fromSymbol("if"),F.fromData(l.hash160(Buffer.from(t.bob,"hex"))),F.fromSymbol("else"),F.fromData(l.hash160(Buffer.from(i.alice,"hex"))),F.fromSymbol("endif"),F.fromSymbol("checksig")]),r.outputs.push(E.fromScript(e,i.src)),await this.remove(t.prevhash),await this.sign(r,null,N.ALL,[0]),n=r.commit();return await this.db.send(n[0]),t.current={hash:n[0].hash("hex"),index:0},t.raw=n[0].toRaw().toString("hex"),t.transStatus=W.Promised,this.db.transactionList.saveContract(t,!0),n}async contractExecute(t,e){if(!(t=this.db.transactionList.get(t))||t.transStatus!=W.Confirmed&&t.transStatus!=W.Expired)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx id.");if(!(t=z.fromRaw(Buffer.from(t.raw,"hex"))))throw new D(L.errors.TYPE_ERROR,"Invalid Tx id.");e=e||1;var i=U.parseContract(t);if(!i||i.oper!==G.contractPromise)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");var s=t.outputs[1].getReturnData();if(!s||s.oper!==G.contractPromise)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");r.strictEqual(i.addr,s.addr),r.strictEqual(i.type,s.type),r.strictEqual(i.dst,s.dst),r.strictEqual(i.period,s.period),r.strictEqual(i.srcact,s.srcact),r.strictEqual(i.dstact,s.dstact);var n=this.db.transactionList.query(i.type,i.addr);if(n!=W.Confirmed&&n!=W.Expired)throw new D(L.errors.TYPE_ERROR,"Contract Promise not Check yet.");if(n==W.Expired&&1!=e||n==W.Confirmed&&2!=e)throw new D(L.errors.TYPE_ERROR,"Invalid Executor.");let a=i.srcact,o=(2==e&&(a=i.dstact),"");o=(a?await this.createReceive(a):this).getAddress();var c=new b,h=(c.addInputFromTx(t,1),{oper:G.contractExecute,type:i.type,addr:i.addr,master:e});h=E.fromScript(k.createScript(Buffer.from(JSON.stringify(h)),k.types.NULLDATA),0),c.outputs.push(h),h=E.fromScript(o,t.outputs[1].value),c.outputs.push(h),t=1==e?await T.fromPublic(Buffer.from(i.ori.alice,"hex")):await T.fromPublic(Buffer.from(s.bob,"hex")),h=await this.getKey(t.getAddress()),await c.signAsync(h,k.hashType.ALL,this.db.workers),e=c.commit();return r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS,n)),await this.db.send(e[0]),e}async htlcDeal(t,e){var i=await this.getTX(t.hash);let r=null;if(e){if(!(e=await this.getAccount(e)))throw new D(L.errors.TYPE_ERROR,"Invalid Account.");r=e.getReceive().toString()}else r=this.getReceive().toString();e=new b;var s=(new k).pushOp(B.OP_1);t.suggest&&s.pushData(Buffer.from(t.sa,"hex")),e.addInput({prevout:{hash:t.hash,index:t.index},script:s}),e.addOutput(r,i.tx.outputs[t.index].value-1e4),e.view.addOutput({hash:t.hash,index:t.index},new E(i.tx.outputs[t.index])),await this.sign(e,null,N.ALL),s=e.commit();return await this.db.send(s[0]),s}async htlcCancel(t,e){let i=null;var r=await this.getTX(t.hash);if(!(i=r?r.tx.outputs[t.index]:i))throw new D(L.errors.TYPE_ERROR,"Invalid Input.");let s=null;if(e){if(!(r=await this.getAccount(e)))throw new D(L.errors.TYPE_ERROR,"Invalid Account.");s=r.getReceive().toString()}else s=this.getReceive().toString();return e=new b,r=(new k).pushOp(B.OP_0),t.suggest&&r.pushData(Buffer.from(t.sa,"hex")),e.addInput({prevout:{hash:t.hash,index:t.index},script:r}),t.suggest?e.setSequence(0,2*O.HTLC_CANCEL_PERIOD,!1):e.setSequence(0,O.HTLC_CANCEL_PERIOD,!1),e.addOutput(s,i.value-1e4),e.view.addOutput({hash:t.hash,index:t.index},new E(i)),r=await this.getKey(t.master),await e.signAsync(r,k.hashType.ALL,this.db.workers),t=e.commit(),await this.db.send(t[0]),t}async sendContracts(t,e,i){var r,s=new b;for(r of t)s.outputs.push(i.create(r));return e?await this.fund(s,{account:e}):await this.fund(s),await this.sign(s),t=s.commit(),await this.db.addTX(t[0]),await this.db.send(t[0]),t}async addStockAccountSeq(t){r(t&&"object"==typeof t,"Token data should be a object"),r(t.cid,"Token data should has a cid property"),r(t.uid,"Token data should has a uid property");var e=await this.stockAddress(t.cid,t.uid);e=this.db.accountList.getOrCreateStockAccount(t.cid,e.toString());return t.seq=e.seq+1,t}async tokenCreate(t,e="",i){r(t&&"object"==typeof t,"Token data should be a object"),r(t.cid,"Token data should has a cid property"),r(t.uid,"Token data should has a uid property"),t.time=!0,await this.ensureAccount({name:e,witness:!0});let s=null;if(i){if(!await this.belongToAccount(e,i))throw new D(L.errors.TYPE_ERROR,`stock.send address error: addr:${i} is not belongs to account:`+e);s=await this.getKey(i)}else s=await this.createReceive(e,a.hashInt(t.cid),this.master);return s.signData(t)}async sign(t,e,i=k.hashType.ALL,r){if(this.watchOnly)throw new Error("Cannot sign from a watch-only wallet.");return await this.unlock(e),e=await this.deriveInputs(t),t.signAsync(e,i,this.db.workers,r)}getCoinView(t){return this.txdb.getCoinView(t)}getSpentView(t){return this.txdb.getSpentView(t)}toDetails(t){return this.txdb.toDetails(t)}getDetails(t){return this.txdb.getDetails(t)}async getCoin(t,e){return this.txdb.getCoin(t,e)}async getCredit(t,e){return this.txdb.getCredit(t,e)}async getStatusOfSC(t){return this.txdb.getStatusOfSC(t)}async setStatusOfSC(t,e){var i=await this.writeLock.lock();try{this.txdb.start();try{await this.txdb._setStatusOfSC(t,e),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}}finally{i()}}getLockedCoins(){return this.txdb.lockedCoins.values}getTX(t){return this.txdb.getTX(t)}getBlocks(){return this.txdb.getBlocks()}getBlock(t){return this.txdb.getBlock(t)}async add(t,e,i){var r=await this.writeLock.lock();try{return await this._add(t,e,i)}finally{r()}}async _add(t,e,i){let r,s;this.txdb.start();try{(r=await this.txdb._add(t,e,i))&&(s=await this.syncOutputDepth(r)),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}return s&&0<s.length&&(this.db.emit("address",this.id,s),this.emit("address",s)),r}async resetBalance(){var t=await this.writeLock.lock();try{this.txdb.start();try{await this.txdb.resetBalance(),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}}finally{t()}}async unconfirm(t){var e=await this.writeLock.lock();try{return await this.txdb.unconfirm(t)}finally{e()}}async remove(t){var e=await this.writeLock.lock();try{return await this.txdb.remove(t)}finally{e()}}async zap(t,e){var i=await this.writeLock.lock();try{return await this._zap(t,e)}finally{i()}}async _zap(t,e){return t=await this.ensureIndex(t),this.txdb.zap(t,e)}async abandon(t){var e=await this.writeLock.lock();try{return await this._abandon(t)}finally{e()}}_abandon(t){return this.txdb.abandon(t)}conserveCoin(t){return this.txdb.conserveCoin(t)}unConserveCoin(t){return this.txdb.unConserveCoin(t)}isConserved(t){return this.txdb.isConserved(t)}getConserved(){return this.txdb.getConserved()}async getHistory(t){return t=await this.ensureIndex(t),this.txdb.getHistory(t)}async getCoins(t){return t=await this.ensureIndex(t),this.txdb.getCoins(t)}async getCredits(t){return t=await this.ensureIndex(t),this.txdb.getCredits(t)}async getSmartCoins(t){var e=[];for(const r of await this.getCredits(t)){var i=r.coin;r.spent||this.txdb.isConserved(i)||(-1!==i.height&&-2!==i.height||r.own)&&e.push(i)}return e}async getPending(t){return t=await this.ensureIndex(t),this.txdb.getPending(t)}async getBalance(t){return t=await this.ensureIndex(t),this.txdb.getBalance(t)}async queryBalanceLog(t,e=0){return(t=await this.ensureIndex(t))?this.db.queryBalanceLog(this.wid,t,e):[]}async getRange(t,e){return t&&"object"==typeof t&&(e=t,t=null),t=await this.ensureIndex(t),this.txdb.getRange(t,e)}async getLast(t,e){return t=await this.ensureIndex(t),this.txdb.getLast(t,e)}async ensureIndex(t,e){if(null==t){if(e)throw new Error("No account provided.");return null}if(-1===(e=await this.getAccountIndex(t)))throw new Error("Account not found.");return e}getAddress(t){return this.account.getAddress(t)}getReceive(t){return this.account.getReceive(t)}getChange(t){return this.account.getChange(t)}getNested(t){return this.account.getNested(t)}inspect(){return{wid:this.wid,id:this.id,network:this.network.type,initialized:this.initialized,accountDepth:this.accountDepth,token:this.token.toString("hex"),tokenDepth:this.tokenDepth,state:this.txdb.state?this.txdb.state.toJSON(!0):null,master:this.master,account:this.account}}toJSON(t){return{network:this.network.type,wid:this.wid,id:this.id,initialized:this.initialized,watchOnly:this.watchOnly,accountDepth:this.accountDepth,token:this.token.toString("hex"),tokenDepth:this.tokenDepth,height:this.db.curHeight,state:this.txdb.state.toJSON(!0),master:this.master.toJSON(t),account:this.account.toJSON(!0)}}getSize(){var t=0;return(t+=50)+o.sizeVarString(this.id,"ascii")+o.sizeVarlen(this.master.getSize())}toRaw(){var t=this.getSize();return(t=new f(t)).writeU32(this.network.magic),t.writeU32(this.wid),t.writeVarString(this.id,"ascii"),t.writeU8(this.initialized?1:0),t.writeU8(this.watchOnly?1:0),t.writeU32(this.accountDepth),t.writeBytes(this.token),t.writeU32(this.tokenDepth),t.writeVarBytes(this.master.toRaw()),t.render()}fromRaw(t){t=new d(t);var e=n.fromMagic(t.readU32());return this.wid=t.readU32(),this.id=t.readVarString("ascii"),this.initialized=1===t.readU8(),this.watchOnly=1===t.readU8(),this.accountDepth=t.readU32(),this.token=t.readBytes(32),this.tokenDepth=t.readU32(),this.master.fromRaw(t.readVarBytes()),r(e===this.db.network,"Wallet network mismatch."),this}static fromRaw(t,e){return new rt(t).fromRaw(e)}static isWallet(t){return t instanceof rt}async issueCreate(t,e,i){var r=new Y(t),s=((s=(r.source.subjectName||(r.source.subjectName=r.erid),T.fromPrivate(Buffer.from(t.key,"hex"),!0,this.network))).witness=!0,r.sign(s,!0,this.network),r.toOptions(!0));return i?this.send({outputs:[{address:t.address,value:1e4}],comment:s},e):await this.send({outputs:[{address:t.address,value:1e4}],comment:s},e),s}async caAbolish(t,e,i){var r=T.fromPrivate(Buffer.from(t.key,"hex"),!0,this.network),s=(r.witness=!0,await this.db.$parent.chain.db.erList.getEr(t.erid));if(!s)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid erid.");if(s.source.cid!=t.cid)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid cid.");if(s.source.uid!=t.uid)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid uid.");var n=s.signature;if(s.sign(r,!0,this.network),s.witness!=t.witness||s.signature!=n)throw new D(L.errors.TYPE_ERROR,"ca.abolish: You have no permission to abolish this witness.");return(s=new J(t)).sign(r),n=s.toOptions(!0),i?this.send({outputs:[{address:t.address,value:1e4}],comment:n},e):await this.send({outputs:[{address:t.address,value:1e4}],comment:n},e),n}async enchanceCp(t,e){var i=((t=new Z(t)).oper="enchanceCp",await this.ensureCp(t.to)),r=await this.ensureCp(t.from);if(!(r=await this.getKey(r.pubAddress)))throw new D(L.errors.TYPE_ERROR,"Invalid cid, Not along to this wallet.");return t.sign(r),r=t.toOptions(!0),[await this.send({outputs:[{address:i.pubAddress,value:1e4}],comment:r},e),r]}async ensureCp(t,e=!1){if(await this.db.flushCP([t]),(t=this.db.cpList.getItem(t))||e)return t;throw new D(L.errors.TYPE_ERROR,"Invalid cid, cannot find cp.")}}t.exports=rt},function(t,e,i){"use strict";
|
|
305
|
+
*/const r=i(0);var s=i(16);const n=i(15),a=i(1),o=i(3),c=i(34),h=i(199),u=i(119).sortWithSeq,l=i(7),p=i(94),d=i(2),f=i(4),m=i(70),g=i(339);i(222);const y=i(110),v=i(73),w=i(12),b=i(60),k=i(17),x=i(223),S=i(124),E=i(26),_=i(159),R=i(340),A=i(65),C=i(28),I=i(27),O=i(6),P=i(311),T=i(39),j=S.Mnemonic,{opcodes:B,hashType:N}=i(21),F=i(167),D=i(77),L=i(78),M=i(143),H=i(46),z=i(19),U=i(43),q=i(53),{NotifyMsg:V,OrderData:K,ContractStatus:W,ContractType:G}=i(5),$=i(37).VerifyError,X=i(85).stockItem,Y=i(157).ErItem,J=i(158).ErAbolishItem,Z=i(237).EnchancementItem,Q=i(31),tt=i(69),et=i(59),it=i(82);class rt extends s{constructor(t,e){super(),r(t,"DB required."),this.db=t,this.network=t.network,this.logger=t.logger,this.readLock=new h,this.writeLock=new c,this.sendLock=new c,this.indexCache=new A(1e4),this.accountCache=new A(1e4),this.pathCache=new A(1e5),this.current=null,this.wid=0,this.id=null,this.initialized=!1,this.watchOnly=!1,this.accountDepth=0,this.token=o.ZERO_HASH,this.tokenDepth=0,this.master=new R,this.txdb=new g(this),this.account=null,e&&this.fromOptions(e)}fromOptions(t){let e,i,s=t.master;return s?("string"==typeof s&&(s=S.PrivateKey.fromBase58(s,this.network)),r(S.isPrivate(s),"Must create wallet with hd private key.")):(i=new j(t.mnemonic),s=S.fromMnemonic(i,this.network)),r(s.network===this.network,"Network mismatch for master key."),this.master.fromKey(s,i),null!=t.wid&&(r(a.isU32(t.wid)),this.wid=t.wid),t.id&&(r(v.isName(t.id),"Bad wallet ID."),e=t.id),null!=t.initialized&&(r("boolean"==typeof t.initialized),this.initialized=t.initialized),null!=t.watchOnly&&(r("boolean"==typeof t.watchOnly),this.watchOnly=t.watchOnly),null!=t.accountDepth&&(r(a.isU32(t.accountDepth)),this.accountDepth=t.accountDepth),t.token&&(r(Buffer.isBuffer(t.token)),r(32===t.token.length),this.token=t.token),e=e||this.getID(),this.id=e,this}static fromOptions(t,e){return new rt(t).fromOptions(e)}async init(t){var e=t.passphrase;r(!this.initialized),this.initialized=!0,e&&await this.master.encrypt(e),t=await this._createAccount(t,e);r(t),this.account=t,this.logger.info("Wallet initialized (%s).",this.id),await this.txdb.open()}async open(){r(this.initialized);var t=await this.getAccount(0);if(!t)throw new Error("Default account not found.");this.account=t,this.logger.info("Wallet opened (%s).",this.id),await this.txdb.open()}async ensureNotifyKey(){this.notifyKey||(await this.ensureAccount({name:"alliance",witness:!0}),this.notifyKey=await this.createReceive("alliance",1,this.master),this.notifyAddress=this.notifyKey.getAddress("string"))}async createAllianceInfo(t,e,i){var r={alliancename:t,nodeid:e};return t?(r.alliancePrivateKey=l.hash256(Buffer.concat([Buffer.from(t),this.master.key.privateKey])),i?(r.prv=Buffer.alloc(0),r.pub=Buffer.from(i,"hex"),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(this.network.type),r.mnemonic=new j):(i=l.hash256(Buffer.concat([Buffer.from(t+"-"+e),this.master.key.privateKey])),r.mnemonic=new j({entropy:i,language:this.master.mnemonic.language,passphrase:this.master.mnemonic.passphrase}),r.prv=l.hash256(Buffer.from(r.mnemonic.toSeed().toString("hex"))),r.pub=C.publicKeyCreate(r.prv,!0),t=R.fromKey(S.fromMnemonic(r.mnemonic),this.network.type).key.deriveAccount(44,0).derive(9).derive(1),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(t.publicKey),this.network.type).toString(this.network.type))):(r.mnemonic=j.fromOptions(this.master.mnemonic),r.prv=l.hash256(Buffer.from(r.mnemonic.toSeed().toString("hex"))),r.pub=C.publicKeyCreate(r.prv,!0),r.awardAddress=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(this.network.type)),r.address=w.fromWitnessPubkeyhash(l.hash160(r.pub),this.network.type).toString(),r}async destroy(){var t=await this.writeLock.lock(),e=await this.sendLock.lock();try{this.db.unregister(this),await this.master.destroy(),this.readLock.destroy(),this.writeLock.destroy(),this.sendLock.destroy()}finally{e(),t()}}async addSharedKey(t,e){var i=await this.writeLock.lock();try{return await this._addSharedKey(t,e)}finally{i()}}async _addSharedKey(t,e){if(e||(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");let i;this.start();try{i=await t.addSharedKey(e)}catch(t){throw this.drop(),t}return await this.commit(),i}async removeSharedKey(t,e){var i=await this.writeLock.lock();try{return await this._removeSharedKey(t,e)}finally{i()}}async _removeSharedKey(t,e){if(e||(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");let i;this.start();try{i=await t.removeSharedKey(e)}catch(t){throw this.drop(),t}return await this.commit(),i}async setPassphrase(t,e){t&&await this.decrypt(t),e&&await this.encrypt(e)}async encrypt(t){var e=await this.writeLock.lock();try{return await this._encrypt(t)}finally{e()}}async _encrypt(t){t=await this.master.encrypt(t,!0),this.start();try{await this.db.encryptKeys(this,t)}catch(e){throw p(t),this.drop(),e}p(t),this.save(),await this.commit()}async decrypt(t){var e=await this.writeLock.lock();try{return await this._decrypt(t)}finally{e()}}async _decrypt(t){t=await this.master.decrypt(t,!0),this.start();try{await this.db.decryptKeys(this,t)}catch(e){throw p(t),this.drop(),e}p(t),this.save(),await this.commit()}async rename(t){var e=await this.writeLock.lock();try{return await this.db.rename(this,t)}finally{e()}}async writeBalanceLog(t){var e=await this.writeLock.lock();try{return await this.db.writeBalanceLog(this,t)}finally{e()}}async renameAccount(t,e){var i=await this.writeLock.lock();try{return await this._renameAccount(t,e)}finally{i()}}async _renameAccount(t,e){if(!v.isName(e))throw new Error("Bad account name.");var i=await this.getAccount(t);if(!i)throw new Error("Account not found.");if(0===i.accountIndex)throw new Error("Cannot rename default account.");if(await this.hasAccount(e))throw new Error("Account name not available.");t=i.name,this.start(),this.db.renameAccount(i,e),await this.commit(),this.indexCache.remove(t),t=this.pathCache.values();for(const r of t)r.account===i.accountIndex&&(r.name=e)}async lock(){var t=await this.writeLock.lock(),e=await this.sendLock.lock();try{await this.master.lock()}finally{e(),t()}}unlock(t,e){return this.master.unlock(t,e)}getID(){r(this.master.key,"Cannot derive id.");var t,e=this.master.key.derive(44);(t=new f(37)).writeBytes(e.publicKey),t.writeU32(this.network.magic),e=l.hash160(t.render());return(t=new f(27)).writeU8(3),t.writeU8(190),t.writeU8(4),t.writeBytes(e),t.writeChecksum(),m.encode(t.render())}async createAccount(t,e){var i=await this.writeLock.lock();try{return await this._createAccount(t,e)}finally{i()}}async _createAccount(t,e){let i,s,n=t.name,o=(n=n||this.accountDepth.toString(10),0);if(0!=this.accountDepth&&(o=a.hashInt(n)),await this.hasAccountIndex(o))throw new Error("Account Index Conflict.");if(await this.hasAccount(n))throw new Error("Account already exists.");if(await this.unlock(e),this.watchOnly&&t.accountKey){if("string"==typeof(i=t.accountKey)&&(i=S.PublicKey.fromBase58(i,this.network)),!S.isPublic(i))throw new Error("Must add HD public keys to watch only wallet.");r(i.network===this.network,"Network mismatch for watch only key.")}else r(this.master.key),i=(i=this.master.key.deriveAccount(44,o)).toPublic();e={wid:this.wid,id:this.id,name:0===this.accountDepth?"default":n,witness:t.witness,watchOnly:this.watchOnly,accountKey:i,accountIndex:o,type:t.type,m:t.m,n:t.n,keys:t.keys},this.start();try{(s=_.fromOptions(this.db,e)).wallet=this,await s.init()}catch(t){throw this.drop(),t}return this.logger.info("Created account %s/%s/%d.",s.id,s.name,s.accountIndex),this.accountDepth++,this.save(),await this.commit(),s}async ensureAccount(t,e){var i=t.name;return(i=await this.getAccount(i))||this.createAccount(t,e)}getAccounts(){return this.db.getAccounts(this.wid)}getAddressHashes(t){return null!=t?this.getAccountHashes(t):this.db.getWalletHashes(this.wid)}async getAccountHashes(t){return t=await this.ensureIndex(t,!0),this.db.getAccountHashes(this.wid,t)}async getAccount(t){if(this.account&&(null==t||"default"===t||"number"==typeof t&&0===t||"string"==typeof t&&0===t.length))return this.account;if(-1===(t=await this.getAccountIndex(t)))return null;var e=await this.readLock.lock(t);try{return await this._getAccount(t)}finally{e()}}async _getAccount(t){var e=this.accountCache.get(t);return e||((e=await this.db.getAccount(this.wid,t))?(e.wallet=this,e.wid=this.wid,e.id=this.id,e.watchOnly=this.watchOnly,await e.open(),this.accountCache.set(t,e),e):null)}async getAccountIndex(t){var e;return null==t?-1:"number"==typeof t?t:null!=(e=this.indexCache.get(t))?e:-1===(e=await this.db.getAccountIndex(this.wid,t))?-1:(this.indexCache.set(t,e),e)}async getAccountName(t){var e;return"string"==typeof t?t:(e=this.accountCache.get(t))?e.name:this.db.getAccountName(this.wid,t)}async hasAccount(t){return-1!==(t=await this.getAccountIndex(t))&&(!!this.accountCache.has(t)||this.db.hasAccount(this.wid,t))}async hasAccountIndex(t){return!!this.accountCache.has(t)||this.db.hasAccount(this.wid,t)}createReceive(t,e=0,i=null){return this.createKey(t,0,e,i)}createChange(t){return this.createKey(t,1)}createNested(t){return this.createKey(t,2)}async createKey(t,e,i=0,r=null){var s=await this.writeLock.lock();try{return await this._createKey(t,e,i,r)}finally{s()}}async _createKey(t,e,i=0,r=null){if(null==e&&(e=t,t=null),!(t=await this.getAccount(t=t||0)))throw new Error("Account not found.");let s;this.start();try{s=await t.createKey(e,i,r)}catch(t){throw this.drop(),t}return await this.commit(),s}async deriveKey(t,e,i,r=null){let s=null;var n=await this.writeLock.lock();try{this.start(),s=await this._deriveKey(t,e,i,r),await this.commit()}catch(t){throw this.drop(),t}finally{n()}return s}async _deriveKey(t,e,i=0,r=null){if(null==e&&(e=t,t=null),t=t||0,t=parseInt(t),t=await this.getAccount(t))return e=await t.deriveKey(e,i,r),await t.saveKey(e),e;throw new Error("Account not found.")}save(){return this.db.save(this)}async saveAccount(t){var e=await this.writeLock.lock();try{this.start(),t._save(),await this.commit(),0==t.accountIndex&&(this.account=t)}finally{e()}}start(){return this.db.start(this)}drop(){return this.db.drop(this)}clear(){return this.db.clear(this)}commit(){return this.db.commit(this)}async hasAddress(t){return t=w.getHash(t,"hex"),null!=await this.getPath(t)}async getPath(t){return(t=await this.readPath(t))?(t.name=await this.getAccountName(t.account),r(t.name),this.pathCache.set(t.hash,t),t):null}async readPath(t){t=w.getHash(t,"hex");var e=this.pathCache.get(t);return e||((e=await this.db.getPath(this.wid,t))?(e.id=this.id,e):null)}async hasPath(t){return t=w.getHash(t,"hex"),!!this.pathCache.has(t)||this.db.hasPath(this.wid,t)}async getPaths(t){if(null!=t)return this.getAccountPaths(t);var e=[];for(const t of await this.db.getWalletPaths(this.wid))t.id=this.id,t.name=await this.getAccountName(t.account),r(t.name),this.pathCache.set(t.hash,t),e.push(t);return e}async getAccountPaths(t){var e=await this.ensureIndex(t,!0),i=await this.getAccountHashes(e),s=await this.getAccountName(t),n=(r(s),[]);for(const t of i){var a=await this.readPath(t);r(a),r(a.account===e),a.name=s,this.pathCache.set(a.hash,a),n.push(a)}return n}async importKey(t,e,i){var r=await this.writeLock.lock();try{return await this._importKey(t,e,i)}finally{r()}}async _importKey(t,e,i){if(t&&"object"==typeof t&&(i=e,e=t,t=null),null==t&&(t=0),r(e.network===this.network,"Network mismatch for key."),this.watchOnly){if(e.privateKey)throw new Error("Cannot import privkey into watch-only wallet.")}else if(!e.privateKey)throw new Error("Cannot import pubkey into non watch-only wallet.");var s=e.getHash("hex");if(await this.getPath(s))throw new Error("Key already exists.");if(!(s=await this.getAccount(t)))throw new Error("Account not found.");if(s.type!==_.types.PUBKEYHASH)throw new Error("Cannot import into non-pkh account.");await this.unlock(i),t=x.fromRing(s,e).toPath(),this.master.encrypted&&(t.data=this.master.encipher(t.data,t.hash),r(t.data),t.encrypted=!0),this.start();try{await s.savePath(t)}catch(t){throw this.drop(),t}await this.commit()}async importAddress(t,e){var i=await this.writeLock.lock();try{return await this._importAddress(t,e)}finally{i()}}async _importAddress(t,e){if(e||(e=t,t=null),null==t&&(t=0),e.network!==this.network)throw new Error("Network mismatch for address.");if(!this.watchOnly)throw new Error("Cannot import address into non watch-only wallet.");if(await this.getPath(e))throw new Error("Address already exists.");if(!(t=await this.getAccount(t)))throw new Error("Account not found.");if(t.type!==_.types.PUBKEYHASH)throw new Error("Cannot import into non-pkh account.");e=y.fromAddress(t,e),this.start();try{await t.savePath(e)}catch(t){throw this.drop(),t}await this.commit()}async fund(t,e){var i=await this.writeLock.lock();try{return await this._fund(t,e)}finally{i()}}async _fund(t,e){if(e=e||{},!this.initialized)throw new Error("Wallet is not initialized.");if(this.watchOnly)throw new Error("Cannot fund from watch-only wallet.");let i;if(null!=e.account){if(!(i=await this.getAccount(e.account)))throw new Error("Account not found.")}else i=this.account;if(!i.initialized)throw new Error("Account is not initialized.");let s,n=e.rate;return null==n&&(n=await this.db.estimateFee(e.blocks)),s=e.smart?await this.getSmartCoins(i.name):(s=await this.getCoins(i.name),this.txdb.filterConserved(s)),await t.fund(s,{allowPreInput:e.allowPreInput,noChange:e.noChange,selection:e.selection,round:e.round,depth:e.depth,hardFee:e.hardFee,subtractFee:e.subtractFee,subtractIndex:e.subtractIndex,changeAddress:i.change.getAddress(),height:this.db.curHeight,rate:n,maxFee:e.maxFee,estimate:t=>this.estimateSize(t),network:this.network}),!e.allowInfiniteFee&&e.noChange&&r(t.getFee()<=P.MAX_FEE,"TX exceeds MAX_FEE."),s}async getAccountByAddress(t){return t=w.getHash(t,"hex"),(t=await this.getPath(t))?this.getAccount(t.account):null}async estimateSize(t){var e=O.WITNESS_SCALE_FACTOR,i=w.fromScript(t);if(!i)return-1;var r=await this.getAccountByAddress(i);if(!r)return-1;let s=0;if(t.isScripthash()&&r.witness)switch(r.type){case _.types.PUBKEYHASH:s=4*(s+23);break;case _.types.MULTISIG:s=4*(s+35)}switch(r.type){case _.types.PUBKEYHASH:s=s+74+34;break;case _.types.MULTISIG:s=(s=(s=(s=(s+=1)+74*r.m)+3+1)+34*r.n)+1+1}return r.witness?s=((s+=1)+e-1)/e|0:s+=o.sizeVarint(s),s}async createTX(t){var e=t.outputs,i=new b;r(Array.isArray(e),"Outputs must be an array."),r(0<e.length,"No outputs available."),t.comment&&("object"==typeof t.comment&&(t.comment=JSON.stringify(t.comment)),i.outputs.push(E.fromScript(k.createScript(Buffer.from(t.comment),k.types.NULLDATA),0)));for(const t of e){var s=new E(t),n=s.getAddress();if(s.isDust())throw new Error("Output is dust.");if(0<s.value){if(!n)throw new Error("Cannot send to unknown address.");if(n.isNull())throw new Error("Cannot send to null address.")}i.outputs.push(s)}let a=null;if(t.inputs)for(const e of t.inputs){var o=await this.getTX(e.hash);o&&(o=q.fromTX(o.tx,e.index,-1,0))&&(a=o.getAddress(),t.allowPreInput=!0,i.addCoin(o))}else await this.fund(i,t);if(a&&((e=new E).value=i.getFee()-P.MIN_FEE,e.script.fromAddress(a),i.outputs.push(e),i.changeIndex=i.outputs.length-1),!1!==t.sort&&i.sortMembers(),null!=t.locktime&&i.setLocktime(t.locktime),r(i.isSane(),"TX failed sanity check."),r(i.verifyInputs(this.db.curHeight+1),"TX failed context check."),0===await this.template(i))throw new Error("Templating failed.");return i}async send(t,e){var i=await this.sendLock.lock();try{return await this._send(t,e)}finally{i()}}async _send(t,e){return e&&(t.account=e),e=await this.createTX(t,!0),await this.sign(e),this.sendMTX(e,{sendafter:t.sendafter})}async sendMTX(t,e={}){if(!t.isSigned())throw new Error("TX could not be fully signed.");var i=t.toTX();if(i.getSigopsCost(t.view)>I.MAX_TX_SIGOPS_COST)throw new Error("TX exceeds policy sigops.");if(i.getWeight()>I.MAX_TX_WEIGHT)throw new Error("TX exceeds policy weight.");return e.sendafter||(this.logger.debug("Sending wallet tx (%s): %s",this.id,i.txid()),await this.db.addTX(i),await this.db.send(i)),i}async resend(){var t=await this.getPending(),e=(0<t.length&&this.logger.info("Rebroadcasting %d transactions.",t.length),[]);for(const i of t)e.push(i.tx);for(const t of await u(e,this.db))await this.db.send(t);return e}async deriveInputs(t){r(t.mutable);var e=[];for(const r of await this.getInputPaths(t)){var i=await this.getAccount(r.account);i&&(i=i.derivePath(r,this.master))&&e.push(i)}return e}async getKey(t){var e;t=w.getHash(t,"hex",this.network.type);return(t=await this.getPath(t))&&(e=await this.getAccount(t.account))?e.derivePath(t,this.master):null}async exportToFile(t){if(!et.unsupported){var e=await this.db.getTip(),i=a.date();let o=1,c="",h=[a.fmt("# Wallet Dump created by %s %s",it.protocol,it.version),a.fmt("# * Created on %s",i),a.fmt("# * Best block at time of backup was %d (%s).",e.height,a.revHex(e.hash)),a.fmt("# * File: %s",t.file),""];e=a.fmt("W %s wid= %s",this.toRaw().toString("base64"),this.wid),h.push(e),e=await this.getAccounts();for(const t of e){var r=await this.getAccount(t);r=a.fmt("C %s name= %s index= %d",r.toRaw().toString("base64"),r.name,r.accountIndex);h.push(r)}for(const e of await this.getAddressHashes()){var s,n=await this.getPrivateKey(e);n&&(s=n.getAddress("string"),n=a.fmt("A %s %s label= account= %s branch= %s index= %s addr= %s",n.toSecret(),i,n.account,n.branch,n.index,s),h.push(n),1e5<h.length)&&(c=h.join("\n"),await et.writeFile(`${t.file}-${o++}.txt`,c,"utf8"),h=[])}h.push(""),h.push("# End of dump"),h.push(""),c=h.join("\n"),await et.writeFile(`${t.file}-${o++}.txt`,c,"utf8")}}async getPrivateKey(t,e){if(t=w.getHash(t,"hex"),!(t=await this.getPath(t)))return null;var i=await this.getAccount(t.account);return i?(await this.unlock(e),(e=i.derivePath(t,this.master)).privateKey?e:null):null}async getInputPaths(t){if(r(t.mutable),!t.hasCoins())throw new Error("Not all coins available.");var e=[];for(const r of t.getInputHashes("hex")){var i=await this.getPath(r);i&&e.push(i)}return e}async getOutputPaths(t){var e=[];for(const r of t.getOutputHashes("hex")){var i=await this.getPath(r);i&&e.push(i)}return e}async setLookahead(t,e){var i=await this.writeLock.lock();try{return this._setLookahead(t,e)}finally{i()}}async _setLookahead(t,e){if(null==e&&(e=t,t=null),!(t=await this.getAccount(t=null==t?0:t)))throw new Error("Account not found.");this.start();try{await t.setLookahead(e)}catch(t){throw this.drop(),t}await this.commit()}async syncOutputDepth(t){var e=new Map;for(const r of t.outputs){var i=r.path;i&&-1!==i.index&&(e.has(i.account)||e.set(i.account,[]),e.get(i.account).push(i))}var s,n,a=[];for([s,n]of e){let t=-1,e=-1,i=-1;for(const r of n)switch(r.branch){case 0:r.index>t&&(t=r.index);break;case 1:r.index>e&&(e=r.index);break;case 2:r.index>i&&(i=r.index)}t+=2,e+=2,i+=2;var o=await this.getAccount(s);(o=(r(o),await o.syncDepth(t,e,i)))&&a.push(o)}return a}async getRedeem(t){"string"==typeof t&&(t=Buffer.from(t,"hex"));var e=await this.getKey(t.toString("hex"));return e?e.getRedeem(t):null}async template(t){var e=await this.deriveInputs(t);return t.sign(e)}async getOrderList(t,e){let i=[];var r=new Q;(await this.getHistory(e||"default")).reduce((t,e)=>{var{tx:e,hash:r,height:s}=e;if(e.outputs[0].getReturnType(B.OP_RETURN))try{var n,a=JSON.parse(e.outputs[0].script.code[1].toString());a&&a.oper==G.payOrder&&((n=K.fromJson(a)).hash=r,n.height=s,t.set(""+n.cid+n.sn,n),i.push(n.cid))}catch(t){}return t},r),e=r.query(t);return await this.db.flushCP(i),e.list.map(t=>{t.cp=this.db.cpList.getItem(t.cid)}),e}async propCreate(t,e){var i,s=new b;for(i of t){var n=await this.ensureCp(i.cid,!0);!n||i.cid==this.network.genesisId||(i.gold=(0|i.gold)>>>0,i.gold<O.MINPROPVALUE)||(i.pid||(i.pid=M()),s.propCreate(n.current.address,i),i.index=s.outputs.length-1)}if(0<s.outputs.length){e?await this.fund(s,{account:e}):await this.fund(s),await this.sign(s);var a,o=s.commit();for(a of(await this.db.addTX(o[0]),await this.db.send(o[0]),r(o[0].verify(o[1],k.flags.STANDARD_VERIFY_FLAGS)),t))a.hash=o[0].hash("hex"),a.txid=o[0].txid();return o}return[]}async stockAddress(t,e){return await this.ensureAccount({name:e,witness:!0}),(await this.createReceive(e,a.hashInt(t),this.master)).getAddress()}async stockOffer(t,e,i,s){r(!!t),r(!!e),r(!!i),e=(0|e)>>>0,i=(0|i)>>>0;var n=await this.ensureCp(t),a=await this.getKey(n.current.address);if(r(!!a),s&&s!==a.name)throw new D(L.errors.TYPE_ERROR,"illegal account");return a=a.signData({cid:t,type:X.RecordType.Offer,sum:e,price:i}),(t=new b).outputs.push(E.fromScript(a.data.addr,.05*e*i)),e=new V(G.stock,M(),this.db.curHeight,a),i=E.fromScript(k.createScript(e.toRaw(),k.types.NULLDATA),0),t.outputs.push(i),s?await this.fund(t,{account:s}):await this.fund(t),t.outputs.shift(),await this.sign(t),a=t.commit(),r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),e.hash=a[0].hash("hex"),e.height=-1,e.cp=n,e}async stockPurchase(t,e,i){if(r(!!t),r(!!e),(e=(0|e)>>>0)<O.STOCK_TRADE_SINGLE||e>O.STOCK_MAX_TRADE_SINGLE)throw new D(L.errors.TYPE_ERROR,"Invalid Stock Amount.");var s=await this.ensureCp(t),n=(t={type:X.RecordType.Purchase,cid:t,uid:i,seq:0,to:s.current.address,sum:e},t=(await this.addStockAccountSeq(t),await this.tokenCreate(t,i)),new b),a=(t=new V(G.stock,M(),this.db.curHeight,t),E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0));n.outputs.push(a),n.outputs.push(E.fromScript(s.current.address,e*s.stock.price)),i?await this.fund(n,{account:i}):await this.fund(n),await this.sign(n),a=n.commit();return r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),t.hash=a[0].hash("hex"),t.height=-1,t.cp=s,t}async stockPurchaseTo(t,e,i,s){if(r(!!t),r(!!e),(e=(0|e)>>>0)<O.STOCK_TRADE_SINGLE||e>O.STOCK_MAX_TRADE_SINGLE)throw new D(L.errors.TYPE_ERROR,"Invalid Stock Amount.");var n=await this.ensureCp(t),a=(t={type:X.RecordType.Purchase,cid:t,uid:i,seq:0,to:n.current.address,sum:e},t=(await this.addStockAccountSeq(t),await this.tokenCreate(t,i)),i=new b,t=new V(G.stock,M(),this.db.curHeight,t),E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0));i.outputs.push(a),i.outputs.push(E.fromScript(n.current.address,e*n.stock.price)),s?await this.fund(i,{account:s}):await this.fund(i),await this.sign(i),a=i.commit();return r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(a[0]),await this.db.send(a[0]),t.hash=a[0].hash("hex"),t.height=-1,t.cp=n,t}async stockSend(t,e,i,s,n){r(!!t),r(!!e),e=(0|e)>>>0;var a=await this.ensureCp(t,!0);return a?(t={type:X.RecordType.Send,cid:t,uid:s,seq:0,sum:e,to:i},await this.addStockAccountSeq(t),e=await this.tokenCreate(t,s,n),i=new b,t=new V(G.stock,M(),this.db.curHeight,e),n=E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0),i.outputs.push(n),s?await this.fund(i,{account:s}):await this.fund(i),await this.sign(i),e=i.commit(),r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(e[0]),await this.db.send(e[0]),t.hash=e[0].hash("hex"),t.height=-1,t.cp=a,t):null}async stockBid(t,e,i,s,n){r(!!t),r(!!e),r(!!i),e=(0|e)>>>0,i=(0|i)>>>0;var a=await this.ensureCp(t,!0);return a?(t={type:X.RecordType.Bid,cid:t,uid:s,seq:0,sum:e,price:i},await this.addStockAccountSeq(t),t=await this.tokenCreate(t,s,n),(n=new b).outputs.push(E.fromScript(t.data.addr,.05*e*i)),e=new V(G.stock,M(),this.db.curHeight,t),i=E.fromScript(k.createScript(e.toRaw(),k.types.NULLDATA),0),n.outputs.push(i),s?await this.fund(n,{account:s}):await this.fund(n),n.outputs.shift(),await this.sign(n),t=n.commit(),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(t[0]),await this.db.send(t[0]),e.hash=t[0].hash("hex"),e.height=-1,e.cp=a,e):null}async stockAuction(t,e,i,s,n,a){r(!!t),r(!!e),r(!!i);var o=await this.ensureCp(t,!0);if(!o)return null;i=(0|i)>>>0;t={type:X.RecordType.Auction,cid:t,to:e,uid:n,seq:0,sum:i,price:s},await this.addStockAccountSeq(t),t=await this.tokenCreate(t,n,a),a=new b,t=new V(G.stock,M(),this.db.curHeight,t);var c=E.fromScript(k.createScript(t.toRaw(),k.types.NULLDATA),0);a.outputs.push(c),a.outputs.push(E.fromScript(e,i*s)),n?await this.fund(a,{account:n}):await this.fund(a),await this.sign(a),c=a.commit();return r(c[0].verify(c[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.verifyClsTx(c[0]),await this.db.send(c[0]),t.hash=c[0].hash("hex"),t.height=-1,t.cp=o,t}async sendSecret(t,e,i){let r=this.db.$contacts.get(t);if(!r||!r.sender){var s=(await this.createReceive(i)).getAddress("string");if(t==s)throw new D(L.errors.TYPE_ERROR,"Forbid Sending to Self Address.");r=await this.db.ensureContact({contact:t,messenger:s,wallet:this,account:i})}if(r)return r.send(e);throw new D(L.errors.TYPE_ERROR,"Invalid Address.")}async commNotify(t){r(!!t),r(!!t.dst),r(!!t.content);var e=new b,i=t.src||this.getReceive().toString(),s=(i=new V(G.notify,M(),this.db.curHeight,{src:i,content:t.content}),E.fromScript(k.createScript(i.toRaw(),k.types.NULLDATA),0));e.outputs.push(s),s={address:t.dst,locktime:O.BLOCK_DAY,locktype:"csb",value:.1*O.COIN},e.outputs.push(new E(s)),t.account?await this.fund(e,{account:t.account,noChange:!0,allowInfiniteFee:!0}):await this.fund(e,{noChange:!0,allowInfiniteFee:!0}),await this.sign(e),s=e.commit();return r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(s[0]),this.logger.debug("Sending tx on wallet(%s): %s",this.id,s[0].txid()),await this.db.send(s[0]),i.hash=s[0].hash("hex"),i.height=-1,i}async payOrder(t,e,i,s,n){r(!!t),r(!!e),r(!!i),r(!!s);var o=(await this.tokenCreate({cid:t,uid:e},n)).data.addr,c=(i=a.sprintf("%0-36s",i),await this.getOrderList([["cid",t],["sn",i]],n));if(0<c.list.length)return c.list[0];if((s=(0|s)>>>0)<O.MINPROPVALUE)return null;if(!(c=await this.ensureCp(t,!0)))return null;t=new K(t,e,i,s,o,"");var h=new b;e=E.fromScript(k.createScript(Buffer.from(JSON.stringify(t)),k.types.NULLDATA),0);for(h.outputs.push(e),h.outputs.push(E.fromScript(c.current.address,s)),n?await this.fund(h,{account:n}):await this.fund(h);2<h.outputs.length;)h.outputs.pop();return await this.sign(h,null,N.ZERO|N.ANYONECANPAY),i=h.commit(),r(i[0].verify(i[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(i[0]),await this.db.send(i[0]),t.hash=i[0].hash("hex"),t.height=-1,t.cp=c,t}async cpRegister(t,e,i,s){if(r(!!e&&"object"==typeof e),!await this.db.client.execute("canExecute",[{confirm:!1,cid:e.cid,name:e.name,oper:G.cpRegister}]))throw new D(L.errors.TYPE_ERROR,"Invalid CP Register Info.");const n=new b;t||(o=await this.createReceive(i),t=o.getAddress());var o=await this.getKey(t);if(!o)throw new D(L.errors.TYPE_ERROR,"Invalid CP Register Address, Not along to this wallet.");e.pubAddress=t.toString(),e.pubKey=o.getPublicKey("hex"),e.signMethod="secp256k1",o=await this.createAllianceInfo(),e.register=o.pub.toString("hex"),n.cpRegister(t,O.registerFee,e);for(let i=0;i<10;i++){var c=""+e.cid+this.network.stockFix+a.sprintf("%02d",i);c={oper:G.propCreate,pid:c,oid:e.cid,cid:e.cid,gold:O.MINPROPVALUE};n.propCreate(t,c)}if(o=async()=>{i?await this.fund(n,{account:i}):await this.fund(n),await this.sign(n);var s=n.commit();return r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.addTX(s[0]),await this.db.send(s[0]),e.txid=s[0].txid(),e.addr=t.toString(),s},!s)return o();o()}getSCAddress(t){return t=tt.fromMnemonic(j.fromOptions(O.SmartContractMnemonic),this.network).deriveAccount(44,t).derive(9).derive(1),w.fromWitnessPubkeyhash(l.hash160(t.publicKey),this.network)}async cpChange(t,e){var i=await this.ensureCp(t.cid);if(i.cid==this.network.genesisId||"ATHENA"==i.name)throw new D(L.errors.TYPE_ERROR,"Invalid cp name.");var s=await this.getTX(i.current.hash);if(!s)throw new D(L.errors.TYPE_ERROR,"Do not have permission to change this info.");if(s=s.tx,!await this.belongToAccount(e,s.outputs[0].getAddress()))throw new D(L.errors.TYPE_ERROR,"Invalid account info.");if(t.newName){if(!await this.db.client.execute("canExecute",[{confirm:!1,cid:i.cid,name:t.newName,oper:G.cpChange}]))throw new D(L.errors.TYPE_ERROR,"Invalid CP Change Info.")}else t.newName=i.name;return t.addr||(t.addr=w.fromString(i.current.address)),i=b.cpChange(s,t),e?await this.fund(i,{allowPreInput:!0,account:e}):await this.fund(i,{allowPreInput:!0}),await this.sign(i),s=i.commit(),await this.db.send(s[0]),r(s[0].verify(s[1],k.flags.STANDARD_VERIFY_FLAGS)),t.txid=s[0].txid(),s}async propExchangeList(t,e,i=!1){var s,n,a,o=new b,c=[];for([s,n,a]of t){var h,u=null;if(u=await this.getTX(s.hash)){if(u=u.tx,h=s.index,u&&u.outputs&&!(u.outputs.length<=h)){if(i){if(!await this.hasAddress(u.outputs[h].getAddress())){this.logger.error("not owned prop:",s.hash,s.index);continue}}else if(!await this.belongToAccount(e,u.outputs[h].getAddress())){this.logger.error("not owned prop:",s.hash,s.index);continue}var l=u.outputs[h].getReturnData();l&&(o.propExchange(u,h,n),l.index=o.outputs.length-1,l.addr=n.toString(),c.push(l))}}else this.logger.error("tx not find:",s.hash,a)}return e?await this.fund(o,{allowPreInput:!0,account:e}):await this.fund(o,{allowPreInput:!0}),await this.sign(o),t=o.commit(),await this.db.addTX(t[0]),await this.db.send(t[0]),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),t.push(c),t}async propDonate(t,e){var i=t.index;if(!(t=await this.getTX(t.hash))||!t.tx||!t.tx.outputs||t.tx.outputs.length<=i)throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(!await this.belongToAccount(e,t.tx.outputs[i].getAddress()))throw new D(L.errors.TYPE_ERROR,"Props that do not belong to you.");if(!(e=t.tx.outputs[i].getReturnData()))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(e.cid&&e.cid==this.network.genesisId)throw new $(t.tx,"invalid","Special props that can not to donate",100);var r=new b;return(t=(r.addInputFromTx(t.tx,i),r.addOutput(k.createScript(Buffer.from(JSON.stringify({value:t.tx.outputs[i].value,cid:e.cid,pid:e.pid,oid:e.oid,gaddr:this.getAddress().toString(this.network)})),k.types.NULLDATA),0),await this.sign(r,null,N.NONE|N.ANYONECANPAY),r.commit())).push(e),t}async propReceive(t,e){var i=(t=b.fromTX(t,1)).inputs[0].prevout,r=t.outputs[0].getReturnData();t.view.addOutput({hash:t.inputs[0].prevout.hash,index:t.inputs[0].prevout.index},new E({value:r.value})),t.outputs.pop();let s=this.getAddress().toString(this.network);e&&(n={cid:r.cid,uid:e},s=(n=await this.tokenCreate(n,e)).data.addr),t.outputs.push(E.fromScript(s,r.value,{oper:G.propExchange,pid:r.pid,cid:r.cid,oid:r.oid,prev:{hash:i.hash,index:i.index}})),e?await this.fund(t,{allowPreInput:!0,account:e}):await this.fund(t,{allowPreInput:!0}),await this.sign(t,null,N.ALL,[0]);var n=t.commit();return await this.db.send(n[0]),r.simAddr=s,[n[0],null,r]}async belongToAccount(t,e){return!!e&&!(!(e=await this.getAccountByAddress(e))||t&&e.name!==t)}async propExchange(t,e,i){let s=null,n=0;var a;return Array.isArray(t)?(s=t[0],n=t[1]):(a=await this.getTX(t.hash))&&(s=a.tx,n=t.index),!s||!s.outputs||s.outputs.length<=n?(this.logger.error("Invalid tx info."),null):await this.belongToAccount(i,s.outputs[n].getAddress())?(a=s.outputs[n].getReturnData())?(t=(new b).propExchange(s,n,e),a.index=t.outputs.length-1,i?await this.fund(t,{allowPreInput:!0,account:i}):await this.fund(t,{allowPreInput:!0}),await this.sign(t),e=t.commit(),await this.db.addTX(e[0]),await this.db.send(e[0]),r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS)),e.push(a),e):(this.logger.error("Invalid tx info."),null):(this.logger.error("Invalid user."),null)}async propFound(t,e){if(t=await this.getTX(t),r(t),!(t=t.tx))throw new D(L.errors.TYPE_ERROR,"Invalid hex string.");let i=0;3<=t.outputs.length&&(i=2);var s=(a=t.outputs[i]).getReturnData();if(!s||s.oper!==G.propExchange&&s.oper!==G.propCreate)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");if(s.cid==this.network.genesisId)throw new $(block,"invalid","prop found supertoken",100);var n=new b,a=(t=(n.addInputFromTx(t,i),E.fromScript(a.getAddress(),a.value)),n.outputs.push(t),e?await this.fund(n,{allowPreInput:!0,subtractFee:!0,account:e}):await this.fund(n,{allowPreInput:!0,subtractFee:!0}),await this.sign(n),n.commit());return await this.db.send(a[0]),r(a[0].verify(a[1],k.flags.STANDARD_VERIFY_FLAGS)),a.push(s),a}async propSale(t,e,i,s){let n=await this.getTX(t);if(!n)throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(n.getDepth(this.db.curHeight)<=0)throw new D(L.errors.TYPE_ERROR,"No enough confirmations.");if(!(n=n.tx))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");n.outputs[0].getReturnType(k.opcodes.OP_RETURN)&&(e=2);var a=n.outputs[e].getReturnData([k.opcodes.OP_PROPEXCHANGE,k.opcodes.OP_PROPCREATE]);if(!a)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");if(!await this.belongToAccount(s,n.outputs[e].getAddress()))throw new D(L.errors.TYPE_ERROR,"Invalid tx info.");if(!(s=await this.getCoin(t,e))||-1===s.height||-2===s.height)throw new D(L.errors.WALLET_INSUFFICIENT_FUNDS,"Invalid coin.");if(await this.txdb.isSpent(t,e))throw new D(L.errors.WALLET_INSUFFICIENT_FUNDS,"Invalid coin.");if(i<=n.outputs[e].value)throw new D(L.errors.TYPE_ERROR,"Invalid fixed price.");if(a.cid==this.network.genesisId)throw new $(n,"invalid","prop not for sale",100);return t=(s=new b).addInputFromTx(n,e),e={oper:G.propSale,pid:a.pid,prev:{hash:t.prevout.hash,index:t.prevout.index},fixed:i,period:this.db.curHeight+O.BLOCK_DAY},a=E.fromScript(k.createScript(Buffer.from(JSON.stringify(e)),k.types.NULLDATA),0),s.outputs.push(a),await this.sign(s,null,N.SINGLE|N.ANYONECANPAY),t=s.commit(),r(t[0].verify(t[1],k.flags.STANDARD_VERIFY_FLAGS)),await this.db.send(t[0]),t}async propBuy(t,e,i){if(!(t=this.db.propList.get(t))||!t.bid||!t.bid.raw)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx Hash.");var r=z.fromRaw(Buffer.from(t.bid.raw,"hex")),s=(await this.createReceive(i)).getAddress(),n=t.gold,a=w.fromString(t.current.address,this.network).getHash();if(e<n)throw new Error("wrong price");if(1<r.outputs.length&&e<r.outputs[1].value)throw new Error("low bid price than before");var o=b.fromTX(r,1);if(!o.outputs[0].getReturnType(B.OP_RETURN))throw new Error("not a sale order");return await this.remove(r.hash("hex")),o.view.addOutput({hash:o.inputs[0].prevout.hash,index:o.inputs[0].prevout.index},new E({value:t.gold})),a=E.fromScript(k.createScript(a),e),o.outputs.push(a),e={oper:G.propExchange,pid:t.pid,cid:t.cid,oid:t.oid,prev:{hash:o.inputs[0].prevout.hash,index:o.inputs[0].prevout.index}},a=E.fromScript(s,n,e),o.outputs.push(a),i?await this.fund(o,{allowPreInput:!0,account:i}):await this.fund(o,{allowPreInput:!0}),await this.sign(o,null,N.ALL,[0]),s=o.commit(),t.owned||this.db.client.watchOutpoint((new H).fromOptions(r.inputs[0].prevout)),await this.db.send(s[0]),s}async getTXByAmount(t,e){let i=null;var r;for(r of await this.getCoins(e))if(!(r.height<=0)&&r.value==t){i=r;break}return i&&(e=await this.getTX(i.hash))?[e.tx,i.index,i.height]:[]}async contractCreate(t,e,i,s,n){if(this.db.transactionList.query(t,s)!=W.None)throw new D(L.errors.TYPE_ERROR,"Contract with the same address finded.");if(0!=parseInt(e%1e3,10))throw new D(L.errors.TYPE_ERROR,"Contract source should an integer multiple of 1000.");if(!await U.checkSum(this.network,t,s))throw new D(L.errors.TYPE_ERROR,"Create contract with an invalid Address or a Address with old transations.");let a=!1,[o,c,h]=await this.getTXByAmount(e,n);if(!o){a=!0;var u=new b;let t="";t=(n?await this.createReceive(n):this).getAddress(),u.outputs.push(E.fromScript(t,e)),n?await this.fund(u,{allowPreInput:!0,account:n}):await this.fund(u,{allowPreInput:!0}),await this.sign(u),u=u.commit(),r(u[0].verify(u[1],k.flags.STANDARD_VERIFY_FLAGS)),o=u[0],c=0,h=-1}(u=new b).addInputFromTx(o,c,h);let l="";l=(n?await this.createReceive(n):this).getAddress();var p=await this.getKey(l);t={oper:G.contractCreate,type:t,addr:s,src:e,dst:i,srcact:n,alice:p.getPublicKey("hex"),period:this.db.curHeight+O.TRANSACTION_PERIOD},s=E.fromScript(k.createScript(Buffer.from(JSON.stringify(t)),k.types.NULLDATA),0),u.outputs.push(s),await this.sign(u,null,N.SINGLE|N.ANYONECANPAY),e=u.commit();return a&&await this.db.send(o),await this.db.send(e[0]),e}async contractPromise(t,e){if(!(t=this.db.transactionList.get(t))||t.transStatus!=W.CreatedOnMem)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx id.");if(!(t=z.fromRaw(Buffer.from(t.raw,"hex"))))throw new D(L.errors.TYPE_ERROR,"Invalid Tx id.");var i=U.parseContract(t);if(!i||i.oper!==G.contractCreate)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");var r=b.fromTX(t,1);if(!r.outputs[0].getReturnType(B.OP_RETURN))throw new Error("not a valid contract");r.view.addOutput({hash:r.inputs[0].prevout.hash,index:r.inputs[0].prevout.index},new E({value:i.src}));let s="";s=(e?await this.createReceive(e):this).getAddress();var n=await this.getKey(s);t={oper:G.contractPromise,prevhash:t.hash("hex"),type:i.type,addr:i.addr,dst:i.dst,srcact:i.srcact,dstact:e,bob:n.getPublicKey("hex"),period:i.period},e=new k([F.fromSymbol("promise"),F.fromData(Buffer.from(JSON.stringify(t))),F.fromSymbol("drop"),F.fromSymbol("greaterthan"),F.fromSymbol("drop"),F.fromSymbol("if"),F.fromData(l.hash160(Buffer.from(t.bob,"hex"))),F.fromSymbol("else"),F.fromData(l.hash160(Buffer.from(i.alice,"hex"))),F.fromSymbol("endif"),F.fromSymbol("checksig")]),r.outputs.push(E.fromScript(e,i.src)),await this.remove(t.prevhash),await this.sign(r,null,N.ALL,[0]),n=r.commit();return await this.db.send(n[0]),t.current={hash:n[0].hash("hex"),index:0},t.raw=n[0].toRaw().toString("hex"),t.transStatus=W.Promised,this.db.transactionList.saveContract(t,!0),n}async contractExecute(t,e){if(!(t=this.db.transactionList.get(t))||t.transStatus!=W.Confirmed&&t.transStatus!=W.Expired)throw new D(L.errors.INVALID_PARAMS,"Invalid Tx id.");if(!(t=z.fromRaw(Buffer.from(t.raw,"hex"))))throw new D(L.errors.TYPE_ERROR,"Invalid Tx id.");e=e||1;var i=U.parseContract(t);if(!i||i.oper!==G.contractPromise)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");var s=t.outputs[1].getReturnData();if(!s||s.oper!==G.contractPromise)throw new D(L.errors.TYPE_ERROR,"Invalid tx type.");r.strictEqual(i.addr,s.addr),r.strictEqual(i.type,s.type),r.strictEqual(i.dst,s.dst),r.strictEqual(i.period,s.period),r.strictEqual(i.srcact,s.srcact),r.strictEqual(i.dstact,s.dstact);var n=this.db.transactionList.query(i.type,i.addr);if(n!=W.Confirmed&&n!=W.Expired)throw new D(L.errors.TYPE_ERROR,"Contract Promise not Check yet.");if(n==W.Expired&&1!=e||n==W.Confirmed&&2!=e)throw new D(L.errors.TYPE_ERROR,"Invalid Executor.");let a=i.srcact,o=(2==e&&(a=i.dstact),"");o=(a?await this.createReceive(a):this).getAddress();var c=new b,h=(c.addInputFromTx(t,1),{oper:G.contractExecute,type:i.type,addr:i.addr,master:e});h=E.fromScript(k.createScript(Buffer.from(JSON.stringify(h)),k.types.NULLDATA),0),c.outputs.push(h),h=E.fromScript(o,t.outputs[1].value),c.outputs.push(h),t=1==e?await T.fromPublic(Buffer.from(i.ori.alice,"hex")):await T.fromPublic(Buffer.from(s.bob,"hex")),h=await this.getKey(t.getAddress()),await c.signAsync(h,k.hashType.ALL,this.db.workers),e=c.commit();return r(e[0].verify(e[1],k.flags.STANDARD_VERIFY_FLAGS,n)),await this.db.send(e[0]),e}async htlcDeal(t,e){var i=await this.getTX(t.hash);let r=null;if(e){if(!(e=await this.getAccount(e)))throw new D(L.errors.TYPE_ERROR,"Invalid Account.");r=e.getReceive().toString()}else r=this.getReceive().toString();e=new b;var s=(new k).pushOp(B.OP_1);t.suggest&&s.pushData(Buffer.from(t.sa,"hex")),e.addInput({prevout:{hash:t.hash,index:t.index},script:s}),e.addOutput(r,i.tx.outputs[t.index].value-1e4),e.view.addOutput({hash:t.hash,index:t.index},new E(i.tx.outputs[t.index])),await this.sign(e,null,N.ALL),s=e.commit();return await this.db.send(s[0]),s}async htlcCancel(t,e){let i=null;var r=await this.getTX(t.hash);if(!(i=r?r.tx.outputs[t.index]:i))throw new D(L.errors.TYPE_ERROR,"Invalid Input.");let s=null;if(e){if(!(r=await this.getAccount(e)))throw new D(L.errors.TYPE_ERROR,"Invalid Account.");s=r.getReceive().toString()}else s=this.getReceive().toString();return e=new b,r=(new k).pushOp(B.OP_0),t.suggest&&r.pushData(Buffer.from(t.sa,"hex")),e.addInput({prevout:{hash:t.hash,index:t.index},script:r}),t.suggest?e.setSequence(0,2*O.HTLC_CANCEL_PERIOD,!1):e.setSequence(0,O.HTLC_CANCEL_PERIOD,!1),e.addOutput(s,i.value-1e4),e.view.addOutput({hash:t.hash,index:t.index},new E(i)),r=await this.getKey(t.master),await e.signAsync(r,k.hashType.ALL,this.db.workers),t=e.commit(),await this.db.send(t[0]),t}async sendContracts(t,e,i){var r,s=new b;for(r of t)s.outputs.push(i.create(r));return e?await this.fund(s,{account:e}):await this.fund(s),await this.sign(s),t=s.commit(),await this.db.addTX(t[0]),await this.db.send(t[0]),t}async addStockAccountSeq(t){r(t&&"object"==typeof t,"Token data should be a object"),r(t.cid,"Token data should has a cid property"),r(t.uid,"Token data should has a uid property");var e=await this.stockAddress(t.cid,t.uid);e=this.db.accountList.getOrCreateStockAccount(t.cid,e.toString());return t.seq=e.seq+1,t}async tokenCreate(t,e="",i){r(t&&"object"==typeof t,"Token data should be a object"),r(t.cid,"Token data should has a cid property"),r(t.uid,"Token data should has a uid property"),t.time=!0,await this.ensureAccount({name:e,witness:!0});let s=null;if(i){if(!await this.belongToAccount(e,i))throw new D(L.errors.TYPE_ERROR,`stock.send address error: addr:${i} is not belongs to account:`+e);s=await this.getKey(i)}else s=await this.createReceive(e,a.hashInt(t.cid),this.master);return s.signData(t)}async sign(t,e,i=k.hashType.ALL,r){if(this.watchOnly)throw new Error("Cannot sign from a watch-only wallet.");return await this.unlock(e),e=await this.deriveInputs(t),t.signAsync(e,i,this.db.workers,r)}getCoinView(t){return this.txdb.getCoinView(t)}getSpentView(t){return this.txdb.getSpentView(t)}toDetails(t){return this.txdb.toDetails(t)}getDetails(t){return this.txdb.getDetails(t)}async getCoin(t,e){return this.txdb.getCoin(t,e)}async getCredit(t,e){return this.txdb.getCredit(t,e)}async getStatusOfSC(t){return this.txdb.getStatusOfSC(t)}async setStatusOfSC(t,e){var i=await this.writeLock.lock();try{this.txdb.start();try{await this.txdb._setStatusOfSC(t,e),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}}finally{i()}}getLockedCoins(){return this.txdb.lockedCoins.values}getTX(t){return this.txdb.getTX(t)}getBlocks(){return this.txdb.getBlocks()}getBlock(t){return this.txdb.getBlock(t)}async add(t,e,i){var r=await this.writeLock.lock();try{return await this._add(t,e,i)}finally{r()}}async _add(t,e,i){let r,s;this.txdb.start();try{(r=await this.txdb._add(t,e,i))&&(s=await this.syncOutputDepth(r)),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}return s&&0<s.length&&(this.db.emit("address",this.id,s),this.emit("address",s)),r}async resetBalance(){var t=await this.writeLock.lock();try{this.txdb.start();try{await this.txdb.resetBalance(),await this.txdb.commit()}catch(t){throw this.txdb.drop(),t}}finally{t()}}async unconfirm(t){var e=await this.writeLock.lock();try{return await this.txdb.unconfirm(t)}finally{e()}}async remove(t){var e=await this.writeLock.lock();try{return await this.txdb.remove(t)}finally{e()}}async zap(t,e){var i=await this.writeLock.lock();try{return await this._zap(t,e)}finally{i()}}async _zap(t,e){return t=await this.ensureIndex(t),this.txdb.zap(t,e)}async abandon(t){var e=await this.writeLock.lock();try{return await this._abandon(t)}finally{e()}}_abandon(t){return this.txdb.abandon(t)}conserveCoin(t){return this.txdb.conserveCoin(t)}unConserveCoin(t){return this.txdb.unConserveCoin(t)}isConserved(t){return this.txdb.isConserved(t)}getConserved(){return this.txdb.getConserved()}async getHistory(t){return t=await this.ensureIndex(t),this.txdb.getHistory(t)}async getCoins(t){return t=await this.ensureIndex(t),this.txdb.getCoins(t)}async getCredits(t){return t=await this.ensureIndex(t),this.txdb.getCredits(t)}async getSmartCoins(t){var e=[];for(const r of await this.getCredits(t)){var i=r.coin;r.spent||this.txdb.isConserved(i)||(-1!==i.height&&-2!==i.height||r.own)&&e.push(i)}return e}async getPending(t){return t=await this.ensureIndex(t),this.txdb.getPending(t)}async getBalance(t){return t=await this.ensureIndex(t),this.txdb.getBalance(t)}async queryBalanceLog(t,e=0){return(t=await this.ensureIndex(t))?this.db.queryBalanceLog(this.wid,t,e):[]}async getRange(t,e){return t&&"object"==typeof t&&(e=t,t=null),t=await this.ensureIndex(t),this.txdb.getRange(t,e)}async getLast(t,e){return t=await this.ensureIndex(t),this.txdb.getLast(t,e)}async ensureIndex(t,e){if(null==t){if(e)throw new Error("No account provided.");return null}if(-1===(e=await this.getAccountIndex(t)))throw new Error("Account not found.");return e}getAddress(t){return this.account.getAddress(t)}getReceive(t){return this.account.getReceive(t)}getChange(t){return this.account.getChange(t)}getNested(t){return this.account.getNested(t)}inspect(){return{wid:this.wid,id:this.id,network:this.network.type,initialized:this.initialized,accountDepth:this.accountDepth,token:this.token.toString("hex"),tokenDepth:this.tokenDepth,state:this.txdb.state?this.txdb.state.toJSON(!0):null,master:this.master,account:this.account}}toJSON(t){return{network:this.network.type,wid:this.wid,id:this.id,initialized:this.initialized,watchOnly:this.watchOnly,accountDepth:this.accountDepth,token:this.token.toString("hex"),tokenDepth:this.tokenDepth,height:this.db.curHeight,state:this.txdb.state.toJSON(!0),master:this.master.toJSON(t),account:this.account.toJSON(!0)}}getSize(){var t=0;return(t+=50)+o.sizeVarString(this.id,"ascii")+o.sizeVarlen(this.master.getSize())}toRaw(){var t=this.getSize();return(t=new f(t)).writeU32(this.network.magic),t.writeU32(this.wid),t.writeVarString(this.id,"ascii"),t.writeU8(this.initialized?1:0),t.writeU8(this.watchOnly?1:0),t.writeU32(this.accountDepth),t.writeBytes(this.token),t.writeU32(this.tokenDepth),t.writeVarBytes(this.master.toRaw()),t.render()}fromRaw(t){t=new d(t);var e=n.fromMagic(t.readU32());return this.wid=t.readU32(),this.id=t.readVarString("ascii"),this.initialized=1===t.readU8(),this.watchOnly=1===t.readU8(),this.accountDepth=t.readU32(),this.token=t.readBytes(32),this.tokenDepth=t.readU32(),this.master.fromRaw(t.readVarBytes()),r(e===this.db.network,"Wallet network mismatch."),this}static fromRaw(t,e){return new rt(t).fromRaw(e)}static isWallet(t){return t instanceof rt}async issueCreate(t,e,i){var r=new Y(t),s=((s=(r.source.subjectName||(r.source.subjectName=r.erid),T.fromPrivate(Buffer.from(t.key,"hex"),!0,this.network))).witness=!0,r.sign(s,!0,this.network),r.toOptions(!0));return i?this.send({outputs:[{address:t.address,value:1e4}],comment:s},e):(r=await this.send({outputs:[{address:t.address,value:1e4}],comment:s},e),s.txid=r.txid()),s}async caAbolish(t,e,i){var r=T.fromPrivate(Buffer.from(t.key,"hex"),!0,this.network),s=(r.witness=!0,await this.db.$parent.chain.db.erList.getEr(t.erid));if(!s)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid erid.");if(s.source.cid!=t.cid)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid cid.");if(s.source.uid!=t.uid)throw new D(L.errors.TYPE_ERROR,"ca.abolish: Invalid uid.");var n=s.signature;if(s.sign(r,!0,this.network),s.witness!=t.witness||s.signature!=n)throw new D(L.errors.TYPE_ERROR,"ca.abolish: You have no permission to abolish this witness.");return(s=new J(t)).sign(r),n=s.toOptions(!0),i?this.send({outputs:[{address:t.address,value:1e4}],comment:n},e):await this.send({outputs:[{address:t.address,value:1e4}],comment:n},e),n}async enchanceCp(t,e){var i=((t=new Z(t)).oper="enchanceCp",await this.ensureCp(t.to)),r=await this.ensureCp(t.from);if(!(r=await this.getKey(r.pubAddress)))throw new D(L.errors.TYPE_ERROR,"Invalid cid, Not along to this wallet.");return t.sign(r),r=t.toOptions(!0),[await this.send({outputs:[{address:i.pubAddress,value:1e4}],comment:r},e),r]}async ensureCp(t,e=!1){if(await this.db.flushCP([t]),(t=this.db.cpList.getItem(t))||e)return t;throw new D(L.errors.TYPE_ERROR,"Invalid cid, cannot find cp.")}}t.exports=rt},function(t,e,i){"use strict";
|
|
306
306
|
/*!
|
|
307
307
|
* BlockMeta.js - walletdb records
|
|
308
308
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -372,7 +372,7 @@ const r=i(21).opcodes;function s(t){let e=null;var i=s.list[t.type];return new(i
|
|
|
372
372
|
/*!
|
|
373
373
|
* layout.js - blockchain data layout for vallnet
|
|
374
374
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
375
|
-
*/const r=i(0),s={binary:!0,C:function(t,e,i){let s,a=t.length;return r("number"==typeof i),"string"==typeof t&&(a/=2),32===a?((s=Buffer.allocUnsafe(69))[0]=154,n(s,t,1),n(s,e,33),s.writeUInt32BE(i,65,!0)):20===a?((s=Buffer.allocUnsafe(57))[0]=67,n(s,t,1),n(s,e,21),s.writeUInt32BE(i,53,!0)):r(!1),s},Cc:function(t){let e,i;return r(Buffer.isBuffer(t)),69===t.length?(e=t.toString("hex",33,65),i=t.readUInt32BE(65,0)):57===t.length?(e=t.toString("hex",21,53),i=t.readUInt32BE(53,0)):r(!1),[e,i]},CP:function(t,e="ascii"){return t=s.s2b(t,e),(e=Buffer.allocUnsafe(37))[0]=147,n(e,t,1),e},CPc:function(t){let e;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],147),37===t.length?e=t.slice(1,37):r(!1),s.b2s(e)},CV:Buffer.from([118]),EN2:function(t,e,i="ascii"){r("string"==typeof t),r("string"==typeof e);var s=Buffer.allocUnsafe(73);return s[0]=226,s.write(t,1,i),s.write(e,37,i),s},ER:function(t){t=s.s2b(t,"hex");var e=Buffer.allocUnsafe(33);return e[0]=152,n(e,t,1),e},ERR:function(t,e){r("string"==typeof t),r("string"==typeof e)
|
|
375
|
+
*/const r=i(0),s={binary:!0,C:function(t,e,i){let s,a=t.length;return r("number"==typeof i),"string"==typeof t&&(a/=2),32===a?((s=Buffer.allocUnsafe(69))[0]=154,n(s,t,1),n(s,e,33),s.writeUInt32BE(i,65,!0)):20===a?((s=Buffer.allocUnsafe(57))[0]=67,n(s,t,1),n(s,e,21),s.writeUInt32BE(i,53,!0)):r(!1),s},Cc:function(t){let e,i;return r(Buffer.isBuffer(t)),69===t.length?(e=t.toString("hex",33,65),i=t.readUInt32BE(65,0)):57===t.length?(e=t.toString("hex",21,53),i=t.readUInt32BE(53,0)):r(!1),[e,i]},CP:function(t,e="ascii"){return t=s.s2b(t,e),(e=Buffer.allocUnsafe(37))[0]=147,n(e,t,1),e},CPc:function(t){let e;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],147),37===t.length?e=t.slice(1,37):r(!1),s.b2s(e)},CV:Buffer.from([118]),EN2:function(t,e,i="ascii"){r("string"==typeof t),r("string"==typeof e);var s=Buffer.allocUnsafe(73);return s[0]=226,s.write(t,1,i),s.write(e,37,i),s},ER:function(t){t=s.s2b(t,"hex");var e=Buffer.allocUnsafe(33);return e[0]=152,n(e,t,1),e},ERR:function(t,e,i){return r("string"==typeof t),r("string"==typeof e),r("string"==typeof i),(i=Buffer.allocUnsafe(98))[0]=217,i.write(t,1,"hex"),i.write(e,34,"hex"),i.write(e,66,"hex"),i},ERRR:function(t){return r(Buffer.isBuffer(t)),[(t=t.slice(1)).toString("hex",0,33),t.toString("hex",33,65),t.toString("hex",65,97)]},ERA:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(33);return e[0]=216,e.write(t,1,"hex"),e},H:function(t){return o(72,t)},HL:Buffer.from([148]),O:Buffer.from([79]),R:Buffer.from([82]),SC:function(t,e="ascii"){return t=s.s2b(t,e),(e=Buffer.allocUnsafe(37))[0]=150,n(e,t,1),e},SR:function(t,e,i,a,o,c){var h=Buffer.allocUnsafe(117);return h.fill(0),Buffer.isBuffer(e)||(r("string"==typeof e),e=s.s2b(e)),h[0]=165,h.writeUInt32BE(t,1,!0),n(h,e,5),h.writeUInt32BE(i,41,!0),n(h,a,45),h.writeUInt32BE(o,109,!0),h.writeUInt32BE(c,113,!0),h},SRR:function(t){return r(Buffer.isBuffer(t)),[(t=t.slice(1)).readUInt32BE(0,!0),t.toString("ascii",4,40),t.readUInt32BE(40,!0),t.toString("hex",44,108),t.readUInt32BE(109,!0),t.readUInt32BE(109,!0)]},SN:function(t,e){var i=Buffer.allocUnsafe(37+e.length);return i.fill(0),Buffer.isBuffer(t)||(r("string"==typeof t),t=s.s2b(t)),i[0]=161,n(i,t,1),n(i,e,37),i},SNN:function(t){return r(Buffer.isBuffer(t)),[(t=t.slice(1)).toString("ascii",0,36),t.toString("hex",36,t.length)]},SS:function(t,e){var i=Buffer.allocUnsafe(41);return i.fill(0),Buffer.isBuffer(t)||(r("string"==typeof t),t=s.s2b(t)),i[0]=167,n(i,t,1),i.writeUInt32BE(e,37,!0),i},SSS:function(t){return r(Buffer.isBuffer(t)),r.strictEqual(t[0],167),[(t=t.slice(1)).toString("ascii",0,36),t.readUInt32BE(36,!0)]},T:function(t,e){let i,s=t.length;return"string"==typeof t&&(s/=2),32===s?((i=Buffer.allocUnsafe(65))[0]=171,n(i,t,1),n(i,e,33)):20===s?((i=Buffer.allocUnsafe(53))[0]=84,n(i,t,1),n(i,e,21)):r(!1),i},TI:function(t,e){let i,s=t.length;return"string"==typeof t&&(s/=2),32===s?((i=Buffer.allocUnsafe(65))[0]=244,n(i,t,1),n(i,e,33)):20===s?((i=Buffer.allocUnsafe(53))[0]=157,n(i,t,1),n(i,e,21)):r(!1),i},TO:function(t,e){let i,s=t.length;return"string"==typeof t&&(s/=2),32===s?((i=Buffer.allocUnsafe(65))[0]=250,n(i,t,1),n(i,e,33)):20===s?((i=Buffer.allocUnsafe(53))[0]=163,n(i,t,1),n(i,e,21)):r(!1),i},Tt:function(t){return r(Buffer.isBuffer(t)),65===t.length?t.toString("hex",33,65):(r(53===t.length),t.toString("hex",21,53))},V:Buffer.from([86]),VM:function(t){return o(164,t)},VO:function(t){return o(162,t)},VP:function(t,e="utf8"){return t=s.s2b(t,e),(e=Buffer.allocUnsafe(37))[0]=166,n(e,t,1),e},VPc:function(t){let e;return r(Buffer.isBuffer(t)),r.strictEqual(t[0],166),37===t.length?e=t.slice(1,37):r(!1),s.b2s(e)},VH:function(t,e){return this.hi(158,t,e)},b:function(t){return a(98,t)},c:function(t,e){return 99,t=t,e=e,i=Buffer.allocUnsafe(37),r("number"==typeof e),i[0]=99,n(i,t,1),i.writeUInt32BE(e,33,!0),i;var i},e:function(t){return a(101,t)},g:function(t){r("string"==typeof t);var e=Buffer.allocUnsafe(1+t.length/2);return e[0]=103,e.write(t,1,"hex"),e},gs:function(t,e,i){r("string"==typeof t),r("string"==typeof e),r("string"==typeof i);var s=Buffer.allocUnsafe(77);return s[0]=218,s.write(t,1,"hex"),s.write(e,21,"hex"),s.write(i,57,"hex"),s},h:function(t){return a(104,t)},hi:function(t,e,i){r("string"==typeof e),r("number"==typeof i);var s=Buffer.allocUnsafe(37);return s[0]=t,s.write(e,1,"hex"),s.writeUInt32BE(i,33,!0),s},hii:function(t){return r(Buffer.isBuffer(t)),r(37===t.length),[(t=t.slice(1)).toString("hex",0,32),t.readUInt32BE(32,!0)]},n:function(t){return a(110,t)},o:function(t,e){r("string"==typeof t),r("string"==typeof e);var i=Buffer.allocUnsafe(73);return i.fill(0),i[0]=111,i.write(t,1,"ascii"),i.write(e,37,"ascii"),i},oo:function(t){return r(Buffer.isBuffer(t)),r(73===t.length),[t.toString("ascii",1,37),t.toString("ascii",38,73)]},p:function(t){return a(112,t)},pp:function(t){return r(Buffer.isBuffer(t)),r(33===t.length),t.toString("hex",1,33)},s:function(t,e){return this.hi(115,t,e)},ss:function(t){return this.hii(t)},t:function(t){return a(116,t)},th:function(t,e){r("number"==typeof t);var i=Buffer.allocUnsafe(37);return i.fill(0),i[0]=220,i.writeUInt32BE(t,1,!0),n(i,e,5),i},thh:function(t){return r(Buffer.isBuffer(t)),r(220==t[0]),{time:t.readUInt32BE(1,!0),hash:t.slice(5,37).toString("hex")}},tx:function(t){return Buffer.concat([Buffer.from([236]),Buffer.from(t,"hex")])},u:function(t){return a(117,t)},v:function(t,e){var i=Buffer.allocUnsafe(34);return r("number"==typeof t),i[0]=118,i[1]=t,n(i,e,2),i},vv:function(t){return r(Buffer.isBuffer(t)),r(34===t.length),[t[1],t.toString("hex",2,34)]},version:function(t){var e=Buffer.allocUnsafe(4);return e.writeUInt32LE(t,0,!0),e},equalVersion:function(t,e){return r(Buffer.isBuffer(t)),t.readUInt32LE(0,!0)==e},s2b:function(t,e="ascii"){return Buffer.from(t,e)},b2s:(t,e="ascii")=>(r(Buffer.isBuffer(t)),t.toString(e))};function n(t,e,i){if(Buffer.isBuffer(e))return e.copy(t,i);r("string"==typeof e),t.write(e,i,"hex")}function a(t,e){var i=Buffer.allocUnsafe(33);return i[0]=t,n(i,e,1),i}function o(t,e){var i=Buffer.allocUnsafe(5);return r("number"==typeof e),i[0]=t,i.writeUInt32BE(e,1,!0),i}t.exports=s},function(t,e){t.exports=require("tls")},function(t,e,i){"use strict";
|
|
376
376
|
/*!
|
|
377
377
|
* general.js - bitcoin constants for vallnet
|
|
378
378
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -402,7 +402,7 @@ function r(t){let e=null;var i=r.list[t.contract.options.type];return i?new(e=i.
|
|
|
402
402
|
* jobs.js - worker jobs for vallnet
|
|
403
403
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
404
404
|
* https://github.com/bookmansoft/gamegold
|
|
405
|
-
*/const r=i(28),s=i(234).derive,n=i(312),a=i(121);i(60),i(22);var{}=i(5);const o=e;o.execute=function(t){try{return o.handle(t)}catch(t){return new a.ErrorResultPacket(t)}},o.handle=function(t){return t.jobsHandle(o)},o.check=function(t,e,i,r){try{t.check(e,i,r)}catch(t){if("ScriptError"===t.type)return new a.CheckResultPacket(t);throw t}return new a.CheckResultPacket},o.checkInput=function(t,e,i,r,s){try{t.checkInput(e,i,r,s)}catch(t){if("ScriptError"===t.type)return new a.CheckInputResultPacket(t);throw t}return new a.CheckInputResultPacket},o.sign=function(t,e,i,r){return e=t.sign(e,!0,i,r),a.SignResultPacket.fromTX(t,e)},o.signInput=function(t,e,i,r,s){return i=t.signInput(t,e,i,r,s),a.SignInputResultPacket.fromTX(t,e,i)},o.ecVerify=function(t,e,i){return t=r.verify(t,e,i),new a.ECVerifyResultPacket(t)},o.ecSign=function(t,e){return t=r.sign(t,e),new a.ECSignResultPacket(t)},o.mine=function(t,e,i,r){return t=n(t,e,i,r),new a.MineResultPacket(t)},o.scrypt=function(t,e,i,r,n,o){return t=s(t,e,i,r,n,o),new a.ScryptResultPacket(t)}},function(t,e,i){var r=i(31);const s=i(4),n=i(3),a=i(7),o=i(65);class c extends r{constructor(t){super(),this.db=t||{getEr:()=>{},setEr:()=>{},delEr:()=>{}},this.cache=new o(1e4)}async loadHistory(){}async getEr(t){return this.cache.get(t)||this.db.getEr(t)}async setEr(t,e){t=new h(t),await this.db.setEr(t,e),this.cache.set(t.erid,t)}async delEr(t,e){await this.db.delEr(t),this.cache.remove(t.erid)}async query(t){let e=!1,i=null,r=[];for(var s of t)if(s&&Array.isArray(s)){if("erid"==s[0])return{list:[await this.getEr(s[1])],page:0,count:1};"merge"==s[0]?e=s[1]:"pubkey"==s[0]?i=s[1]:r.push(s)}return i?this.db.byPubkey(i,r,e):{list:[],page:0,count:1}}}class h{constructor(t){this.fromOptions(t=t||{})}fromOptions(t){this.oper=t.oper||"erIssue",this.erid=t.erid,this.witness=t.witness||"",this.validHeight=t.validHeight,this.startHeight=t.startHeight||0,this.signature=t.signature||"",this.source=null,t.source&&(this.source={},this.source.subjectName=t.source.subjectName,this.source.pubkey=t.source.pubkey,this.source.subjectHash=t.source.subjectHash,this.source.cluster=t.source.cluster,this.source.cid=t.source.cid,this.source.uid=t.source.uid),this.wid=t.wid||0,this.account=t.account||""}toRaw(){return Buffer.from(JSON.stringify(this.toOptions(!0)),"utf-8")}toOptions(t=!1){var e={};return e.oper=this.oper||"erIssue",e.erid=this.erid,e.witness=this.witness||"",e.validHeight=this.validHeight,t&&(e.startHeight=this.startHeight,e.signature=this.signature||""),this.source&&(e.source={},e.source.subjectName=this.source.subjectName,e.source.pubkey=this.source.pubkey,e.source.subjectHash=this.source.subjectHash,e.source.cluster=this.source.cluster||"",e.source.cid=this.source.cid||"",e.source.uid=this.source.uid||0),e}getSignObjSize(t){let e=0;return e=(e=(e=(e+=n.sizeVarString(t.oper,"utf8"))+n.sizeVarString(t.erid,"utf8"))+n.sizeVarString(t.witness,"ascii"))+4+4,t.source?(e=(e=(e=(e+=n.sizeVarString(t.source.subjectName,"utf8"))+n.sizeVarString(t.source.pubkey,"utf8"))+n.sizeVarString(t.source.subjectHash,"utf8"))+n.sizeVarString(t.source.cluster,"utf8"))+n.sizeVarString(t.source.cid,"utf8")+4:e}toWriter(t,e){return e.writeVarString(t.oper,"utf8"),e.writeVarString(t.erid,"utf8"),e.writeVarString(t.witness,"ascii"),e.writeU32(t.validHeight),e.writeU32(t.startHeight),t.source&&(e.writeVarString(t.source.subjectName,"utf8"),e.writeVarString(t.source.pubkey,"utf8"),e.writeVarString(t.source.subjectHash,"utf8"),e.writeVarString(t.source.cluster,"utf8"),e.writeVarString(t.source.cid,"utf8"),e.writeU32(t.source.uid)),e}toHash(){var t=this.toOptions();return a.hash256(this.toWriter(t,new s(this.getSignObjSize(t))).render())}fromRaw(t){return t=JSON.parse(t.toString("utf8")),this.fromOptions(t),this}static fromRaw(t){return(new h).fromRaw(t)}sign(t){this.signature=t.sign(this.toHash()).toString("hex")}verifying(t){return t.verify(this.toHash(),Buffer.from(this.signature,"hex"))}}c.ErItem=h,t.exports=c},function(t,e,i){var r=i(31);const s=i(4),n=i(3),a=i(7);class o extends r{constructor(t){super(),this.db=t||{getErAbolish:()=>{},setErAbolish:()=>{},delErAbolish:()=>{},loadErAbolishList:()=>{}}}async loadHistory(){}async getErAb(t){return this.db.getErAbolish(t)}async setErAb(t,e){t=new c(t),await this.db.setErAbolish(t),this.set(t.erid,t)}async delErAb(t,e){await this.db.delErAbolish(t),this.delete(t.erid)}async query(t){let e=!1;for(var i of t)"cluster"==i[0]&&(e=i[1]);for(var r of t){if("erid"==r[0])return{list:[await this.getErAb(r[1])],page:0,count:1};if("pubkey"==r[0])return this.db.byPubkey(r[1],e)}return{list:[],page:0,count:1}}}class c{constructor(t){this.fromOptions(t=t||{})}fromOptions(t){this.oper=t.oper||"erAbolish",this.erid=t.erid,this.witness=t.witness||"",this.abolishHeight=t.abolishHeight,this.startHeight=t.startHeight||0,this.signature=t.signature||""}toOptions(t){var e={};return e.oper=this.oper||"erAbolish",e.erid=this.erid,e.witness=this.witness||"",e.abolishHeight=this.abolishHeight,t&&(e.startHeight=this.startHeight,e.signature=this.signature||""),e}getMsgSize(){var t=0;return(t+=n.sizeVarString(this.oper,"utf8"))+n.sizeVarString(this.erid,"utf8")+n.sizeVarString(this.witness,"ascii")+4+4}toWriter(t,e){return e.writeVarString(this.oper,"utf8"),e.writeVarString(this.erid,"utf8"),e.writeVarString(this.witness,"ascii"),e.writeU32(this.abolishHeight),e.writeU32(this.startHeight),e}toHash(){var t=this.toOptions();return a.hash256(this.toWriter(t,new s(this.getMsgSize(t))).render())}toRaw(){return Buffer.from(JSON.stringify(this.toOptions(!0)),"utf-8")}fromReader(t){return t=JSON.parse(t.toString("utf8")),this.fromOptions(t),this}fromRaw(t){return this.fromReader(t)}static fromRaw(t){return(new c).fromRaw(t)}sign(t){this.signature=t.sign(this.toHash()).toString("hex")}verifying(t){return t.verify(this.toHash(),Buffer.from(this.signature,"hex"))}}o.ErAbolishItem=c,t.exports=o},function(t,e,i){"use strict";
|
|
405
|
+
*/const r=i(28),s=i(234).derive,n=i(312),a=i(121);i(60),i(22);var{}=i(5);const o=e;o.execute=function(t){try{return o.handle(t)}catch(t){return new a.ErrorResultPacket(t)}},o.handle=function(t){return t.jobsHandle(o)},o.check=function(t,e,i,r){try{t.check(e,i,r)}catch(t){if("ScriptError"===t.type)return new a.CheckResultPacket(t);throw t}return new a.CheckResultPacket},o.checkInput=function(t,e,i,r,s){try{t.checkInput(e,i,r,s)}catch(t){if("ScriptError"===t.type)return new a.CheckInputResultPacket(t);throw t}return new a.CheckInputResultPacket},o.sign=function(t,e,i,r){return e=t.sign(e,!0,i,r),a.SignResultPacket.fromTX(t,e)},o.signInput=function(t,e,i,r,s){return i=t.signInput(t,e,i,r,s),a.SignInputResultPacket.fromTX(t,e,i)},o.ecVerify=function(t,e,i){return t=r.verify(t,e,i),new a.ECVerifyResultPacket(t)},o.ecSign=function(t,e){return t=r.sign(t,e),new a.ECSignResultPacket(t)},o.mine=function(t,e,i,r){return t=n(t,e,i,r),new a.MineResultPacket(t)},o.scrypt=function(t,e,i,r,n,o){return t=s(t,e,i,r,n,o),new a.ScryptResultPacket(t)}},function(t,e,i){var r=i(31);const s=i(4),n=i(3),a=i(7),o=i(65);class c extends r{constructor(t){super(),this.db=t||{getEr:()=>{},setEr:()=>{},delEr:()=>{}},this.cache=new o(1e4)}async loadHistory(){}async getEr(t){return this.cache.get(t)||this.db.getEr(t)}async setEr(t,e){(t=new h(t)).txid=e.txid(),await this.db.setEr(t,e),this.cache.set(t.erid,t)}async delEr(t,e){t.txid=e.txid(),await this.db.delEr(t),this.cache.remove(t.erid)}async query(t){let e=!1,i=null,r=[];for(var s of t)if(s&&Array.isArray(s)){if("erid"==s[0])return{list:[await this.getEr(s[1])],page:0,count:1};"merge"==s[0]?e=s[1]:"pubkey"==s[0]?i=s[1]:r.push(s)}return i?this.db.byPubkey(i,r,e):{list:[],page:0,count:1}}}class h{constructor(t){this.fromOptions(t=t||{})}fromOptions(t){this.oper=t.oper||"erIssue",this.erid=t.erid,this.witness=t.witness||"",this.validHeight=t.validHeight,this.startHeight=t.startHeight||0,this.signature=t.signature||"",this.source=null,t.source&&(this.source={},this.source.subjectName=t.source.subjectName,this.source.pubkey=t.source.pubkey,this.source.subjectHash=t.source.subjectHash,this.source.cluster=t.source.cluster,this.source.cid=t.source.cid,this.source.uid=t.source.uid),this.wid=t.wid||0,this.account=t.account||""}toRaw(){return Buffer.from(JSON.stringify(this.toOptions(!0)),"utf-8")}toOptions(t=!1){var e={};return e.oper=this.oper||"erIssue",e.erid=this.erid,e.witness=this.witness||"",e.validHeight=this.validHeight,t&&(e.startHeight=this.startHeight,e.signature=this.signature||""),this.source&&(e.source={},e.source.subjectName=this.source.subjectName,e.source.pubkey=this.source.pubkey,e.source.subjectHash=this.source.subjectHash,e.source.cluster=this.source.cluster||"",e.source.cid=this.source.cid||"",e.source.uid=this.source.uid||0),e}getSignObjSize(t){let e=0;return e=(e=(e=(e+=n.sizeVarString(t.oper,"utf8"))+n.sizeVarString(t.erid,"utf8"))+n.sizeVarString(t.witness,"ascii"))+4+4,t.source?(e=(e=(e=(e+=n.sizeVarString(t.source.subjectName,"utf8"))+n.sizeVarString(t.source.pubkey,"utf8"))+n.sizeVarString(t.source.subjectHash,"utf8"))+n.sizeVarString(t.source.cluster,"utf8"))+n.sizeVarString(t.source.cid,"utf8")+4:e}toWriter(t,e){return e.writeVarString(t.oper,"utf8"),e.writeVarString(t.erid,"utf8"),e.writeVarString(t.witness,"ascii"),e.writeU32(t.validHeight),e.writeU32(t.startHeight),t.source&&(e.writeVarString(t.source.subjectName,"utf8"),e.writeVarString(t.source.pubkey,"utf8"),e.writeVarString(t.source.subjectHash,"utf8"),e.writeVarString(t.source.cluster,"utf8"),e.writeVarString(t.source.cid,"utf8"),e.writeU32(t.source.uid)),e}toHash(){var t=this.toOptions();return a.hash256(this.toWriter(t,new s(this.getSignObjSize(t))).render())}fromRaw(t){return t=JSON.parse(t.toString("utf8")),this.fromOptions(t),this}static fromRaw(t){return(new h).fromRaw(t)}sign(t){this.signature=t.sign(this.toHash()).toString("hex")}verifying(t){return t.verify(this.toHash(),Buffer.from(this.signature,"hex"))}}c.ErItem=h,t.exports=c},function(t,e,i){var r=i(31);const s=i(4),n=i(3),a=i(7);class o extends r{constructor(t){super(),this.db=t||{getErAbolish:()=>{},setErAbolish:()=>{},delErAbolish:()=>{},loadErAbolishList:()=>{}}}async loadHistory(){}async getErAb(t){return this.db.getErAbolish(t)}async setErAb(t,e){t=new c(t),await this.db.setErAbolish(t),this.set(t.erid,t)}async delErAb(t,e){await this.db.delErAbolish(t),this.delete(t.erid)}async query(t){let e=!1;for(var i of t)"cluster"==i[0]&&(e=i[1]);for(var r of t){if("erid"==r[0])return{list:[await this.getErAb(r[1])],page:0,count:1};if("pubkey"==r[0])return this.db.byPubkey(r[1],e)}return{list:[],page:0,count:1}}}class c{constructor(t){this.fromOptions(t=t||{})}fromOptions(t){this.oper=t.oper||"erAbolish",this.erid=t.erid,this.witness=t.witness||"",this.abolishHeight=t.abolishHeight,this.startHeight=t.startHeight||0,this.signature=t.signature||""}toOptions(t){var e={};return e.oper=this.oper||"erAbolish",e.erid=this.erid,e.witness=this.witness||"",e.abolishHeight=this.abolishHeight,t&&(e.startHeight=this.startHeight,e.signature=this.signature||""),e}getMsgSize(){var t=0;return(t+=n.sizeVarString(this.oper,"utf8"))+n.sizeVarString(this.erid,"utf8")+n.sizeVarString(this.witness,"ascii")+4+4}toWriter(t,e){return e.writeVarString(this.oper,"utf8"),e.writeVarString(this.erid,"utf8"),e.writeVarString(this.witness,"ascii"),e.writeU32(this.abolishHeight),e.writeU32(this.startHeight),e}toHash(){var t=this.toOptions();return a.hash256(this.toWriter(t,new s(this.getMsgSize(t))).render())}toRaw(){return Buffer.from(JSON.stringify(this.toOptions(!0)),"utf-8")}fromReader(t){return t=JSON.parse(t.toString("utf8")),this.fromOptions(t),this}fromRaw(t){return this.fromReader(t)}static fromRaw(t){return(new c).fromRaw(t)}sign(t){this.signature=t.sign(this.toHash()).toString("hex")}verifying(t){return t.verify(this.toHash(),Buffer.from(this.signature,"hex"))}}o.ErAbolishItem=c,t.exports=o},function(t,e,i){"use strict";
|
|
406
406
|
/*!
|
|
407
407
|
* account.js - account object for vallnet
|
|
408
408
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -455,7 +455,7 @@ const r=i(5).ContractType;t.exports=function(t){if(!t)return i(190);switch(t.ope
|
|
|
455
455
|
/*!
|
|
456
456
|
* mappedlock.js - lock and queue for vallnet
|
|
457
457
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
458
|
-
*/function r(t,e){this.resolve=t,this.reject=e}function s(){}t.exports=class{constructor(){this.jobs=new Map,this.busy=new Set,this.destroyed=!1}has(t){return this.busy.has(t)}hasPending(t){return this.jobs.has(t)}lock(t,e){return this.destroyed?Promise.reject(new Error("Lock is destroyed.")):null==t||e?Promise.resolve(s):this.busy.has(t)?new Promise((e,i)=>{this.jobs.has(t)||this.jobs.set(t,[]),this.jobs.get(t).push(new r(e,i))}):(this.busy.add(t),Promise.resolve(this.unlock(t)))}unlock(t){const e=this;return function i(){var r,s;!e.destroyed&&e.busy.has(t)&&(e.busy.delete(t),r=e.jobs.get(t))&&(0===r.length&&e.jobs.delete(t),s=r.shift(),0===r.length&&e.jobs.delete(t),e.busy.add(t),s.resolve(i))}}destroy(){if(!this.destroyed){this.destroyed=!0;var t=this.jobs;this.busy=new Map,this.jobs=new Map;for(const e of t.values())for(const t of e)t.reject(new Error("MappedLock was destroyed."))}}}},function(t,e,i){var r=i(11);const s=i(5).ContractEnvType,n=i(37).VerifyError,a=i(154).scItem,o=i(63).verifyData,c=i(0),h=i(36).broadcast;t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,this.data.indate?this.data.indate=this.data.height+Math.max(144,Math.min(52560,this.data.indate)):this.data.indate=this.data.height+4320,e=new a({type:this.data.type,addr:this.data.addr,dst:this.data.dst,height:this.data.height,state:1,ver:1,indate:this.data.indate}),this.data.cls&&(e.options.cls=this.data.cls,this.mode===s.Block)&&"publish"==this.data.cls&&h("sc/publish",e.options),e.do(),await t.scList.addItem(e))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e8!=i.value||!this.data)throw new n(e,"invalid","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0<t.scList.query([["options.dst",this.data.dst]]).length)throw new n(e,"Contract Register Conflict","another contract already on "+this.data.dst,100);if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new n(e,"Invalid Smart Contract","Receive address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError;var{}=i(154);const o=i(63).verifyData,c=i(0);t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,1==(e=t.scList.query([["options.dst",this.data.dst]])).list.length)&&(e.list[0].options.ver+=1,e.list[0].options.type=this.data.type,e.list[0].options.height=this.data.height,e.list[0].do(),await t.scList.addItem(e.list[0]))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e5!=i.value||!this.data)throw new a(e,"Invalid Smart Contract","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0==(t=t.scList.query([["options.dst",this.data.dst]])).list.length)throw new a(e,"Contract Not Exists","contract not exists",100);if(t.list[0].options.state!=n.Normal)throw new a(e,"Contract State Error","contract state error",100);if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new a(e,"Invalid Smart Contract","dst address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError;var{}=i(154);const o=i(63).verifyData,c=i(0);t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,1==(e=t.scList.query([["options.dst",this.data.dst]])).list.length)&&(e.list[0].options.state=this.data.state,e.list[0].options.height=this.data.height,e.list[0].do(),await t.scList.addItem(e.list[0]))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e5!=i.value||!this.data)throw new a(e,"Invalid Smart Contract","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0==(t=t.scList.query([["options.dst",this.data.dst]])).list.length)throw new a(e,"Contract Not Exists","contract not exists",100);switch(t.list[0].options.state){case n.Normal:if(this.data.state!=n.Frozen&&this.data.state!=n.Destroy)throw new a(e,"Contract State Error","contract state error",100);break;case n.Frozen:if(this.data.state!=n.Normal&&this.data.state!=n.Destroy)throw new a(e,"Contract State Error","contract state error",100);break;default:throw new a(e,"Contract State Error","contract state error",100)}if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new a(e,"Invalid Smart Contract","dst address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError,o=i(6),c=i(155),h=i(43);t.exports=class extends r{async onPacking(){var t=this.options.env,e=this.options.tx.hash("hex"),i=await t.node.cdb.get("primary"),r=this.data.$top;let s={derive:[]};var n=await i.getStatusOfSC(e);if(n.txs)for(var a of n.txs)(a=await i.getTX(a))&&s.derive.push(a.tx);else if((n=await this.getContract())&&(n={height:t.curHeight,data:this.data,tx:this.options.tx,contract:n,wallet:i},n=c(n)))if((s=await n.run()).derive&&s.derive.length<o.MAX_PACKING_SIZE){let n=[];for(var u of s.derive)if((u=await(await h.FactoryOfContract({tx:u,env:t})).onPacking()).derive){if(!(s.derive.length+n.length+u.derive.length<o.MAX_PACKING_SIZE))break;n=n.concat(u.derive)}s.derive=s.derive.concat(n),r||await i.setStatusOfSC(e,s.derive.map(t=>t.hash("hex")))}else s.derive=[];return s}async confirm(){var t,e,i;if(this.mode==s.Block)return t=this.options.env,(e=await this.getContract())&&(i=c({data:this.data,tx:this.options.tx,contract:e,wallet:await this.options.env.node.cdb.get("primary")}))&&(e.do(),await t.scList.addItem(e),await i.confirm()),!0}async unconfirm(){var t,e,i;if(this.mode==s.Block)return t=this.options.env,(e=await this.getContract())&&(i={data:this.data,tx:this.options.tx,contract:e,wallet:await this.options.env.node.cdb.get("primary")},i=c(i))&&(e.undo(),await t.scList.addItem(e),await i.unconfirm()),!0}async verify(){var t=this.options.env,e=this.options.tx,i=await this.getContract();if(!i)throw new a(e,"invalid","contract not found",100);if(i.options.state!=n.Normal)throw new a(e,"invalid","contract version conflict",100);if(this.data.params.ver&&this.data.params.ver!=i.options.ver)throw new a(e,"invalid","contract version conflict",100);if(i.options.indate<t.curHeight)throw new a(e,"invalid","contract expired",100);return e={data:this.data,tx:e,contract:i,wallet:await t.node.cdb.get("primary")},!!(i=c(e))&&i.verify()}async getContract(){if(0<this.options.tx.outputs.length){var t=this.options.tx.outputs[1].getAddress().toString();if((t=await this.options.env.node.chain.db.getSCList([["options.dst",t]]))&&0<t.list.length)return t.list[0]}return null}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){var t,e,i,r,s,n;return await this.verify()?(t=await super.run(),e=this.options.contract.options.addr,i=this.options.tx.outputs[1].value,r=this.options.wallet,n=this.options.data.params.relay,s=this.options.data.$top||0,n=await r.send({sendafter:!(r=[]),subtractFee:!1,sort:!1,outputs:[{address:n,value:i}],comment:JSON.stringify({$tag:"inner",$top:s+1,oper:"scrun",hash:this.options.tx.hash("hex"),account:e,params:this.options.data.params.params})},e),r.push(n),t.derive=r,t):{derive:[]}}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[],i=this.options.tx.outputs[1].value,r=this.options.wallet,s=this.options.contract.options.addr;let n=this.options.data.params.sim;n||(n=(a=this.options.tx.inputs[0]).getAddress().toString());var a=this.options.data.$top||0;r=await r.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:n,value:i/2}],comment:JSON.stringify({$tag:"inner",$top:a+1,hash:this.options.tx.hash("hex"),account:s})},s);return e.push(r),t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[],i=this.options.tx.outputs[1].value,r=this.options.wallet,s=this.options.contract.options.addr;let n=this.options.data.params.sim;n||(n=(a=this.options.tx.inputs[0]).getAddress().toString());var a=this.options.data.$top||0;r=await r.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:n,value:i/2}],comment:JSON.stringify({$tag:"inner",$top:a+1,hash:this.options.tx.hash("hex"),account:s})},s);return e.push(r),t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){return await this.verify()?await super.run():{derive:[]}}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[];let i=this.options.contract;var r=this.options.data.params.oper,s=this.options.wallet,n=i.options.addr;switch(r){case"pubk":{var a,o,c,h=this.options.data.params.addr,u=this.options.data.params.pubk,l=this.options.data.params.partner;"object"==typeof i.options.contacts&&!Array.isArray(i.options.contacts)||(i.options.contacts={}),l&&l.split(",").map(t=>{i.options.contacts[t]||(i.options.contacts[t]={st:0})});let t="";for(a of Object.keys(i.options.contacts))h!=a&&(o=i.options.contacts[a],c=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:a,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendpubk",$tag:"inner",hash:this.options.tx.hash("hex"),data:u,m:i.options.m,n:i.options.n,contract:i.options.dst,account:n})},n),e.push(c),o.pubk)&&(t&&(t+=","),t+=o.pubk);t&&(l=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:h,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendpubk",$tag:"inner",hash:this.options.tx.hash("hex"),data:t,contract:i.options.dst,account:n})},n),e.push(l)),i.options.contacts[h]?i.options.contacts[h].pubk||(i.options.contacts[h].pubk=u):i.options.contacts[h]={pubk:u,st:0};break}case"puba":{var p,d=this.options.data.params.addr,f=this.options.data.params.puba;let t=!0;for(p of(i.options.puba=i.options.puba||f,Object.keys(i.options.contacts))){var m=i.options.contacts[p];p==d&&i.options.puba==f&&(m.st=1),1!=m.st&&(t=!1)}i.options.status=t;break}case"sign":if(1==i.options.status){var g,y,v=this.options.data.params.addr;for(g of Object.keys(i.options.contacts))g!=v&&(y=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:g,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendtx",$tag:"inner",hash:this.options.tx.hash("hex"),data:this.options.data.params.tx,contract:i.options.dst,account:n})},n),e.push(y))}break;default:return t}return t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){var r=i(11);const s=i(5).ContractEnvType,n=i(36).broadcast;t.exports=class extends r{async confirm(){var t;this.mode==s.Wallet&&(t=this.options.tx.outputs[1])&&(this.data.addr=t.getAddress().toString(),this.options.env.emit(this.data.type+"/receive",this.data),n(this.data.type+"/receive",this.data))}async verify(){return!0}}},function(t,e,i){const r=i(0);var s=i(11);const n=i(5).PropStatus;t.exports=class extends s{async confirm(){var t=this.options.env,e=await t.propList.getVp(this.data.ori.pid);return e&&(e.pst=n.Delete,await t.propList.setVp(e)),!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=await t.propList.getVp(this.data.ori.pid);return i&&i.current.hash==e.inputs[0].prevout.hash&&i.current.index==e.inputs[0].prevout.index&&(i.pst=n.Ready,await t.propList.setVp(i)),!0}async verify(){var t=this.options.env,e=this.options.tx,i=this.data;return!(!i.ori||!i.ori.pid||t.network.stockReg.test(i.ori.pid)||t.network.tokenReg.test(i.ori.pid)||!(t=await t.propList.getVp(i.ori.pid))||t.pst!=n.Ready||(r.strictEqual(t.current.hash,e.inputs[0].prevout.hash),r.strictEqual(t.current.index,e.inputs[0].prevout.index),0))}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractType:n}=i(5),a=i(6),o=i(21).opcodes;t.exports=class extends r{async confirm(){return this.options.env,this.options.tx.hash("hex"),this.mode===s.Block&&await this.HandleVoteTrans(!1),!0}async unconfirm(){return this.options.env,this.options.tx,this.mode===s.Block&&await this.HandleVoteTrans(!0),!0}async HandleVoteTrans(t){var e=this.options.env,i=this.options.tx,r=this.options.tx.outputs[0].script.code;if(r[0].value==o.OP_RETURN)try{var s=JSON.parse(Buffer.from(r[1].data).toString());if(s&&s.oper==n.vote)switch(s.type){case"mine":{let r=0;for(var c of i.inputs){var h,u=await e.getExtendTX(c.prevout.hash);u&&e.voteMgr.isIn(u.height)?(h=u.tx.outputs[c.prevout.index])&&h.value?r+=h.value/a.COIN|0:e.logger.warning("Voting: Invalid UTXO Info"):e.logger.warning("Voting: Invalid UTXO Height")}0<r&&await e.voteMgr.calcVote(r,s.ca,t);break}case"oracle":{let r=0;for(var l of i.inputs){var p,d=await e.getExtendTX(l.prevout.hash);d&&e.voteMgr.isIn(d.height)?(p=d.tx.outputs[l.prevout.index])&&p.value?r+=p.value/1e5|0:e.logger.warning("Oracle: Invalid UTXO Info"):e.logger.warning("Oracle: Invalid UTXO Height")}0<r&&await e.voteMgr.calcOracle(r,{k:s.k,v:s.v},t);break}}}catch(r){console.log(r)}}async verify(){return!0}}},function(t,e,i){const r=i(0);var s=i(11);const{BlockFinalType:n,ContractEnvType:a,ContractType:o,PropStatus:c}=i(5),h=i(37).VerifyError,u=i(6),l=i(36).broadcast,p=i(1);t.exports=class extends s{async insert(){var t=this.options.env,e=this.options.tx,i=2<e.outputs.length?e.outputs[2].getReturnData():null,s=await t.propList.getVp(this.data.pid);if(i){if(this.mode==a.Wallet&&s.bid&&(i=await t.getTX(s.bid.hash))&&(i=await t.getWalletsByTX(i)))for(const e of i){var n=await t.get(e);r(n),await n.remove(s.bid.hash)}i=e.outputs[1].value;var o=e.outputs[2].getAddress().toString();i>=this.data.fixed||t.curHeight>=this.data.period&&i>s.gold?(Reflect.deleteProperty(s,"bid"),s.current={hash:this.options.hash,index:2,address:o},s.pst=c.Ready,await t.propList.setVp(s,e),t.network.stockReg.test(s.pid)&&(e=t.cpList.getItem(s.cid))&&(e.status=1,await t.cpList.addItem(e)),this.mode==a.Wallet&&(e={pid:s.pid,address:s.current.address,wid:s.wid,account:s.account,time:p.now(),height:-1,cid:s.cid},t.emit("prop/auction",e),l("prop/auction",e))):(s.pst=c.Sale,s.bid={},s.bid.raw=this.options.raw,s.bid.fixed=this.data.fixed,s.bid.period=this.data.period,s.bid.hash=this.options.hash,s.bid.value=i,s.bid.address=o,await t.propList.setVp(s))}else s.pst=c.Sale,s.bid={},s.bid.raw=this.options.raw,s.bid.fixed=this.data.fixed,s.bid.period=this.data.period,s.bid.hash=this.options.hash,s.bid.value=s.gold,s.bid.address="",await t.propList.setVp(s);return!0}async erase(){var t,e=this.options.env,i=2<(r=this.options.tx).outputs.length?r.outputs[2].getReturnData():null,r=r.inputs[0],s=await e.propList.getVp(this.data.pid);s&&(i?(i=await e.getExtendTX(r.prevout.hash))&&(t=i.tx.outputs[r.prevout.index],s.current={hash:r.prevout.hash,index:r.prevout.index,address:t.getAddress().toString()},s.bid={hash:this.options.hash,value:s.gold,address:"",raw:this.options.raw,fixed:this.data.fixed,period:this.data.period},s.pst=c.Sale,await e.propList.setVp(s,i.tx)):(Reflect.deleteProperty(s,"bid"),s.pst=c.Ready,await e.propList.setVp(s)))}async confirm(){var t=this.options.env,e=this.options.tx,i=e.hash("hex"),r=e.outputs[2].getAddress().toString(),s=await t.propList.getVp(this.data.pid);return Reflect.deleteProperty(s,"bid"),s.current={hash:i,index:2,address:r},s.height=this.options.coinbaseHeight,s.pst=c.Ready,await t.propList.setVp(s,e),t.network.stockReg.test(s.pid)&&(i=t.cpList.getItem(s.cid))&&(i.status=1,await t.cpList.addItem(i)),this.mode==a.Wallet&&(r={pid:s.pid,address:s.current.address,wid:s.wid,account:s.account,time:this.options.block.time,height:s.height,cid:s.cid},t.emit("prop/auction",r),l("prop/auction",r)),!0}async unconfirm(){var t,e,i=this.options.env,r=this.options.tx,s=r.inputs[0].prevout,n=await i.getExtendTX(s.hash);return n?(t=(e=n.tx.outputs[s.index]).getReturnData(),(t=await i.propList.getVp(t.pid))&&(t.current={hash:s.hash,index:s.index,address:e.getAddress().toString()},t.height=n.height-1,await i.propList.setVp(t,r)),i.network.stockReg.test(t.pid)&&(s=i.cpList.getItem(t.cid))&&(s.status=1,await i.cpList.addItem(s)),this.mode==a.Wallet&&(e={pid:t.pid,address:t.current.address,wid:t.wid,account:t.account,time:this.options.block.time,height:t.height,cid:t.cid},i.emit("prop/auction",e),l("prop/auction",e))):this.mode==a.Wallet&&(n=await i.propList.getVp(this.data.pid),await i.propList.delVp(n)),!0}async verify(){var t=this.data,e=this.options.env,i=this.options.tx,s=2<i.outputs.length?i.outputs[2].getReturnData():null,n=await e.propList.getVp(t.pid);if(!n)return!1;switch(this.mode){case a.Mempool:if(r.strictEqual(t.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(t.prev.index,i.inputs[0].prevout.index),r(e.curHeight+u.BLOCK_DAY>=this.data.period),r(t.cid!=e.network.genesisId),s){if(n.period<e.curHeight)throw new h(i,"sale order expired","contract",0);if(r.strictEqual(s.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(s.prev.index,i.inputs[0].prevout.index),r.strictEqual(s.pid,t.pid),r.strictEqual(s.oper,o.propExchange),!n.bid)throw new h(i,"sale order lack bid info","contract",0);if(n.bid.value>=this.data.fixed)throw new h(i,"can not bid on sale order finished","contract",0);if(i.outputs[1].value<=n.bid.value||i.outputs[1].value<=n.gold)throw new h(i,"invalid bid price","contract",0);var l=await e.getTX(n.bid.hash);l&&await e.removeDoubleSpenders(l)}else r(n.pst===c.Ready);break;case a.Block:if(r.strictEqual(t.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(t.prev.index,i.inputs[0].prevout.index),r(t.cid!=e.network.genesisId),r.strictEqual(s.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(s.prev.index,i.inputs[0].prevout.index),r.strictEqual(s.pid,t.pid),r.strictEqual(s.oper,o.propExchange),i.outputs[1].value<=n.gold)throw new h(i,"invalid bid price","contract",0)}return!0}isBlockFinal(){var t=this.options.env,e=this.options.tx;return this.data.period<t.curHeight?n.Expired:2<=e.outputs.length&&(e.outputs[1].value>=this.data.fixed||this.data.period==t.curHeight&&e.outputs[1].value>=e.outputs[2].value)?n.Final:n.Waiting}isPreVerify(){var t=this.options.tx;return!!(2<t.outputs.length&&t.outputs[2].getReturnData())}}},function(t,e,i){var r=i(11);const{OrderData:s,ContractEnvType:n,BlockFinalType:a,VerifyCode:o}=i(5),c=i(26),h=i(85).stockItem,u=i(60),l=i(27),p=i(36).broadcast,d=i(1),f=i(6);t.exports=class extends r{async insert(){if(this.mode!=n.Wallet){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i);if(2==e.outputs.length){let s=this.data.sum,n=0;const p=u.fromTX(e);p.outputs.pop(),p.view=await t.getSpentViewUnLock(p);var a,h=p.getInputValue();let d=await t.getCpSnap(this.data.cid);if(!d)return o.SnapNull;r&&d.grate&&d.grate<50&&0<d.grate&&(g=s/100*d.grate|0,p.outputs.push(c.fromScript(r,g)),s-=g),d.addresses.map(t=>{var e=s/100*d.lords[t]*3|0;p.outputs.push(c.fromScript(t,e)),n+=e});let y=0;for(a of d.slist)if(!(a.sum>d.hSum)){var m=s/(f.STOCK_ORIENT+d.hSum)*a.sum|0;if(p.outputs.push(c.fromScript(a.addr,m)),n+=m,(y+=a.sum)>=d.hSum)break}p.outputs.push(c.fromScript(d.addrOfMaster,s-n)),p.outputs.push(c.fromScript(i,0));var g=await p.getSigopsSize(),[h]=(i=h-this.data.sum-l.getMinFee(g),0<i?p.outputs[p.outputs.length-1].value=i:p.outputs.pop(),p.commit());await t.removeDoubleSpenders(e),await t._addTX(h)}else(g=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r)).publish=t.curHeight,g.height=-1,g.hash=this.options.hash,await t.addOrder(g),-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=-1,this.data.confirm=0,this.data.time=d.now(),t.emit("contract.order.add",this.data),p("cp/orderPay",this.data))}return!0}async confirm(){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i),a=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r);switch(a.publish=t.curHeight,a.height=this.options.coinbaseHeight,a.hash=this.options.hash,this.mode){case n.Wallet:{let i=0;for(let s=1;s<=e.outputs.length-3;s++){var o,c=e.outputs[s],u=c.getAddress().toString();1==s&&r&&u==r?(i=1,(o=new h).height=this.options.coinbaseHeight,o.txid=e.txid(),o.type=h.RecordType.Ads,o.cid=this.data.cid,o.addr=u,o.price=c.value,await t.cpList.stockAds(o)):s>i&&((o=new h).height=this.options.coinbaseHeight,o.txid=e.txid(),o.type=h.RecordType.Bonus,o.cid=this.data.cid,o.addr=u,o.price=c.value,await t.cpList.stockBonus(o))}break}case n.Block:{await t.addOrder(a);let i=0;for(let s=1;s<=e.outputs.length-3;s++){var l,d=e.outputs[s],f=d.getAddress().toString();1==s&&r&&f==r?(i=1,(l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Ads,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockAds(l)):s>i&&((l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Bonus,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockBonus(l))}-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=this.options.coinbaseHeight,this.data.confirm=1,this.data.time=this.options.block.time,t.emit("contract.order.confirm",this.data),p("cp/orderPay",this.data));break}}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i);switch(this.mode){case n.Wallet:{let i=0;for(let s=1;s<=e.outputs.length-3;s++){var a,o=e.outputs[s],c=o.getAddress().toString();1==s&&r&&c==r?(i=1,(a=new h).height=this.options.coinbaseHeight,a.txid=e.txid(),a.type=h.RecordType.Ads,a.cid=this.data.cid,a.addr=c,a.price=o.value,await t.cpList.stockCancelAds(a)):s>i&&((a=new h).height=this.options.coinbaseHeight,a.txid=e.txid(),a.type=h.RecordType.Bonus,a.cid=this.data.cid,a.addr=c,a.price=o.value,await t.cpList.stockCancelBonus(a))}break}case n.Block:{var u=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r);u.publish=t.curHeight,u.height=-1,u.hash=this.options.hash,await t.addOrder(u);let i=0;for(let s=1;s<=e.outputs.length-3;s++){var l,d=e.outputs[s],f=d.getAddress().toString();1==s&&r&&f==r?(i=1,(l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Ads,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockCancelAds(l)):s>i&&((l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Bonus,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockCancelBonus(l))}-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=-1,this.data.confirm=0,this.data.time=this.options.block.time,t.emit("contract.order.unconfirm",this.data),p("cp/orderPay",this.data));break}}return!0}async erase(){var t;return this.mode!=n.Wallet&&(t=this.options.env,2<this.options.tx.outputs.length)&&(this.data.confirm=0,t.emit("contract.order.remove",this.data)),!0}async verify(){var t=this.options.env,e=this.options.tx,i=u.fromTX(e),r=(i.view=this.options.coins||null,this.mode==n.Mempool&&(i.view=await t.node.mempool.getSpentViewUnLock(e)),i.getInputValue());if(r<this.data.sum)return!1;if(e.outputs.length<2)return!1;if(2!=e.outputs.length){var s=this.data.addr,a=await t.getGuider(s);let n=this.data.sum;var c=await t.getCpSnap(this.data.cid);if(!c)return o.SnapNull;let u=0,g=0;for(let t=1;t<e.outputs.length;t++){var h=e.outputs[t],p=h.getAddress().toString();if(1==t&&a&&p==a){if(g=1,!(c.grate&&c.grate<20&&0<c.grate))return!1;if(h.value!=n/100*c.grate|0)return!1;n-=h.value}else if(t<=c.addresses.length+g){if(h.value!=n/100*c.lords[p]*3|0||p!=c.addresses[t-g-1])return!1;u+=h.value}else if(t<=c.addresses.length+g+c.slist.length){var d=c.slist[t-c.addresses.length-g-1],m=n/(f.STOCK_ORIENT+c.hSum)*d.sum|0;if(h.value!=m||p!=d.addr)return!1;u+=h.value}else if(t==c.addresses.length+g+c.slist.length+1){if(p!=c.addrOfMaster||h.value!=n-u)return!1}else if(m=await i.getSigopsSize(),d=r-this.data.sum-l.getMinFee(m),p!=s||h.value!=d)return!1}}return!0}isBlockFinal(){this.options.env;var t=this.options.tx;return t.outputs.length<2?a.Expired:2==t.outputs.length?a.Waiting:a.Final}async checkFees(){return!0}}},function(t,e,i){const r=i(0),s=i(108),{ContractEnvType:n,BlockFinalType:a}=i(5);var o=i(11);const c=i(6),h=i(36).broadcast,u=i(7),l=i(12);t.exports=class extends o{async insert(){var t=this.options.env,e=this.options.tx;switch(this.data.body.dst=e.outputs[1].getAddress().toString(),this.mode){case n.Mempool:try{var i=JSON.parse(this.data.body.content);switch(i.cmd){case"peerdel":r(this.data.body.dst==t.node.config.notifyAddress),r(l.fromString(this.data.body.dst).hash.toString("hex")==u.hash160(Buffer.from(i.pub,"hex")).toString("hex")),r(s.verifyObj(i.payload,i.sig,i.pub)),await t.node.rpc._delPeer([i.payload.host]);break;case"peeradd":r(this.data.body.dst==t.node.config.notifyAddress),r(l.fromString(this.data.body.dst).hash.toString("hex")==u.hash160(Buffer.from(i.pub,"hex")).toString("hex")),r(s.verifyObj(i.payload,i.sig,i.pub)),await t.node.rpc._addPeer([i.payload.host,i.payload.key])}}catch(t){}break;case n.Wallet:if(t.NotifyList.get(this.data.sn))return;var a=this.data.body.dst,[a,o]=await t.getAccountByAddress(a,e);this.data.account=o,this.data.wid=a,t.emit("notify/receive",this.data),h("notify/receive",this.data),await t.NotifyList.set(this.data.sn,this.data)}return!0}async confirm(){}async unconfirm(){}async erase(){var t=this.options.env;return this.options.tx,this.mode===n.Wallet&&(await t.NotifyList.delete(this.data.sn),t.emit("notify/remove",this.data),h("notify/remove",this.data)),!0}async verify(){var t=this.options.env,e=this.options.tx;return!(e.getOutputValue()<.1*c.COIN||2<e.outputs.length||this.data.h>t.curHeight)}isBlockFinal(){var t=this.options.env;return this.data.h<t.curHeight-6?a.Expired:a.Waiting}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractStatus:n,BlockFinalType:a}=i(5),o=i(37).VerifyError;t.exports=class extends r{async insert(){var t=this.options.env;return this.data.period<t.curHeight?await t.transactionList.delTransContract(this.data,!0):(this.data.current={hash:this.options.hash,index:0},this.data.raw=this.options.raw,await t.transactionList.addTransContract(s.Mempool,this.data)),!0}async erase(){var t=this.options.env;switch(this.mode){case s.Mempool:await t.transactionList.delTransContract(this.data);break;case s.Wallet:await t.transactionList.delTransContract(this.data,!0)}}async verify(){var t=this.options.env,e=this.options.tx;if(this.data.period<t.curHeight)throw new o(e,"transaction contract expired","contract",0);if(t.transactionList.query(this.data.type,this.data.addr)!=n.None)throw new o(e,"Same Address Contract Finded","contract",0);return!0}isBlockFinal(){var t=this.options.env;return this.data.period<t.curHeight?a.Expired:a.Waiting}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractStatus:n}=i(5),a=i(109);t.exports=class extends r{async confirm(){var t=this.options.env;let e=n.Backed;switch(2==this.data.master&&(e=n.Exchanged),this.mode){case s.Block:var i=t.transactionList.get(this.data.type+"."+this.data.addr);i?(i.transStatus=e,await t.transactionList.saveContract(i,!0)):await t.transactionList.addTransContract(s.Block,this.data,!0);break;case s.Wallet:(i=t.transactionList.get(this.data.type+"."+this.data.addr))?(i.transStatus=e,await t.transactionList.saveContract(i,!0)):await t.transactionList.addTransContract(s.Wallet,this.data,!0)}return!0}async verify(){var t=this.options.env;switch(this.mode){case s.Mempool:case s.Block:case s.Wallet:{var e=this.data.master,i=t.transactionList.get(this.data.type+"."+this.data.addr);let r=i.transStatus;return r!==n.Expired&&r!==n.Confirmed&&r!==n.Backed&&r!==n.Exchanged&&(i=new a(t.network.txcheckpoint,i),[,r]=await i.execute(t)),(r===n.Expired||r===n.Confirmed||r===n.Backed||r===n.Exchanged)&&!(r==n.Expired&&1!=e||r==n.Confirmed&&2!=e||r==n.Backed&&1!=e||r==n.Exchanged&&2!=e)}}}}},function(t,e,i){var r=i(11);const{VerifyCode:s,ContractEnvType:n}=i(5),a=i(63).verifyData,o=i(85).stockItem,c=i(6),h=i(36).broadcast;t.exports=class extends r{async confirm(){var t,e=this.options.env,i=this.options.tx,r=(this.data.txid=i.txid(),o.fromObj(this.data));switch(r.type){case o.RecordType.Offer:await e.cpList.stockOffer(r),this.mode==n.Block&&(t=e.cpList.getRecord(r.cid))&&h("cp/stock",t);break;case o.RecordType.Purchase:if(await e.cpList.stockPurchase(r),this.mode==n.Block)try{var s=await e.accountList.query([["cid",r.cid]]);r.support=s.list.length,(s=e.cpList.getRecord(r.cid))&&(r.sum_left=s.stock.sum),h("cp/stockPurchase",r)}catch(t){}break;case o.RecordType.Bid:await e.cpList.stockBid(r),this.mode==n.Block&&h("cp/stockBid",r);break;case o.RecordType.Auction:await e.cpList.stockAuction(r),this.mode==n.Block&&h("cp/stockAuction",r);break;case o.RecordType.Send:await e.cpList.stockSend(r)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=(this.data.txid=e.txid(),o.fromObj(this.data));switch(i.type){case o.RecordType.Offer:t.cpList.stockCancelOffer(i);break;case o.RecordType.Bid:t.cpList.stockCancelBid(i);break;case o.RecordType.Auction:t.cpList.stockCancelAuction(i);break;case o.RecordType.Purchase:t.cpList.stockCancelPurchase(i);break;case o.RecordType.Send:t.cpList.stockCancelSend(i)}return!0}async verify(){var t=this.options.env,e=this.options.tx,i=t.accountList;if(!a(this.data.body))return s.SignFailed;if(this.data.h>t.curHeight)return s.WrongHeight;var r=this.data.body.data,h=t.cpList.getItem(r.cid);if(!h)return s.WrongPublisher;if(!r.sum||r.sum<c.STOCK_TRADE_SINGLE)return s.WrongSum;switch(r.type){case o.RecordType.Offer:if(2<e.outputs.length)return s.WrongFormat;if(h.current.address!=r.addr)return s.WrongPublisher;if(r.price<c.GRAM||r.price>c.STOCK_MAX_PRICE)return s.WrongPrice;if(r.sum<=0||r.sum>c.STOCK_ADDED_SINGLE||h.stock.hSum+r.sum>c.STOCK_ADDED)return s.WrongSum;if(h.stock.hBonus<.3*h.stock.hSum*h.stock.hPrice)return s.WrongBonus;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<.05*r.sum*r.price)return s.WrongFee}if(h.stock.hHeight){if(this.data.h-h.stock.height<=c.BLOCK_DAY*c.STOCK_OFFER_PERIOD)return s.StockOffering;if(this.data.h-h.stock.height<=c.BLOCK_DAY*c.STOCK_OFFER_CD)return s.StockCooling;if(this.data.body.data.price<h.stock.lastPrice||this.data.body.data.price>4*h.stock.lastPrice)return s.WrongPrice}break;case o.RecordType.Bid:if(h.stock.price<c.GRAM||h.stock.price>c.STOCK_MAX_PRICE)return s.WrongPrice;if(r.sum<c.STOCK_TRADE_SINGLE||r.sum>c.STOCK_MAX_TRADE_SINGLE)return s.WrongSum;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<.05*r.sum*r.price)return s.WrongFee}var u=i.getStockAccount(r.cid,r.addr);if(!u)return s.StockAccountNotExist;if(u.seq+1!==r.seq)return s.AccountSequenceWrong;if(u.sum<r.sum)return s.StockAccountNotEnoughSum;if(u.stock.period>=this.data.h)return s.StockOffering;break;case o.RecordType.Auction:{if(!(u=i.getStockAccount(r.cid,r.to)))return s.StockAccountNotExist;if(r.to==r.addr)return s.WrongPublisher;if(u.stock.sum<r.sum)return s.StockAccountNotEnoughSum;var l=i.getStockAccount(r.cid,r.addr);let t=0;if((t=l?l.seq:t)+1!==r.seq)return s.AccountSequenceWrong;if(u.stock.period<this.data.h)return s.StockOfferExpired;if((this.mode==n.Block||this.mode==n.Mempool)&&(l=e.outputs[1],r.price!=u.stock.price||l.getAddress().toString()!=u.addr||l.value!=r.sum*u.stock.price))return s.FundNotEnough;break}case o.RecordType.Purchase:{if(h.current.address!==r.to)return s.WrongPublisher;if(!h.stock.hHeight)return s.StockOfferExpired;if(this.data.h-h.stock.height>c.BLOCK_DAY*c.STOCK_OFFER_PERIOD)return s.StockOfferExpired;if(h.stock.sum<r.sum)return s.StockAccountNotEnoughSum;let a=0;if((a=(l=i.getStockAccount(r.cid,r.addr))?l.seq:a)+1!==r.seq)return s.AccountSequenceWrong;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<r.sum*r.price)return s.FundNotEnough}break}case o.RecordType.Send:if(!(u=i.getStockAccount(r.cid,r.addr)))return s.StockAccountNotExist;if(r.to==r.addr)return s.WrongPublisher;if(u.seq+1!==r.seq)return s.AccountSequenceWrong;if(u.sum<r.sum)return s.StockAccountNotEnoughSum}return!0}isPreVerify(){var t=this.options.tx;return(t=(this.data.txid=t.txid(),o.fromObj(this.data))).type===o.RecordType.Bid}async checkFees(){return!0}}},function(t,e,i){i=i(11);t.exports=class extends i{async insert(){var t=this.options.env,e=this.options.tx;for(let s=1;s<e.outputs.length;s++){var i=e.outputs[s],r=i.getAddress().toString();1e5==i.value&&t.setGuider(this.data.addr,this.data.cid,r)}return!0}async confirm(){return!0}async unconfirm(){return!0}async erase(){var t=this.options.env,e=this.options.tx;for(let r=1;r<e.outputs.length;r++){var i=e.outputs[r].getAddress().toString();t.unsetGuider(this.data.addr,this.data.cid,i)}return!0}async verify(){return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,VerifyCode:n}=i(5),a=i(157).ErItem,o=i(39),c=i(7),h=i(12),u=i(36).broadcast;t.exports=class extends r{async insert(){return!0}async confirm(){var t=this.options.env,e=this.options.tx;switch(this.data.startHeight=t.curHeight,await t.erList.setEr(this.data,e),this.mode){case s.Wallet:var i=h.fromWitnessPubkeyhash(c.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);i&&r&&(this.data.account=r,this.data.wid=i,t.emit("ca/issue",this.data),u("ca/issue",this.data));break;case s.Block:t.node.transmit("ca.issue",this.data),r=o.fromPrivate(Buffer.from(t.node.config.alliancePrivateKey,"hex"),!0,t.network),o.fromPrivate(c.hash256(Buffer.concat([Buffer.from(this.data.source.cid+"-"+this.data.source.uid),r.privateKey]),!0,t.network)).publicKey.toString("hex")==this.data.witness&&t.node.transmit("ca.issue.alliance",this.data)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx;switch(t.erList.delEr(this.data,e),this.mode){case s.Wallet:var i=h.fromWitnessPubkeyhash(c.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/unissue",this.data),u("ca/unissue",this.data);break;case s.Block:t.node.transmit("ca.unissue",this.data)}return!0}async erase(){return!0}async verify(){var t=this.options.env,e=this.data;t=o.fromPublic(Buffer.from(e.witness,"hex"),t.network);return!!new a(e).verifying(t)||n.SignatureNotMatch}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,VerifyCode:n,ContractType:a}=i(5),o=i(158).ErAbolishItem,c=i(39),h=i(36).broadcast,u=i(7),l=i(12);t.exports=class extends r{async insert(){return!0}async confirm(){var t=this.options.env,e=this.options.tx;switch(this.data.startHeight=t.curHeight,await t.erAbList.setErAb(this.data,e),this.mode){case s.Wallet:var i=l.fromWitnessPubkeyhash(u.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/abolish",this.data),h("ca/abolish",this.data);break;case s.Block:t.node.transmit("ca.abolish",this.data)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx;switch(t.erAbList.delErAb(this.data,e),this.mode){case s.Wallet:var i=l.fromWitnessPubkeyhash(u.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/unabolish",this.data),h("ca/unabolish",this.data);break;case s.Block:t.node.transmit("ca.unabolish",this.data)}return!0}async erase(){return!0}async verify(){var t=this.options.env,e=this.data,i=await t.erList.getEr(e.erid);return i&&i.witness==e.witness?e&&e.oper==a.erAbolish&&(i=await t.erAbList.getErAb(e.erid))&&e.abolishHeight>=i.abolishHeight?n.NotExistER:(i=c.fromPublic(Buffer.from(e.witness,"hex"),t.network),!!new o(e).verifying(i)||n.SignatureNotMatch):n.SignatureNotMatch}}},function(t,e,i){var r=i(11);const{VerifyCode:s,ContractEnvType:n}=i(5),a=i(237).EnchancementItem,o=i(39);t.exports=class extends r{async insert(){return!0}async confirm(){var t,e;return this.mode==n.Block&&(t=this.options.env,e=this.options.tx,this.data.enchanceTx=e.txid(),t.enCpList.setEn(this.data),!0)}async unconfirm(){var t,e;return this.mode==n.Block&&(t=this.options.env,e=this.options.tx,t.enCpList.delEn(this.data,e),!0)}async erase(){return!0}async verify(){var t=this.options.env,e=this.options.tx,i=this.data,r=t.cpList.getItem(i.to);e=e.outputs[1].getAddress().toString();return r&&r.pubAddress&&r.pubAddress==e&&(r=t.cpList.getItem(i.from))&&r.pubAddress&&r.pubKey?(e=o.fromPublic(Buffer.from(r.pubKey,"hex"),t.network),!!new a(i).verifying(e)||s.SignatureNotMatch):s.NotExistCp}}},function(t,e,i){"use strict";
|
|
458
|
+
*/function r(t,e){this.resolve=t,this.reject=e}function s(){}t.exports=class{constructor(){this.jobs=new Map,this.busy=new Set,this.destroyed=!1}has(t){return this.busy.has(t)}hasPending(t){return this.jobs.has(t)}lock(t,e){return this.destroyed?Promise.reject(new Error("Lock is destroyed.")):null==t||e?Promise.resolve(s):this.busy.has(t)?new Promise((e,i)=>{this.jobs.has(t)||this.jobs.set(t,[]),this.jobs.get(t).push(new r(e,i))}):(this.busy.add(t),Promise.resolve(this.unlock(t)))}unlock(t){const e=this;return function i(){var r,s;!e.destroyed&&e.busy.has(t)&&(e.busy.delete(t),r=e.jobs.get(t))&&(0===r.length&&e.jobs.delete(t),s=r.shift(),0===r.length&&e.jobs.delete(t),e.busy.add(t),s.resolve(i))}}destroy(){if(!this.destroyed){this.destroyed=!0;var t=this.jobs;this.busy=new Map,this.jobs=new Map;for(const e of t.values())for(const t of e)t.reject(new Error("MappedLock was destroyed."))}}}},function(t,e,i){var r=i(11);const s=i(5).ContractEnvType,n=i(37).VerifyError,a=i(154).scItem,o=i(63).verifyData,c=i(0),h=i(36).broadcast;t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,this.data.indate?this.data.indate=this.data.height+Math.max(144,Math.min(52560,this.data.indate)):this.data.indate=this.data.height+4320,e=new a({type:this.data.type,addr:this.data.addr,dst:this.data.dst,height:this.data.height,state:1,ver:1,indate:this.data.indate}),this.data.cls&&(e.options.cls=this.data.cls,this.mode===s.Block)&&"publish"==this.data.cls&&h("sc/publish",e.options),e.do(),await t.scList.addItem(e))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e8!=i.value||!this.data)throw new n(e,"invalid","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0<t.scList.query([["options.dst",this.data.dst]]).length)throw new n(e,"Contract Register Conflict","another contract already on "+this.data.dst,100);if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new n(e,"Invalid Smart Contract","Receive address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError;var{}=i(154);const o=i(63).verifyData,c=i(0);t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,1==(e=t.scList.query([["options.dst",this.data.dst]])).list.length)&&(e.list[0].options.ver+=1,e.list[0].options.type=this.data.type,e.list[0].options.height=this.data.height,e.list[0].do(),await t.scList.addItem(e.list[0]))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e5!=i.value||!this.data)throw new a(e,"Invalid Smart Contract","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0==(t=t.scList.query([["options.dst",this.data.dst]])).list.length)throw new a(e,"Contract Not Exists","contract not exists",100);if(t.list[0].options.state!=n.Normal)throw new a(e,"Contract State Error","contract state error",100);if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new a(e,"Invalid Smart Contract","dst address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError;var{}=i(154);const o=i(63).verifyData,c=i(0);t.exports=class extends r{async confirm(){var t,e;this.mode==s.Block&&(t=this.options.env,e=this.options.tx,this.data.dst=e.outputs[1].getAddress().toString(),this.data.height=this.options.coinbaseHeight,1==(e=t.scList.query([["options.dst",this.data.dst]])).list.length)&&(e.list[0].options.state=this.data.state,e.list[0].options.height=this.data.height,e.list[0].do(),await t.scList.addItem(e.list[0]))}async unconfirm(){this.mode==s.Block&&await this.options.env.scList.delItem(this.data)}async verify(){var t=this.options.env,e=this.options.tx,i=e.outputs[1];if(!i||1e5!=i.value||!this.data)throw new a(e,"Invalid Smart Contract","null scRegister data",100);var r=this.data.sig;delete this.data.sig,c.strictEqual(!0,o({data:this.data,sig:r})),r=await t.node.cdb.get("primary");if(0==(t=t.scList.query([["options.dst",this.data.dst]])).list.length)throw new a(e,"Contract Not Exists","contract not exists",100);switch(t.list[0].options.state){case n.Normal:if(this.data.state!=n.Frozen&&this.data.state!=n.Destroy)throw new a(e,"Contract State Error","contract state error",100);break;case n.Frozen:if(this.data.state!=n.Normal&&this.data.state!=n.Destroy)throw new a(e,"Contract State Error","contract state error",100);break;default:throw new a(e,"Contract State Error","contract state error",100)}if(await r.ensureAccount({name:this.data.addr,witness:!0}),(await r.createReceive(this.data.addr,1)).getAddress("string")!=i.getAddress().toString())throw new a(e,"Invalid Smart Contract","dst address error",100);return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractState:n}=i(5),a=i(37).VerifyError,o=i(6),c=i(155),h=i(43);t.exports=class extends r{async onPacking(){var t=this.options.env,e=this.options.tx.hash("hex"),i=await t.node.cdb.get("primary"),r=this.data.$top;let s={derive:[]};var n=await i.getStatusOfSC(e);if(n.txs)for(var a of n.txs)(a=await i.getTX(a))&&s.derive.push(a.tx);else if((n=await this.getContract())&&(n={height:t.curHeight,data:this.data,tx:this.options.tx,contract:n,wallet:i},n=c(n)))if((s=await n.run()).derive&&s.derive.length<o.MAX_PACKING_SIZE){let n=[];for(var u of s.derive)if((u=await(await h.FactoryOfContract({tx:u,env:t})).onPacking()).derive){if(!(s.derive.length+n.length+u.derive.length<o.MAX_PACKING_SIZE))break;n=n.concat(u.derive)}s.derive=s.derive.concat(n),r||await i.setStatusOfSC(e,s.derive.map(t=>t.hash("hex")))}else s.derive=[];return s}async confirm(){var t,e,i;if(this.mode==s.Block)return t=this.options.env,(e=await this.getContract())&&(i=c({data:this.data,tx:this.options.tx,contract:e,wallet:await this.options.env.node.cdb.get("primary")}))&&(e.do(),await t.scList.addItem(e),await i.confirm()),!0}async unconfirm(){var t,e,i;if(this.mode==s.Block)return t=this.options.env,(e=await this.getContract())&&(i={data:this.data,tx:this.options.tx,contract:e,wallet:await this.options.env.node.cdb.get("primary")},i=c(i))&&(e.undo(),await t.scList.addItem(e),await i.unconfirm()),!0}async verify(){var t=this.options.env,e=this.options.tx,i=await this.getContract();if(!i)throw new a(e,"invalid","contract not found",100);if(i.options.state!=n.Normal)throw new a(e,"invalid","contract version conflict",100);if(this.data.params.ver&&this.data.params.ver!=i.options.ver)throw new a(e,"invalid","contract version conflict",100);if(i.options.indate<t.curHeight)throw new a(e,"invalid","contract expired",100);return e={data:this.data,tx:e,contract:i,wallet:await t.node.cdb.get("primary")},!!(i=c(e))&&i.verify()}async getContract(){if(0<this.options.tx.outputs.length){var t=this.options.tx.outputs[1].getAddress().toString();if((t=await this.options.env.node.chain.db.getSCList([["options.dst",t]]))&&0<t.list.length)return t.list[0]}return null}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){var t,e,i,r,s,n;return await this.verify()?(t=await super.run(),e=this.options.contract.options.addr,i=this.options.tx.outputs[1].value,r=this.options.wallet,n=this.options.data.params.relay,s=this.options.data.$top||0,n=await r.send({sendafter:!(r=[]),subtractFee:!1,sort:!1,outputs:[{address:n,value:i}],comment:JSON.stringify({$tag:"inner",$top:s+1,oper:"scrun",hash:this.options.tx.hash("hex"),account:e,params:this.options.data.params.params})},e),r.push(n),t.derive=r,t):{derive:[]}}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[],i=this.options.tx.outputs[1].value,r=this.options.wallet,s=this.options.contract.options.addr;let n=this.options.data.params.sim;n||(n=(a=this.options.tx.inputs[0]).getAddress().toString());var a=this.options.data.$top||0;r=await r.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:n,value:i/2}],comment:JSON.stringify({$tag:"inner",$top:a+1,hash:this.options.tx.hash("hex"),account:s})},s);return e.push(r),t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[],i=this.options.tx.outputs[1].value,r=this.options.wallet,s=this.options.contract.options.addr;let n=this.options.data.params.sim;n||(n=(a=this.options.tx.inputs[0]).getAddress().toString());var a=this.options.data.$top||0;r=await r.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:n,value:i/2}],comment:JSON.stringify({$tag:"inner",$top:a+1,hash:this.options.tx.hash("hex"),account:s})},s);return e.push(r),t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){return await this.verify()?await super.run():{derive:[]}}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){i=i(80);t.exports=class extends i{async run(){if(!await this.verify())return{derive:[]};var t=await super.run(),e=[];let i=this.options.contract;var r=this.options.data.params.oper,s=this.options.wallet,n=i.options.addr;switch(r){case"pubk":{var a,o,c,h=this.options.data.params.addr,u=this.options.data.params.pubk,l=this.options.data.params.partner;"object"==typeof i.options.contacts&&!Array.isArray(i.options.contacts)||(i.options.contacts={}),l&&l.split(",").map(t=>{i.options.contacts[t]||(i.options.contacts[t]={st:0})});let t="";for(a of Object.keys(i.options.contacts))h!=a&&(o=i.options.contacts[a],c=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:a,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendpubk",$tag:"inner",hash:this.options.tx.hash("hex"),data:u,m:i.options.m,n:i.options.n,contract:i.options.dst,account:n})},n),e.push(c),o.pubk)&&(t&&(t+=","),t+=o.pubk);t&&(l=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:h,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendpubk",$tag:"inner",hash:this.options.tx.hash("hex"),data:t,contract:i.options.dst,account:n})},n),e.push(l)),i.options.contacts[h]?i.options.contacts[h].pubk||(i.options.contacts[h].pubk=u):i.options.contacts[h]={pubk:u,st:0};break}case"puba":{var p,d=this.options.data.params.addr,f=this.options.data.params.puba;let t=!0;for(p of(i.options.puba=i.options.puba||f,Object.keys(i.options.contacts))){var m=i.options.contacts[p];p==d&&i.options.puba==f&&(m.st=1),1!=m.st&&(t=!1)}i.options.status=t;break}case"sign":if(1==i.options.status){var g,y,v=this.options.data.params.addr;for(g of Object.keys(i.options.contacts))g!=v&&(y=await s.send({sendafter:!1,subtractFee:!1,sort:!1,outputs:[{address:g,value:1e4}],comment:JSON.stringify({oper:"scnotify",type:"mssendtx",$tag:"inner",hash:this.options.tx.hash("hex"),data:this.options.data.params.tx,contract:i.options.dst,account:n})},n),e.push(y))}break;default:return t}return t.derive=e,t}async confirm(){return!0}async unconfirm(){return!0}async verify(){return super.verify()}}},function(t,e,i){var r=i(11);const s=i(5).ContractEnvType,n=i(36).broadcast;t.exports=class extends r{async confirm(){var t;this.mode==s.Wallet&&(t=this.options.tx.outputs[1])&&(this.data.addr=t.getAddress().toString(),this.options.env.emit(this.data.type+"/receive",this.data),n(this.data.type+"/receive",this.data))}async verify(){return!0}}},function(t,e,i){const r=i(0);var s=i(11);const n=i(5).PropStatus;t.exports=class extends s{async confirm(){var t=this.options.env,e=await t.propList.getVp(this.data.ori.pid);return e&&(e.pst=n.Delete,await t.propList.setVp(e)),!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=await t.propList.getVp(this.data.ori.pid);return i&&i.current.hash==e.inputs[0].prevout.hash&&i.current.index==e.inputs[0].prevout.index&&(i.pst=n.Ready,await t.propList.setVp(i)),!0}async verify(){var t=this.options.env,e=this.options.tx,i=this.data;return!(!i.ori||!i.ori.pid||t.network.stockReg.test(i.ori.pid)||t.network.tokenReg.test(i.ori.pid)||!(t=await t.propList.getVp(i.ori.pid))||t.pst!=n.Ready||(r.strictEqual(t.current.hash,e.inputs[0].prevout.hash),r.strictEqual(t.current.index,e.inputs[0].prevout.index),0))}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractType:n}=i(5),a=i(6),o=i(21).opcodes;t.exports=class extends r{async confirm(){return this.options.env,this.options.tx.hash("hex"),this.mode===s.Block&&await this.HandleVoteTrans(!1),!0}async unconfirm(){return this.options.env,this.options.tx,this.mode===s.Block&&await this.HandleVoteTrans(!0),!0}async HandleVoteTrans(t){var e=this.options.env,i=this.options.tx,r=this.options.tx.outputs[0].script.code;if(r[0].value==o.OP_RETURN)try{var s=JSON.parse(Buffer.from(r[1].data).toString());if(s&&s.oper==n.vote)switch(s.type){case"mine":{let r=0;for(var c of i.inputs){var h,u=await e.getExtendTX(c.prevout.hash);u&&e.voteMgr.isIn(u.height)?(h=u.tx.outputs[c.prevout.index])&&h.value?r+=h.value/a.COIN|0:e.logger.warning("Voting: Invalid UTXO Info"):e.logger.warning("Voting: Invalid UTXO Height")}0<r&&await e.voteMgr.calcVote(r,s.ca,t);break}case"oracle":{let r=0;for(var l of i.inputs){var p,d=await e.getExtendTX(l.prevout.hash);d&&e.voteMgr.isIn(d.height)?(p=d.tx.outputs[l.prevout.index])&&p.value?r+=p.value/1e5|0:e.logger.warning("Oracle: Invalid UTXO Info"):e.logger.warning("Oracle: Invalid UTXO Height")}0<r&&await e.voteMgr.calcOracle(r,{k:s.k,v:s.v},t);break}}}catch(r){console.log(r)}}async verify(){return!0}}},function(t,e,i){const r=i(0);var s=i(11);const{BlockFinalType:n,ContractEnvType:a,ContractType:o,PropStatus:c}=i(5),h=i(37).VerifyError,u=i(6),l=i(36).broadcast,p=i(1);t.exports=class extends s{async insert(){var t=this.options.env,e=this.options.tx,i=2<e.outputs.length?e.outputs[2].getReturnData():null,s=await t.propList.getVp(this.data.pid);if(i){if(this.mode==a.Wallet&&s.bid&&(i=await t.getTX(s.bid.hash))&&(i=await t.getWalletsByTX(i)))for(const e of i){var n=await t.get(e);r(n),await n.remove(s.bid.hash)}i=e.outputs[1].value;var o=e.outputs[2].getAddress().toString();i>=this.data.fixed||t.curHeight>=this.data.period&&i>s.gold?(Reflect.deleteProperty(s,"bid"),s.current={hash:this.options.hash,index:2,address:o},s.pst=c.Ready,await t.propList.setVp(s,e),t.network.stockReg.test(s.pid)&&(e=t.cpList.getItem(s.cid))&&(e.status=1,await t.cpList.addItem(e)),this.mode==a.Wallet&&(e={pid:s.pid,address:s.current.address,wid:s.wid,account:s.account,time:p.now(),height:-1,cid:s.cid},t.emit("prop/auction",e),l("prop/auction",e))):(s.pst=c.Sale,s.bid={},s.bid.raw=this.options.raw,s.bid.fixed=this.data.fixed,s.bid.period=this.data.period,s.bid.hash=this.options.hash,s.bid.value=i,s.bid.address=o,await t.propList.setVp(s))}else s.pst=c.Sale,s.bid={},s.bid.raw=this.options.raw,s.bid.fixed=this.data.fixed,s.bid.period=this.data.period,s.bid.hash=this.options.hash,s.bid.value=s.gold,s.bid.address="",await t.propList.setVp(s);return!0}async erase(){var t,e=this.options.env,i=2<(r=this.options.tx).outputs.length?r.outputs[2].getReturnData():null,r=r.inputs[0],s=await e.propList.getVp(this.data.pid);s&&(i?(i=await e.getExtendTX(r.prevout.hash))&&(t=i.tx.outputs[r.prevout.index],s.current={hash:r.prevout.hash,index:r.prevout.index,address:t.getAddress().toString()},s.bid={hash:this.options.hash,value:s.gold,address:"",raw:this.options.raw,fixed:this.data.fixed,period:this.data.period},s.pst=c.Sale,await e.propList.setVp(s,i.tx)):(Reflect.deleteProperty(s,"bid"),s.pst=c.Ready,await e.propList.setVp(s)))}async confirm(){var t=this.options.env,e=this.options.tx,i=e.hash("hex"),r=e.outputs[2].getAddress().toString(),s=await t.propList.getVp(this.data.pid);return Reflect.deleteProperty(s,"bid"),s.current={hash:i,index:2,address:r},s.height=this.options.coinbaseHeight,s.pst=c.Ready,await t.propList.setVp(s,e),t.network.stockReg.test(s.pid)&&(i=t.cpList.getItem(s.cid))&&(i.status=1,await t.cpList.addItem(i)),this.mode==a.Wallet&&(r={pid:s.pid,address:s.current.address,wid:s.wid,account:s.account,time:this.options.block.time,height:s.height,cid:s.cid},t.emit("prop/auction",r),l("prop/auction",r)),!0}async unconfirm(){var t,e,i=this.options.env,r=this.options.tx,s=r.inputs[0].prevout,n=await i.getExtendTX(s.hash);return n?(t=(e=n.tx.outputs[s.index]).getReturnData(),(t=await i.propList.getVp(t.pid))&&(t.current={hash:s.hash,index:s.index,address:e.getAddress().toString()},t.height=n.height-1,await i.propList.setVp(t,r)),i.network.stockReg.test(t.pid)&&(s=i.cpList.getItem(t.cid))&&(s.status=1,await i.cpList.addItem(s)),this.mode==a.Wallet&&(e={pid:t.pid,address:t.current.address,wid:t.wid,account:t.account,time:this.options.block.time,height:t.height,cid:t.cid},i.emit("prop/auction",e),l("prop/auction",e))):this.mode==a.Wallet&&(n=await i.propList.getVp(this.data.pid),await i.propList.delVp(n)),!0}async verify(){var t=this.data,e=this.options.env,i=this.options.tx,s=2<i.outputs.length?i.outputs[2].getReturnData():null,n=await e.propList.getVp(t.pid);if(!n)return!1;switch(this.mode){case a.Mempool:if(r.strictEqual(t.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(t.prev.index,i.inputs[0].prevout.index),r(e.curHeight+u.BLOCK_DAY>=this.data.period),r(t.cid!=e.network.genesisId),s){if(n.period<e.curHeight)throw new h(i,"sale order expired","contract",0);if(r.strictEqual(s.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(s.prev.index,i.inputs[0].prevout.index),r.strictEqual(s.pid,t.pid),r.strictEqual(s.oper,o.propExchange),!n.bid)throw new h(i,"sale order lack bid info","contract",0);if(n.bid.value>=this.data.fixed)throw new h(i,"can not bid on sale order finished","contract",0);if(i.outputs[1].value<=n.bid.value||i.outputs[1].value<=n.gold)throw new h(i,"invalid bid price","contract",0);var l=await e.getTX(n.bid.hash);l&&await e.removeDoubleSpenders(l)}else r(n.pst===c.Ready);break;case a.Block:if(r.strictEqual(t.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(t.prev.index,i.inputs[0].prevout.index),r(t.cid!=e.network.genesisId),r.strictEqual(s.prev.hash,i.inputs[0].prevout.hash),r.strictEqual(s.prev.index,i.inputs[0].prevout.index),r.strictEqual(s.pid,t.pid),r.strictEqual(s.oper,o.propExchange),i.outputs[1].value<=n.gold)throw new h(i,"invalid bid price","contract",0)}return!0}isBlockFinal(){var t=this.options.env,e=this.options.tx;return this.data.period<t.curHeight?n.Expired:2<=e.outputs.length&&(e.outputs[1].value>=this.data.fixed||this.data.period==t.curHeight&&e.outputs[1].value>=e.outputs[2].value)?n.Final:n.Waiting}isPreVerify(){var t=this.options.tx;return!!(2<t.outputs.length&&t.outputs[2].getReturnData())}}},function(t,e,i){var r=i(11);const{OrderData:s,ContractEnvType:n,BlockFinalType:a,VerifyCode:o}=i(5),c=i(26),h=i(85).stockItem,u=i(60),l=i(27),p=i(36).broadcast,d=i(1),f=i(6);t.exports=class extends r{async insert(){if(this.mode!=n.Wallet){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i);if(2==e.outputs.length){let s=this.data.sum,n=0;const p=u.fromTX(e);p.outputs.pop(),p.view=await t.getSpentViewUnLock(p);var a,h=p.getInputValue();let d=await t.getCpSnap(this.data.cid);if(!d)return o.SnapNull;r&&d.grate&&d.grate<50&&0<d.grate&&(g=s/100*d.grate|0,p.outputs.push(c.fromScript(r,g)),s-=g),d.addresses.map(t=>{var e=s/100*d.lords[t]*3|0;p.outputs.push(c.fromScript(t,e)),n+=e});let y=0;for(a of d.slist)if(!(a.sum>d.hSum)){var m=s/(f.STOCK_ORIENT+d.hSum)*a.sum|0;if(p.outputs.push(c.fromScript(a.addr,m)),n+=m,(y+=a.sum)>=d.hSum)break}p.outputs.push(c.fromScript(d.addrOfMaster,s-n)),p.outputs.push(c.fromScript(i,0));var g=await p.getSigopsSize(),[h]=(i=h-this.data.sum-l.getMinFee(g),0<i?p.outputs[p.outputs.length-1].value=i:p.outputs.pop(),p.commit());await t.removeDoubleSpenders(e),await t._addTX(h)}else(g=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r)).publish=t.curHeight,g.height=-1,g.hash=this.options.hash,await t.addOrder(g),-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=-1,this.data.confirm=0,this.data.time=d.now(),t.emit("contract.order.add",this.data),p("cp/orderPay",this.data))}return!0}async confirm(){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i),a=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r);switch(a.publish=t.curHeight,a.height=this.options.coinbaseHeight,a.hash=this.options.hash,this.mode){case n.Wallet:{let i=0;for(let s=1;s<=e.outputs.length-3;s++){var o,c=e.outputs[s],u=c.getAddress().toString();1==s&&r&&u==r?(i=1,(o=new h).height=this.options.coinbaseHeight,o.txid=e.txid(),o.type=h.RecordType.Ads,o.cid=this.data.cid,o.addr=u,o.price=c.value,await t.cpList.stockAds(o)):s>i&&((o=new h).height=this.options.coinbaseHeight,o.txid=e.txid(),o.type=h.RecordType.Bonus,o.cid=this.data.cid,o.addr=u,o.price=c.value,await t.cpList.stockBonus(o))}break}case n.Block:{await t.addOrder(a);let i=0;for(let s=1;s<=e.outputs.length-3;s++){var l,d=e.outputs[s],f=d.getAddress().toString();1==s&&r&&f==r?(i=1,(l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Ads,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockAds(l)):s>i&&((l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Bonus,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockBonus(l))}-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=this.options.coinbaseHeight,this.data.confirm=1,this.data.time=this.options.block.time,t.emit("contract.order.confirm",this.data),p("cp/orderPay",this.data));break}}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=this.data.addr,r=await t.getGuider(i);switch(this.mode){case n.Wallet:{let i=0;for(let s=1;s<=e.outputs.length-3;s++){var a,o=e.outputs[s],c=o.getAddress().toString();1==s&&r&&c==r?(i=1,(a=new h).height=this.options.coinbaseHeight,a.txid=e.txid(),a.type=h.RecordType.Ads,a.cid=this.data.cid,a.addr=c,a.price=o.value,await t.cpList.stockCancelAds(a)):s>i&&((a=new h).height=this.options.coinbaseHeight,a.txid=e.txid(),a.type=h.RecordType.Bonus,a.cid=this.data.cid,a.addr=c,a.price=o.value,await t.cpList.stockCancelBonus(a))}break}case n.Block:{var u=new s(this.data.cid,this.data.uid,this.data.sn,this.data.sum,this.data.addr,r);u.publish=t.curHeight,u.height=-1,u.hash=this.options.hash,await t.addOrder(u);let i=0;for(let s=1;s<=e.outputs.length-3;s++){var l,d=e.outputs[s],f=d.getAddress().toString();1==s&&r&&f==r?(i=1,(l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Ads,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockCancelAds(l)):s>i&&((l=new h).height=this.options.coinbaseHeight,l.txid=e.txid(),l.type=h.RecordType.Bonus,l.cid=this.data.cid,l.addr=f,l.price=d.value,await t.cpList.stockCancelBonus(l))}-1!=t.hmacConnection.indexOf(this.data.cid)&&(this.data.hash=this.options.hash,this.data.height=-1,this.data.confirm=0,this.data.time=this.options.block.time,t.emit("contract.order.unconfirm",this.data),p("cp/orderPay",this.data));break}}return!0}async erase(){var t;return this.mode!=n.Wallet&&(t=this.options.env,2<this.options.tx.outputs.length)&&(this.data.confirm=0,t.emit("contract.order.remove",this.data)),!0}async verify(){var t=this.options.env,e=this.options.tx,i=u.fromTX(e),r=(i.view=this.options.coins||null,this.mode==n.Mempool&&(i.view=await t.node.mempool.getSpentViewUnLock(e)),i.getInputValue());if(r<this.data.sum)return!1;if(e.outputs.length<2)return!1;if(2!=e.outputs.length){var s=this.data.addr,a=await t.getGuider(s);let n=this.data.sum;var c=await t.getCpSnap(this.data.cid);if(!c)return o.SnapNull;let u=0,g=0;for(let t=1;t<e.outputs.length;t++){var h=e.outputs[t],p=h.getAddress().toString();if(1==t&&a&&p==a){if(g=1,!(c.grate&&c.grate<20&&0<c.grate))return!1;if(h.value!=n/100*c.grate|0)return!1;n-=h.value}else if(t<=c.addresses.length+g){if(h.value!=n/100*c.lords[p]*3|0||p!=c.addresses[t-g-1])return!1;u+=h.value}else if(t<=c.addresses.length+g+c.slist.length){var d=c.slist[t-c.addresses.length-g-1],m=n/(f.STOCK_ORIENT+c.hSum)*d.sum|0;if(h.value!=m||p!=d.addr)return!1;u+=h.value}else if(t==c.addresses.length+g+c.slist.length+1){if(p!=c.addrOfMaster||h.value!=n-u)return!1}else if(m=await i.getSigopsSize(),d=r-this.data.sum-l.getMinFee(m),p!=s||h.value!=d)return!1}}return!0}isBlockFinal(){this.options.env;var t=this.options.tx;return t.outputs.length<2?a.Expired:2==t.outputs.length?a.Waiting:a.Final}async checkFees(){return!0}}},function(t,e,i){const r=i(0),s=i(108),{ContractEnvType:n,BlockFinalType:a}=i(5);var o=i(11);const c=i(6),h=i(36).broadcast,u=i(7),l=i(12);t.exports=class extends o{async insert(){var t=this.options.env,e=this.options.tx;switch(this.data.body.dst=e.outputs[1].getAddress().toString(),this.mode){case n.Mempool:try{var i=JSON.parse(this.data.body.content);switch(i.cmd){case"peerdel":r(this.data.body.dst==t.node.config.notifyAddress),r(l.fromString(this.data.body.dst).hash.toString("hex")==u.hash160(Buffer.from(i.pub,"hex")).toString("hex")),r(s.verifyObj(i.payload,i.sig,i.pub)),await t.node.rpc._delPeer([i.payload.host]);break;case"peeradd":r(this.data.body.dst==t.node.config.notifyAddress),r(l.fromString(this.data.body.dst).hash.toString("hex")==u.hash160(Buffer.from(i.pub,"hex")).toString("hex")),r(s.verifyObj(i.payload,i.sig,i.pub)),await t.node.rpc._addPeer([i.payload.host,i.payload.key])}}catch(t){}break;case n.Wallet:if(t.NotifyList.get(this.data.sn))return;var a=this.data.body.dst,[a,o]=await t.getAccountByAddress(a,e);this.data.account=o,this.data.wid=a,t.emit("notify/receive",this.data),h("notify/receive",this.data),await t.NotifyList.set(this.data.sn,this.data)}return!0}async confirm(){}async unconfirm(){}async erase(){var t=this.options.env;return this.options.tx,this.mode===n.Wallet&&(await t.NotifyList.delete(this.data.sn),t.emit("notify/remove",this.data),h("notify/remove",this.data)),!0}async verify(){var t=this.options.env,e=this.options.tx;return!(e.getOutputValue()<.1*c.COIN||2<e.outputs.length||this.data.h>t.curHeight)}isBlockFinal(){var t=this.options.env;return this.data.h<t.curHeight-6?a.Expired:a.Waiting}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractStatus:n,BlockFinalType:a}=i(5),o=i(37).VerifyError;t.exports=class extends r{async insert(){var t=this.options.env;return this.data.period<t.curHeight?await t.transactionList.delTransContract(this.data,!0):(this.data.current={hash:this.options.hash,index:0},this.data.raw=this.options.raw,await t.transactionList.addTransContract(s.Mempool,this.data)),!0}async erase(){var t=this.options.env;switch(this.mode){case s.Mempool:await t.transactionList.delTransContract(this.data);break;case s.Wallet:await t.transactionList.delTransContract(this.data,!0)}}async verify(){var t=this.options.env,e=this.options.tx;if(this.data.period<t.curHeight)throw new o(e,"transaction contract expired","contract",0);if(t.transactionList.query(this.data.type,this.data.addr)!=n.None)throw new o(e,"Same Address Contract Finded","contract",0);return!0}isBlockFinal(){var t=this.options.env;return this.data.period<t.curHeight?a.Expired:a.Waiting}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,ContractStatus:n}=i(5),a=i(109);t.exports=class extends r{async confirm(){var t=this.options.env;let e=n.Backed;switch(2==this.data.master&&(e=n.Exchanged),this.mode){case s.Block:var i=t.transactionList.get(this.data.type+"."+this.data.addr);i?(i.transStatus=e,await t.transactionList.saveContract(i,!0)):await t.transactionList.addTransContract(s.Block,this.data,!0);break;case s.Wallet:(i=t.transactionList.get(this.data.type+"."+this.data.addr))?(i.transStatus=e,await t.transactionList.saveContract(i,!0)):await t.transactionList.addTransContract(s.Wallet,this.data,!0)}return!0}async verify(){var t=this.options.env;switch(this.mode){case s.Mempool:case s.Block:case s.Wallet:{var e=this.data.master,i=t.transactionList.get(this.data.type+"."+this.data.addr);let r=i.transStatus;return r!==n.Expired&&r!==n.Confirmed&&r!==n.Backed&&r!==n.Exchanged&&(i=new a(t.network.txcheckpoint,i),[,r]=await i.execute(t)),(r===n.Expired||r===n.Confirmed||r===n.Backed||r===n.Exchanged)&&!(r==n.Expired&&1!=e||r==n.Confirmed&&2!=e||r==n.Backed&&1!=e||r==n.Exchanged&&2!=e)}}}}},function(t,e,i){var r=i(11);const{VerifyCode:s,ContractEnvType:n}=i(5),a=i(63).verifyData,o=i(85).stockItem,c=i(6),h=i(36).broadcast;t.exports=class extends r{async confirm(){var t,e=this.options.env,i=this.options.tx,r=(this.data.txid=i.txid(),o.fromObj(this.data));switch(r.type){case o.RecordType.Offer:await e.cpList.stockOffer(r),this.mode==n.Block&&(t=e.cpList.getRecord(r.cid))&&h("cp/stock",t);break;case o.RecordType.Purchase:if(await e.cpList.stockPurchase(r),this.mode==n.Block)try{var s=await e.accountList.query([["cid",r.cid]]);r.support=s.list.length,(s=e.cpList.getRecord(r.cid))&&(r.sum_left=s.stock.sum),h("cp/stockPurchase",r)}catch(t){}break;case o.RecordType.Bid:await e.cpList.stockBid(r),this.mode==n.Block&&h("cp/stockBid",r);break;case o.RecordType.Auction:await e.cpList.stockAuction(r),this.mode==n.Block&&h("cp/stockAuction",r);break;case o.RecordType.Send:await e.cpList.stockSend(r)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx,i=(this.data.txid=e.txid(),o.fromObj(this.data));switch(i.type){case o.RecordType.Offer:t.cpList.stockCancelOffer(i);break;case o.RecordType.Bid:t.cpList.stockCancelBid(i);break;case o.RecordType.Auction:t.cpList.stockCancelAuction(i);break;case o.RecordType.Purchase:t.cpList.stockCancelPurchase(i);break;case o.RecordType.Send:t.cpList.stockCancelSend(i)}return!0}async verify(){var t=this.options.env,e=this.options.tx,i=t.accountList;if(!a(this.data.body))return s.SignFailed;if(this.data.h>t.curHeight)return s.WrongHeight;var r=this.data.body.data,h=t.cpList.getItem(r.cid);if(!h)return s.WrongPublisher;if(!r.sum||r.sum<c.STOCK_TRADE_SINGLE)return s.WrongSum;switch(r.type){case o.RecordType.Offer:if(2<e.outputs.length)return s.WrongFormat;if(h.current.address!=r.addr)return s.WrongPublisher;if(r.price<c.GRAM||r.price>c.STOCK_MAX_PRICE)return s.WrongPrice;if(r.sum<=0||r.sum>c.STOCK_ADDED_SINGLE||h.stock.hSum+r.sum>c.STOCK_ADDED)return s.WrongSum;if(h.stock.hBonus<.3*h.stock.hSum*h.stock.hPrice)return s.WrongBonus;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<.05*r.sum*r.price)return s.WrongFee}if(h.stock.hHeight){if(this.data.h-h.stock.height<=c.BLOCK_DAY*c.STOCK_OFFER_PERIOD)return s.StockOffering;if(this.data.h-h.stock.height<=c.BLOCK_DAY*c.STOCK_OFFER_CD)return s.StockCooling;if(this.data.body.data.price<h.stock.lastPrice||this.data.body.data.price>4*h.stock.lastPrice)return s.WrongPrice}break;case o.RecordType.Bid:if(h.stock.price<c.GRAM||h.stock.price>c.STOCK_MAX_PRICE)return s.WrongPrice;if(r.sum<c.STOCK_TRADE_SINGLE||r.sum>c.STOCK_MAX_TRADE_SINGLE)return s.WrongSum;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<.05*r.sum*r.price)return s.WrongFee}var u=i.getStockAccount(r.cid,r.addr);if(!u)return s.StockAccountNotExist;if(u.seq+1!==r.seq)return s.AccountSequenceWrong;if(u.sum<r.sum)return s.StockAccountNotEnoughSum;if(u.stock.period>=this.data.h)return s.StockOffering;break;case o.RecordType.Auction:{if(!(u=i.getStockAccount(r.cid,r.to)))return s.StockAccountNotExist;if(r.to==r.addr)return s.WrongPublisher;if(u.stock.sum<r.sum)return s.StockAccountNotEnoughSum;var l=i.getStockAccount(r.cid,r.addr);let t=0;if((t=l?l.seq:t)+1!==r.seq)return s.AccountSequenceWrong;if(u.stock.period<this.data.h)return s.StockOfferExpired;if((this.mode==n.Block||this.mode==n.Mempool)&&(l=e.outputs[1],r.price!=u.stock.price||l.getAddress().toString()!=u.addr||l.value!=r.sum*u.stock.price))return s.FundNotEnough;break}case o.RecordType.Purchase:{if(h.current.address!==r.to)return s.WrongPublisher;if(!h.stock.hHeight)return s.StockOfferExpired;if(this.data.h-h.stock.height>c.BLOCK_DAY*c.STOCK_OFFER_PERIOD)return s.StockOfferExpired;if(h.stock.sum<r.sum)return s.StockAccountNotEnoughSum;let a=0;if((a=(l=i.getStockAccount(r.cid,r.addr))?l.seq:a)+1!==r.seq)return s.AccountSequenceWrong;if(this.mode==n.Block||this.mode==n.Mempool){let i=this.options.coins||null;if(this.mode==n.Mempool&&(i=await t.node.mempool.getSpentViewUnLock(e)),e.getInputValue(i)-e.getOutputValue()<r.sum*r.price)return s.FundNotEnough}break}case o.RecordType.Send:if(!(u=i.getStockAccount(r.cid,r.addr)))return s.StockAccountNotExist;if(r.to==r.addr)return s.WrongPublisher;if(u.seq+1!==r.seq)return s.AccountSequenceWrong;if(u.sum<r.sum)return s.StockAccountNotEnoughSum}return!0}isPreVerify(){var t=this.options.tx;return(t=(this.data.txid=t.txid(),o.fromObj(this.data))).type===o.RecordType.Bid}async checkFees(){return!0}}},function(t,e,i){i=i(11);t.exports=class extends i{async insert(){var t=this.options.env,e=this.options.tx;for(let s=1;s<e.outputs.length;s++){var i=e.outputs[s],r=i.getAddress().toString();1e5==i.value&&t.setGuider(this.data.addr,this.data.cid,r)}return!0}async confirm(){return!0}async unconfirm(){return!0}async erase(){var t=this.options.env,e=this.options.tx;for(let r=1;r<e.outputs.length;r++){var i=e.outputs[r].getAddress().toString();t.unsetGuider(this.data.addr,this.data.cid,i)}return!0}async verify(){return!0}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,VerifyCode:n,ContractType:a}=i(5),o=i(157).ErItem,c=i(39),h=i(7),u=i(12),l=i(36).broadcast;t.exports=class extends r{async insert(){return!0}async confirm(){var t=this.options.env,e=this.options.tx;switch(this.data.startHeight=t.curHeight,await t.erList.setEr(this.data,e),this.mode){case s.Wallet:var i=u.fromWitnessPubkeyhash(h.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);i&&r&&(this.data.account=r,this.data.wid=i,t.emit("ca/issue",this.data),l("ca/issue",this.data));break;case s.Block:t.node.transmit("ca.issue",this.data),r=c.fromPrivate(Buffer.from(t.node.config.alliancePrivateKey,"hex"),!0,t.network),c.fromPrivate(h.hash256(Buffer.concat([Buffer.from(this.data.source.cid+"-"+this.data.source.uid),r.privateKey]),!0,t.network)).publicKey.toString("hex")==this.data.witness&&t.node.transmit("ca.issue.alliance",this.data)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx;switch(t.erList.delEr(this.data,e),this.mode){case s.Wallet:var i=u.fromWitnessPubkeyhash(h.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/unissue",this.data),l("ca/unissue",this.data);break;case s.Block:t.node.transmit("ca.unissue",this.data)}return!0}async erase(){return!0}async verify(){var t=this.options.env,e=this.data;return e&&e.oper==a.erIssue&&await t.erList.getEr(e.erid)?n.DuplicateEr:(t=c.fromPublic(Buffer.from(e.witness,"hex"),t.network),!!new o(e).verifying(t)||n.SignatureNotMatch)}}},function(t,e,i){var r=i(11);const{ContractEnvType:s,VerifyCode:n,ContractType:a}=i(5),o=i(158).ErAbolishItem,c=i(39),h=i(36).broadcast,u=i(7),l=i(12);t.exports=class extends r{async insert(){return!0}async confirm(){var t=this.options.env,e=this.options.tx;switch(this.data.startHeight=t.curHeight,await t.erAbList.setErAb(this.data,e),this.mode){case s.Wallet:var i=l.fromWitnessPubkeyhash(u.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/abolish",this.data),h("ca/abolish",this.data);break;case s.Block:t.node.transmit("ca.abolish",this.data)}return!0}async unconfirm(){var t=this.options.env,e=this.options.tx;switch(t.erAbList.delErAb(this.data,e),this.mode){case s.Wallet:var i=l.fromWitnessPubkeyhash(u.hash160(Buffer.from(this.data.witness,"hex")),t.network),[i,r]=await t.getAccountByAddress(i,e);this.data.account=r,this.data.wid=i,t.emit("ca/unabolish",this.data),h("ca/unabolish",this.data);break;case s.Block:t.node.transmit("ca.unabolish",this.data)}return!0}async erase(){return!0}async verify(){var t=this.options.env,e=this.data,i=await t.erList.getEr(e.erid);return i&&i.witness==e.witness?e&&e.oper==a.erAbolish&&(i=await t.erAbList.getErAb(e.erid))&&e.abolishHeight>=i.abolishHeight?n.NotExistER:(i=c.fromPublic(Buffer.from(e.witness,"hex"),t.network),!!new o(e).verifying(i)||n.SignatureNotMatch):n.SignatureNotMatch}}},function(t,e,i){var r=i(11);const{VerifyCode:s,ContractEnvType:n}=i(5),a=i(237).EnchancementItem,o=i(39);t.exports=class extends r{async insert(){return!0}async confirm(){var t,e;return this.mode==n.Block&&(t=this.options.env,e=this.options.tx,this.data.enchanceTx=e.txid(),t.enCpList.setEn(this.data),!0)}async unconfirm(){var t,e;return this.mode==n.Block&&(t=this.options.env,e=this.options.tx,t.enCpList.delEn(this.data,e),!0)}async erase(){return!0}async verify(){var t=this.options.env,e=this.options.tx,i=this.data,r=t.cpList.getItem(i.to);e=e.outputs[1].getAddress().toString();return r&&r.pubAddress&&r.pubAddress==e&&(r=t.cpList.getItem(i.from))&&r.pubAddress&&r.pubKey?(e=o.fromPublic(Buffer.from(r.pubKey,"hex"),t.network),!!new a(i).verifying(e)||s.SignatureNotMatch):s.NotExistCp}}},function(t,e,i){"use strict";
|
|
459
459
|
/*!
|
|
460
460
|
* TXRecord.js
|
|
461
461
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -881,7 +881,7 @@ var r=i(775),s=i(777),n=i(778),a=i(779),o=i(780),c=i(781),h=i(782),u=i(783);i=i(
|
|
|
881
881
|
/*!
|
|
882
882
|
* chaindb.js - blockchain data management for vallnet
|
|
883
883
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
884
|
-
*/const r=i(0),s=i(1),n=i(2),a=i(4),o=i(33),c=i(3),h=i(15),u=i(61),l=i(252),p=i(169),d=i(148),f=i(65),m=i(75),g=i(46),y=i(31),v=i(12),w=i(332),b=i(333),k=i(147),x=c.U8,S=c.U32,{getVerifyMsg:E,BlockFinalType:_,OrderData:R,ContractEnvType:A,ContractType:C}=i(5);var I=i(72);const O=i(43),P=i(19),T=i(60),j=i(114),B=i(26),N=i(7),F=i(145),D=i(6),L=i(161),M=i(154),H=M.scItem,z=i(232),U=z.stockAccount,q=i(342),V=i(85),K=V.cpItem,W=V.cpSnap,G=V.stockItem,$=i(134),X=$.vpItem,Y=i(343),J=Y.vpItem,Z=i(728),Q=i(157),tt=Q.ErItem,et=i(158),it=et.ErAbolishItem,rt=i(237),st=rt.EnchancementItem;i(53);const nt=i(344),at=i(118),{opcodes:ot,nestingCodes:ct}=i(21),ht=i(125),ut=i(28),lt=i(39),pt=i(37).VerifyError;class dt extends I{constructor(t){super(),this.chain=t,this.eid="chaindb",this.fromOptions(t.options),this.db=p(this.options),this.stateCache=new gt(this.network),this.state=new mt,this.pending=null,this.current=null,this.coinCache=new f(this.options.coinCache),this.cacheHash=new f(this.options.entryCache),this.cacheHeight=new f(this.options.entryCache),this.autoTaskMgr=new L(this),this.propList=new $(this),this.htlcList=new Y(this),this.$voteMgr=new Z(this),this.transactionList=new q(this),this.cpList=new V(this),this.scList=new M(this),this.erList=new Q(this),this.erAbList=new et(this),this.enCpList=new rt(this,{type:"cp"}),this.accountList=new z(this),this.middleHashChain=new Set,this.on("contract.order.confirm",t=>{var e=this.cpList.getItem(t.cid);e&&this.node.notifyCp(t,e)}),this.on("contract.order.unconfirm",t=>{var e=this.cpList.getItem(t.cid);e&&this.node.notifyCp(t,e)})}get hmacConnection(){return this.node.specialCp.content()}get voteMgr(){return this.$voteMgr}async setCpHistory(){if(this.curHeight%10==0){var t=await this.cpList.query([["status",1]]);if(0<t.list.length){var e,i=this.db.batch();for(e of t.list){var r=e.cid,s={};let t=100;for(const i of(await this.getStockPropList(r)).reduce((t,e)=>((e=X.fromRaw(e.value)).height<=this.curHeight-D.BLOCK_DAY&&t.push(e),t),[]))if(i.current.address!=e.current.address&&(s[i.current.address]=(s[i.current.address]||0)+1),(t-=3)<=70)break;var n=(await this.accountList.query([["cid",r]])).list.sort((t,e)=>t.addr.localeCompare(e.addr));n=new W({grate:e.grate,addrOfMaster:e.current.address,hSum:e.stock.hSum,lords:s,slist:n});i.put(d.SS(r,this.curHeight),n.toRaw()),e.status=0,i.put(d.CP(e.cid),e.toRaw())}await i.write()}}}async getGuider(t){return t=v.fromString(t).getHash("hex"),(t=await this.db.get(d.g(t)))?v.fromRaw(t).toString():null}async setGuider(t,e,i){var r;i=v.fromString(i),await this.db.has(d.g(i.getHash("hex")))||(t=v.fromString(t),await(r=this.db.batch()).put(d.g(i.getHash("hex")),t.toRaw()),await r.put(d.gs(t.getHash("hex"),Buffer.from(e,"ascii").toString("hex"),i.getHash("hex")),i.toRaw()),await r.write())}async unsetGuider(t,e,i){t=v.fromString(t).getHash("hex"),i=v.fromString(i).getHash("hex");var r=this.db.batch();r.del(d.g(i)),r.del(d.gs(t,Buffer.from(e,"ascii").toString("hex"),i)),await r.write()}async getSimAddresses(t,e){t=v.fromString(t).getHash("hex");let i=Buffer.from(e,"ascii").toString("hex"),r=i;return e||(i=c.ZERO_CID,r=c.MAX_CID),(await this.db.values({gte:d.gs(t,i,c.ZERO_HASH160_HEX),lte:d.gs(t,r,c.MAX_HASH160_HEX),parse:t=>v.fromRaw(t).toString()})).length}async getCpHistory(t,e){return(t=await this.db.get(d.SS(t,e)))?W.fromRaw(t):null}async getCpSnap(t){let e=null,i=this.curHeight;for(;!e;){10<=i?5<(s=i%10)?i-=s:i=i-10-s:i=0;var r,s=await this.getCpHistory(t,i);if(s)(e={cid:t}).grate=s.grate,e.addrOfMaster=s.addrOfMaster,e.hSum=s.hSum,e.slist=s.slist,e.lords=s.lords,e.addresses=Object.keys(e.lords).sort((t,e)=>t.localeCompare(e));else if(0==i)return(r=this.cpList.getItem(t))?{cid:r.cid,grate:r.grate,addrOfMaster:r.current.address,hSum:r.stock.hSum,slist:[],lords:{},addresses:[]}:null}return e}get mode(){return A.Block}fromOptions(t){this.options=t,this.node=t.node,this.network=t.network,this.logger=t.logger.context("chaindb")}get curHeight(){return this.chain.height}get finder(){return this.node.getTXFromAll?this.node.getTXFromAll.bind(this.node):()=>{}}get tidCreator(){return d.tx}rpcExecute(){return this.node.rpc.execute.apply(this.node.rpc,arguments)}createGenesisCoinbase(t,e){var i,r=new P,s=new j,n=((i=((i=(s.script.pushInt(0),s.script.pushData(c.ZERO_HASH160),Buffer.allocUnsafe(4))).writeUInt32LE(0,0,!0),s.script.pushData(i),s.script.pushData(c.ZERO_U64),s.script.compile(),s.witness.push(c.ZERO_HASH),s.witness.compile(),r.inputs.push(s),new B)).script.createScript(c.ZERO_HASH160),i.value=D.ORIGINAL,r.outputs.push(i),c.ZERO_HASH),a=[],[a,,]=(a.push(c.ZERO_HASH),F.createRoot(a));a=N.root256(a,n);return(n=new B).script.fromCommitment(a),r.outputs.push(n),s.script.setData(1,e),s.script.compile(),i.script.fromAddress(t.addresses[0]),r}dummyInput(){return j.fromOutpoint(new g(c.NULL_HASH,0))}createGenesisBlock(t){if(!t.addresses||t.addresses.length<11)throw new Error("addresses length expect 11.");let e=t.flags;e=e||Buffer.from("In the name of Athena: Of the user, By the user, and For the user.","ascii");var i=this.createGenesisCoinbase(t,e),r=this.network.genesisId,n=new T,[n,,]=(n.addInput(this.dummyInput()),n.cpRegister(t.addresses[0],D.COIN,{cid:r,oper:C.cpRegister,name:"ATHENA",ip:"*",pubAddress:"",pubKey:"",signMethod:""}),n.commit()),a=new T;a.addInput(this.dummyInput());for(let e=0;e<10;e++)for(let i=0;i<10;i++){var o={oper:C.propCreate,pid:""+this.network.tokenFix+s.sprintf("%04d",10*e+i+1),oid:this.network.tokenFix+"0000",cid:r,gold:D.COIN};a.propCreate(t.addresses[e+1],o)}var[h,,]=a.commit(),u=new m({version:t.version,prevBlock:c.NULL_HASH,merkleRoot:i.hash("hex"),time:t.time,bits:t.bits,nonce:t.nonce,height:0});return u.txs.push(i),u.txs.push(n),u.txs.push(h),u.refresh(!0),u.merkleRoot=u.createMerkleRoot("hex"),u}async open(t){this.logger.info("Opening ChainDB..."),await this.db.open();var e=await this.db.checkVersion(d,3);if(i=await this.getState()){var i;if(await this.verifyFlags(i),await this.verifyDeployments(),this.stateCache=await this.getStateCache(),this.state=i,!(i=await this.getEntry(0)))throw new Error("genesis block not found.");this.network.genesis.hash=i.hash,this.network.genesis.merkleRoot=i.merkleRoot,this.logger.info("ChainDB successfully loaded.")}else t&&(i=await this.getGenesisParams(t),this.node.miner&&(this.node.miner.addresses=[new v(i.coinbaseAddress)]),this.node.config)&&this.node.config.changeParams(i),await this.saveFlags(),await this.saveDeployments(),await this.saveGenesis(),this.logger.info("ChainDB successfully initialized.");return this.logger.info("Chain State: hash=%s tx=%d coin=%d value=%s.",this.state.rhash(),this.state.tx,this.state.coin,o.btc(this.state.value)),e}async getGenesisParams(t){if(t.isGenesisParams)return t;t=t||{};var e=new nt({name:"wallet-test",db:"memory",resolution:!1,verify:!1}),i=(e=(t.getMnemonicFromMemory=!0,await e.open(t),await e.get("primary")),[]);for(const s of await e.getPaths("default")){var r=s.toAddress();0==s.branch&&i.push(""+r.toString(t.network))}var s,n,a,o,h={};return h[t.network+"Addresses"]=i.reduce((t,e)=>t+(""==t?e:","+e),""),h.coinbaseAddress=i[1],h.notifyAddress=e.notifyAddress,this.node.config.notifyAddress=h.notifyAddress,await ht.writeFile(h,t.network+"-genesis.params"),t.isGenesisEncrypt||(s=N.hash256(Buffer.from(e.master.mnemonic.toSeed().toString("hex"))),n=ut.publicKeyCreate(s,!0),a=v.fromWitnessPubkeyhash(N.hash160(n),this.network.type).toString(),o=N.hash256(Buffer.concat([Buffer.from("root"),e.master.key.privateKey])),e={body:{language:e.master.mnemonic.language,phrase:e.master.mnemonic.getPhrase(),passphrase:e.master.mnemonic.passphrase,awardAddress:h.coinbaseAddress,notifyAddress:e.notifyAddress,alliancePrivateKey:o.toString("hex"),allianceName:"root",allianceNodeId:0,allianceNodeToken:{prv:s.toString("hex"),pub:n.toString("hex"),address:a}},password:t.password||c.MNEMONIC_SALT,network:t.network,file:t.network+"-genesis.keystore"},await ht.writeEncryptFile(e)),h}close(){return this.db.close()}start(){return r(!this.current),r(!this.pending),this.current=this.db.batch(),this.pending=this.state.clone(),this.coinCache.start(),this.cacheHash.start(),this.cacheHeight.start(),this.current}put(t,e){r(this.current),this.current.put(t,e)}del(t){r(this.current),this.current.del(t)}batch(){return r(this.current),this.current}drop(){var t=this.current;r(this.current),r(this.pending),this.current=null,this.pending=null,this.coinCache.drop(),this.cacheHash.drop(),this.cacheHeight.drop(),this.stateCache.drop(),t.clear()}async commit(){r(this.current),r(this.pending);try{await this.current.write()}catch(t){throw this.current=null,this.pending=null,this.coinCache.drop(),this.cacheHash.drop(),this.cacheHeight.drop(),t}this.pending.committed&&(this.state=this.pending),this.current=null,this.pending=null,this.coinCache.commit(),this.cacheHash.commit(),this.cacheHeight.commit(),this.stateCache.commit()}hasCache(t){return("number"==typeof t?this.cacheHeight:(r("string"==typeof t),this.cacheHash)).has(t)}getCache(t){return("number"==typeof t?this.cacheHeight:(r("string"==typeof t),this.cacheHash)).get(t)}async getHeight(t){var e;return"number"==typeof t?t:(r("string"==typeof t),t===c.NULL_HASH?-1:(e=this.cacheHash.get(t))?e.height:(e=await this.db.get(d.h(t)))?e.readUInt32LE(0,!0):-1)}async getHash(t){var e;return"string"==typeof t?t:(r("number"==typeof t),t<0?null:(e=this.cacheHeight.get(t))?e.hash:(e=await this.db.get(d.H(t)))?e.toString("hex"):null)}async getEntryByHeight(t){var e;return r("number"==typeof t),t<0?null:this.cacheHeight.get(t)||((t=await this.db.get(d.H(t)))&&(t=t.toString("hex"),e=this.state,t=await this.getEntryByHash(t))?(this.state===e&&this.cacheHeight.set(t.height,t),t):null)}async getEntryByHash(t){return r("string"==typeof t),t===c.NULL_HASH?null:this.cacheHash.get(t)||((t=await this.db.get(d.e(t)))?(t=w.fromRaw(t),this.cacheHash.set(t.hash,t),t):null)}getEntry(t){return"number"==typeof t?this.getEntryByHeight(t):this.getEntryByHash(t)}async hasEntry(t){return-1!==await this.getHeight(t)}async getAncestor(t,e){if(e<0)return null;if(r(0<=e),r(e<=t.height),await this.isMainChain(t))return this.getEntryByHeight(e);for(;t.height!==e;){t=this.getPrevCache(t)||await this.getPrevious(t),r(t)}return t}getPrevious(t){return this.getEntryByHash(t.prevBlock)}getPrevCache(t){return this.cacheHash.get(t.prevBlock)||null}async getNext(t){return(t=await this.getNextHash(t.hash))?this.getEntryByHash(t):null}async getNextEntry(t){var e=await this.getEntryByHeight(t.height+1);return e&&e.prevBlock===t.hash?e:null}getTip(){return this.getEntryByHash(this.state.tip)}async getState(){var t=await this.db.get(d.R);return t?mt.fromRaw(t):null}async saveGenesis(){let t=[];t=(this.node.config?this.node.config[this.network.type+"Addresses"]:this.network.genesis.addresses).split(",");var e=this.createGenesisBlock({version:this.network.genesis.version,time:this.network.genesis.time,bits:this.network.genesis.bits,nonce:this.network.genesis.nonce,addresses:t}),i=(this.network.genesis.hash=e.hash("hex"),this.network.genesis.merkleRoot=e.merkleRoot,w.fromBlock(e)),r=(this.logger.info("Writing genesis block to ChainDB."),new u);for(let t=0;t<e.txs.length;t++)r.addTX(e.txs[t],e.height,e.time);await this.save(i,e,r)}async getFlags(){var t=await this.db.get(d.O);return t?ft.fromRaw(t):null}async verifyFlags(t){var e=this.options,i=await this.getFlags();let r=!1,s=!1;if(!i)throw new Error("No flags found.");if(e.network!==i.network)throw new Error("Network mismatch for chain.");if(e.spv&&!i.spv)throw new Error("Cannot retroactively enable SPV.");if(!e.spv&&i.spv)throw new Error("Cannot retroactively disable SPV.");if(!i.witness){if(!e.forceFlags)throw new Error("Cannot retroactively enable witness.");r=!0}if(e.prune&&!i.prune){if(!e.forceFlags)throw new Error("Cannot retroactively prune.");s=!0}if(!e.prune&&i.prune)throw new Error("Cannot retroactively unprune.");if(e.indexTX&&!i.indexTX)throw new Error("Cannot retroactively enable TX indexing.");if(!e.indexTX&&i.indexTX)throw new Error("Cannot retroactively disable TX indexing.");if(e.indexAddress&&!i.indexAddress)throw new Error("Cannot retroactively enable address indexing.");if(!e.indexAddress&&i.indexAddress)throw new Error("Cannot retroactively disable address indexing.");r&&(await this.logger.info("Rewriting chain flags."),await this.saveFlags()),s&&(await this.logger.info("Retroactively pruning chain."),await this.prune(t.tip))}async getStateCache(){var t=new gt(this.network);for(const s of await this.db.range({gte:d.v(0,c.ZERO_HASH),lte:d.v(255,c.MAX_HASH),values:!0})){var[e,i]=d.vv(s.key),r=s.value[0];t.insert(e,i,r)}return t}saveDeployments(){var t=this.db.batch();return this.writeDeployments(t),t.write()}async batchPut(t,e){var i=this.db.batch();i.put(t,e),await i.write()}async batchDel(t){var e=this.db.batch();e.del(t),await e.write()}writeDeployments(t){var e=new a(1+17*this.network.deploys.length);e.writeU8(this.network.deploys.length);for(const t of this.network.deploys)e.writeU8(t.bit),e.writeU32(t.startTime),e.writeU32(t.timeout),e.writeI32(t.threshold),e.writeI32(t.window);t.put(d.V,e.render())}async checkDeployments(){var t=await this.db.get(d.V),e=(r(t,"No deployment table found."),new n(t)),i=e.readU8(),s=[];for(let t=0;t<i;t++){var a=e.readU8(),o=e.readU32(),c=e.readU32(),h=e.readI32(),u=e.readI32(),l=this.network.byBit(a);l&&o===l.startTime&&c===l.timeout&&h===l.threshold&&u===l.window||s.push(a)}return s}async verifyDeployments(){let t;try{t=await this.checkDeployments()}catch(e){if("EncodingError"!==e.type)throw e;t=[];for(let e=0;e<32;e++)t.push(e)}if(0===t.length)return!0;var e=this.db.batch();for(const i of t)this.logger.warning("Versionbit deployment params modified."),this.logger.warning("Invalidating cache for bit %d.",i),await this.invalidateCache(i,e);return this.writeDeployments(e),await e.write(),!1}async invalidateCache(t,e){for(const i of await this.db.keys({gte:d.v(t,c.ZERO_HASH),lte:d.v(t,c.MAX_HASH)}))e.del(i)}async prune(){var t=this.options,e=this.network.block.keepBlocks,i=this.network.block.pruneAfterHeight;if((await this.getFlags()).prune)throw new Error("Chain is already pruned.");var s=await this.getHeight(this.state.tip);if(s<=i+e)return!1;i+=1;var n=s-e,a=this.db.batch();for(let t=i;t<=n;t++){var o=await this.getHash(t);if(!o)throw new Error(`Cannot find hash for ${t}.`);a.del(d.b(o)),a.del(d.u(o))}try{t.prune=!0;const e=ft.fromOptions(t);r(e.prune),a.put(d.O,e.toRaw()),await a.write()}catch(e){throw t.prune=!1,e}return await this.db.compactRange(),!0}async getNextHash(t){return(t=await this.db.get(d.n(t)))?t.toString("hex"):null}async isMainHash(t){if(r("string"==typeof t),t===c.NULL_HASH)return!1;if(t===this.network.genesis.hash)return!0;if(t===this.state.tip)return!0;var e=this.cacheHash.get(t);return e&&(e=this.cacheHeight.get(e.height))?e.hash===t:!!await this.getNextHash(t)}async isMainChain(t){var e;return!!t.isGenesis()||t.hash===this.state.tip||((e=this.getCache(t.height))?t.hash===e.hash:!!await this.getNextHash(t.hash))}getEntries(){return this.db.values({gte:d.e(c.ZERO_HASH),lte:d.e(c.MAX_HASH),parse:t=>w.fromRaw(t)})}getTimestampHashes(t,e){return this.db.keys({gte:d.th(e,c.ZERO_HASH),lte:d.th(t,c.MAX_HASH),parse:d.thh})}getContracts(){return this.db.values({gte:d.tx(c.NULL_HASH),lte:d.tx(c.HIGH_HASH),parse:t=>s.parseJson(t.toString())})}getCps(){return this.db.values({gte:d.CP(c.ZERO_CID,"hex"),lte:d.CP(c.MAX_CID,"hex"),parse:t=>K.fromRaw(t)})}async setCp(t){var e=this.db.batch();e.put(d.CP(t.cid),t.toRaw()),await e.write()}async delCp(t){var e=this.db.batch();e.del(d.CP(t)),await e.write()}getScs(){return this.db.values({gte:d.SC(c.ZERO_CID,"hex"),lte:d.SC(c.MAX_CID,"hex"),parse:t=>H.fromRaw(t)})}async setSc(t){var e=this.db.batch();e.put(d.SC(t.id),t.toRaw()),await e.write()}async delSc(t){var e=this.db.batch();e.del(d.SC(t)),await e.write()}async getSCList(t){return r(Array.isArray(t)),this.scList.query(t)}async getStockAccountList(t){return t?this.db.values({gte:U.SN(t,c.NULL_HASH),lte:U.SN(t,c.HIGH_HASH),parse:U.fromRaw}):this.db.values({gte:U.SN(c.ZERO_CID_BUF,c.NULL_HASH),lte:U.SN(c.MAX_CID_BUF,c.HIGH_HASH),parse:U.fromRaw})}async setStockRecord(t){var e=this.db.batch();switch(e.put(t.itemNo,t.toRaw()),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(i.stock.sum=t.sum,i.stock.price=t.price,i.seq=t.seq,i.stock.period=this.curHeight+1+10*D.BLOCK_DAY,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Auction:{if(!(i=this.accountList.getStockAccount(t.cid,t.to)))break;let s=this.accountList.getStockAccount(t.cid,t.addr);s||(s=new U(t.cid,t.addr,0,0,0),this.accountList.setStockAccount(s));var r=s.sum+t.sum;s.price=(t.sum*t.price+s.sum*s.price)/r|0,s.sum=r,s.seq=t.seq,e.put(s.getItemNo(),s.toRaw()),r=i.sum-t.sum,i.sum=r,i.stock.sum-=t.sum,e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Purchase:{let i=this.accountList.getStockAccount(t.cid,t.addr);i?(r=i.sum+t.sum,i.price=(t.sum*t.price+i.sum*i.price)/r,i.sum=r,i.seq=t.seq):((i=new U(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(i)),e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Send:if(i=this.accountList.getStockAccount(t.cid,t.addr)){i.sum-=t.sum,i.seq=t.seq;let s=this.accountList.getStockAccount(t.cid,t.to);s||(s=new U(t.cid,t.to,0,0),this.accountList.setStockAccount(s)),r=s.sum+t.sum,s.price=(t.sum*i.price+s.sum*s.price)/r,s.sum=r,e.put(i.getItemNo(),i.toRaw()),e.put(s.getItemNo(),s.toRaw())}break;case G.RecordType.Bonus:case G.RecordType.Ads:}await e.write()}async unsetStockRecord(t){var e=this.db.batch();switch(e.del(t.itemNo),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.stock.sum=0,s.stock.price=0,s.stock.period=0,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Auction:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(i=s.sum-t.sum,s.price=(s.sum*s.price-t.sum*t.price)/i|0,s.sum=i,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),s=this.accountList.getStockAccount(t.cid,t.to))&&(i=s.sum+t.sum,s.sum=i,s.stock.sum+=t.sum,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Purchase:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(s=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*t.price)/s|0,i.sum=s,i.seq=t.seq-1,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Send:var r,s;(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.sum+=t.sum,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),i=this.accountList.getStockAccount(t.cid,t.to))&&(r=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*s.price)/r|0,i.sum=r,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Bonus:}await e.write()}async getStockPropList(t){return this.db.range({gte:d.VP(""+t+this.network.stockFix+s.sprintf("%02d",0)),lte:d.VP(""+t+this.network.stockFix+s.sprintf("%02d",29)),values:!0})}async delVp(t){var e=this.db.batch();e.del(d.VP(t.pid)),await e.write()}async setVp(t){var e=this.db.batch();e.put(d.VP(t.pid),t.toRaw()),await e.write()}async getVp(t){return(t=await this.db.get(d.VP(t)))?X.fromRaw(t):null}loadVpList(){return this.db.values({gte:d.VP(c.ZERO_CID,"hex"),lte:d.VP(c.MAX_CID,"hex"),parse:t=>X.fromRaw(t)})}async delHtlc(t){var e;t.id&&(this.htlcList.delete(t.id),this.htlcList.delAccount(t),(e=this.db.batch()).del(d.VH(t.shash,t.sidx)),await e.write())}async setSuggest(t){t=new J(t);var e=(this.htlcList.set(t.id,t),this.db.batch());e.put(d.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async setAssent(t){t=new J(t);var e=(this.htlcList.set(t.id,t),this.db.batch());e.put(d.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async loadHtlcList(){return this.db.values({gte:d.VH(c.ZERO_CID,0),lte:d.VH(c.MAX_CID,4294967295),parse:t=>J.fromRaw(t)})}async delErAbolish(t){var e=this.db.batch();e.del(d.ERA(t.erid)),await e.write()}async setErAbolish(t){var e=this.db.batch();e.put(d.ERA(t.erid),t.toRaw()),await e.write()}async getErAbolish(t){return(t=await this.db.get(d.ERA(t)))?it.fromRaw(t):null}loadErAbolishList(){return this.db.values({gte:d.ERA(c.ZERO_CID),lte:d.ERA(c.MAX_CID),parse:t=>it.fromRaw(t)})}async delCpEn(t){var e=this.db.batch();e.del(d.EN2(t.to,t.from)),await e.write()}async setCpEn(t){var e=this.db.batch();e.put(d.EN2(t.to,t.from),t.toRaw()),await e.write()}loadCpEnList(){return this.db.values({gte:d.EN2(c.ZERO_CID,c.ZERO_CID,"ascii"),lte:d.EN2(c.MAX_CID,c.MAX_CID,"ascii"),parse:t=>st.fromRaw(t)})}queryCpEnListByCid(t){return this.db.values({gte:d.EN2(t,c.ZERO_CID,"ascii"),lte:d.EN2(t,c.MAX_CID,"ascii"),parse:t=>st.fromRaw(t)})}async delEr(t){var e=this.db.batch();e.del(d.ER(t.erid)),e.del(d.ERR(t.witness,t.erid)),await e.write()}async setEr(t){var e=this.db.batch(),i=d.ERR(t.witness,t.erid);e.put(i,t.toRaw()),e.put(d.ER(t.erid),i),await e.write()}async getEr(t){return(t=(t=await this.db.get(d.ER(t)))&&await this.db.get(t))?tt.fromRaw(t):null}async byPubkey(t,e,i=!1){if(!(t=await this.db.values({gte:d.ERR(t,c.ZERO_CID),lte:d.ERR(t,c.MAX_CID),parse:t=>tt.fromRaw(t)}))||0==t.length)return[];let r=null;if(i){var s,n=new Map;for(s of t){var a,o=await this.caVerifyObj(s);o&&((a=n.get(o.source.cluster))?o.startHeight>a.startHeight&&n.set(s.source.cluster,o):n.set(o.source.cluster,o))}r=n.values()}else r=t;if(!r||0==r.length)return[];var h,u=new y;for(h of r)u.set(h.erid,h);return u.query(e)}async caVerify(t){return this.caVerifyObj(await this.erList.getEr(t))}async caVerifyObj(t){var e;return t?(t.verify=!1,t.validHeight<=this.chain.height||(e=await this.erAbList.getErAb(t.erid))&&e.abolishHeight<this.chain.height||(e=lt.fromPublic(Buffer.from(t.witness,"hex"),this.network.type),t.verifying(e)&&(t.verify=!0,0<(e=this.cpList.query([["pubKey",t.witness]])).list.length)&&(t.cpid=e.list[0].cid)),t):null}async addOrder(t){await this.batchPut(d.o(t.cid,t.sn),t.toRaw())}async arrangeOrder(t){var e,i=[],r=[];for(e of await this.db.values({gte:d.o(t,c.ZERO_OID),lte:d.o(t,c.MAX_OID),parse:R.fromRaw}))(-1==e.height&&this.curHeight-e.publish>=10*D.BLOCK_DAY?r:i).push(e);return 0<r.length&&this.delOrder(r),i}async getAddressesFromOrder(t){var e,i=[];t.cls&&i.push(["cls",t.cls]);let r=await this.node.rpc.execute({method:"cp.remoteQuery",params:[i]}),s=[];for(e of r=r.list.map(t=>t.cid))s=s?s.concat(await this.arrangeOrder(e)):await this.arrangeOrder(e);s=s.reduce((e,i)=>(i.addr&&0<i.height&&(!t.time||600*(this.chain.height-i.height)<t.time)&&(e[i.addr]?i.sum&&(e[i.addr].sum+=i.sum):(e[i.addr]=i,e[i.addr].sum=e[i.addr].sum||0)),e),{});var n={list:[],pageNum:1,pageCur:1};(s=(s=t.amount?Object.values(s).filter(e=>e.sum>=t.amount):Object.values(s)).map(t=>({addr:t.addr,sum:t.sum}))).length%t.pageSize==0?n.pageNum=s.length/t.pageSize|0:n.pageNum=1+(s.length/t.pageSize|0),n.pageCur=Math.max(1,Math.min(n.pageNum,t.page));for(let e=t.pageSize*(n.pageCur-1);e<t.pageSize*n.pageCur&&s[e];e++)n.list.push(s[e]);return n}async getOrderList(t,e){r("string"==typeof t),r(Array.isArray(e));let i=null;for(var n of e)if("sn"==n[0]){i=2==n.length?n[1]:n[2],i=Array.isArray(i)?1==i.length?s.sprintf("%0-36s",i[0]):i.map(t=>s.sprintf("%0-36s",t)):s.sprintf("%0-36s",i),2==n.length?n[1]=i:n[2]=i;break}var a=new y;return(await this.arrangeOrder(t)).reduce((t,e)=>(t.set(""+e.cid+e.sn,e),t),a),a.query(e)}async getOrderRecord(t,e){return r("string"==typeof t),r("string"==typeof e),e=s.sprintf("%0-36s",e),(t=await this.db.get(d.o(t,e)))?(0<(e=R.fromRaw(t)).height?e.confirm=this.chain.height-e.height+1:e.confirm=0,e):null}async delOrder(t){const e=this.db.batch();Array.isArray(t)?t.map(t=>{e.del(d.o(t.cid,t.sn))}):e.del(d.o(t.cid,t.sn)),await e.write()}async getStockRecordById(t){return(t=await this.db.get(t))?G.fromRaw(t):null}async getStockRecord(t,e,i){let r=6,s=c.ZERO_CID_BUF,n=c.MAX_CID_BUF,a=0;return t&&(r=t,e)&&(s=e,n=e,i)&&(a=i),t=await this.db.values({gte:G.itemNo(r,s,a,c.NULL_HASH,0),lte:G.itemNo(r,n,4294967295,c.HIGH_HASH,4294967295),parse:G.fromRaw}),e=new y,t.reduce((t,e)=>(t.set(e.itemNo,e),t),e),e}async getStockRecordByCid(t,e){var i,r=new y;for(i of Object.keys(G.RecordType))r.merge(await this.getStockRecord(G.RecordType[i],t,e));return r}async saveVote(t,e){var i=this.db.batch();i.put(d.VM(t),Buffer.from(JSON.stringify(e))),await i.write()}async saveOracle(t,e){var i=this.db.batch();i.put(d.VO(t),Buffer.from(JSON.stringify(e))),await i.write()}getTips(){return this.db.keys({gte:d.p(c.ZERO_HASH),lte:d.p(c.MAX_HASH),parse:d.pp})}async readCoin(t){var e,i,r,s;return this.options.spv?null:(({hash:e,index:i}=t),t=t.toKey(),r=this.state,(s=this.coinCache.get(t))?k.fromRaw(s):(s=await this.db.get(d.c(e,i)))?(r===this.state&&this.coinCache.set(t,s),k.fromRaw(s)):null)}async getCoin(t,e){return t=new g(t,e),(e=await this.readCoin(t))?e.toCoin(t):null}async hasCoins(t){for(let i=0;i<t.outputs.length;i++){var e=d.c(t.hash(),i);if(await this.db.has(e))return!0}return!1}async getCoinView(t){var e,i=new u;for({prevout:e}of t.inputs){var r=await this.readCoin(e);r&&i.addEntry(e,r)}return i}async getSpentView(t){var e,i=await this.getCoinView(t);for({prevout:e}of t.inputs)if(!i.hasEntry(e)){var r,{hash:r,index:s}=e;if(r=await this.getMeta(r)){const{tx:t,height:e,time:n}=r;s<t.outputs.length&&i.addIndex(t,s,e,n)}}return i}async getUndoCoins(t){return(t=await this.db.get(d.u(t)))?l.fromRaw(t):new l}async getBlock(t){return(t=await this.getRawBlock(t))?m.fromRaw(t):null}async getRawBlock(t){return!this.options.spv&&(t=await this.getHash(t))?this.db.get(d.b(t)):null}async getBlockView(t){var e=new u,i=await this.getUndoCoins(t.hash());if(!i.isEmpty()){for(let r=t.txs.length-1;0<r;r--){var s=t.txs[r];for(let t=s.inputs.length-1;0<=t;t--){var n=s.inputs[t];i.apply(e,n.prevout)}}r(i.isEmpty(),"Undo coins data inconsistency.")}return e}async getMeta(t){return this.options.indexTX&&(t=await this.db.get(d.t(t)))?b.fromRaw(t):null}async getTX(t){return(t=await this.getMeta(t))?t.tx:null}async getExtendTX(t){return(t=await this.getMeta(t))||null}async hasTX(t){return!!this.options.indexTX&&this.db.has(d.t(t))}async getCoinsByAddress(t){if(!this.options.indexAddress)return[];var e=[];for(const o of t=Array.isArray(t)?t:[t]){var i,s,n=v.getHash(o);for([i,s]of await this.db.keys({gte:d.C(n,c.ZERO_HASH,0),lte:d.C(n,c.MAX_HASH,4294967295),parse:d.Cc})){var a=await this.getCoin(i,s);r(a),e.push(a)}}return e}async getHashesByAddress(t,e="both"){if(Array.isArray(t)||(t=[t]),!this.options.indexTX||!this.options.indexAddress)return[];const i=Object.create(null);for(const s of t){var r=v.getHash(s);let t,n;n="input"==e?(t=d.TI(r,c.ZERO_HASH),d.TI(r,c.MAX_HASH)):"output"==e?(t=d.TO(r,c.ZERO_HASH),d.TO(r,c.MAX_HASH)):(t=d.T(r,c.ZERO_HASH),d.T(r,c.MAX_HASH)),await this.db.keys({gte:t,lte:n,parse:t=>{t=d.Tt(t),i[t]=!0}})}return Object.keys(i)}async getTXByAddress(t){var e=[];for(const i of await this.getMetaByAddress(t))e.push(i.tx);return e}async getVpByOid(t){return{list:[],count:0}}async getVpByAddress(t){var e=[];for(const s of await this.getMetaByAddress(t))for(let t=0;t<s.tx.outputs.length;t++){var i=s.tx.outputs[t],r=i.getReturnData([ot.OP_PROPCREATE,ot.OP_PROPEXCHANGE]);r&&(r.current={hash:s.tx.rhash("hex"),index:t,address:i.getAddress().toString()},e.push(r))}return{list:e,count:e.length}}async getMetaByAddress(t){if(!this.options.indexTX||!this.options.indexAddress)return[];Array.isArray(t)||(t=[t]);var e=[];for(const s of await this.getHashesByAddress(t)){var i=await this.getMeta(s);r(i),e.push(i)}return e}async scan(t,e,i){"number"==typeof(t=null==t?this.network.genesis.hash:t)?this.logger.info("Scanning from height %d.",t):this.logger.info("Scanning from block %s.",s.revHex(t));let r=await this.getEntry(t);if(r){if(!await this.isMainChain(r))throw new Error("Cannot rescan an alternate chain.");let t=0;for(;r;){var n=await this.getBlock(r.hash),a=[];if(t++,n){this.logger.info("Scanning block %s (%d).",r.rhash(),r.height);for(let t=0;t<n.txs.length;t++){var o=n.txs[t];let i=!1;for(let t=0;t<o.outputs.length;t++){var c=o.outputs[t].getHash();c&&(0==r.height||e&&e.test(c))&&(c=g.fromTX(o,t),e.add(c.toRaw()),i=!0)}if(!e||i)a.push(o);else if(0!==t)for(var{prevout:h}of o.inputs)if(!e||e.test(h.toRaw())){a.push(o);break}}}else if(!this.options.spv&&!this.options.prune)throw new Error("Block not found.");await i(r,a),r=await this.getNext(r)}this.logger.info("Finished scanning %d blocks.",t)}}async save(t,e,i){this.start();try{await this._save(t,e,i)}catch(t){throw this.drop(),t}await this.commit()}async _save(t,e,i){var r=e.hash();this.put(d.h(r),S(t.height)),this.put(d.th(e.time,r),null),this.put(d.e(r),t.toRaw()),this.cacheHash.push(t.hash,t),this.del(d.p(t.prevBlock)),this.put(d.p(r),null),this.saveUpdates(),i?(t.isGenesis()||this.put(d.n(t.prevBlock),r),this.put(d.H(t.height),r),this.cacheHeight.push(t.height,t),await this.saveBlock(t,e,i),this.put(d.R,this.pending.commit(r))):await this.saveBlock(t,e)}async reconnect(t,e,i){this.start();try{await this._reconnect(t,e,i)}catch(t){throw this.drop(),t}await this.commit()}async _reconnect(t,e,i){var s=e.hash();r(!t.isGenesis()),this.put(d.n(t.prevBlock),s),this.put(d.H(t.height),s),this.cacheHeight.push(t.height,t),this.cacheHash.push(t.hash,t),this.saveUpdates(),await this.connectBlock(t,e,i),this.put(d.R,this.pending.commit(s))}async disconnect(t,e){let i;this.start();try{i=await this._disconnect(t,e)}catch(t){throw this.drop(),t}return await this.commit(),i}async _disconnect(t,e){return this.del(d.n(t.prevBlock)),this.del(d.H(t.height)),this.cacheHeight.unpush(t.height),this.saveUpdates(),e=await this.disconnectBlock(t,e),this.put(d.R,this.pending.commit(t.prevBlock)),e}saveUpdates(){var t=this.stateCache.updates;if(0!==t.length){this.logger.info("Saving %d state cache updates.",t.length);for(const r of t){var{bit:e,hash:i}=r;this.put(d.v(e,i),r.toRaw())}}}async reset(t){var e=await this.getEntry(t);if(!e)throw new Error("Block not found.");if(!await this.isMainChain(e))throw new Error("Cannot reset on alternate chain.");if(this.options.prune)throw new Error("Cannot reset when pruned.");await this.removeChains();let i=await this.getTip();for(r(i),this.logger.debug("Resetting main chain to: %s",e.rhash());;){if(this.start(),i.hash===e.hash){this.put(d.R,this.pending.commit(i.hash)),await this.commit();break}r(!i.isGenesis()),this.del(d.p(i.hash)),this.put(d.p(i.prevBlock),null),this.del(d.H(i.height)),this.del(d.h(i.hash)),this.del(d.th(i.time,i.hash)),this.del(d.e(i.hash)),this.del(d.n(i.prevBlock));try{await this.removeBlock(i)}catch(t){throw this.drop(),t}this.cacheHeight.remove(i.height),this.cacheHash.remove(i.hash),i=await this.getPrevious(i),r(i)}return i}async removeChains(){var t=await this.getTips();this.start();try{for(const e of t)await this._removeChain(e)}catch(t){throw this.drop(),t}await this.commit()}async _removeChain(t){let e=await this.getEntryByHash(t);if(!e)throw new Error("Alternate chain tip not found.");for(this.logger.debug("Removing alternate chain: %s.",e.rhash());!await this.isMainChain(e);)r(!e.isGenesis()),this.del(d.p(e.hash)),this.del(d.h(e.hash)),this.del(d.th(e.time,e.hash)),this.del(d.e(e.hash)),this.del(d.b(e.hash)),this.cacheHash.unpush(e.hash),e=await this.getPrevious(e),r(e)}async saveBlock(t,e,i){var r=e.hash();this.options.spv||(this.put(d.b(r),e.toRaw()),i&&await this.connectBlock(t,e,i))}async removeBlock(t){if(this.options.spv)return new u;var e=await this.getBlock(t.hash);if(!e)throw new Error("Block not found.");this.del(d.b(e.hash()));var i=await this.disconnectBlock(t,e);return this.put(d.R,this.pending.commit(t.prevBlock)),await this.commit(),await this.chain.fire("block.disconnect",t,e,i),i}saveView(t){for(var[e,i]of t.map)for(var[r,s]of i.outputs)s.spent?(this.del(d.c(e,r)),this.coinCache.unpush(e+r)):(this.del(d.s(e,r)),s=s.toRaw(),this.put(d.c(e,r),s),this.coinCache.push(e+r,s))}async getSpender(t,e){return(t=await this.db.get(d.s(t,e)))?P.DecodeSpenderValue(t):null}async connectBlock(t,e,i){if(!this.options.spv){var r=e.hash("hex");this.pending.connect(e);for(let u=0;u<e.txs.length;u++){var s=e.txs[u],n=s.hash("hex");if(!t.isGenesis()&&0<u)for(let t=0;t<s.inputs.length;t++){var a=s.inputs[t].prevout,o=i.getOutput(a);this.pending.spend(o);try{await this.emitCoinSpent(s.inputs[t],o,s,e)}catch(t){this.logger.error("connect block:",t.message)}this.put(d.s(a.hash,a.index),P.EncodeSpenderValue(n,t,e.height,r))}for(const t of s.outputs)t.script.isUnspendable()||this.pending.add(t);try{var c=await O.FactoryOfContract({env:this,block:e,tx:s,coins:i});if(!t.isGenesis()){var h=await c.verify();if(1!=h)throw new pt(s,E(h),"bad-contract-verify",100)}await c.isBlockFinal()==_.Final&&await c.confirm()}catch(t){this.logger.error("TX(%s) Smart Contract Execute Error: %s",s.txid(),t.message)}this.indexTX(s,i,t,u)}this.saveView(i),i.undo.isEmpty()||this.put(d.u(r),i.undo.commit()),await this.setCpHistory(),await this.voteMgr.saveVote(),this.scList.deletes([["indate","<",this.chain.height]]),await this.pruneBlock(t)}}async disconnectBlock(t,e){var i=new u;if(!this.options.spv){var s=e.hash(),n=await this.getUndoCoins(s);this.pending.disconnect(e);for(let r=e.txs.length-1;0<=r;r--){var a=e.txs[r];if(0<r)for(let t=a.inputs.length-1;0<=t;t--){var o=a.inputs[t].prevout;n.apply(i,o),this.pending.add(i.getOutput(o))}i.removeTX(a,t.height,t.time);for(let t=a.outputs.length-1;0<=t;t--){var c=a.outputs[t];c.script.isUnspendable()||this.pending.spend(c)}try{await(await O.FactoryOfContract({env:this,block:e,tx:a})).unconfirm()}catch(s){this.logger.error("TX(%s) Smart Contract Unconfirm Error: %s",a.txid(),s.message)}await this.unindexTX(a,i)}r(n.isEmpty(),"Undo coins data inconsistency."),this.saveView(i),this.del(d.u(s)),await this.voteMgr.saveVote()}return i}async pruneBlock(t){this.options.spv||!this.options.prune||(t=t.height-this.network.block.keepBlocks)<=this.network.block.pruneAfterHeight||(t=await this.getHash(t))&&(this.del(d.b(t)),this.del(d.u(t)))}saveFlags(){var t=ft.fromOptions(this.options),e=this.db.batch();return e.put(d.O,t.toRaw()),e.write()}indexTX(t,e,i,r){var s=t.hash();if(this.options.indexTX&&(r=b.fromTX(t,i,r),this.put(d.t(s),r.toRaw()),this.options.indexAddress)){for(const e of t.getHashes())this.put(d.T(e,s),null);for(const e of t.getOutputHashes())this.put(d.TO(e,s),null);for(const i of t.getInputHashes(e))this.put(d.TI(i,s),null)}if(this.options.indexAddress){if(!i.isGenesis()&&!t.isCoinbase())for(var{prevout:n}of t.inputs){var a=e.getOutput(n).getHash();a&&this.del(d.C(a,n.hash,n.index))}for(let e=0;e<t.outputs.length;e++){var o=t.outputs[e].getHash();o&&this.put(d.C(o,s,e),null)}}}async unindexTX(t,e){var i,r=t.hash();if(this.options.indexTX&&(this.del(d.t(r)),this.options.indexAddress))for(i of t.getHashes(e))this.del(d.T(i,r)),this.del(d.TI(i,r)),this.del(d.TO(i,r));if(this.options.indexAddress){if(!t.isCoinbase())for(var{prevout:s}of t.inputs){var n=e.getOutput(s).getHash();n&&this.put(d.C(n,s.hash,s.index),null)}for(let e=0;e<t.outputs.length;e++){var a=t.outputs[e].getHash();a&&this.del(d.C(a,r,e))}}}async readHostList(){return this.db.get(d.HL)}async writeHostList(t){var e=this.db.batch();return e.put(d.HL,t),e.write()}async emitCoinSpent(t,e,i,r){(i={env:this,block:r,tx:i,hash:t.prevout.hash,i:t.prevout.index,height:r.height,output:e,type:e.getReturnType(),data:e.getReturnData(ct)}).data&&await at(i).spent(t)}}function ft(t){if(!(this instanceof ft))return new ft(t);this.network=h.primary,this.spv=!1,this.witness=!0,this.prune=!1,this.indexTX=!1,this.indexAddress=!1,t&&this.fromOptions(t)}dt.layout=d,ft.prototype.fromOptions=function(t){return this.network=h.get(t.network),null!=t.spv&&(r("boolean"==typeof t.spv),this.spv=t.spv),null!=t.prune&&(r("boolean"==typeof t.prune),this.prune=t.prune),null!=t.indexTX&&(r("boolean"==typeof t.indexTX),this.indexTX=t.indexTX),null!=t.indexAddress&&(r("boolean"==typeof t.indexAddress),this.indexAddress=t.indexAddress),this},ft.fromOptions=function(t){return(new ft).fromOptions(t)},ft.prototype.toRaw=function(){var t=new a(12);let e=0;return this.spv&&(e|=1),this.witness&&(e|=2),this.prune&&(e|=4),this.indexTX&&(e|=8),this.indexAddress&&(e|=16),t.writeU32(this.network.magic),t.writeU32(e),t.writeU32(0),t.render()},ft.prototype.fromRaw=function(t){return t=new n(t),this.network=h.fromMagic(t.readU32()),t=t.readU32(),this.spv=0!=(1&t),this.witness=0!=(2&t),this.prune=0!=(4&t),this.indexTX=0!=(8&t),this.indexAddress=0!=(16&t),this},ft.fromRaw=function(t){return(new ft).fromRaw(t)};class mt{constructor(){this.tip=c.NULL_HASH,this.tx=0,this.coin=0,this.value=0,this.committed=!1}rhash(){return s.revHex(this.tip)}clone(){var t=new mt;return t.tip=this.tip,t.tx=this.tx,t.coin=this.coin,t.value=this.value,t}connect(t){this.tx+=t.txs.length}disconnect(t){this.tx-=t.txs.length}add(t){this.coin++,this.value+=t.value}spend(t){this.coin--,this.value-=t.value}commit(t){return"string"!=typeof t&&(t=t.toString("hex")),this.tip=t,this.committed=!0,this.toRaw()}toRaw(){var t=new a(56);return t.writeHash(this.tip),t.writeU64(this.tx),t.writeU64(this.coin),t.writeU64(this.value),t.render()}static fromRaw(t){var e=new mt;t=new n(t);return e.tip=t.readHash("hex"),e.tx=t.readU64(),e.coin=t.readU64(),e.value=t.readU64(),e}}function gt(t){this.network=t,this.bits=[],this.updates=[],this._init()}function yt(t,e,i){this.bit=t,this.hash=e,this.state=i}gt.prototype._init=function(){for(let t=0;t<32;t++)this.bits.push(null);for(var{bit:t}of this.network.deploys)r(!this.bits[t]),this.bits[t]=new Map},gt.prototype.set=function(t,e,i){var s=this.bits[t];r(s),s.get(e.hash)!==i&&(s.set(e.hash,i),this.updates.push(new yt(t,e.hash,i)))},gt.prototype.get=function(t,e){return t=this.bits[t],r(t),null==(t=t.get(e.hash))?-1:t},gt.prototype.commit=function(){this.updates.length=0},gt.prototype.drop=function(){for(var{bit:t,hash:e}of this.updates)t=this.bits[t],r(t),t.delete(e);this.updates.length=0},gt.prototype.insert=function(t,e,i){t=this.bits[t],r(t),t.set(e,i)},yt.prototype.toRaw=function(){return x(this.state)},t.exports=dt},function(t,e,i){"use strict";
|
|
884
|
+
*/const r=i(0),s=i(1),n=i(2),a=i(4),o=i(33),c=i(3),h=i(15),u=i(61),l=i(252),p=i(169),d=i(148),f=i(65),m=i(75),g=i(46),y=i(31),v=i(12),w=i(332),b=i(333),k=i(147),x=c.U8,S=c.U32,{getVerifyMsg:E,BlockFinalType:_,OrderData:R,ContractEnvType:A,ContractType:C}=i(5);var I=i(72);const O=i(43),P=i(19),T=i(60),j=i(114),B=i(26),N=i(7),F=i(145),D=i(6),L=i(161),M=i(154),H=M.scItem,z=i(232),U=z.stockAccount,q=i(342),V=i(85),K=V.cpItem,W=V.cpSnap,G=V.stockItem,$=i(134),X=$.vpItem,Y=i(343),J=Y.vpItem,Z=i(728),Q=i(157),tt=Q.ErItem,et=i(158),it=et.ErAbolishItem,rt=i(237),st=rt.EnchancementItem;i(53);const nt=i(344),at=i(118),{opcodes:ot,nestingCodes:ct}=i(21),ht=i(125),ut=i(28),lt=i(39),pt=i(37).VerifyError;class dt extends I{constructor(t){super(),this.chain=t,this.eid="chaindb",this.fromOptions(t.options),this.db=p(this.options),this.stateCache=new gt(this.network),this.state=new mt,this.pending=null,this.current=null,this.coinCache=new f(this.options.coinCache),this.cacheHash=new f(this.options.entryCache),this.cacheHeight=new f(this.options.entryCache),this.autoTaskMgr=new L(this),this.propList=new $(this),this.htlcList=new Y(this),this.$voteMgr=new Z(this),this.transactionList=new q(this),this.cpList=new V(this),this.scList=new M(this),this.erList=new Q(this),this.erAbList=new et(this),this.enCpList=new rt(this,{type:"cp"}),this.accountList=new z(this),this.middleHashChain=new Set,this.on("contract.order.confirm",t=>{var e=this.cpList.getItem(t.cid);e&&this.node.notifyCp(t,e)}),this.on("contract.order.unconfirm",t=>{var e=this.cpList.getItem(t.cid);e&&this.node.notifyCp(t,e)})}get hmacConnection(){return this.node.specialCp.content()}get voteMgr(){return this.$voteMgr}async setCpHistory(){if(this.curHeight%10==0){var t=await this.cpList.query([["status",1]]);if(0<t.list.length){var e,i=this.db.batch();for(e of t.list){var r=e.cid,s={};let t=100;for(const i of(await this.getStockPropList(r)).reduce((t,e)=>((e=X.fromRaw(e.value)).height<=this.curHeight-D.BLOCK_DAY&&t.push(e),t),[]))if(i.current.address!=e.current.address&&(s[i.current.address]=(s[i.current.address]||0)+1),(t-=3)<=70)break;var n=(await this.accountList.query([["cid",r]])).list.sort((t,e)=>t.addr.localeCompare(e.addr));n=new W({grate:e.grate,addrOfMaster:e.current.address,hSum:e.stock.hSum,lords:s,slist:n});i.put(d.SS(r,this.curHeight),n.toRaw()),e.status=0,i.put(d.CP(e.cid),e.toRaw())}await i.write()}}}async getGuider(t){return t=v.fromString(t).getHash("hex"),(t=await this.db.get(d.g(t)))?v.fromRaw(t).toString():null}async setGuider(t,e,i){var r;i=v.fromString(i),await this.db.has(d.g(i.getHash("hex")))||(t=v.fromString(t),await(r=this.db.batch()).put(d.g(i.getHash("hex")),t.toRaw()),await r.put(d.gs(t.getHash("hex"),Buffer.from(e,"ascii").toString("hex"),i.getHash("hex")),i.toRaw()),await r.write())}async unsetGuider(t,e,i){t=v.fromString(t).getHash("hex"),i=v.fromString(i).getHash("hex");var r=this.db.batch();r.del(d.g(i)),r.del(d.gs(t,Buffer.from(e,"ascii").toString("hex"),i)),await r.write()}async getSimAddresses(t,e){t=v.fromString(t).getHash("hex");let i=Buffer.from(e,"ascii").toString("hex"),r=i;return e||(i=c.ZERO_CID,r=c.MAX_CID),(await this.db.values({gte:d.gs(t,i,c.ZERO_HASH160_HEX),lte:d.gs(t,r,c.MAX_HASH160_HEX),parse:t=>v.fromRaw(t).toString()})).length}async getCpHistory(t,e){return(t=await this.db.get(d.SS(t,e)))?W.fromRaw(t):null}async getCpSnap(t){let e=null,i=this.curHeight;for(;!e;){10<=i?5<(s=i%10)?i-=s:i=i-10-s:i=0;var r,s=await this.getCpHistory(t,i);if(s)(e={cid:t}).grate=s.grate,e.addrOfMaster=s.addrOfMaster,e.hSum=s.hSum,e.slist=s.slist,e.lords=s.lords,e.addresses=Object.keys(e.lords).sort((t,e)=>t.localeCompare(e));else if(0==i)return(r=this.cpList.getItem(t))?{cid:r.cid,grate:r.grate,addrOfMaster:r.current.address,hSum:r.stock.hSum,slist:[],lords:{},addresses:[]}:null}return e}get mode(){return A.Block}fromOptions(t){this.options=t,this.node=t.node,this.network=t.network,this.logger=t.logger.context("chaindb")}get curHeight(){return this.chain.height}get finder(){return this.node.getTXFromAll?this.node.getTXFromAll.bind(this.node):()=>{}}get tidCreator(){return d.tx}rpcExecute(){return this.node.rpc.execute.apply(this.node.rpc,arguments)}createGenesisCoinbase(t,e){var i,r=new P,s=new j,n=((i=((i=(s.script.pushInt(0),s.script.pushData(c.ZERO_HASH160),Buffer.allocUnsafe(4))).writeUInt32LE(0,0,!0),s.script.pushData(i),s.script.pushData(c.ZERO_U64),s.script.compile(),s.witness.push(c.ZERO_HASH),s.witness.compile(),r.inputs.push(s),new B)).script.createScript(c.ZERO_HASH160),i.value=D.ORIGINAL,r.outputs.push(i),c.ZERO_HASH),a=[],[a,,]=(a.push(c.ZERO_HASH),F.createRoot(a));a=N.root256(a,n);return(n=new B).script.fromCommitment(a),r.outputs.push(n),s.script.setData(1,e),s.script.compile(),i.script.fromAddress(t.addresses[0]),r}dummyInput(){return j.fromOutpoint(new g(c.NULL_HASH,0))}createGenesisBlock(t){if(!t.addresses||t.addresses.length<11)throw new Error("addresses length expect 11.");let e=t.flags;e=e||Buffer.from("In the name of Athena: Of the user, By the user, and For the user.","ascii");var i=this.createGenesisCoinbase(t,e),r=this.network.genesisId,n=new T,[n,,]=(n.addInput(this.dummyInput()),n.cpRegister(t.addresses[0],D.COIN,{cid:r,oper:C.cpRegister,name:"ATHENA",ip:"*",pubAddress:"",pubKey:"",signMethod:""}),n.commit()),a=new T;a.addInput(this.dummyInput());for(let e=0;e<10;e++)for(let i=0;i<10;i++){var o={oper:C.propCreate,pid:""+this.network.tokenFix+s.sprintf("%04d",10*e+i+1),oid:this.network.tokenFix+"0000",cid:r,gold:D.COIN};a.propCreate(t.addresses[e+1],o)}var[h,,]=a.commit(),u=new m({version:t.version,prevBlock:c.NULL_HASH,merkleRoot:i.hash("hex"),time:t.time,bits:t.bits,nonce:t.nonce,height:0});return u.txs.push(i),u.txs.push(n),u.txs.push(h),u.refresh(!0),u.merkleRoot=u.createMerkleRoot("hex"),u}async open(t){this.logger.info("Opening ChainDB..."),await this.db.open();var e=await this.db.checkVersion(d,3);if(i=await this.getState()){var i;if(await this.verifyFlags(i),await this.verifyDeployments(),this.stateCache=await this.getStateCache(),this.state=i,!(i=await this.getEntry(0)))throw new Error("genesis block not found.");this.network.genesis.hash=i.hash,this.network.genesis.merkleRoot=i.merkleRoot,this.logger.info("ChainDB successfully loaded.")}else t&&(i=await this.getGenesisParams(t),this.node.miner&&(this.node.miner.addresses=[new v(i.coinbaseAddress)]),this.node.config)&&this.node.config.changeParams(i),await this.saveFlags(),await this.saveDeployments(),await this.saveGenesis(),this.logger.info("ChainDB successfully initialized.");return this.logger.info("Chain State: hash=%s tx=%d coin=%d value=%s.",this.state.rhash(),this.state.tx,this.state.coin,o.btc(this.state.value)),e}async getGenesisParams(t){if(t.isGenesisParams)return t;t=t||{};var e=new nt({name:"wallet-test",db:"memory",resolution:!1,verify:!1}),i=(e=(t.getMnemonicFromMemory=!0,await e.open(t),await e.get("primary")),[]);for(const s of await e.getPaths("default")){var r=s.toAddress();0==s.branch&&i.push(""+r.toString(t.network))}var s,n,a,o,h={};return h[t.network+"Addresses"]=i.reduce((t,e)=>t+(""==t?e:","+e),""),h.coinbaseAddress=i[1],h.notifyAddress=e.notifyAddress,this.node.config.notifyAddress=h.notifyAddress,await ht.writeFile(h,t.network+"-genesis.params"),t.isGenesisEncrypt||(s=N.hash256(Buffer.from(e.master.mnemonic.toSeed().toString("hex"))),n=ut.publicKeyCreate(s,!0),a=v.fromWitnessPubkeyhash(N.hash160(n),this.network.type).toString(),o=N.hash256(Buffer.concat([Buffer.from("root"),e.master.key.privateKey])),e={body:{language:e.master.mnemonic.language,phrase:e.master.mnemonic.getPhrase(),passphrase:e.master.mnemonic.passphrase,awardAddress:h.coinbaseAddress,notifyAddress:e.notifyAddress,alliancePrivateKey:o.toString("hex"),allianceName:"root",allianceNodeId:0,allianceNodeToken:{prv:s.toString("hex"),pub:n.toString("hex"),address:a}},password:t.password||c.MNEMONIC_SALT,network:t.network,file:t.network+"-genesis.keystore"},await ht.writeEncryptFile(e)),h}close(){return this.db.close()}start(){return r(!this.current),r(!this.pending),this.current=this.db.batch(),this.pending=this.state.clone(),this.coinCache.start(),this.cacheHash.start(),this.cacheHeight.start(),this.current}put(t,e){r(this.current),this.current.put(t,e)}del(t){r(this.current),this.current.del(t)}batch(){return r(this.current),this.current}drop(){var t=this.current;r(this.current),r(this.pending),this.current=null,this.pending=null,this.coinCache.drop(),this.cacheHash.drop(),this.cacheHeight.drop(),this.stateCache.drop(),t.clear()}async commit(){r(this.current),r(this.pending);try{await this.current.write()}catch(t){throw this.current=null,this.pending=null,this.coinCache.drop(),this.cacheHash.drop(),this.cacheHeight.drop(),t}this.pending.committed&&(this.state=this.pending),this.current=null,this.pending=null,this.coinCache.commit(),this.cacheHash.commit(),this.cacheHeight.commit(),this.stateCache.commit()}hasCache(t){return("number"==typeof t?this.cacheHeight:(r("string"==typeof t),this.cacheHash)).has(t)}getCache(t){return("number"==typeof t?this.cacheHeight:(r("string"==typeof t),this.cacheHash)).get(t)}async getHeight(t){var e;return"number"==typeof t?t:(r("string"==typeof t),t===c.NULL_HASH?-1:(e=this.cacheHash.get(t))?e.height:(e=await this.db.get(d.h(t)))?e.readUInt32LE(0,!0):-1)}async getHash(t){var e;return"string"==typeof t?t:(r("number"==typeof t),t<0?null:(e=this.cacheHeight.get(t))?e.hash:(e=await this.db.get(d.H(t)))?e.toString("hex"):null)}async getEntryByHeight(t){var e;return r("number"==typeof t),t<0?null:this.cacheHeight.get(t)||((t=await this.db.get(d.H(t)))&&(t=t.toString("hex"),e=this.state,t=await this.getEntryByHash(t))?(this.state===e&&this.cacheHeight.set(t.height,t),t):null)}async getEntryByHash(t){return r("string"==typeof t),t===c.NULL_HASH?null:this.cacheHash.get(t)||((t=await this.db.get(d.e(t)))?(t=w.fromRaw(t),this.cacheHash.set(t.hash,t),t):null)}getEntry(t){return"number"==typeof t?this.getEntryByHeight(t):this.getEntryByHash(t)}async hasEntry(t){return-1!==await this.getHeight(t)}async getAncestor(t,e){if(e<0)return null;if(r(0<=e),r(e<=t.height),await this.isMainChain(t))return this.getEntryByHeight(e);for(;t.height!==e;){t=this.getPrevCache(t)||await this.getPrevious(t),r(t)}return t}getPrevious(t){return this.getEntryByHash(t.prevBlock)}getPrevCache(t){return this.cacheHash.get(t.prevBlock)||null}async getNext(t){return(t=await this.getNextHash(t.hash))?this.getEntryByHash(t):null}async getNextEntry(t){var e=await this.getEntryByHeight(t.height+1);return e&&e.prevBlock===t.hash?e:null}getTip(){return this.getEntryByHash(this.state.tip)}async getState(){var t=await this.db.get(d.R);return t?mt.fromRaw(t):null}async saveGenesis(){let t=[];t=(this.node.config?this.node.config[this.network.type+"Addresses"]:this.network.genesis.addresses).split(",");var e=this.createGenesisBlock({version:this.network.genesis.version,time:this.network.genesis.time,bits:this.network.genesis.bits,nonce:this.network.genesis.nonce,addresses:t}),i=(this.network.genesis.hash=e.hash("hex"),this.network.genesis.merkleRoot=e.merkleRoot,w.fromBlock(e)),r=(this.logger.info("Writing genesis block to ChainDB."),new u);for(let t=0;t<e.txs.length;t++)r.addTX(e.txs[t],e.height,e.time);await this.save(i,e,r)}async getFlags(){var t=await this.db.get(d.O);return t?ft.fromRaw(t):null}async verifyFlags(t){var e=this.options,i=await this.getFlags();let r=!1,s=!1;if(!i)throw new Error("No flags found.");if(e.network!==i.network)throw new Error("Network mismatch for chain.");if(e.spv&&!i.spv)throw new Error("Cannot retroactively enable SPV.");if(!e.spv&&i.spv)throw new Error("Cannot retroactively disable SPV.");if(!i.witness){if(!e.forceFlags)throw new Error("Cannot retroactively enable witness.");r=!0}if(e.prune&&!i.prune){if(!e.forceFlags)throw new Error("Cannot retroactively prune.");s=!0}if(!e.prune&&i.prune)throw new Error("Cannot retroactively unprune.");if(e.indexTX&&!i.indexTX)throw new Error("Cannot retroactively enable TX indexing.");if(!e.indexTX&&i.indexTX)throw new Error("Cannot retroactively disable TX indexing.");if(e.indexAddress&&!i.indexAddress)throw new Error("Cannot retroactively enable address indexing.");if(!e.indexAddress&&i.indexAddress)throw new Error("Cannot retroactively disable address indexing.");r&&(await this.logger.info("Rewriting chain flags."),await this.saveFlags()),s&&(await this.logger.info("Retroactively pruning chain."),await this.prune(t.tip))}async getStateCache(){var t=new gt(this.network);for(const s of await this.db.range({gte:d.v(0,c.ZERO_HASH),lte:d.v(255,c.MAX_HASH),values:!0})){var[e,i]=d.vv(s.key),r=s.value[0];t.insert(e,i,r)}return t}saveDeployments(){var t=this.db.batch();return this.writeDeployments(t),t.write()}async batchPut(t,e){var i=this.db.batch();i.put(t,e),await i.write()}async batchDel(t){var e=this.db.batch();e.del(t),await e.write()}writeDeployments(t){var e=new a(1+17*this.network.deploys.length);e.writeU8(this.network.deploys.length);for(const t of this.network.deploys)e.writeU8(t.bit),e.writeU32(t.startTime),e.writeU32(t.timeout),e.writeI32(t.threshold),e.writeI32(t.window);t.put(d.V,e.render())}async checkDeployments(){var t=await this.db.get(d.V),e=(r(t,"No deployment table found."),new n(t)),i=e.readU8(),s=[];for(let t=0;t<i;t++){var a=e.readU8(),o=e.readU32(),c=e.readU32(),h=e.readI32(),u=e.readI32(),l=this.network.byBit(a);l&&o===l.startTime&&c===l.timeout&&h===l.threshold&&u===l.window||s.push(a)}return s}async verifyDeployments(){let t;try{t=await this.checkDeployments()}catch(e){if("EncodingError"!==e.type)throw e;t=[];for(let e=0;e<32;e++)t.push(e)}if(0===t.length)return!0;var e=this.db.batch();for(const i of t)this.logger.warning("Versionbit deployment params modified."),this.logger.warning("Invalidating cache for bit %d.",i),await this.invalidateCache(i,e);return this.writeDeployments(e),await e.write(),!1}async invalidateCache(t,e){for(const i of await this.db.keys({gte:d.v(t,c.ZERO_HASH),lte:d.v(t,c.MAX_HASH)}))e.del(i)}async prune(){var t=this.options,e=this.network.block.keepBlocks,i=this.network.block.pruneAfterHeight;if((await this.getFlags()).prune)throw new Error("Chain is already pruned.");var s=await this.getHeight(this.state.tip);if(s<=i+e)return!1;i+=1;var n=s-e,a=this.db.batch();for(let t=i;t<=n;t++){var o=await this.getHash(t);if(!o)throw new Error(`Cannot find hash for ${t}.`);a.del(d.b(o)),a.del(d.u(o))}try{t.prune=!0;const e=ft.fromOptions(t);r(e.prune),a.put(d.O,e.toRaw()),await a.write()}catch(e){throw t.prune=!1,e}return await this.db.compactRange(),!0}async getNextHash(t){return(t=await this.db.get(d.n(t)))?t.toString("hex"):null}async isMainHash(t){if(r("string"==typeof t),t===c.NULL_HASH)return!1;if(t===this.network.genesis.hash)return!0;if(t===this.state.tip)return!0;var e=this.cacheHash.get(t);return e&&(e=this.cacheHeight.get(e.height))?e.hash===t:!!await this.getNextHash(t)}async isMainChain(t){var e;return!!t.isGenesis()||t.hash===this.state.tip||((e=this.getCache(t.height))?t.hash===e.hash:!!await this.getNextHash(t.hash))}getEntries(){return this.db.values({gte:d.e(c.ZERO_HASH),lte:d.e(c.MAX_HASH),parse:t=>w.fromRaw(t)})}getTimestampHashes(t,e){return this.db.keys({gte:d.th(e,c.ZERO_HASH),lte:d.th(t,c.MAX_HASH),parse:d.thh})}getContracts(){return this.db.values({gte:d.tx(c.NULL_HASH),lte:d.tx(c.HIGH_HASH),parse:t=>s.parseJson(t.toString())})}getCps(){return this.db.values({gte:d.CP(c.ZERO_CID,"hex"),lte:d.CP(c.MAX_CID,"hex"),parse:t=>K.fromRaw(t)})}async setCp(t){var e=this.db.batch();e.put(d.CP(t.cid),t.toRaw()),await e.write()}async delCp(t){var e=this.db.batch();e.del(d.CP(t)),await e.write()}getScs(){return this.db.values({gte:d.SC(c.ZERO_CID,"hex"),lte:d.SC(c.MAX_CID,"hex"),parse:t=>H.fromRaw(t)})}async setSc(t){var e=this.db.batch();e.put(d.SC(t.id),t.toRaw()),await e.write()}async delSc(t){var e=this.db.batch();e.del(d.SC(t)),await e.write()}async getSCList(t){return r(Array.isArray(t)),this.scList.query(t)}async getStockAccountList(t){return t?this.db.values({gte:U.SN(t,c.NULL_HASH),lte:U.SN(t,c.HIGH_HASH),parse:U.fromRaw}):this.db.values({gte:U.SN(c.ZERO_CID_BUF,c.NULL_HASH),lte:U.SN(c.MAX_CID_BUF,c.HIGH_HASH),parse:U.fromRaw})}async setStockRecord(t){var e=this.db.batch();switch(e.put(t.itemNo,t.toRaw()),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(i.stock.sum=t.sum,i.stock.price=t.price,i.seq=t.seq,i.stock.period=this.curHeight+1+10*D.BLOCK_DAY,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Auction:{if(!(i=this.accountList.getStockAccount(t.cid,t.to)))break;let s=this.accountList.getStockAccount(t.cid,t.addr);s||(s=new U(t.cid,t.addr,0,0,0),this.accountList.setStockAccount(s));var r=s.sum+t.sum;s.price=(t.sum*t.price+s.sum*s.price)/r|0,s.sum=r,s.seq=t.seq,e.put(s.getItemNo(),s.toRaw()),r=i.sum-t.sum,i.sum=r,i.stock.sum-=t.sum,e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Purchase:{let i=this.accountList.getStockAccount(t.cid,t.addr);i?(r=i.sum+t.sum,i.price=(t.sum*t.price+i.sum*i.price)/r,i.sum=r,i.seq=t.seq):((i=new U(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(i)),e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Send:if(i=this.accountList.getStockAccount(t.cid,t.addr)){i.sum-=t.sum,i.seq=t.seq;let s=this.accountList.getStockAccount(t.cid,t.to);s||(s=new U(t.cid,t.to,0,0),this.accountList.setStockAccount(s)),r=s.sum+t.sum,s.price=(t.sum*i.price+s.sum*s.price)/r,s.sum=r,e.put(i.getItemNo(),i.toRaw()),e.put(s.getItemNo(),s.toRaw())}break;case G.RecordType.Bonus:case G.RecordType.Ads:}await e.write()}async unsetStockRecord(t){var e=this.db.batch();switch(e.del(t.itemNo),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.stock.sum=0,s.stock.price=0,s.stock.period=0,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Auction:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(i=s.sum-t.sum,s.price=(s.sum*s.price-t.sum*t.price)/i|0,s.sum=i,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),s=this.accountList.getStockAccount(t.cid,t.to))&&(i=s.sum+t.sum,s.sum=i,s.stock.sum+=t.sum,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Purchase:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(s=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*t.price)/s|0,i.sum=s,i.seq=t.seq-1,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Send:var r,s;(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.sum+=t.sum,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),i=this.accountList.getStockAccount(t.cid,t.to))&&(r=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*s.price)/r|0,i.sum=r,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Bonus:}await e.write()}async getStockPropList(t){return this.db.range({gte:d.VP(""+t+this.network.stockFix+s.sprintf("%02d",0)),lte:d.VP(""+t+this.network.stockFix+s.sprintf("%02d",29)),values:!0})}async delVp(t){var e=this.db.batch();e.del(d.VP(t.pid)),await e.write()}async setVp(t){var e=this.db.batch();e.put(d.VP(t.pid),t.toRaw()),await e.write()}async getVp(t){return(t=await this.db.get(d.VP(t)))?X.fromRaw(t):null}loadVpList(){return this.db.values({gte:d.VP(c.ZERO_CID,"hex"),lte:d.VP(c.MAX_CID,"hex"),parse:t=>X.fromRaw(t)})}async delHtlc(t){var e;t.id&&(this.htlcList.delete(t.id),this.htlcList.delAccount(t),(e=this.db.batch()).del(d.VH(t.shash,t.sidx)),await e.write())}async setSuggest(t){t=new J(t);var e=(this.htlcList.set(t.id,t),this.db.batch());e.put(d.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async setAssent(t){t=new J(t);var e=(this.htlcList.set(t.id,t),this.db.batch());e.put(d.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async loadHtlcList(){return this.db.values({gte:d.VH(c.ZERO_CID,0),lte:d.VH(c.MAX_CID,4294967295),parse:t=>J.fromRaw(t)})}async delErAbolish(t){var e=this.db.batch();e.del(d.ERA(t.erid)),await e.write()}async setErAbolish(t){var e=this.db.batch();e.put(d.ERA(t.erid),t.toRaw()),await e.write()}async getErAbolish(t){return(t=await this.db.get(d.ERA(t)))?it.fromRaw(t):null}loadErAbolishList(){return this.db.values({gte:d.ERA(c.ZERO_CID),lte:d.ERA(c.MAX_CID),parse:t=>it.fromRaw(t)})}async delCpEn(t){var e=this.db.batch();e.del(d.EN2(t.to,t.from)),await e.write()}async setCpEn(t){var e=this.db.batch();e.put(d.EN2(t.to,t.from),t.toRaw()),await e.write()}loadCpEnList(){return this.db.values({gte:d.EN2(c.ZERO_CID,c.ZERO_CID,"ascii"),lte:d.EN2(c.MAX_CID,c.MAX_CID,"ascii"),parse:t=>st.fromRaw(t)})}queryCpEnListByCid(t){return this.db.values({gte:d.EN2(t,c.ZERO_CID,"ascii"),lte:d.EN2(t,c.MAX_CID,"ascii"),parse:t=>st.fromRaw(t)})}async delEr(t){var e=this.db.batch();e.del(d.ER(t.erid)),e.del(d.ERR(t.witness,t.erid,t.txid)),await e.write()}async setEr(t,e){var i=this.db.batch(),r=d.ERR(t.witness,t.erid,t.txid);i.put(r,t.toRaw()),i.put(d.ER(t.erid),r),await i.write()}async getEr(t){if(!(t=await this.db.get(d.ER(t))))return null;var[,,t]=d.ERRR(t);let e=await this.db.get(e);return e?((e=tt.fromRaw(e)).txid=t,e):null}async byPubkey(t,e,i=!1){if(!(t=await this.db.values({gte:d.ERR(t,c.NULL_HASH,c.NULL_HASH),lte:d.ERR(t,c.HIGH_HASH,c.HIGH_HASH),parse:t=>tt.fromRaw(t)}))||0==t.length)return[];let r=null;if(i){var s,n=new Map;for(s of t){var a,o=await this.caVerifyObj(s);o&&((a=n.get(o.source.cluster))?o.startHeight>a.startHeight&&n.set(s.source.cluster,o):n.set(o.source.cluster,o))}r=n.values()}else r=t;if(!r||0==r.length)return[];var h,u=new y;for(h of r)u.set(h.erid,h);return u.query(e)}async caVerify(t){return this.caVerifyObj(await this.erList.getEr(t))}async caVerifyObj(t){var e;return t?(t.verify=!1,t.validHeight<=this.chain.height||(e=await this.erAbList.getErAb(t.erid))&&e.abolishHeight<this.chain.height||(e=lt.fromPublic(Buffer.from(t.witness,"hex"),this.network.type),t.verifying(e)&&(t.verify=!0,0<(e=this.cpList.query([["pubKey",t.witness]])).list.length)&&(t.cpid=e.list[0].cid)),t):null}async addOrder(t){await this.batchPut(d.o(t.cid,t.sn),t.toRaw())}async arrangeOrder(t){var e,i=[],r=[];for(e of await this.db.values({gte:d.o(t,c.ZERO_OID),lte:d.o(t,c.MAX_OID),parse:R.fromRaw}))(-1==e.height&&this.curHeight-e.publish>=10*D.BLOCK_DAY?r:i).push(e);return 0<r.length&&this.delOrder(r),i}async getAddressesFromOrder(t){var e,i=[];t.cls&&i.push(["cls",t.cls]);let r=await this.node.rpc.execute({method:"cp.remoteQuery",params:[i]}),s=[];for(e of r=r.list.map(t=>t.cid))s=s?s.concat(await this.arrangeOrder(e)):await this.arrangeOrder(e);s=s.reduce((e,i)=>(i.addr&&0<i.height&&(!t.time||600*(this.chain.height-i.height)<t.time)&&(e[i.addr]?i.sum&&(e[i.addr].sum+=i.sum):(e[i.addr]=i,e[i.addr].sum=e[i.addr].sum||0)),e),{});var n={list:[],pageNum:1,pageCur:1};(s=(s=t.amount?Object.values(s).filter(e=>e.sum>=t.amount):Object.values(s)).map(t=>({addr:t.addr,sum:t.sum}))).length%t.pageSize==0?n.pageNum=s.length/t.pageSize|0:n.pageNum=1+(s.length/t.pageSize|0),n.pageCur=Math.max(1,Math.min(n.pageNum,t.page));for(let e=t.pageSize*(n.pageCur-1);e<t.pageSize*n.pageCur&&s[e];e++)n.list.push(s[e]);return n}async getOrderList(t,e){r("string"==typeof t),r(Array.isArray(e));let i=null;for(var n of e)if("sn"==n[0]){i=2==n.length?n[1]:n[2],i=Array.isArray(i)?1==i.length?s.sprintf("%0-36s",i[0]):i.map(t=>s.sprintf("%0-36s",t)):s.sprintf("%0-36s",i),2==n.length?n[1]=i:n[2]=i;break}var a=new y;return(await this.arrangeOrder(t)).reduce((t,e)=>(t.set(""+e.cid+e.sn,e),t),a),a.query(e)}async getOrderRecord(t,e){return r("string"==typeof t),r("string"==typeof e),e=s.sprintf("%0-36s",e),(t=await this.db.get(d.o(t,e)))?(0<(e=R.fromRaw(t)).height?e.confirm=this.chain.height-e.height+1:e.confirm=0,e):null}async delOrder(t){const e=this.db.batch();Array.isArray(t)?t.map(t=>{e.del(d.o(t.cid,t.sn))}):e.del(d.o(t.cid,t.sn)),await e.write()}async getStockRecordById(t){return(t=await this.db.get(t))?G.fromRaw(t):null}async getStockRecord(t,e,i){let r=6,s=c.ZERO_CID_BUF,n=c.MAX_CID_BUF,a=0;return t&&(r=t,e)&&(s=e,n=e,i)&&(a=i),t=await this.db.values({gte:G.itemNo(r,s,a,c.NULL_HASH,0),lte:G.itemNo(r,n,4294967295,c.HIGH_HASH,4294967295),parse:G.fromRaw}),e=new y,t.reduce((t,e)=>(t.set(e.itemNo,e),t),e),e}async getStockRecordByCid(t,e){var i,r=new y;for(i of Object.keys(G.RecordType))r.merge(await this.getStockRecord(G.RecordType[i],t,e));return r}async saveVote(t,e){var i=this.db.batch();i.put(d.VM(t),Buffer.from(JSON.stringify(e))),await i.write()}async saveOracle(t,e){var i=this.db.batch();i.put(d.VO(t),Buffer.from(JSON.stringify(e))),await i.write()}getTips(){return this.db.keys({gte:d.p(c.ZERO_HASH),lte:d.p(c.MAX_HASH),parse:d.pp})}async readCoin(t){var e,i,r,s;return this.options.spv?null:(({hash:e,index:i}=t),t=t.toKey(),r=this.state,(s=this.coinCache.get(t))?k.fromRaw(s):(s=await this.db.get(d.c(e,i)))?(r===this.state&&this.coinCache.set(t,s),k.fromRaw(s)):null)}async getCoin(t,e){return t=new g(t,e),(e=await this.readCoin(t))?e.toCoin(t):null}async hasCoins(t){for(let i=0;i<t.outputs.length;i++){var e=d.c(t.hash(),i);if(await this.db.has(e))return!0}return!1}async getCoinView(t){var e,i=new u;for({prevout:e}of t.inputs){var r=await this.readCoin(e);r&&i.addEntry(e,r)}return i}async getSpentView(t){var e,i=await this.getCoinView(t);for({prevout:e}of t.inputs)if(!i.hasEntry(e)){var r,{hash:r,index:s}=e;if(r=await this.getMeta(r)){const{tx:t,height:e,time:n}=r;s<t.outputs.length&&i.addIndex(t,s,e,n)}}return i}async getUndoCoins(t){return(t=await this.db.get(d.u(t)))?l.fromRaw(t):new l}async getBlock(t){return(t=await this.getRawBlock(t))?m.fromRaw(t):null}async getRawBlock(t){return!this.options.spv&&(t=await this.getHash(t))?this.db.get(d.b(t)):null}async getBlockView(t){var e=new u,i=await this.getUndoCoins(t.hash());if(!i.isEmpty()){for(let r=t.txs.length-1;0<r;r--){var s=t.txs[r];for(let t=s.inputs.length-1;0<=t;t--){var n=s.inputs[t];i.apply(e,n.prevout)}}r(i.isEmpty(),"Undo coins data inconsistency.")}return e}async getMeta(t){return this.options.indexTX&&(t=await this.db.get(d.t(t)))?b.fromRaw(t):null}async getTX(t){return(t=await this.getMeta(t))?t.tx:null}async getExtendTX(t){return(t=await this.getMeta(t))||null}async hasTX(t){return!!this.options.indexTX&&this.db.has(d.t(t))}async getCoinsByAddress(t){if(!this.options.indexAddress)return[];var e=[];for(const o of t=Array.isArray(t)?t:[t]){var i,s,n=v.getHash(o);for([i,s]of await this.db.keys({gte:d.C(n,c.ZERO_HASH,0),lte:d.C(n,c.MAX_HASH,4294967295),parse:d.Cc})){var a=await this.getCoin(i,s);r(a),e.push(a)}}return e}async getHashesByAddress(t,e="both"){if(Array.isArray(t)||(t=[t]),!this.options.indexTX||!this.options.indexAddress)return[];const i=Object.create(null);for(const s of t){var r=v.getHash(s);let t,n;n="input"==e?(t=d.TI(r,c.ZERO_HASH),d.TI(r,c.MAX_HASH)):"output"==e?(t=d.TO(r,c.ZERO_HASH),d.TO(r,c.MAX_HASH)):(t=d.T(r,c.ZERO_HASH),d.T(r,c.MAX_HASH)),await this.db.keys({gte:t,lte:n,parse:t=>{t=d.Tt(t),i[t]=!0}})}return Object.keys(i)}async getTXByAddress(t){var e=[];for(const i of await this.getMetaByAddress(t))e.push(i.tx);return e}async getVpByOid(t){return{list:[],count:0}}async getVpByAddress(t){var e=[];for(const s of await this.getMetaByAddress(t))for(let t=0;t<s.tx.outputs.length;t++){var i=s.tx.outputs[t],r=i.getReturnData([ot.OP_PROPCREATE,ot.OP_PROPEXCHANGE]);r&&(r.current={hash:s.tx.rhash("hex"),index:t,address:i.getAddress().toString()},e.push(r))}return{list:e,count:e.length}}async getMetaByAddress(t){if(!this.options.indexTX||!this.options.indexAddress)return[];Array.isArray(t)||(t=[t]);var e=[];for(const s of await this.getHashesByAddress(t)){var i=await this.getMeta(s);r(i),e.push(i)}return e}async scan(t,e,i){"number"==typeof(t=null==t?this.network.genesis.hash:t)?this.logger.info("Scanning from height %d.",t):this.logger.info("Scanning from block %s.",s.revHex(t));let r=await this.getEntry(t);if(r){if(!await this.isMainChain(r))throw new Error("Cannot rescan an alternate chain.");let t=0;for(;r;){var n=await this.getBlock(r.hash),a=[];if(t++,n){this.logger.info("Scanning block %s (%d).",r.rhash(),r.height);for(let t=0;t<n.txs.length;t++){var o=n.txs[t];let i=!1;for(let t=0;t<o.outputs.length;t++){var c=o.outputs[t].getHash();c&&(0==r.height||e&&e.test(c))&&(c=g.fromTX(o,t),e.add(c.toRaw()),i=!0)}if(!e||i)a.push(o);else if(0!==t)for(var{prevout:h}of o.inputs)if(!e||e.test(h.toRaw())){a.push(o);break}}}else if(!this.options.spv&&!this.options.prune)throw new Error("Block not found.");await i(r,a),r=await this.getNext(r)}this.logger.info("Finished scanning %d blocks.",t)}}async save(t,e,i){this.start();try{await this._save(t,e,i)}catch(t){throw this.drop(),t}await this.commit()}async _save(t,e,i){var r=e.hash();this.put(d.h(r),S(t.height)),this.put(d.th(e.time,r),null),this.put(d.e(r),t.toRaw()),this.cacheHash.push(t.hash,t),this.del(d.p(t.prevBlock)),this.put(d.p(r),null),this.saveUpdates(),i?(t.isGenesis()||this.put(d.n(t.prevBlock),r),this.put(d.H(t.height),r),this.cacheHeight.push(t.height,t),await this.saveBlock(t,e,i),this.put(d.R,this.pending.commit(r))):await this.saveBlock(t,e)}async reconnect(t,e,i){this.start();try{await this._reconnect(t,e,i)}catch(t){throw this.drop(),t}await this.commit()}async _reconnect(t,e,i){var s=e.hash();r(!t.isGenesis()),this.put(d.n(t.prevBlock),s),this.put(d.H(t.height),s),this.cacheHeight.push(t.height,t),this.cacheHash.push(t.hash,t),this.saveUpdates(),await this.connectBlock(t,e,i),this.put(d.R,this.pending.commit(s))}async disconnect(t,e){let i;this.start();try{i=await this._disconnect(t,e)}catch(t){throw this.drop(),t}return await this.commit(),i}async _disconnect(t,e){return this.del(d.n(t.prevBlock)),this.del(d.H(t.height)),this.cacheHeight.unpush(t.height),this.saveUpdates(),e=await this.disconnectBlock(t,e),this.put(d.R,this.pending.commit(t.prevBlock)),e}saveUpdates(){var t=this.stateCache.updates;if(0!==t.length){this.logger.info("Saving %d state cache updates.",t.length);for(const r of t){var{bit:e,hash:i}=r;this.put(d.v(e,i),r.toRaw())}}}async reset(t){var e=await this.getEntry(t);if(!e)throw new Error("Block not found.");if(!await this.isMainChain(e))throw new Error("Cannot reset on alternate chain.");if(this.options.prune)throw new Error("Cannot reset when pruned.");await this.removeChains();let i=await this.getTip();for(r(i),this.logger.debug("Resetting main chain to: %s",e.rhash());;){if(this.start(),i.hash===e.hash){this.put(d.R,this.pending.commit(i.hash)),await this.commit();break}r(!i.isGenesis()),this.del(d.p(i.hash)),this.put(d.p(i.prevBlock),null),this.del(d.H(i.height)),this.del(d.h(i.hash)),this.del(d.th(i.time,i.hash)),this.del(d.e(i.hash)),this.del(d.n(i.prevBlock));try{await this.removeBlock(i)}catch(t){throw this.drop(),t}this.cacheHeight.remove(i.height),this.cacheHash.remove(i.hash),i=await this.getPrevious(i),r(i)}return i}async removeChains(){var t=await this.getTips();this.start();try{for(const e of t)await this._removeChain(e)}catch(t){throw this.drop(),t}await this.commit()}async _removeChain(t){let e=await this.getEntryByHash(t);if(!e)throw new Error("Alternate chain tip not found.");for(this.logger.debug("Removing alternate chain: %s.",e.rhash());!await this.isMainChain(e);)r(!e.isGenesis()),this.del(d.p(e.hash)),this.del(d.h(e.hash)),this.del(d.th(e.time,e.hash)),this.del(d.e(e.hash)),this.del(d.b(e.hash)),this.cacheHash.unpush(e.hash),e=await this.getPrevious(e),r(e)}async saveBlock(t,e,i){var r=e.hash();this.options.spv||(this.put(d.b(r),e.toRaw()),i&&await this.connectBlock(t,e,i))}async removeBlock(t){if(this.options.spv)return new u;var e=await this.getBlock(t.hash);if(!e)throw new Error("Block not found.");this.del(d.b(e.hash()));var i=await this.disconnectBlock(t,e);return this.put(d.R,this.pending.commit(t.prevBlock)),await this.commit(),await this.chain.fire("block.disconnect",t,e,i),i}saveView(t){for(var[e,i]of t.map)for(var[r,s]of i.outputs)s.spent?(this.del(d.c(e,r)),this.coinCache.unpush(e+r)):(this.del(d.s(e,r)),s=s.toRaw(),this.put(d.c(e,r),s),this.coinCache.push(e+r,s))}async getSpender(t,e){return(t=await this.db.get(d.s(t,e)))?P.DecodeSpenderValue(t):null}async connectBlock(t,e,i){if(!this.options.spv){var r=e.hash("hex");this.pending.connect(e);for(let u=0;u<e.txs.length;u++){var s=e.txs[u],n=s.hash("hex");if(!t.isGenesis()&&0<u)for(let t=0;t<s.inputs.length;t++){var a=s.inputs[t].prevout,o=i.getOutput(a);this.pending.spend(o);try{await this.emitCoinSpent(s.inputs[t],o,s,e)}catch(t){this.logger.error("connect block:",t.message)}this.put(d.s(a.hash,a.index),P.EncodeSpenderValue(n,t,e.height,r))}for(const t of s.outputs)t.script.isUnspendable()||this.pending.add(t);try{var c=await O.FactoryOfContract({env:this,block:e,tx:s,coins:i});if(!t.isGenesis()){var h=await c.verify();if(1!=h)throw new pt(s,E(h),"bad-contract-verify",100)}await c.isBlockFinal()==_.Final&&await c.confirm()}catch(t){this.logger.error("TX(%s) Smart Contract Execute Error: %s",s.txid(),t.message)}this.indexTX(s,i,t,u)}this.saveView(i),i.undo.isEmpty()||this.put(d.u(r),i.undo.commit()),await this.setCpHistory(),await this.voteMgr.saveVote(),this.scList.deletes([["indate","<",this.chain.height]]),await this.pruneBlock(t)}}async disconnectBlock(t,e){var i=new u;if(!this.options.spv){var s=e.hash(),n=await this.getUndoCoins(s);this.pending.disconnect(e);for(let r=e.txs.length-1;0<=r;r--){var a=e.txs[r];if(0<r)for(let t=a.inputs.length-1;0<=t;t--){var o=a.inputs[t].prevout;n.apply(i,o),this.pending.add(i.getOutput(o))}i.removeTX(a,t.height,t.time);for(let t=a.outputs.length-1;0<=t;t--){var c=a.outputs[t];c.script.isUnspendable()||this.pending.spend(c)}try{await(await O.FactoryOfContract({env:this,block:e,tx:a})).unconfirm()}catch(s){this.logger.error("TX(%s) Smart Contract Unconfirm Error: %s",a.txid(),s.message)}await this.unindexTX(a,i)}r(n.isEmpty(),"Undo coins data inconsistency."),this.saveView(i),this.del(d.u(s)),await this.voteMgr.saveVote()}return i}async pruneBlock(t){this.options.spv||!this.options.prune||(t=t.height-this.network.block.keepBlocks)<=this.network.block.pruneAfterHeight||(t=await this.getHash(t))&&(this.del(d.b(t)),this.del(d.u(t)))}saveFlags(){var t=ft.fromOptions(this.options),e=this.db.batch();return e.put(d.O,t.toRaw()),e.write()}indexTX(t,e,i,r){var s=t.hash();if(this.options.indexTX&&(r=b.fromTX(t,i,r),this.put(d.t(s),r.toRaw()),this.options.indexAddress)){for(const e of t.getHashes())this.put(d.T(e,s),null);for(const e of t.getOutputHashes())this.put(d.TO(e,s),null);for(const i of t.getInputHashes(e))this.put(d.TI(i,s),null)}if(this.options.indexAddress){if(!i.isGenesis()&&!t.isCoinbase())for(var{prevout:n}of t.inputs){var a=e.getOutput(n).getHash();a&&this.del(d.C(a,n.hash,n.index))}for(let e=0;e<t.outputs.length;e++){var o=t.outputs[e].getHash();o&&this.put(d.C(o,s,e),null)}}}async unindexTX(t,e){var i,r=t.hash();if(this.options.indexTX&&(this.del(d.t(r)),this.options.indexAddress))for(i of t.getHashes(e))this.del(d.T(i,r)),this.del(d.TI(i,r)),this.del(d.TO(i,r));if(this.options.indexAddress){if(!t.isCoinbase())for(var{prevout:s}of t.inputs){var n=e.getOutput(s).getHash();n&&this.put(d.C(n,s.hash,s.index),null)}for(let e=0;e<t.outputs.length;e++){var a=t.outputs[e].getHash();a&&this.del(d.C(a,r,e))}}}async readHostList(){return this.db.get(d.HL)}async writeHostList(t){var e=this.db.batch();return e.put(d.HL,t),e.write()}async emitCoinSpent(t,e,i,r){(i={env:this,block:r,tx:i,hash:t.prevout.hash,i:t.prevout.index,height:r.height,output:e,type:e.getReturnType(),data:e.getReturnData(ct)}).data&&await at(i).spent(t)}}function ft(t){if(!(this instanceof ft))return new ft(t);this.network=h.primary,this.spv=!1,this.witness=!0,this.prune=!1,this.indexTX=!1,this.indexAddress=!1,t&&this.fromOptions(t)}dt.layout=d,ft.prototype.fromOptions=function(t){return this.network=h.get(t.network),null!=t.spv&&(r("boolean"==typeof t.spv),this.spv=t.spv),null!=t.prune&&(r("boolean"==typeof t.prune),this.prune=t.prune),null!=t.indexTX&&(r("boolean"==typeof t.indexTX),this.indexTX=t.indexTX),null!=t.indexAddress&&(r("boolean"==typeof t.indexAddress),this.indexAddress=t.indexAddress),this},ft.fromOptions=function(t){return(new ft).fromOptions(t)},ft.prototype.toRaw=function(){var t=new a(12);let e=0;return this.spv&&(e|=1),this.witness&&(e|=2),this.prune&&(e|=4),this.indexTX&&(e|=8),this.indexAddress&&(e|=16),t.writeU32(this.network.magic),t.writeU32(e),t.writeU32(0),t.render()},ft.prototype.fromRaw=function(t){return t=new n(t),this.network=h.fromMagic(t.readU32()),t=t.readU32(),this.spv=0!=(1&t),this.witness=0!=(2&t),this.prune=0!=(4&t),this.indexTX=0!=(8&t),this.indexAddress=0!=(16&t),this},ft.fromRaw=function(t){return(new ft).fromRaw(t)};class mt{constructor(){this.tip=c.NULL_HASH,this.tx=0,this.coin=0,this.value=0,this.committed=!1}rhash(){return s.revHex(this.tip)}clone(){var t=new mt;return t.tip=this.tip,t.tx=this.tx,t.coin=this.coin,t.value=this.value,t}connect(t){this.tx+=t.txs.length}disconnect(t){this.tx-=t.txs.length}add(t){this.coin++,this.value+=t.value}spend(t){this.coin--,this.value-=t.value}commit(t){return"string"!=typeof t&&(t=t.toString("hex")),this.tip=t,this.committed=!0,this.toRaw()}toRaw(){var t=new a(56);return t.writeHash(this.tip),t.writeU64(this.tx),t.writeU64(this.coin),t.writeU64(this.value),t.render()}static fromRaw(t){var e=new mt;t=new n(t);return e.tip=t.readHash("hex"),e.tx=t.readU64(),e.coin=t.readU64(),e.value=t.readU64(),e}}function gt(t){this.network=t,this.bits=[],this.updates=[],this._init()}function yt(t,e,i){this.bit=t,this.hash=e,this.state=i}gt.prototype._init=function(){for(let t=0;t<32;t++)this.bits.push(null);for(var{bit:t}of this.network.deploys)r(!this.bits[t]),this.bits[t]=new Map},gt.prototype.set=function(t,e,i){var s=this.bits[t];r(s),s.get(e.hash)!==i&&(s.set(e.hash,i),this.updates.push(new yt(t,e.hash,i)))},gt.prototype.get=function(t,e){return t=this.bits[t],r(t),null==(t=t.get(e.hash))?-1:t},gt.prototype.commit=function(){this.updates.length=0},gt.prototype.drop=function(){for(var{bit:t,hash:e}of this.updates)t=this.bits[t],r(t),t.delete(e);this.updates.length=0},gt.prototype.insert=function(t,e,i){t=this.bits[t],r(t),t.set(e,i)},yt.prototype.toRaw=function(){return x(this.state)},t.exports=dt},function(t,e,i){"use strict";
|
|
885
885
|
/*!
|
|
886
886
|
* lowlevelup.js - LevelUP module for vallnet
|
|
887
887
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
@@ -908,7 +908,7 @@ var r=i(775),s=i(777),n=i(778),a=i(779),o=i(780),c=i(781),h=i(782),u=i(783);i=i(
|
|
|
908
908
|
/*!
|
|
909
909
|
* accountdb.js - storage for account management
|
|
910
910
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|
|
911
|
-
*/const r=i(8),s=i(0),n=i(73),a=i(122),o=i(159),c=i(612),h=i(95),u=h.walletdb,l=i(7),p=i(160),d=i(127),f=i(169),m=i(6),g=i(37).VerifyError,y=i(46),v=i(12);i(19);const w=i(60),b=i(198),k=i(69),x=i(43),{getVerifyMsg:S,BlockFinalType:E,ContractEnvType:_}=i(5),R=i(161),A=i(614),C=i(31);var I=i(72);const O=i(1),P=i(119).sortWithSeq,T=i(34),j=i(199),B=i(65),N=i(101),F=i(3),D=F.U32,L=i(341),M=i(342),H=i(343),z=H.vpItem,U=i(616),q=U.vpItem,V=i(85),K=i(617),W=V.cpItem,G=V.stockItem,$=i(158),X=$.ErAbolishItem,Y=i(36).broadcast,J=i(134),Z=J.vpItem,Q=i(232),tt=Q.stockAccount,et=i(157),it=et.ErItem,rt=i(618),st=rt.AuditItem,nt=i(315),at=i(110),ot=i(619),ct=i(316),ht=i(123),ut=i(620),lt=i(222),pt=i(39),dt=i(35),ft=i(59),mt=i(78).errors,gt=i(77);class yt extends I{constructor(t){super(),this.readyLoad=!1,this.options=new c(t),this.network=this.options.network,this.logger=this.options.logger.context("wallet"),this.workers=this.options.workers,this.keys={hmacSalt:F.DefaultChainCode},t.keys&&t.keys.hmacSalt&&(s(Buffer.isBuffer(t.keys.hmacSalt)),this.keys.hmacSalt=t.keys.hmacSalt),this.client=this.options.client,this.client&&(this.client.wdb=this),this.jsonp=this.options.jsonp,this.jsonp&&(this.jsonp.wdb=this),this.spv=this.options.spv,this.feeRate=this.options.feeRate,this.db=f(this.options),this.rpc=new L(this),this.primary=null,this.state=new ot,this.wallets=new Map,this.depth=0,this.rescanning=!1,this.bound=!1,this.newRecord=!0,this.readLock=new j,this.writeLock=new T,this.txLock=new T,this.scanLock=new T,this.widCache=new B(1e4),this.pathMapCache=new B(1e5),this.filter=new N,this.middleHashMem=new Set,this.middleHashChain=new Set,this.autoTaskMgr=new R(this),this.transactionList=new M(this),this.htlcList=new H(this),this.commentList=new U(this),this.NotifyList=new C,this.propList=new J(this),this.accountList=new Q(this),this.$contacts=new C,this.cpList=new V(this),this.cpMemList=new V(this),this.accountCoinList=new K(this),this.auditList=new rt(this),this.erList=new et(this),this.erAbList=new $(this),this.hmacConnection=[],this._init()}async logAudit(t){t.height=this.curHeight,t.time=O.now(),t.erid=l.sha256(O.stringify(t)).toString("hex"),t=new st(t),await this.auditList.setAudit(t)}async getAccountByAddress(t,e){if(t){let s=null;if(s=e?await this.getWalletsByTX(e):await this.getWallets())for(const e of s){var i=await this.get(e);if(i){var r=await i.getPath(t);if(r)return[i.wid,r.name,i.id]}}}return[0,"",""]}_init(){let t=1e6,e=-1;this.spv&&(t=2e4,e=N.flags.ALL),this.filter=N.fromRate(t,.001,e)}async getCpSnap(){return{}}get mode(){return _.Wallet}async getTXFromAll(t){return this.getTXFromDb(t)}async checkNewRecord(){var t={createIfMissing:this.db.options.createIfMissing,errorIfExists:this.db.options.errorIfExists};this.db.options.createIfMissing=!1,this.db.options.errorIfExists=!0;try{await this.db.open();var e=await this.db.checkVersion(u,6);this.newRecord="new"==e}catch(t){if(-1!=t.message.indexOf("does not exist (create_if_missing is false)"))this.newRecord=!0;else{if(-1==t.message.indexOf("exists (error_if_exists is true)"))throw t;this.newRecord=!1}}try{await this.db.close()}catch(t){}this.db.options.createIfMissing=t.createIfMissing,this.db.options.errorIfExists=t.errorIfExists}async isNewRecord(){return await this.checkNewRecord(),this.newRecord}setmnemonic(t){if(this.options.mnemonic=this.options.mnemonic||{},t.bits)this.options.mnemonic={bits:t.bits};else if(t.entropy)this.options.mnemonic={entropy:Buffer.from(t.entropy,"hex")};else if(t.phrase){var e=this.testmnemonic(t.phrase);if(0!=e.code)throw e.msg;this.options.mnemonic={phrase:t.phrase}}t.passphrase&&(this.options.mnemonic.passphrase=t.passphrase),t.language&&(this.options.mnemonic.language=t.language)}testmnemonic(t){try{return new b(t),{code:0}}catch(t){return{code:-1,msg:t.message}}}async getContracts(t){var e=await this.db.values({gte:h.txdb.tx(F.NULL_HASH),lte:h.txdb.tx(F.HIGH_HASH),parse:t=>O.parseJson(t.toString())});return t?e.filter(e=>e.srcact==t||e.dstact==t):e}isFull(){return this.spv||this.synced||!1}async _open(t){}async handleNotify(t,e=!1){if(!e){let i=t.body.content;if("string"==typeof i)try{i=JSON.parse(t.body.content)}catch(t){return}"object"==typeof i&&"secret"===i.type&&(e={contact:t.body.src,messenger:t.body.dst},i.init&&(e.init=Buffer.from(i.init,"hex")),i.packet&&(e.packet=Buffer.from(i.packet)),await this.handleSecret(e))}}async handleSecret(t){if(t.contact&&t.messenger&&t.contact!=t.messenger){try{v.fromString(t.contact,this.network.type),v.fromString(t.messenger,this.network.type)}catch(t){return}var e=await this.ensureContact(t);e&&await e.ensureMessenger(t).answer(t)}}async scanContact(t,e=-1){var i=async t=>{var e;t.witness&&"witnesspubkeyhash"==t.getType()&&(e=t.witness.getPubkeyhashInput()[1],t=v.fromWitness(t.witness).toString(),e)&&t&&await this.ensureContact({contact:t,publicKey:e})};if(0<=e&&e<t.inputs.length)await i(t.inputs[e]);else for(var r of t.inputs)await i(r)}async ensureContact(t){if(!t.contact||t.contact==t.messenger)return null;try{v.fromString(t.contact,this.network.type),t.messenger&&v.fromString(t.messenger,this.network.type)}catch(t){return null}t.network=this.network.type,this.$contacts.get(t.contact)||this.$contacts.set(t.contact,new A(t));var e=this.$contacts.get(t.contact);if(t.messenger&&!(t=e.ensureMessenger(t)).wallet){var i,[i,r]=await this.getAccountByAddress(t.address);if(!(i=await this.get(i)))return;t.wallet=i,t.account=r}return e}getCps(){return this.db.values({gte:h.txdb.cp(F.ZERO_CID,"hex"),lte:h.txdb.cp(F.MAX_CID,"hex"),parse:t=>W.fromRaw(t)})}async _close(){await this.disconnect(),this.http&&this.options.listen&&await this.http.close();for(const t of this.wallets.values())await t.destroy();await this.db.close(),this.options.listen&&await this.logger.close()}async destroy(){await this.db.destroy(),this.widCache.reset(),this.pathMapCache.reset()}async load(t){if(this.readyLoad){var e=await this.ensure({id:"primary",witness:!0,mnemonic:this.options.mnemonic}),i=await this.txLock.lock();try{await this.init(t),await this.watch(),await e.createReceive(0,1,e.master,this.network.type),await e.ensureNotifyKey(),await this.sync()}finally{i()}setTimeout(()=>{this.resend()},5e3)}}bind(){!this.client||this.bound||(this.bound=!0,this.client.hook("htlcassent.cancel",t=>{this.setAssent(t),this.emit("htlcassent.cancel",t)}),this.client.hook("htlcassent.deal",t=>{this.setAssent(t),this.emit("htlcassent.deal",t)}),this.client.hook("htlcassent.receive",t=>{this.setAssent(t),this.emit("htlcassent.receive",t)}),this.client.hook("htlcsuggest.cancel",t=>{this.setSuggest(t),this.emit("htlcsuggest.cancel",t)}),this.client.hook("htlcsuggest.deal",t=>{this.setSuggest(t),this.emit("htlcsuggest.deal",t)}),this.client.hook("htlcsuggest.receive",t=>{this.setSuggest(t),this.emit("htlcsuggest.receive",t)}),this.on("mssendpubk/receive",async t=>{let e=await this.get(t.addr);var i,r,s;if(!e&&(e=await this.ensure({id:t.addr,type:"multisig",m:t.m,n:t.n,witness:!0}),[s,r]=await this.getAccountByAddress(t.addr),s=await this.get(s))&&await s.send({subtractFee:!1,sort:!1,outputs:[{address:t.contract,value:1e4}],comment:JSON.stringify({oper:"scrun",params:{oper:"pubk",addr:t.addr,puba:e.account.accountKey}})},r),e.account.keys.length<e.account.n-1){for(i of t.data.split(","))try{await e.addSharedKey(i)}catch(t){}e.account.keys.length==e.account.n-1&&([s,r]=await this.getAccountByAddress(t.addr),s=await this.get(s))&&await s.send({subtractFee:!1,sort:!1,outputs:[{address:t.contract,value:1e4}],comment:JSON.stringify({oper:"scrun",params:{oper:"puba",addr:t.addr,puba:e.account.receive.getAddress().toString()}})},r)}}),this.on("mssendtx/receive",async t=>{var e,i=await this.get(t.addr);i&&i.account.type==o.types.MULTISIG&&((e=w.fromRaw(t.data,"hex")).view=await i.getCoinView(e),e.isSigned()||(t.txid=e.txid(),await this.saveMSTrans(t)))}),this.client.hook("onConnect",async()=>{await this.load()}),this.client.hook("error",t=>{this.emit("error",t)}),this.client.hook("block.connect",async(t,e)=>{try{await this.addBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.hook("block.disconnect",async(t,e)=>{try{await this.removeBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.hook("chain.full",()=>{this.synced=!0}),this.client.hook("block.rescan",async(t,e)=>{try{await this.rescanBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.on("tx",async(t,e,i)=>{try{await this.addTX(t,null,i)}catch(t){this.emit("error",t)}}),this.client.on("entry.remove",async(t,e)=>{try{if(e){var i=t.tx.hash("hex"),r=await this.getWalletsByTX(t.tx);if(r)for(const e of r){var n=await this.get(e);s(n),await n.remove(i),(await x.FactoryOfContract({tx:t.tx,env:this})).erase()}}}catch(t){this.emit("error",t)}}),this.client.hook("chain.reset",async t=>{try{await this.resetChain(t)}catch(t){this.emit("error",t)}}),this.jsonp&&this.jsonp.hook("error",t=>{this.emit("error",t)}))}async disconnect(){this.client&&await this.client._close(),this.jsonp&&await this.jsonp._close()}async flushCP(t,e=!1){this.client&&(t=t||[],e||(t=this.cpList.excludeCids(t),e=e||0<t.length),e)&&await this.client.execute("cp.remoteQuery",[[["cid","include",t]]])}async watch(){let t=this.db.iterator({gte:u.p(F.NULL_HASH),lte:u.p(F.HIGH_HASH)}),e=0,i=0;for(;;){var r=await t.next();if(!r)break;try{var s=u.pp(r.key);this.filter.add(s,"hex")}catch(e){throw await t.end(),e}e++}for(t=this.db.iterator({gte:u.o(F.NULL_HASH,0),lte:u.o(F.HIGH_HASH,4294967295)});;){var n=await t.next();if(!n)break;try{var[a,o]=u.oo(n.key),c=new y(a,o).toRaw();this.filter.add(c)}catch(e){throw await t.end(),e}i++}this.logger.info("Filter: Added %d hashes to AccountDB filter.",e),this.logger.info("Filter: Added %d outpoints to AccountDB filter.",i),await this.setFilter()}async sync(){if(this.client){let e,i=this.curHeight;for(;0<=i;){var t=await this.getBlock(i);if(!t)break;if(e=await this.client.getEntry(t.hash))break;i--}e||(i=this.state.startHeight,e=await this.client.getEntry(this.state.startHash))||(i=0),await this.cpList.loadHistory(),await this.cpMemList.loadHistory(),await this.propList.loadHistory(),await this.htlcList.loadHistory(),await this.commentList.loadHistory(),await this.accountList.loadHistory(),await this.transactionList.loadHistory(),await this.loadContact(),await this.erList.loadHistory(),await this.auditList.loadHistory(),await this.erAbList.loadHistory(),await this.accountCoinList.loadHistory(),await this.scan(i,!1)}}async scan(t,e=!0){if(this.client){null==t&&(t=this.state.startHeight),s(t>>>0===t,"WDB: Must pass in a height.");var i=this.curHeight;e=(await this.rollback(t,e),this.logger.info("AccountDB is scanning %d blocks.",i-t+1),await this.getTip());try{this.rescanning=!0,await this.client.rescan(e.hash)}finally{this.rescanning=!1}}}async rescan(t){var e=await this.txLock.lock();try{return await this.scan(t,!1)}finally{e()}}async send(t){if(this.client)return this.client.send(t);this.emit("send",t)}async getTX(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e.tx}return null}async getTXFromDb(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e.tx}return null}async getExtendTX(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e}return null}async removeTX(t){this.client?await this.client.removeTX(t):this.emit("remove",t)}async estimateFee(t){return 0<this.feeRate?this.feeRate:!this.client||(t=await this.client.estimateFee(t))<this.network.feeRate?this.network.feeRate:t>this.network.maxFeeRate?this.network.maxFeeRate:t}setFilter(){return this.client?this.client.setFilter(this.filter):(this.emit("filter.set",this.filter),Promise.resolve())}addFilter(t){return this.client?this.client.addFilter(t):(this.emit("filter.add",t),Promise.resolve())}resetFilter(){return this.client?this.client.resetFilter():(this.emit("filter.reset"),Promise.resolve())}backup(t){return this.db.backup(t)}async wipe(){this.logger.warning("Wiping AccountDB TXDB..."),this.logger.warning("I hope you know what you're doing.");var t=this.db.iterator({gte:Buffer.from([0]),lte:Buffer.from([255])}),e=this.db.batch();let i=0;for(;;){var r=await t.next();if(!r)break;try{switch(r.key[0]){case 98:case 99:case 101:case 116:case 111:case 104:case 82:e.del(r.key),i++}}catch(e){throw await t.end(),e}}this.logger.warning("Wiped %d txdb records.",i),await e.write()}async getDepth(){var t=this.db.iterator({gte:u.w(0),lte:u.w(4294967295),reverse:!0,limit:1}),e=await t.next();return e?(await t.end(),u.ww(e.key)+1):1}start(t){return s(!t.current,"WDB: Batch already started."),t.current=this.db.batch(),t.accountCache.start(),t.pathCache.start(),t.current}drop(t){var e=this.batch(t);t.current=null,t.accountCache.drop(),t.pathCache.drop(),e.clear()}clear(t){var e=this.batch(t);t.accountCache.clear(),t.pathCache.clear(),e.clear()}batch(t){return s(t.current,"WDB: Batch does not exist."),t.current}async commit(t){var e=this.batch(t);try{await e.write()}catch(t){throw this.drop(),t}t.current=null,t.accountCache.commit(),t.pathCache.commit()}testFilter(t){return this.filter.test(t,"hex")}addHash(t){return this.filter.add(t,"hex"),this.addFilter(t)}addOutpoint(t,e){t=new y(t,e),this.filter.add(t.toRaw())}dump(){return this.db.dump()}register(t){s(!this.wallets.has(t.wid)),this.wallets.set(t.wid,t)}unregister(t){s(this.wallets.has(t.wid)),this.wallets.delete(t.wid)}async getWalletID(t){var e;return t?"number"==typeof t?t:this.widCache.get(t)||((e=await this.db.get(u.l(t)))?(e=e.readUInt32LE(0,!0),this.widCache.set(t,e),e):null):null}async get(t){if(!(t=await this.getWalletID(t)))return null;var e=await this.readLock.lock(t);try{return await this._get(t)}finally{e()}}async _get(t){var e=this.wallets.get(t);return e||((e=await this.db.get(u.w(t)))?(await(t=a.fromRaw(this,e)).open(),this.register(t),t):null)}async loadBackup(t){if(ft.unsupported)throw new gt(mt.INTERNAL_ERROR,"FS not available.");let e=await this.get("primary");var i;for(i of(await ft.readFile(t,"utf8")).split(/\n+/))if(0!==(i=i.trim()).length&&!/^\s*#/.test(i)){var r=i.split(/\s+/);if(r.length<4)throw new gt(mt.DESERIALIZATION_ERROR,"Malformed wallet Data File.");switch(r[0]){case"W":var n=Buffer.from(r[1],"base64");n=a.fromRaw(e.db,n);if(e.wid!=n.wid)throw new gt(mt.DESERIALIZATION_ERROR,"Malformed wallet Key");await this.replace(n),e=await this.get("primary"),this.logger.info("Import Wallet %s(%s)",e.id,e.wid);break;case"C":n=Buffer.from(r[1],"base64");(c=((h=o.fromRaw(e.db,n)).wallet=e,h.wid=e.wid,h.id=e.id,h.initialized=!0,h.watchOnly=e.watchOnly,h.receive=h.deriveReceive(h.receiveDepth-1),h.change=h.deriveChange(h.changeDepth-1),h.witness&&(h.nested=h.deriveNested(h.nestedDepth-1)),e.master.key.deriveAccount(44,h.accountIndex))).publicKey.toString("hex")!==h.accountKey.publicKey.toString("hex")&&s(c.publicKey.toString("hex")==h.accountKey.publicKey.toString("hex")),await e.saveAccount(h),this.logger.info("Import Account %s(%s)",h.name,h.accountIndex);break;case"A":var c=parseInt(r[5]),h=parseInt(r[7]),u=parseInt(r[9]),l=r[11].trim(),p=await e.deriveKey(c,h,u),d=await e.deriveKey(c,h,u,e.master);p.getAddress("string")!==d.getAddress("string")&&s(p.getAddress("string")==d.getAddress("string")),p.getAddress("string")!==l&&s(p.getAddress("string")==l),this.logger.info("Import Address %s %s %s %s",c,h,u,p.getAddress("string"))}}return e.accountCache.reset(),e}save(t){var e=t.wid,i=t.id,r=this.batch(t);this.widCache.set(i,e),r.put(u.w(e),t.toRaw()),r.put(u.l(i),D(e))}async rename(t,e){var i=await this.writeLock.lock();try{return await this._rename(t,e)}finally{i()}}async _rename(t,e){var i=t.id;if(!n.isName(e))throw new Error("WDB: Bad wallet ID.");if(await this.has(e))throw new Error("WDB: ID not available.");this.start(t).del(u.l(i)),t.id=e,this.save(t),await this.commit(t),this.widCache.remove(i),i=t.pathCache.values();for(const t of i)t.id=e}async replace(t){var e=await this.writeLock.lock();try{return await this._replace(t)}finally{e()}}async _replace(t){var e=this.start(t);e.del(u.l(t.id)),e.del(u.w(t.wid)),this.save(t),await this.commit(t),this.widCache.remove(t.id),this.wallets.delete(t.wid)}renameAccount(t,e){var i=t.wallet;this.batch(i).del(u.i(t.wid,t.name)),t.name=e,this.saveAccount(t)}async auth(t,e){if("string"==typeof e){if(!O.isHex256(e))throw new Error("WDB Authentication: Invalid Token.");e=Buffer.from(e,"hex")}t=k.getHmac(t.toString(),this.keys.hmacSalt);var i=r.createHmac("sha256",t.random);i=Buffer.from(i.update(t.token).digest("hex"),"hex");if(!p(e,i))throw new Error("WDB Authentication: CRC Error.")}async create(t){var e=await this.writeLock.lock();t=t||{};try{return await this._create(t)}finally{e()}}async _create(t){if(await this.has(t.id))throw new Error("WDB: Wallet already exists.");"string"==typeof t.mnemonic&&(t.mnemonic={phrase:t.mnemonic}),t.mnemonic=t.mnemonic||{},!t.mnemonic.language&&this.options.mnemonic&&this.options.mnemonic.language&&(t.mnemonic.language=this.options.mnemonic.language);var e=a.fromOptions(this,t);return e.wid=this.depth++,await e.init(t),this.register(e),this.logger.info("Created wallet %s in AccountDB.",e.id),e}async has(t){return null!=await this.getWalletID(t)}async ensure(t){return await this.get(t.id)||this.create(t)}async getAccount(t,e){return(t=await this.db.get(u.a(t,e)))?o.fromRaw(this,t):null}getAccounts(t){return this.db.values({gte:u.n(t,0),lte:u.n(t,4294967295),parse:t=>t.toString("ascii")})}async getAccountIndex(t,e){return(t=await this.db.get(u.i(t,e)))?t.readUInt32LE(0,!0):-1}async getGuider(t){return t=v.fromString(t,this.network.type).getHash("hex"),(t=await this.db.get(u.g(t)))?v.fromRaw(t).toString():null}async setGuider(t,e,i){var r;i=v.fromString(i,this.network.type).getHash("hex"),await this.db.has(u.g(i))||(t=v.fromString(t,this.network.type),(r=this.db.batch()).put(u.g(i),t.toRaw()),r.put(u.gs(t.getHash("hex"),Buffer.from(e,"ascii").toString("hex"),i),null),await r.write())}async unsetGuider(t,e,i){t=v.fromString(t,this.network.type).getHash("hex"),i=v.fromString(i,this.network.type).getHash("hex");var r=this.db.batch();r.del(u.g(i)),r.del(u.gs(t,Buffer.from(e,"ascii").toString("hex"),i)),await r.write()}async getAccountName(t,e){return(t=await this.db.get(u.n(t,e)))?t.toString("ascii"):null}saveAccount(t){var e=t.wid,i=t.wallet,r=t.accountIndex,s=t.name,n=this.batch(i);n.put(u.a(e,r),t.toRaw()),n.put(u.i(e,s),D(r)),n.put(u.n(e,r),Buffer.from(s,"ascii")),i.accountCache.push(r,t)}hasAccount(t,e){return"number"==typeof t&&"number"==typeof e&&this.db.has(u.a(t,e))}async getPathMap(t){var e=this.pathMapCache.get(t);return e||((e=await this.db.get(u.p(t)))?(e=ut.fromRaw(t,e),this.pathMapCache.set(t,e),e):null)}saveKey(t,e){return this.savePath(t,e.toPath())}async savePath(t,e){var i=t.wid,r=e.hash,s=this.batch(t);await this.addHash(r);let n=await this.getPathMap(r);(n=n||new ut(r)).add(i)&&(this.pathMapCache.set(r,n),t.pathCache.push(r,e),s.put(u.p(r),n.toRaw()),s.put(u.P(i,r),e.toRaw()),s.put(u.r(i,e.account,r),null))}async getPath(t,e){var i=await this.db.get(u.P(t,e));return i?((i=at.fromRaw(i)).wid=t,i.hash=e,i):null}hasPath(t,e){return this.db.has(u.P(t,e))}getHashes(){return this.db.keys({gte:u.p(F.NULL_HASH),lte:u.p(F.HIGH_HASH),parse:u.pp})}getOutpoints(){return this.db.keys({gte:u.o(F.NULL_HASH,0),lte:u.o(F.HIGH_HASH,4294967295),parse:t=>{var[t,e]=u.oo(t);return new y(t,e)}})}getWalletHashes(t){return this.db.keys({gte:u.P(t,F.NULL_HASH),lte:u.P(t,F.HIGH_HASH),parse:u.Pp})}getAccountHashes(t,e){return this.db.keys({gte:u.r(t,e,F.NULL_HASH),lte:u.r(t,e,F.HIGH_HASH),parse:u.rr})}async getWalletPaths(t){var e=[];for(const s of await this.db.range({gte:u.P(t,F.NULL_HASH),lte:u.P(t,F.HIGH_HASH)})){var i=u.Pp(s.key),r=at.fromRaw(s.value);r.hash=i,r.wid=t,e.push(r)}return e}async encryptKeys(t,e){var i,r,n=t.wid,a=await t.getPaths(),o=this.batch(t);for(i of a)i.data&&(s(!i.encrypted),r=Buffer.from(i.hash,"hex").slice(0,16),(i=i.clone()).data=d.encipher(i.data,e,r),i.encrypted=!0,t.pathCache.push(i.hash,i),o.put(u.P(n,i.hash),i.toRaw()))}async decryptKeys(t,e){var i,r,n=t.wid,a=await t.getPaths(),o=this.batch(t);for(i of a)i.data&&(s(i.encrypted),r=Buffer.from(i.hash,"hex").slice(0,16),(i=i.clone()).data=d.decipher(i.data,e,r),i.encrypted=!1,t.pathCache.push(i.hash,i),o.put(u.P(n,i.hash),i.toRaw()))}async resend(){var t,e={};for(const t of await this.db.keys({gte:u.w(0),lte:u.w(4294967295)})){var i,r=u.ww(t);r&&(i=await this.resendPending(r))&&Array.isArray(i)&&(e[r]=i)}for(t of Object.keys(e)){var s=await this.get(parseInt(t));if(s)for(const i of e[t]){try{await this.send(i)}catch(t){this.logger.warning("wdb resend:",t.message);try{await s.abandon(i.hash("hex"))}catch(t){this.logger.warning("wdb abandon:",t.message)}}await dt.timeout(50)}}}async resendPending(t){var e=await this.get(t),i=await this.db.keys({gte:h.txdb.prefix(t,h.txdb.p(F.NULL_HASH)),lte:h.txdb.prefix(t,h.txdb.p(F.HIGH_HASH))});if(0!==i.length){this.logger.info("Rebroadcasting %d transactions for %d.",i.length,t);var r=[];for(const o of i){var s=h.txdb.pp(o),n=h.txdb.prefix(t,h.txdb.t(s));if((n=await this.db.get(n))&&!(n=lt.fromRaw(n)).tx.isCoinbase())try{var a=await x.FactoryOfContract({tx:n.tx,env:this});await a.isBlockFinal()==E.Expired?e&&(await this.removeTX(n.tx),await e.remove(s),await a.erase()):"notify"!=a.oper&&r.push(n.tx)}catch(t){this.logger.error("TX(%s) Smart Contract Error: %s",n.tx.txid(),t.message)}}return await P(r,this)}}getWallets(){return this.db.keys({gte:u.l("\0"),lte:u.l("ÿ"),parse:u.ll})}async getWalletsByTX(t){var e=new Set;if(!t.isCoinbase())for(const r of t.inputs){var i=r.prevout;if(this.testFilter(i.toRaw())&&(i=await this.getOutpointMap(i.hash,i.index)))for(const t of i.wids)e.add(t)}for(const i of t.getOutputHashes("hex"))if(this.testFilter(i)){var r=await this.getPathMap(i);if(r)for(const t of r.wids)e.add(t)}return 0===e.size?null:e}async getState(){var t=await this.db.get(u.R);return t?ot.fromRaw(t):null}async init(t){var e=this.options.startHeight;let i;if(this.client){if(null!=e){if(!(i=await this.client.getEntry(e)))throw new Error("WDB: Could not find start block.")}else i=await this.client.getTip();i=ht.fromEntry(i)}else i=ht.fromEntry(this.network.genesis);this.logger.info("Initializing AccountDB chain state (height %d).",i.height),(e=await this.getState())?this.state=e:await this.resetState(i,!1),await this.ensure({id:"primary",witness:!0,mnemonic:this.options.mnemonic}),t&&t.backup&&await this.loadBackup(t.backup)}async resetState(t,e){for(var i=this.state.clone(),r=(i.startHeight=t.height,i.startHash=t.hash,i.height=t.height,i.marked=e,this.db.batch()),s=this.db.iterator({gte:u.h(t.height),lte:u.h(4294967295),values:!1});;){var n=await s.next();if(!n)break;try{r.del(n.key)}catch(t){throw await s.end(),t}}r.put(u.h(t.height),t.toHash()),r.put(u.R,i.toRaw()),await r.write(),this.state=i}async syncState(t){var e=this.state.clone(),i=this.db.batch();if(t.height<e.height){let s=e.height;var r=s-t.height;for(let t=0;t<r;t++)i.del(u.h(s--))}else t.height>e.height&&s(t.height===e.height+1,`Bad chain sync tip ${t.height} while state `+e.height);e.height=t.height,i.put(u.h(t.height),t.toHash()),i.put(u.R,e.toRaw()),await i.write(),this.state=e,Y("block/tips",e)}get curHeight(){return this.state.height}get tidCreator(){return h.txdb.tx}get finder(){return this.getTXFromDb.bind(this)}rpcExecute(){return this.rpc.execute.apply(this.rpc,arguments)}async getBlockMap(t){var e=await this.db.get(u.b(t));return e?ct.fromRaw(t,e):null}writeBlockMap(t,e,i){this.batch(t).put(u.b(e),i.toRaw())}unwriteBlockMap(t,e){this.batch(t).del(u.b(e))}async getOutpointMap(t,e){var i=await this.db.get(u.o(t,e));return i?nt.fromRaw(t,e,i):null}writeOutpointMap(t,e,i,r){t=this.batch(t),this.addOutpoint(e,i),t.put(u.o(e,i),r.toRaw())}unwriteOutpointMap(t,e,i){this.batch(t).del(u.o(e,i))}async writeBalanceLog(t,e){var i=u.log(t.wid,e.aidx,e.height,e.hash),r=(e=Buffer.from(JSON.stringify(e)),await this.writeLock.lock());try{this.start(t).put(i,e),await this.commit(t)}finally{r()}}async queryBalanceLog(t,e,i=0){return this.db.values({gte:u.log(t,e,i,F.NULL_HASH),lte:u.log(t,e,this.curHeight,F.HIGH_HASH),parse:t=>JSON.parse(t.toString())})}async getBlock(t){var e,i=await this.db.get(u.h(t));return i?((e=new ht).hash=i.toString("hex"),e.height=t,e):null}async getTip(){var t=await this.getBlock(this.curHeight);if(t)return t;throw new Error("WDB: Tip not found!")}async rollback(t,e=!0){if(t>this.curHeight)throw new Error("WDB: Cannot rollback to the future.");if(t===this.curHeight)return this.logger.debug("Rolled back to same height (%d).",t),!0;this.logger.info("Rolling back %d AccountDB blocks to height %d.",this.curHeight-t,t);var i=await this.getBlock(t);let r=!1;return i?(await this.revert(i.height),await this.syncState(i),e):(i=new ht,t>=this.state.startHeight?(i.height=this.state.startHeight,i.hash=this.state.startHash,r=this.state.marked,this.logger.warning("Rolling back AccountDB to start block (%d).",i.height)):(i.height=0,i.hash=this.network.genesis.hash,r=!1,this.logger.warning("Rolling back AccountDB to genesis block.")),await this.revert(i.height),await this.resetState(i,r),!1)}async revert(t){var e=this.db.iterator({gte:u.b(t+1),lte:u.b(4294967295),reverse:!0,values:!0});let i=0;for(;;){var r=await e.next();if(!r)break;try{var s=u.bb(r.key),n=ct.fromRaw(s,r.value).toArray();i+=n.length;for(let t=n.length-1;0<=t;t--)await this._unconfirm(n[t])}catch(t){throw await e.end(),t}}this.logger.info("Rolled back %d AccountDB transactions.",i)}async addBlock(t,e){var i=await this.txLock.lock();try{return await this._addBlock(t,e)}finally{i()}}async _addBlock(t,e){var i=ht.fromEntry(t);let r=0;if(i.height<this.curHeight)this.logger.warning("AccountDB is connecting low blocks (%d).",i.height);else{if(i.height===this.curHeight)this.logger.warning("Already saw AccountDB block (%d).",i.height);else if(i.height!==this.curHeight+1)throw new Error(`WDB(addBlock): Bad disconnection (height mismatch, tip ${i.height} while state ${this.curHeight})`);if(await this.syncState(i),!(this.options.checkpoints&&i.height<=this.network.lastCheckpoint)){for(const t of e)await this._insert(t,i)&&r++;0<r&&this.logger.info("Connected AccountDB block %s (tx=%d).",O.revHex(i.hash),r)}}return r}async removeBlock(t,e){var i=await this.txLock.lock();try{return await this._removeBlock(t,e)}finally{i()}}async _removeBlock(t,e){if((t=ht.fromEntry(t)).height>this.curHeight)return this.logger.warning("AccountDB is disconnecting high blocks (%d).",t.height),0;if(t.height!==this.curHeight)throw new Error(`WDB(removeBlock): Bad disconnection (height mismatch, tip ${t.height} / ${O.revHex(t.hash)} while state ${this.curHeight})`);var i=await this.getBlock(t.height-1);if(!i)throw new Error(`WDB(removeBlock): Bad disconnection (no previous block of ${t.height} / ${O.revHex(t.hash)}).`);var r=await this.getBlockMap(t.height);if(r){for(let t=e.length-1;0<=t;t--){var s=e[t];await this._unconfirm(s,r)}this.logger.warning("Disconnected wallet block %s (tx=%d).",O.revHex(t.hash),r.txs.size)}return await this.syncState(i),r?r.txs.size:0}async rescanBlock(t,e){if(this.rescanning){var i=await this.scanLock.lock();try{await this._addBlock(t,e)}catch(t){throw this.emit("error",t),t}finally{i()}}else this.logger.warning("Unsolicited rescan block: %s.",t.height)}async addTX(t,e,i){var r=await this.txLock.lock();try{return await this._insert(t,e,i)}finally{r()}}listNotify(t){return this.NotifyList.deletes([["h","<",this.curHeight-12]]),this.NotifyList.query(t)}listContact(t,e,i){return this.$contacts.query(t,e,i)}async setCp(t){await this.batchPut(h.txdb.cp(t.cid),t.toRaw())}async delCp(t){await this.batchDel(h.txdb.cp(t))}async delVp(t){var e=this.db.batch();e.del(h.txdb.VP(t.pid)),await e.write()}async setVp(t,e){var i=this.db.batch();i.put(h.txdb.VP(t.pid),t.toRaw()),await i.write()}async getVp(t){return(t=await this.db.get(h.txdb.VP(t)))?Z.fromRaw(t):null}async getVpByAddress(t){return{list:[],count:0}}async getVpByOid(t){return{list:[],count:0}}async loadVpList(){return this.db.values({gte:h.txdb.VP(F.ZERO_CID,"hex"),lte:h.txdb.VP(F.MAX_CID,"hex"),parse:t=>Z.fromRaw(t)})}async saveContact(t){var e=this.db.batch();e.put(h.txdb.CT(t.getAddress()),t.toRaw()),await e.write()}async loadContact(t){var e;for(e of await this.db.values({gte:h.txdb.CT(F.ZERO_HASH160_HEX),lte:h.txdb.CT(F.MAX_HASH160_HEX),parse:t=>A.fromRaw(t,this)}))e.sender&&(e.sender.wallet=await this.get(e.sender.wid)),this.$contacts.set(e.address,e)}async delHtlc(t){var e;(t=new z(t)).id&&(this.htlcList.delete(t.id),this.htlcList.delAccount(t),(e=this.db.batch()).del(h.txdb.VH(t.shash,t.sidx)),await e.write())}async setSuggest(t){t=new z(t);var e,[e,i]=(this.htlcList.set(t.id,t),await this.getAccountByAddress(t.aa)),[e,i]=(e&&this.htlcList.setAccount(t,e,i),await this.getAccountByAddress(t.ba));(e=(e&&this.htlcList.setAccount(t,e,i),this.db.batch())).put(h.txdb.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async setAssent(t){t=new z(t);var e,[e,i]=(this.htlcList.set(t.id,t),await this.getAccountByAddress(t.ab)),[e,i]=(e&&this.htlcList.setAccount(t,e,i),await this.getAccountByAddress(t.bb));(e=(e&&this.htlcList.setAccount(t,e,i),this.db.batch())).put(h.txdb.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async loadHtlcList(){return this.db.values({gte:h.txdb.VH(F.ZERO_CID,0),lte:h.txdb.VH(F.MAX_CID,4294967295),parse:t=>z.fromRaw(t)})}async delComment(t){var e;(t=new q(t)).id&&(this.commentList.delete(t.id),this.commentList.delAccount(t),(e=this.db.batch()).del(h.txdb.VC(t.shash,t.sidx)),await e.write())}async setComment(t){t=new q(t);var e,[e,i]=(this.commentList.set(t.id,t),await this.getAccountByAddress(t.bob));(e=(e&&(this.commentList.setAccount(t,e,i),this.emit("comm.comment",t)),this.db.batch())).put(h.txdb.VC(t.shash,t.sidx),t.toRaw()),await e.write()}async loadCommentList(){return this.db.values({gte:h.txdb.VC(F.ZERO_CID,0),lte:h.txdb.VC(F.MAX_CID,4294967295),parse:t=>q.fromRaw(t)})}async setStockRecord(t){var e=this.db.batch();switch(e.put(t.itemNo,t.toRaw()),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(i.stock.sum=t.sum,i.stock.price=t.price,i.stock.period=this.curHeight+10*m.BLOCK_DAY,i.seq=t.seq,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Auction:{let s=this.accountList.getStockAccount(t.cid,t.addr);if(s?(i=s.sum+t.sum,s.price=(t.sum*t.price+s.sum*s.price)/i|0,s.sum=i,s.seq=t.seq):((s=new tt(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(s)),e.put(s.getItemNo(),s.toRaw()),!(i=this.accountList.getStockAccount(t.cid,t.to)))break;var r=i.sum-t.sum;i.sum=r,i.stock.sum-=t.sum,e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Purchase:{let i=this.accountList.getStockAccount(t.cid,t.addr);i?(r=i.sum+t.sum,i.price=(t.sum*t.price+i.sum*i.price)/r,i.sum=r,i.seq=t.seq):((i=new tt(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(i)),e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Send:if(i=this.accountList.getStockAccount(t.cid,t.addr)){i.sum-=t.sum,i.seq=t.seq;let s=this.accountList.getStockAccount(t.cid,t.to);s||(s=new tt(t.cid,t.to,0,0,0),this.accountList.setStockAccount(s)),r=s.sum+t.sum,s.price=(t.sum*i.price+s.sum*s.price)/r,s.sum=r,e.put(i.getItemNo(),i.toRaw()),e.put(s.getItemNo(),s.toRaw())}break;case G.RecordType.Bonus:case G.RecordType.Ads:}await e.write()}async unsetStockRecord(t){var e=this.db.batch();switch(e.del(t.itemNo),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.stock.sum=0,s.stock.price=0,s.stock.period=0,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Auction:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(i=s.sum-t.sum,s.price=(s.sum*s.price-t.sum*t.price)/i|0,s.sum=i,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),s=this.accountList.getStockAccount(t.cid,t.to))&&(i=s.sum+t.sum,s.sum=i,s.stock.sum+=t.sum,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Purchase:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(s=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*t.price)/s,i.sum=s,i.seq=t.seq-1,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Send:var r,s;(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.sum+=t.sum,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),i=this.accountList.getStockAccount(t.cid,t.to))&&(r=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*s.price)/r|0,i.sum=r,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Bonus:}await e.write()}async getStockRecordById(t){return(t=await this.db.get(t))?G.fromRaw(t):null}async verifyClsTx(t,e){if(!this.spv&&1!=(e=await(await x.FactoryOfContract({env:this,block:e,tx:t})).verify()))throw new g(t,S(e),"bad-contract-verify",100);return!0}async getStockRecord(t,e,i){let r=6,s=F.ZERO_CID_BUF,n=F.MAX_CID_BUF,a=0;return t&&(r=t,e)&&(s=e,n=e,a=i||0),t=new C,(await this.db.values({gte:G.itemNo(r,s,a,F.NULL_HASH,0),lte:G.itemNo(r,n,4294967295,F.HIGH_HASH,4294967295),parse:G.fromRaw})).reduce((t,e)=>(t.set(e.itemNo,e),t),t),t}async getStockRecordByCid(t,e){var i,r=new C;for(i of Object.keys(G.RecordType)){var s=await this.getStockRecord(G.RecordType[i],t,e);r.merge(s)}return r}async getStockAccountList(t){var e;return t?(e=tt.SN(t,F.NULL_HASH),t=tt.SN(t,F.HIGH_HASH),this.db.values({gte:e,lte:t,parse:tt.fromRaw})):this.db.values({gte:tt.SN(F.ZERO_CID_BUF,F.NULL_HASH),lte:tt.SN(F.MAX_CID_BUF,F.HIGH_HASH),parse:tt.fromRaw})}async delEr(t){var e=this.db.batch();e.del(h.txdb.ER(t.erid)),e.del(h.txdb.ERR(t.witness,t.erid)),await e.write()}async setEr(t,e){e&&t.source&&(i=v.fromWitnessPubkeyhash(l.hash160(Buffer.from(t.source.pubkey,"hex")),this.network),[i,e]=await this.getAccountByAddress(i,e),t.wid=i,t.account=e);var i=this.db.batch();e=h.txdb.ERR(t.witness,t.erid);i.put(e,t.toRaw()),i.put(h.txdb.ER(t.erid),e),await i.write()}async getEr(t){return(t=(t=await this.db.get(h.txdb.ER(t)))&&await this.db.get(t))?it.fromRaw(t):null}async byPubkey(t,e,i=!1){var r,s=new C;t=await this.db.values({gte:h.txdb.ERR(t,F.ZERO_CID),lte:h.txdb.ERR(t,F.MAX_CID),parse:t=>it.fromRaw(t)});let n=[],a=new Map;if(i){for(var o of t)(!a.get(o.source.cluster)||o.startHeight>a.get(o.source.cluster).startHeight)&&a.set(o.source.cluster,await this.caVerifyObj(o));n=a.values()}else n=t;for(r of n)s.set(r.erid,r);return s.query(e)}async caVerifyObj(t){var e={verify:!1};if(!t||t.validHeight<=this.curHeight)return e;var i=await this.erAbList.getErAb(t.erid);return i&&i.abolishHeight<this.curHeight?e:(i=pt.fromPublic(Buffer.from(t.witness,"hex"),this.network.type),t.verify(i)?(t.verify=!0,0<(i=this.cpList.query([["pubKey",t.witness]])).list.length&&(t.cpid=i.list[0].cid),t):e)}async delErAbolish(t){var e=this.db.batch();e.del(h.txdb.ERA(t.erid)),await e.write()}async setErAbolish(t){var e=this.db.batch();e.put(h.txdb.ERA(t.erid),t.toRaw()),await e.write()}async getErAbolish(t){return(t=await this.db.get(h.txdb.ERA(t)))?X.fromRaw(t):null}loadErAbolishList(){return this.db.values({gte:h.txdb.ERA(F.ZERO_CID),lte:h.txdb.ERA(F.MAX_CID),parse:t=>X.fromRaw(t)})}async delAudit(t){var e=this.db.batch();e.del(h.txdb.AU(t.erid)),await e.write()}async setAudit(t){var e=this.db.batch();e.put(h.txdb.AU(t.erid),t.toRaw()),await e.write()}async getAudit(t){return(t=await this.db.get(h.txdb.AU(t)))?st.fromRaw(t):null}async loadAuditList(){return this.db.values({gte:h.txdb.AU(F.NULL_HASH),lte:h.txdb.AU(F.HIGH_HASH),parse:t=>st.fromRaw(t)})}async batchPut(t,e){var i=this.db.batch();i.put(t,e),await i.write()}async batchDel(t){var e=this.db.batch();e.del(t),await e.write()}async _insert(t,e,i){s(!t.mutable,"WDB: Cannot add mutable TX.");let r=await this.getWalletsByTX(t);if(r){this.logger.info("Incoming transaction for %d wallets in AccountDB (%s).",r.size,t.txid()),!e||this.state.marked||(this.logger.info("Marking AccountDB start block at %s (%d).",O.revHex(e.hash),e.height),await this.resetState(e,!0));let a=!1;for(const o of r){var n=await this.get(o);s(n),await n.add(t,e,i)&&(this.logger.info("Added transaction to wallet in AccountDB: %s (%d).",n.id,o),a=!0)}a||(r=null)}try{var a=await x.FactoryOfContract({env:this,block:e,tx:t});e?await a.confirm():await a.insert()}catch(a){e?this.logger.error("TX(%s) Smart Contract Confirm Error: %s",t.txid(),a.message):this.logger.error("TX(%s) Smart Contract Insert Error: %s",t.txid(),a.message)}return r}async _unconfirm(t,e){if(e)try{await(await x.FactoryOfContract({env:this,block:e,tx:t})).unconfirm()}catch(e){this.logger.error("TX(%s) Smart Contract Unconfirm Error: %s",t.txid(),e.message)}let i,r=null;if(i=t.wids?(r=t.wids,t.hash):(r=await this.getWalletsByTX(t),t.hash("hex")),!r)return null;for(const t of r){var n=await this.get(t);s(n),await n.unconfirm(i)}for(const t of r){var a=await this.get(t);s(a),await a.abandon(i)}}async resetChain(t){var e=await this.txLock.lock();try{return await this._resetChain(t)}finally{e()}}async _resetChain(t){if(t.height>this.curHeight)throw new Error(`WDB: Bad reset height ${t.height} while curHeight `+this.curHeight);var e;for(e of(await this.rollback(t.height)||await this.scan(),await this.getWallets())){var i=await this.get(e);for(const e of await i.getPending())try{await i.abandon(e.hash)}catch(t){}await i.resetBalance()}}async saveMSTrans(t){var e=await this.writeLock.lock();try{return await this._saveMSTrans(t)}finally{e()}}async _saveMSTrans(t){var e=this.db.batch();e.put(u.ms(v.getHash(t.addr,"hex"),t.txid),Buffer.from(JSON.stringify(t))),await e.write()}async listMSTrans(t){return t=v.getHash(t,"hex"),this.db.values({gte:u.ms(t,F.NULL_HASH),lte:u.ms(t,F.HIGH_HASH),parse:t=>JSON.parse(t.toString())})}async delMSTrans(t,e){var i=await this.writeLock.lock();try{return await this._delMSTrans(t,e)}finally{i()}}async _delMSTrans(t,e){t=v.getHash(t,"hex");var i=this.db.batch();i.del(u.ms(t,e)),await i.write()}}yt.layout=u,t.exports=yt},function(t,e,i){"use strict";
|
|
911
|
+
*/const r=i(8),s=i(0),n=i(73),a=i(122),o=i(159),c=i(612),h=i(95),u=h.walletdb,l=i(7),p=i(160),d=i(127),f=i(169),m=i(6),g=i(37).VerifyError,y=i(46),v=i(12);i(19);const w=i(60),b=i(198),k=i(69),x=i(43),{getVerifyMsg:S,BlockFinalType:E,ContractEnvType:_}=i(5),R=i(161),A=i(614),C=i(31);var I=i(72);const O=i(1),P=i(119).sortWithSeq,T=i(34),j=i(199),B=i(65),N=i(101),F=i(3),D=F.U32,L=i(341),M=i(342),H=i(343),z=H.vpItem,U=i(616),q=U.vpItem,V=i(85),K=i(617),W=V.cpItem,G=V.stockItem,$=i(158),X=$.ErAbolishItem,Y=i(36).broadcast,J=i(134),Z=J.vpItem,Q=i(232),tt=Q.stockAccount,et=i(157),it=et.ErItem,rt=i(618),st=rt.AuditItem,nt=i(315),at=i(110),ot=i(619),ct=i(316),ht=i(123),ut=i(620),lt=i(222),pt=i(39),dt=i(35),ft=i(59),mt=i(78).errors,gt=i(77);class yt extends I{constructor(t){super(),this.readyLoad=!1,this.options=new c(t),this.network=this.options.network,this.logger=this.options.logger.context("wallet"),this.workers=this.options.workers,this.keys={hmacSalt:F.DefaultChainCode},t.keys&&t.keys.hmacSalt&&(s(Buffer.isBuffer(t.keys.hmacSalt)),this.keys.hmacSalt=t.keys.hmacSalt),this.client=this.options.client,this.client&&(this.client.wdb=this),this.jsonp=this.options.jsonp,this.jsonp&&(this.jsonp.wdb=this),this.spv=this.options.spv,this.feeRate=this.options.feeRate,this.db=f(this.options),this.rpc=new L(this),this.primary=null,this.state=new ot,this.wallets=new Map,this.depth=0,this.rescanning=!1,this.bound=!1,this.newRecord=!0,this.readLock=new j,this.writeLock=new T,this.txLock=new T,this.scanLock=new T,this.widCache=new B(1e4),this.pathMapCache=new B(1e5),this.filter=new N,this.middleHashMem=new Set,this.middleHashChain=new Set,this.autoTaskMgr=new R(this),this.transactionList=new M(this),this.htlcList=new H(this),this.commentList=new U(this),this.NotifyList=new C,this.propList=new J(this),this.accountList=new Q(this),this.$contacts=new C,this.cpList=new V(this),this.cpMemList=new V(this),this.accountCoinList=new K(this),this.auditList=new rt(this),this.erList=new et(this),this.erAbList=new $(this),this.hmacConnection=[],this._init()}async logAudit(t){t.height=this.curHeight,t.time=O.now(),t.erid=l.sha256(O.stringify(t)).toString("hex"),t=new st(t),await this.auditList.setAudit(t)}async getAccountByAddress(t,e){if(t){let s=null;if(s=e?await this.getWalletsByTX(e):await this.getWallets())for(const e of s){var i=await this.get(e);if(i){var r=await i.getPath(t);if(r)return[i.wid,r.name,i.id]}}}return[0,"",""]}_init(){let t=1e6,e=-1;this.spv&&(t=2e4,e=N.flags.ALL),this.filter=N.fromRate(t,.001,e)}async getCpSnap(){return{}}get mode(){return _.Wallet}async getTXFromAll(t){return this.getTXFromDb(t)}async checkNewRecord(){var t={createIfMissing:this.db.options.createIfMissing,errorIfExists:this.db.options.errorIfExists};this.db.options.createIfMissing=!1,this.db.options.errorIfExists=!0;try{await this.db.open();var e=await this.db.checkVersion(u,6);this.newRecord="new"==e}catch(t){if(-1!=t.message.indexOf("does not exist (create_if_missing is false)"))this.newRecord=!0;else{if(-1==t.message.indexOf("exists (error_if_exists is true)"))throw t;this.newRecord=!1}}try{await this.db.close()}catch(t){}this.db.options.createIfMissing=t.createIfMissing,this.db.options.errorIfExists=t.errorIfExists}async isNewRecord(){return await this.checkNewRecord(),this.newRecord}setmnemonic(t){if(this.options.mnemonic=this.options.mnemonic||{},t.bits)this.options.mnemonic={bits:t.bits};else if(t.entropy)this.options.mnemonic={entropy:Buffer.from(t.entropy,"hex")};else if(t.phrase){var e=this.testmnemonic(t.phrase);if(0!=e.code)throw e.msg;this.options.mnemonic={phrase:t.phrase}}t.passphrase&&(this.options.mnemonic.passphrase=t.passphrase),t.language&&(this.options.mnemonic.language=t.language)}testmnemonic(t){try{return new b(t),{code:0}}catch(t){return{code:-1,msg:t.message}}}async getContracts(t){var e=await this.db.values({gte:h.txdb.tx(F.NULL_HASH),lte:h.txdb.tx(F.HIGH_HASH),parse:t=>O.parseJson(t.toString())});return t?e.filter(e=>e.srcact==t||e.dstact==t):e}isFull(){return this.spv||this.synced||!1}async _open(t){}async handleNotify(t,e=!1){if(!e){let i=t.body.content;if("string"==typeof i)try{i=JSON.parse(t.body.content)}catch(t){return}"object"==typeof i&&"secret"===i.type&&(e={contact:t.body.src,messenger:t.body.dst},i.init&&(e.init=Buffer.from(i.init,"hex")),i.packet&&(e.packet=Buffer.from(i.packet)),await this.handleSecret(e))}}async handleSecret(t){if(t.contact&&t.messenger&&t.contact!=t.messenger){try{v.fromString(t.contact,this.network.type),v.fromString(t.messenger,this.network.type)}catch(t){return}var e=await this.ensureContact(t);e&&await e.ensureMessenger(t).answer(t)}}async scanContact(t,e=-1){var i=async t=>{var e;t.witness&&"witnesspubkeyhash"==t.getType()&&(e=t.witness.getPubkeyhashInput()[1],t=v.fromWitness(t.witness).toString(),e)&&t&&await this.ensureContact({contact:t,publicKey:e})};if(0<=e&&e<t.inputs.length)await i(t.inputs[e]);else for(var r of t.inputs)await i(r)}async ensureContact(t){if(!t.contact||t.contact==t.messenger)return null;try{v.fromString(t.contact,this.network.type),t.messenger&&v.fromString(t.messenger,this.network.type)}catch(t){return null}t.network=this.network.type,this.$contacts.get(t.contact)||this.$contacts.set(t.contact,new A(t));var e=this.$contacts.get(t.contact);if(t.messenger&&!(t=e.ensureMessenger(t)).wallet){var i,[i,r]=await this.getAccountByAddress(t.address);if(!(i=await this.get(i)))return;t.wallet=i,t.account=r}return e}getCps(){return this.db.values({gte:h.txdb.cp(F.ZERO_CID,"hex"),lte:h.txdb.cp(F.MAX_CID,"hex"),parse:t=>W.fromRaw(t)})}async _close(){await this.disconnect(),this.http&&this.options.listen&&await this.http.close();for(const t of this.wallets.values())await t.destroy();await this.db.close(),this.options.listen&&await this.logger.close()}async destroy(){await this.db.destroy(),this.widCache.reset(),this.pathMapCache.reset()}async load(t){if(this.readyLoad){var e=await this.ensure({id:"primary",witness:!0,mnemonic:this.options.mnemonic}),i=await this.txLock.lock();try{await this.init(t),await this.watch(),await e.createReceive(0,1,e.master,this.network.type),await e.ensureNotifyKey(),await this.sync()}finally{i()}setTimeout(()=>{this.resend()},5e3)}}bind(){!this.client||this.bound||(this.bound=!0,this.client.hook("htlcassent.cancel",t=>{this.setAssent(t),this.emit("htlcassent.cancel",t)}),this.client.hook("htlcassent.deal",t=>{this.setAssent(t),this.emit("htlcassent.deal",t)}),this.client.hook("htlcassent.receive",t=>{this.setAssent(t),this.emit("htlcassent.receive",t)}),this.client.hook("htlcsuggest.cancel",t=>{this.setSuggest(t),this.emit("htlcsuggest.cancel",t)}),this.client.hook("htlcsuggest.deal",t=>{this.setSuggest(t),this.emit("htlcsuggest.deal",t)}),this.client.hook("htlcsuggest.receive",t=>{this.setSuggest(t),this.emit("htlcsuggest.receive",t)}),this.on("mssendpubk/receive",async t=>{let e=await this.get(t.addr);var i,r,s;if(!e&&(e=await this.ensure({id:t.addr,type:"multisig",m:t.m,n:t.n,witness:!0}),[s,r]=await this.getAccountByAddress(t.addr),s=await this.get(s))&&await s.send({subtractFee:!1,sort:!1,outputs:[{address:t.contract,value:1e4}],comment:JSON.stringify({oper:"scrun",params:{oper:"pubk",addr:t.addr,puba:e.account.accountKey}})},r),e.account.keys.length<e.account.n-1){for(i of t.data.split(","))try{await e.addSharedKey(i)}catch(t){}e.account.keys.length==e.account.n-1&&([s,r]=await this.getAccountByAddress(t.addr),s=await this.get(s))&&await s.send({subtractFee:!1,sort:!1,outputs:[{address:t.contract,value:1e4}],comment:JSON.stringify({oper:"scrun",params:{oper:"puba",addr:t.addr,puba:e.account.receive.getAddress().toString()}})},r)}}),this.on("mssendtx/receive",async t=>{var e,i=await this.get(t.addr);i&&i.account.type==o.types.MULTISIG&&((e=w.fromRaw(t.data,"hex")).view=await i.getCoinView(e),e.isSigned()||(t.txid=e.txid(),await this.saveMSTrans(t)))}),this.client.hook("onConnect",async()=>{await this.load()}),this.client.hook("error",t=>{this.emit("error",t)}),this.client.hook("block.connect",async(t,e)=>{try{await this.addBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.hook("block.disconnect",async(t,e)=>{try{await this.removeBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.hook("chain.full",()=>{this.synced=!0}),this.client.hook("block.rescan",async(t,e)=>{try{await this.rescanBlock(t,e)}catch(t){this.emit("error",t)}}),this.client.on("tx",async(t,e,i)=>{try{await this.addTX(t,null,i)}catch(t){this.emit("error",t)}}),this.client.on("entry.remove",async(t,e)=>{try{if(e){var i=t.tx.hash("hex"),r=await this.getWalletsByTX(t.tx);if(r)for(const e of r){var n=await this.get(e);s(n),await n.remove(i),(await x.FactoryOfContract({tx:t.tx,env:this})).erase()}}}catch(t){this.emit("error",t)}}),this.client.hook("chain.reset",async t=>{try{await this.resetChain(t)}catch(t){this.emit("error",t)}}),this.jsonp&&this.jsonp.hook("error",t=>{this.emit("error",t)}))}async disconnect(){this.client&&await this.client._close(),this.jsonp&&await this.jsonp._close()}async flushCP(t,e=!1){this.client&&(t=t||[],e||(t=this.cpList.excludeCids(t),e=e||0<t.length),e)&&await this.client.execute("cp.remoteQuery",[[["cid","include",t]]])}async watch(){let t=this.db.iterator({gte:u.p(F.NULL_HASH),lte:u.p(F.HIGH_HASH)}),e=0,i=0;for(;;){var r=await t.next();if(!r)break;try{var s=u.pp(r.key);this.filter.add(s,"hex")}catch(e){throw await t.end(),e}e++}for(t=this.db.iterator({gte:u.o(F.NULL_HASH,0),lte:u.o(F.HIGH_HASH,4294967295)});;){var n=await t.next();if(!n)break;try{var[a,o]=u.oo(n.key),c=new y(a,o).toRaw();this.filter.add(c)}catch(e){throw await t.end(),e}i++}this.logger.info("Filter: Added %d hashes to AccountDB filter.",e),this.logger.info("Filter: Added %d outpoints to AccountDB filter.",i),await this.setFilter()}async sync(){if(this.client){let e,i=this.curHeight;for(;0<=i;){var t=await this.getBlock(i);if(!t)break;if(e=await this.client.getEntry(t.hash))break;i--}e||(i=this.state.startHeight,e=await this.client.getEntry(this.state.startHash))||(i=0),await this.cpList.loadHistory(),await this.cpMemList.loadHistory(),await this.propList.loadHistory(),await this.htlcList.loadHistory(),await this.commentList.loadHistory(),await this.accountList.loadHistory(),await this.transactionList.loadHistory(),await this.loadContact(),await this.erList.loadHistory(),await this.auditList.loadHistory(),await this.erAbList.loadHistory(),await this.accountCoinList.loadHistory(),await this.scan(i,!1)}}async scan(t,e=!0){if(this.client){null==t&&(t=this.state.startHeight),s(t>>>0===t,"WDB: Must pass in a height.");var i=this.curHeight;e=(await this.rollback(t,e),this.logger.info("AccountDB is scanning %d blocks.",i-t+1),await this.getTip());try{this.rescanning=!0,await this.client.rescan(e.hash)}finally{this.rescanning=!1}}}async rescan(t){var e=await this.txLock.lock();try{return await this.scan(t,!1)}finally{e()}}async send(t){if(this.client)return this.client.send(t);this.emit("send",t)}async getTX(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e.tx}return null}async getTXFromDb(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e.tx}return null}async getExtendTX(t){for(const i of this.wallets.values()){var e=await i.getTX(t);if(e)return e}return null}async removeTX(t){this.client?await this.client.removeTX(t):this.emit("remove",t)}async estimateFee(t){return 0<this.feeRate?this.feeRate:!this.client||(t=await this.client.estimateFee(t))<this.network.feeRate?this.network.feeRate:t>this.network.maxFeeRate?this.network.maxFeeRate:t}setFilter(){return this.client?this.client.setFilter(this.filter):(this.emit("filter.set",this.filter),Promise.resolve())}addFilter(t){return this.client?this.client.addFilter(t):(this.emit("filter.add",t),Promise.resolve())}resetFilter(){return this.client?this.client.resetFilter():(this.emit("filter.reset"),Promise.resolve())}backup(t){return this.db.backup(t)}async wipe(){this.logger.warning("Wiping AccountDB TXDB..."),this.logger.warning("I hope you know what you're doing.");var t=this.db.iterator({gte:Buffer.from([0]),lte:Buffer.from([255])}),e=this.db.batch();let i=0;for(;;){var r=await t.next();if(!r)break;try{switch(r.key[0]){case 98:case 99:case 101:case 116:case 111:case 104:case 82:e.del(r.key),i++}}catch(e){throw await t.end(),e}}this.logger.warning("Wiped %d txdb records.",i),await e.write()}async getDepth(){var t=this.db.iterator({gte:u.w(0),lte:u.w(4294967295),reverse:!0,limit:1}),e=await t.next();return e?(await t.end(),u.ww(e.key)+1):1}start(t){return s(!t.current,"WDB: Batch already started."),t.current=this.db.batch(),t.accountCache.start(),t.pathCache.start(),t.current}drop(t){var e=this.batch(t);t.current=null,t.accountCache.drop(),t.pathCache.drop(),e.clear()}clear(t){var e=this.batch(t);t.accountCache.clear(),t.pathCache.clear(),e.clear()}batch(t){return s(t.current,"WDB: Batch does not exist."),t.current}async commit(t){var e=this.batch(t);try{await e.write()}catch(t){throw this.drop(),t}t.current=null,t.accountCache.commit(),t.pathCache.commit()}testFilter(t){return this.filter.test(t,"hex")}addHash(t){return this.filter.add(t,"hex"),this.addFilter(t)}addOutpoint(t,e){t=new y(t,e),this.filter.add(t.toRaw())}dump(){return this.db.dump()}register(t){s(!this.wallets.has(t.wid)),this.wallets.set(t.wid,t)}unregister(t){s(this.wallets.has(t.wid)),this.wallets.delete(t.wid)}async getWalletID(t){var e;return t?"number"==typeof t?t:this.widCache.get(t)||((e=await this.db.get(u.l(t)))?(e=e.readUInt32LE(0,!0),this.widCache.set(t,e),e):null):null}async get(t){if(!(t=await this.getWalletID(t)))return null;var e=await this.readLock.lock(t);try{return await this._get(t)}finally{e()}}async _get(t){var e=this.wallets.get(t);return e||((e=await this.db.get(u.w(t)))?(await(t=a.fromRaw(this,e)).open(),this.register(t),t):null)}async loadBackup(t){if(ft.unsupported)throw new gt(mt.INTERNAL_ERROR,"FS not available.");let e=await this.get("primary");var i;for(i of(await ft.readFile(t,"utf8")).split(/\n+/))if(0!==(i=i.trim()).length&&!/^\s*#/.test(i)){var r=i.split(/\s+/);if(r.length<4)throw new gt(mt.DESERIALIZATION_ERROR,"Malformed wallet Data File.");switch(r[0]){case"W":var n=Buffer.from(r[1],"base64");n=a.fromRaw(e.db,n);if(e.wid!=n.wid)throw new gt(mt.DESERIALIZATION_ERROR,"Malformed wallet Key");await this.replace(n),e=await this.get("primary"),this.logger.info("Import Wallet %s(%s)",e.id,e.wid);break;case"C":n=Buffer.from(r[1],"base64");(c=((h=o.fromRaw(e.db,n)).wallet=e,h.wid=e.wid,h.id=e.id,h.initialized=!0,h.watchOnly=e.watchOnly,h.receive=h.deriveReceive(h.receiveDepth-1),h.change=h.deriveChange(h.changeDepth-1),h.witness&&(h.nested=h.deriveNested(h.nestedDepth-1)),e.master.key.deriveAccount(44,h.accountIndex))).publicKey.toString("hex")!==h.accountKey.publicKey.toString("hex")&&s(c.publicKey.toString("hex")==h.accountKey.publicKey.toString("hex")),await e.saveAccount(h),this.logger.info("Import Account %s(%s)",h.name,h.accountIndex);break;case"A":var c=parseInt(r[5]),h=parseInt(r[7]),u=parseInt(r[9]),l=r[11].trim(),p=await e.deriveKey(c,h,u),d=await e.deriveKey(c,h,u,e.master);p.getAddress("string")!==d.getAddress("string")&&s(p.getAddress("string")==d.getAddress("string")),p.getAddress("string")!==l&&s(p.getAddress("string")==l),this.logger.info("Import Address %s %s %s %s",c,h,u,p.getAddress("string"))}}return e.accountCache.reset(),e}save(t){var e=t.wid,i=t.id,r=this.batch(t);this.widCache.set(i,e),r.put(u.w(e),t.toRaw()),r.put(u.l(i),D(e))}async rename(t,e){var i=await this.writeLock.lock();try{return await this._rename(t,e)}finally{i()}}async _rename(t,e){var i=t.id;if(!n.isName(e))throw new Error("WDB: Bad wallet ID.");if(await this.has(e))throw new Error("WDB: ID not available.");this.start(t).del(u.l(i)),t.id=e,this.save(t),await this.commit(t),this.widCache.remove(i),i=t.pathCache.values();for(const t of i)t.id=e}async replace(t){var e=await this.writeLock.lock();try{return await this._replace(t)}finally{e()}}async _replace(t){var e=this.start(t);e.del(u.l(t.id)),e.del(u.w(t.wid)),this.save(t),await this.commit(t),this.widCache.remove(t.id),this.wallets.delete(t.wid)}renameAccount(t,e){var i=t.wallet;this.batch(i).del(u.i(t.wid,t.name)),t.name=e,this.saveAccount(t)}async auth(t,e){if("string"==typeof e){if(!O.isHex256(e))throw new Error("WDB Authentication: Invalid Token.");e=Buffer.from(e,"hex")}t=k.getHmac(t.toString(),this.keys.hmacSalt);var i=r.createHmac("sha256",t.random);i=Buffer.from(i.update(t.token).digest("hex"),"hex");if(!p(e,i))throw new Error("WDB Authentication: CRC Error.")}async create(t){var e=await this.writeLock.lock();t=t||{};try{return await this._create(t)}finally{e()}}async _create(t){if(await this.has(t.id))throw new Error("WDB: Wallet already exists.");"string"==typeof t.mnemonic&&(t.mnemonic={phrase:t.mnemonic}),t.mnemonic=t.mnemonic||{},!t.mnemonic.language&&this.options.mnemonic&&this.options.mnemonic.language&&(t.mnemonic.language=this.options.mnemonic.language);var e=a.fromOptions(this,t);return e.wid=this.depth++,await e.init(t),this.register(e),this.logger.info("Created wallet %s in AccountDB.",e.id),e}async has(t){return null!=await this.getWalletID(t)}async ensure(t){return await this.get(t.id)||this.create(t)}async getAccount(t,e){return(t=await this.db.get(u.a(t,e)))?o.fromRaw(this,t):null}getAccounts(t){return this.db.values({gte:u.n(t,0),lte:u.n(t,4294967295),parse:t=>t.toString("ascii")})}async getAccountIndex(t,e){return(t=await this.db.get(u.i(t,e)))?t.readUInt32LE(0,!0):-1}async getGuider(t){return t=v.fromString(t,this.network.type).getHash("hex"),(t=await this.db.get(u.g(t)))?v.fromRaw(t).toString():null}async setGuider(t,e,i){var r;i=v.fromString(i,this.network.type).getHash("hex"),await this.db.has(u.g(i))||(t=v.fromString(t,this.network.type),(r=this.db.batch()).put(u.g(i),t.toRaw()),r.put(u.gs(t.getHash("hex"),Buffer.from(e,"ascii").toString("hex"),i),null),await r.write())}async unsetGuider(t,e,i){t=v.fromString(t,this.network.type).getHash("hex"),i=v.fromString(i,this.network.type).getHash("hex");var r=this.db.batch();r.del(u.g(i)),r.del(u.gs(t,Buffer.from(e,"ascii").toString("hex"),i)),await r.write()}async getAccountName(t,e){return(t=await this.db.get(u.n(t,e)))?t.toString("ascii"):null}saveAccount(t){var e=t.wid,i=t.wallet,r=t.accountIndex,s=t.name,n=this.batch(i);n.put(u.a(e,r),t.toRaw()),n.put(u.i(e,s),D(r)),n.put(u.n(e,r),Buffer.from(s,"ascii")),i.accountCache.push(r,t)}hasAccount(t,e){return"number"==typeof t&&"number"==typeof e&&this.db.has(u.a(t,e))}async getPathMap(t){var e=this.pathMapCache.get(t);return e||((e=await this.db.get(u.p(t)))?(e=ut.fromRaw(t,e),this.pathMapCache.set(t,e),e):null)}saveKey(t,e){return this.savePath(t,e.toPath())}async savePath(t,e){var i=t.wid,r=e.hash,s=this.batch(t);await this.addHash(r);let n=await this.getPathMap(r);(n=n||new ut(r)).add(i)&&(this.pathMapCache.set(r,n),t.pathCache.push(r,e),s.put(u.p(r),n.toRaw()),s.put(u.P(i,r),e.toRaw()),s.put(u.r(i,e.account,r),null))}async getPath(t,e){var i=await this.db.get(u.P(t,e));return i?((i=at.fromRaw(i)).wid=t,i.hash=e,i):null}hasPath(t,e){return this.db.has(u.P(t,e))}getHashes(){return this.db.keys({gte:u.p(F.NULL_HASH),lte:u.p(F.HIGH_HASH),parse:u.pp})}getOutpoints(){return this.db.keys({gte:u.o(F.NULL_HASH,0),lte:u.o(F.HIGH_HASH,4294967295),parse:t=>{var[t,e]=u.oo(t);return new y(t,e)}})}getWalletHashes(t){return this.db.keys({gte:u.P(t,F.NULL_HASH),lte:u.P(t,F.HIGH_HASH),parse:u.Pp})}getAccountHashes(t,e){return this.db.keys({gte:u.r(t,e,F.NULL_HASH),lte:u.r(t,e,F.HIGH_HASH),parse:u.rr})}async getWalletPaths(t){var e=[];for(const s of await this.db.range({gte:u.P(t,F.NULL_HASH),lte:u.P(t,F.HIGH_HASH)})){var i=u.Pp(s.key),r=at.fromRaw(s.value);r.hash=i,r.wid=t,e.push(r)}return e}async encryptKeys(t,e){var i,r,n=t.wid,a=await t.getPaths(),o=this.batch(t);for(i of a)i.data&&(s(!i.encrypted),r=Buffer.from(i.hash,"hex").slice(0,16),(i=i.clone()).data=d.encipher(i.data,e,r),i.encrypted=!0,t.pathCache.push(i.hash,i),o.put(u.P(n,i.hash),i.toRaw()))}async decryptKeys(t,e){var i,r,n=t.wid,a=await t.getPaths(),o=this.batch(t);for(i of a)i.data&&(s(i.encrypted),r=Buffer.from(i.hash,"hex").slice(0,16),(i=i.clone()).data=d.decipher(i.data,e,r),i.encrypted=!1,t.pathCache.push(i.hash,i),o.put(u.P(n,i.hash),i.toRaw()))}async resend(){var t,e={};for(const t of await this.db.keys({gte:u.w(0),lte:u.w(4294967295)})){var i,r=u.ww(t);r&&(i=await this.resendPending(r))&&Array.isArray(i)&&(e[r]=i)}for(t of Object.keys(e)){var s=await this.get(parseInt(t));if(s)for(const i of e[t]){try{await this.send(i)}catch(t){this.logger.warning("wdb resend:",t.message);try{await s.abandon(i.hash("hex"))}catch(t){this.logger.warning("wdb abandon:",t.message)}}await dt.timeout(50)}}}async resendPending(t){var e=await this.get(t),i=await this.db.keys({gte:h.txdb.prefix(t,h.txdb.p(F.NULL_HASH)),lte:h.txdb.prefix(t,h.txdb.p(F.HIGH_HASH))});if(0!==i.length){this.logger.info("Rebroadcasting %d transactions for %d.",i.length,t);var r=[];for(const o of i){var s=h.txdb.pp(o),n=h.txdb.prefix(t,h.txdb.t(s));if((n=await this.db.get(n))&&!(n=lt.fromRaw(n)).tx.isCoinbase())try{var a=await x.FactoryOfContract({tx:n.tx,env:this});await a.isBlockFinal()==E.Expired?e&&(await this.removeTX(n.tx),await e.remove(s),await a.erase()):"notify"!=a.oper&&r.push(n.tx)}catch(t){this.logger.error("TX(%s) Smart Contract Error: %s",n.tx.txid(),t.message)}}return await P(r,this)}}getWallets(){return this.db.keys({gte:u.l("\0"),lte:u.l("ÿ"),parse:u.ll})}async getWalletsByTX(t){var e=new Set;if(!t.isCoinbase())for(const r of t.inputs){var i=r.prevout;if(this.testFilter(i.toRaw())&&(i=await this.getOutpointMap(i.hash,i.index)))for(const t of i.wids)e.add(t)}for(const i of t.getOutputHashes("hex"))if(this.testFilter(i)){var r=await this.getPathMap(i);if(r)for(const t of r.wids)e.add(t)}return 0===e.size?null:e}async getState(){var t=await this.db.get(u.R);return t?ot.fromRaw(t):null}async init(t){var e=this.options.startHeight;let i;if(this.client){if(null!=e){if(!(i=await this.client.getEntry(e)))throw new Error("WDB: Could not find start block.")}else i=await this.client.getTip();i=ht.fromEntry(i)}else i=ht.fromEntry(this.network.genesis);this.logger.info("Initializing AccountDB chain state (height %d).",i.height),(e=await this.getState())?this.state=e:await this.resetState(i,!1),await this.ensure({id:"primary",witness:!0,mnemonic:this.options.mnemonic}),t&&t.backup&&await this.loadBackup(t.backup)}async resetState(t,e){for(var i=this.state.clone(),r=(i.startHeight=t.height,i.startHash=t.hash,i.height=t.height,i.marked=e,this.db.batch()),s=this.db.iterator({gte:u.h(t.height),lte:u.h(4294967295),values:!1});;){var n=await s.next();if(!n)break;try{r.del(n.key)}catch(t){throw await s.end(),t}}r.put(u.h(t.height),t.toHash()),r.put(u.R,i.toRaw()),await r.write(),this.state=i}async syncState(t){var e=this.state.clone(),i=this.db.batch();if(t.height<e.height){let s=e.height;var r=s-t.height;for(let t=0;t<r;t++)i.del(u.h(s--))}else t.height>e.height&&s(t.height===e.height+1,`Bad chain sync tip ${t.height} while state `+e.height);e.height=t.height,i.put(u.h(t.height),t.toHash()),i.put(u.R,e.toRaw()),await i.write(),this.state=e,Y("block/tips",e)}get curHeight(){return this.state.height}get tidCreator(){return h.txdb.tx}get finder(){return this.getTXFromDb.bind(this)}rpcExecute(){return this.rpc.execute.apply(this.rpc,arguments)}async getBlockMap(t){var e=await this.db.get(u.b(t));return e?ct.fromRaw(t,e):null}writeBlockMap(t,e,i){this.batch(t).put(u.b(e),i.toRaw())}unwriteBlockMap(t,e){this.batch(t).del(u.b(e))}async getOutpointMap(t,e){var i=await this.db.get(u.o(t,e));return i?nt.fromRaw(t,e,i):null}writeOutpointMap(t,e,i,r){t=this.batch(t),this.addOutpoint(e,i),t.put(u.o(e,i),r.toRaw())}unwriteOutpointMap(t,e,i){this.batch(t).del(u.o(e,i))}async writeBalanceLog(t,e){var i=u.log(t.wid,e.aidx,e.height,e.hash),r=(e=Buffer.from(JSON.stringify(e)),await this.writeLock.lock());try{this.start(t).put(i,e),await this.commit(t)}finally{r()}}async queryBalanceLog(t,e,i=0){return this.db.values({gte:u.log(t,e,i,F.NULL_HASH),lte:u.log(t,e,this.curHeight,F.HIGH_HASH),parse:t=>JSON.parse(t.toString())})}async getBlock(t){var e,i=await this.db.get(u.h(t));return i?((e=new ht).hash=i.toString("hex"),e.height=t,e):null}async getTip(){var t=await this.getBlock(this.curHeight);if(t)return t;throw new Error("WDB: Tip not found!")}async rollback(t,e=!0){if(t>this.curHeight)throw new Error("WDB: Cannot rollback to the future.");if(t===this.curHeight)return this.logger.debug("Rolled back to same height (%d).",t),!0;this.logger.info("Rolling back %d AccountDB blocks to height %d.",this.curHeight-t,t);var i=await this.getBlock(t);let r=!1;return i?(await this.revert(i.height),await this.syncState(i),e):(i=new ht,t>=this.state.startHeight?(i.height=this.state.startHeight,i.hash=this.state.startHash,r=this.state.marked,this.logger.warning("Rolling back AccountDB to start block (%d).",i.height)):(i.height=0,i.hash=this.network.genesis.hash,r=!1,this.logger.warning("Rolling back AccountDB to genesis block.")),await this.revert(i.height),await this.resetState(i,r),!1)}async revert(t){var e=this.db.iterator({gte:u.b(t+1),lte:u.b(4294967295),reverse:!0,values:!0});let i=0;for(;;){var r=await e.next();if(!r)break;try{var s=u.bb(r.key),n=ct.fromRaw(s,r.value).toArray();i+=n.length;for(let t=n.length-1;0<=t;t--)await this._unconfirm(n[t])}catch(t){throw await e.end(),t}}this.logger.info("Rolled back %d AccountDB transactions.",i)}async addBlock(t,e){var i=await this.txLock.lock();try{return await this._addBlock(t,e)}finally{i()}}async _addBlock(t,e){var i=ht.fromEntry(t);let r=0;if(i.height<this.curHeight)this.logger.warning("AccountDB is connecting low blocks (%d).",i.height);else{if(i.height===this.curHeight)this.logger.warning("Already saw AccountDB block (%d).",i.height);else if(i.height!==this.curHeight+1)throw new Error(`WDB(addBlock): Bad disconnection (height mismatch, tip ${i.height} while state ${this.curHeight})`);if(await this.syncState(i),!(this.options.checkpoints&&i.height<=this.network.lastCheckpoint)){for(const t of e)await this._insert(t,i)&&r++;0<r&&this.logger.info("Connected AccountDB block %s (tx=%d).",O.revHex(i.hash),r)}}return r}async removeBlock(t,e){var i=await this.txLock.lock();try{return await this._removeBlock(t,e)}finally{i()}}async _removeBlock(t,e){if((t=ht.fromEntry(t)).height>this.curHeight)return this.logger.warning("AccountDB is disconnecting high blocks (%d).",t.height),0;if(t.height!==this.curHeight)throw new Error(`WDB(removeBlock): Bad disconnection (height mismatch, tip ${t.height} / ${O.revHex(t.hash)} while state ${this.curHeight})`);var i=await this.getBlock(t.height-1);if(!i)throw new Error(`WDB(removeBlock): Bad disconnection (no previous block of ${t.height} / ${O.revHex(t.hash)}).`);var r=await this.getBlockMap(t.height);if(r){for(let t=e.length-1;0<=t;t--){var s=e[t];await this._unconfirm(s,r)}this.logger.warning("Disconnected wallet block %s (tx=%d).",O.revHex(t.hash),r.txs.size)}return await this.syncState(i),r?r.txs.size:0}async rescanBlock(t,e){if(this.rescanning){var i=await this.scanLock.lock();try{await this._addBlock(t,e)}catch(t){throw this.emit("error",t),t}finally{i()}}else this.logger.warning("Unsolicited rescan block: %s.",t.height)}async addTX(t,e,i){var r=await this.txLock.lock();try{return await this._insert(t,e,i)}finally{r()}}listNotify(t){return this.NotifyList.deletes([["h","<",this.curHeight-12]]),this.NotifyList.query(t)}listContact(t,e,i){return this.$contacts.query(t,e,i)}async setCp(t){await this.batchPut(h.txdb.cp(t.cid),t.toRaw())}async delCp(t){await this.batchDel(h.txdb.cp(t))}async delVp(t){var e=this.db.batch();e.del(h.txdb.VP(t.pid)),await e.write()}async setVp(t,e){var i=this.db.batch();i.put(h.txdb.VP(t.pid),t.toRaw()),await i.write()}async getVp(t){return(t=await this.db.get(h.txdb.VP(t)))?Z.fromRaw(t):null}async getVpByAddress(t){return{list:[],count:0}}async getVpByOid(t){return{list:[],count:0}}async loadVpList(){return this.db.values({gte:h.txdb.VP(F.ZERO_CID,"hex"),lte:h.txdb.VP(F.MAX_CID,"hex"),parse:t=>Z.fromRaw(t)})}async saveContact(t){var e=this.db.batch();e.put(h.txdb.CT(t.getAddress()),t.toRaw()),await e.write()}async loadContact(t){var e;for(e of await this.db.values({gte:h.txdb.CT(F.ZERO_HASH160_HEX),lte:h.txdb.CT(F.MAX_HASH160_HEX),parse:t=>A.fromRaw(t,this)}))e.sender&&(e.sender.wallet=await this.get(e.sender.wid)),this.$contacts.set(e.address,e)}async delHtlc(t){var e;(t=new z(t)).id&&(this.htlcList.delete(t.id),this.htlcList.delAccount(t),(e=this.db.batch()).del(h.txdb.VH(t.shash,t.sidx)),await e.write())}async setSuggest(t){t=new z(t);var e,[e,i]=(this.htlcList.set(t.id,t),await this.getAccountByAddress(t.aa)),[e,i]=(e&&this.htlcList.setAccount(t,e,i),await this.getAccountByAddress(t.ba));(e=(e&&this.htlcList.setAccount(t,e,i),this.db.batch())).put(h.txdb.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async setAssent(t){t=new z(t);var e,[e,i]=(this.htlcList.set(t.id,t),await this.getAccountByAddress(t.ab)),[e,i]=(e&&this.htlcList.setAccount(t,e,i),await this.getAccountByAddress(t.bb));(e=(e&&this.htlcList.setAccount(t,e,i),this.db.batch())).put(h.txdb.VH(t.shash,t.sidx),t.toRaw()),await e.write()}async loadHtlcList(){return this.db.values({gte:h.txdb.VH(F.ZERO_CID,0),lte:h.txdb.VH(F.MAX_CID,4294967295),parse:t=>z.fromRaw(t)})}async delComment(t){var e;(t=new q(t)).id&&(this.commentList.delete(t.id),this.commentList.delAccount(t),(e=this.db.batch()).del(h.txdb.VC(t.shash,t.sidx)),await e.write())}async setComment(t){t=new q(t);var e,[e,i]=(this.commentList.set(t.id,t),await this.getAccountByAddress(t.bob));(e=(e&&(this.commentList.setAccount(t,e,i),this.emit("comm.comment",t)),this.db.batch())).put(h.txdb.VC(t.shash,t.sidx),t.toRaw()),await e.write()}async loadCommentList(){return this.db.values({gte:h.txdb.VC(F.ZERO_CID,0),lte:h.txdb.VC(F.MAX_CID,4294967295),parse:t=>q.fromRaw(t)})}async setStockRecord(t){var e=this.db.batch();switch(e.put(t.itemNo,t.toRaw()),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(i.stock.sum=t.sum,i.stock.price=t.price,i.stock.period=this.curHeight+10*m.BLOCK_DAY,i.seq=t.seq,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Auction:{let s=this.accountList.getStockAccount(t.cid,t.addr);if(s?(i=s.sum+t.sum,s.price=(t.sum*t.price+s.sum*s.price)/i|0,s.sum=i,s.seq=t.seq):((s=new tt(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(s)),e.put(s.getItemNo(),s.toRaw()),!(i=this.accountList.getStockAccount(t.cid,t.to)))break;var r=i.sum-t.sum;i.sum=r,i.stock.sum-=t.sum,e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Purchase:{let i=this.accountList.getStockAccount(t.cid,t.addr);i?(r=i.sum+t.sum,i.price=(t.sum*t.price+i.sum*i.price)/r,i.sum=r,i.seq=t.seq):((i=new tt(t.cid,t.addr,t.sum,t.price,0)).seq=t.seq,this.accountList.setStockAccount(i)),e.put(i.getItemNo(),i.toRaw());break}case G.RecordType.Send:if(i=this.accountList.getStockAccount(t.cid,t.addr)){i.sum-=t.sum,i.seq=t.seq;let s=this.accountList.getStockAccount(t.cid,t.to);s||(s=new tt(t.cid,t.to,0,0,0),this.accountList.setStockAccount(s)),r=s.sum+t.sum,s.price=(t.sum*i.price+s.sum*s.price)/r,s.sum=r,e.put(i.getItemNo(),i.toRaw()),e.put(s.getItemNo(),s.toRaw())}break;case G.RecordType.Bonus:case G.RecordType.Ads:}await e.write()}async unsetStockRecord(t){var e=this.db.batch();switch(e.del(t.itemNo),t.type){case G.RecordType.Offer:break;case G.RecordType.Bid:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.stock.sum=0,s.stock.price=0,s.stock.period=0,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Auction:(s=this.accountList.getStockAccount(t.cid,t.addr))&&(i=s.sum-t.sum,s.price=(s.sum*s.price-t.sum*t.price)/i|0,s.sum=i,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),s=this.accountList.getStockAccount(t.cid,t.to))&&(i=s.sum+t.sum,s.sum=i,s.stock.sum+=t.sum,e.put(s.getItemNo(),s.toRaw()));break;case G.RecordType.Purchase:var i=this.accountList.getStockAccount(t.cid,t.addr);i&&(s=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*t.price)/s,i.sum=s,i.seq=t.seq-1,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Send:var r,s;(s=this.accountList.getStockAccount(t.cid,t.addr))&&(s.sum+=t.sum,s.seq=t.seq-1,e.put(s.getItemNo(),s.toRaw()),i=this.accountList.getStockAccount(t.cid,t.to))&&(r=i.sum-t.sum,i.price=(i.sum*i.price-t.sum*s.price)/r|0,i.sum=r,e.put(i.getItemNo(),i.toRaw()));break;case G.RecordType.Bonus:}await e.write()}async getStockRecordById(t){return(t=await this.db.get(t))?G.fromRaw(t):null}async verifyClsTx(t,e){if(!this.spv&&1!=(e=await(await x.FactoryOfContract({env:this,block:e,tx:t})).verify()))throw new g(t,S(e),"bad-contract-verify",100);return!0}async getStockRecord(t,e,i){let r=6,s=F.ZERO_CID_BUF,n=F.MAX_CID_BUF,a=0;return t&&(r=t,e)&&(s=e,n=e,a=i||0),t=new C,(await this.db.values({gte:G.itemNo(r,s,a,F.NULL_HASH,0),lte:G.itemNo(r,n,4294967295,F.HIGH_HASH,4294967295),parse:G.fromRaw})).reduce((t,e)=>(t.set(e.itemNo,e),t),t),t}async getStockRecordByCid(t,e){var i,r=new C;for(i of Object.keys(G.RecordType)){var s=await this.getStockRecord(G.RecordType[i],t,e);r.merge(s)}return r}async getStockAccountList(t){var e;return t?(e=tt.SN(t,F.NULL_HASH),t=tt.SN(t,F.HIGH_HASH),this.db.values({gte:e,lte:t,parse:tt.fromRaw})):this.db.values({gte:tt.SN(F.ZERO_CID_BUF,F.NULL_HASH),lte:tt.SN(F.MAX_CID_BUF,F.HIGH_HASH),parse:tt.fromRaw})}async delEr(t){var e=this.db.batch();e.del(h.txdb.ER(t.erid)),e.del(h.txdb.ERR(t.witness,t.erid,t.txid)),await e.write()}async setEr(t,e){e&&t.source&&(i=v.fromWitnessPubkeyhash(l.hash160(Buffer.from(t.source.pubkey,"hex")),this.network),[i,e]=await this.getAccountByAddress(i,e),t.wid=i,t.account=e);var i=this.db.batch();e=h.txdb.ERR(t.witness,t.erid,t.txid);i.put(e,t.toRaw()),i.put(h.txdb.ER(t.erid),e),await i.write()}async getEr(t){return(t=(t=await this.db.get(h.txdb.ER(t)))&&await this.db.get(t))?it.fromRaw(t):null}async byPubkey(t,e,i=!1){var r,s=new C;t=await this.db.values({gte:h.txdb.ERR(t,F.NULL_HASH,F.NULL_HASH),lte:h.txdb.ERR(t,F.HIGH_HASH,F.HIGH_HASH),parse:t=>it.fromRaw(t)});let n=[],a=new Map;if(i){for(var o of t)(!a.get(o.source.cluster)||o.startHeight>a.get(o.source.cluster).startHeight)&&a.set(o.source.cluster,await this.caVerifyObj(o));n=a.values()}else n=t;for(r of n)s.set(r.erid,r);return s.query(e)}async caVerifyObj(t){var e={verify:!1};if(!t||t.validHeight<=this.curHeight)return e;var i=await this.erAbList.getErAb(t.erid);return i&&i.abolishHeight<this.curHeight?e:(i=pt.fromPublic(Buffer.from(t.witness,"hex"),this.network.type),t.verify(i)?(t.verify=!0,0<(i=this.cpList.query([["pubKey",t.witness]])).list.length&&(t.cpid=i.list[0].cid),t):e)}async delErAbolish(t){var e=this.db.batch();e.del(h.txdb.ERA(t.erid)),await e.write()}async setErAbolish(t){var e=this.db.batch();e.put(h.txdb.ERA(t.erid),t.toRaw()),await e.write()}async getErAbolish(t){return(t=await this.db.get(h.txdb.ERA(t)))?X.fromRaw(t):null}loadErAbolishList(){return this.db.values({gte:h.txdb.ERA(F.ZERO_CID),lte:h.txdb.ERA(F.MAX_CID),parse:t=>X.fromRaw(t)})}async delAudit(t){var e=this.db.batch();e.del(h.txdb.AU(t.erid)),await e.write()}async setAudit(t){var e=this.db.batch();e.put(h.txdb.AU(t.erid),t.toRaw()),await e.write()}async getAudit(t){return(t=await this.db.get(h.txdb.AU(t)))?st.fromRaw(t):null}async loadAuditList(){return this.db.values({gte:h.txdb.AU(F.NULL_HASH),lte:h.txdb.AU(F.HIGH_HASH),parse:t=>st.fromRaw(t)})}async batchPut(t,e){var i=this.db.batch();i.put(t,e),await i.write()}async batchDel(t){var e=this.db.batch();e.del(t),await e.write()}async _insert(t,e,i){s(!t.mutable,"WDB: Cannot add mutable TX.");let r=await this.getWalletsByTX(t);if(r){this.logger.info("Incoming transaction for %d wallets in AccountDB (%s).",r.size,t.txid()),!e||this.state.marked||(this.logger.info("Marking AccountDB start block at %s (%d).",O.revHex(e.hash),e.height),await this.resetState(e,!0));let a=!1;for(const o of r){var n=await this.get(o);s(n),await n.add(t,e,i)&&(this.logger.info("Added transaction to wallet in AccountDB: %s (%d).",n.id,o),a=!0)}a||(r=null)}try{var a=await x.FactoryOfContract({env:this,block:e,tx:t});e?await a.confirm():await a.insert()}catch(a){e?this.logger.error("TX(%s) Smart Contract Confirm Error: %s",t.txid(),a.message):this.logger.error("TX(%s) Smart Contract Insert Error: %s",t.txid(),a.message)}return r}async _unconfirm(t,e){if(e)try{await(await x.FactoryOfContract({env:this,block:e,tx:t})).unconfirm()}catch(e){this.logger.error("TX(%s) Smart Contract Unconfirm Error: %s",t.txid(),e.message)}let i,r=null;if(i=t.wids?(r=t.wids,t.hash):(r=await this.getWalletsByTX(t),t.hash("hex")),!r)return null;for(const t of r){var n=await this.get(t);s(n),await n.unconfirm(i)}for(const t of r){var a=await this.get(t);s(a),await a.abandon(i)}}async resetChain(t){var e=await this.txLock.lock();try{return await this._resetChain(t)}finally{e()}}async _resetChain(t){if(t.height>this.curHeight)throw new Error(`WDB: Bad reset height ${t.height} while curHeight `+this.curHeight);var e;for(e of(await this.rollback(t.height)||await this.scan(),await this.getWallets())){var i=await this.get(e);for(const e of await i.getPending())try{await i.abandon(e.hash)}catch(t){}await i.resetBalance()}}async saveMSTrans(t){var e=await this.writeLock.lock();try{return await this._saveMSTrans(t)}finally{e()}}async _saveMSTrans(t){var e=this.db.batch();e.put(u.ms(v.getHash(t.addr,"hex"),t.txid),Buffer.from(JSON.stringify(t))),await e.write()}async listMSTrans(t){return t=v.getHash(t,"hex"),this.db.values({gte:u.ms(t,F.NULL_HASH),lte:u.ms(t,F.HIGH_HASH),parse:t=>JSON.parse(t.toString())})}async delMSTrans(t,e){var i=await this.writeLock.lock();try{return await this._delMSTrans(t,e)}finally{i()}}async _delMSTrans(t,e){t=v.getHash(t,"hex");var i=this.db.batch();i.del(u.ms(t,e)),await i.write()}}yt.layout=u,t.exports=yt},function(t,e,i){"use strict";
|
|
912
912
|
/*!
|
|
913
913
|
* txdb.js - persistent transaction pool
|
|
914
914
|
* Copyright (c) 2019-2022, Bookman Software (MIT License).
|