From b0a6bfea47b19451e5e5b78572273804ddff7be3 Mon Sep 17 00:00:00 2001 From: stjet <49297268+stjet@users.noreply.github.com> Date: Thu, 13 Jun 2024 13:48:48 +0000 Subject: [PATCH] much get cryptography in order, hex->uint8 fix, work on wallet, work, rpc --- .gitignore | 1 + banani-browser.js | 6 +- browser-main.ts | 3 +- browser_test/index.html | 7 +- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/classes/RPC.html | 40 +++- docs/classes/RPCWithBackup.html | 44 +++++ docs/classes/RPCWorkProvider.html | 6 + docs/classes/Wallet.html | 17 +- docs/functions/a.html | 1 + docs/functions/get_private_key_from_seed.html | 2 +- .../get_public_key_from_private_key.html | 1 + docs/functions/hex_to_uint8array.html | 2 +- docs/functions/int_to_uint8array.html | 2 +- docs/functions/raw_to_whole.html | 2 +- docs/functions/uint8array_to_hex.html | 2 +- docs/functions/whole_to_raw.html | 2 +- docs/hierarchy.html | 2 +- docs/interfaces/AccountBalanceRPC.html | 4 + docs/interfaces/AccountHistoryBlock.html | 8 + docs/interfaces/AccountHistoryRPC.html | 4 + docs/interfaces/AccountHistoryRawBlock.html | 17 ++ docs/interfaces/AccountHistoryRawRPC.html | 4 + docs/interfaces/AccountInfoRPC.html | 20 ++ docs/interfaces/AccountReceivableRPC.html | 2 + .../AccountReceivableSourceRPC.html | 2 + docs/interfaces/AccountRepresentativeRPC.html | 2 + docs/interfaces/AccountWeightRPC.html | 2 + docs/interfaces/AccountsBalancesRPC.html | 2 + .../AccountsRepresentativesRPC.html | 2 + docs/interfaces/Block.html | 10 + docs/interfaces/BlockCountRPC.html | 4 +- docs/interfaces/BlockInfoRPC.html | 10 + docs/interfaces/BlocksInfoRPC.html | 2 + docs/interfaces/BlocksRPC.html | 2 + docs/interfaces/DelegatorsCountRPC.html | 2 + docs/interfaces/DelegatorsRPC.html | 2 + docs/interfaces/RPCInterface.html | 8 +- docs/interfaces/RepresentativesOnlineRPC.html | 2 + .../RepresentativesOnlineWeightRPC.html | 2 + docs/interfaces/RepresentativesRPC.html | 2 + docs/interfaces/WorkProvider.html | 2 + docs/modules.html | 41 +++- docs/types/Address.html | 1 + docs/types/BananoAddress.html | 1 + docs/types/BlockAllTypes.html | 1 + docs/types/BlockBasicTypes.html | 1 + docs/types/BlockHash.html | 2 + docs/types/BlockLegacyTypes.html | 1 + docs/types/BlockStateChangeTypes.html | 1 + docs/types/BlockSubtype.html | 1 + docs/types/NanoAddress.html | 1 + docs/types/Whole.html | 2 +- main.ts | 1 + package-lock.json | 8 +- package.json | 5 +- rpc.ts | 186 ++++++++++++++++-- rpc_types.ts | 167 +++++++++++++++- util.ts | 19 +- wallet.ts | 36 +++- work.ts | 29 +++ 62 files changed, 707 insertions(+), 58 deletions(-) create mode 100644 docs/classes/RPCWithBackup.html create mode 100644 docs/classes/RPCWorkProvider.html create mode 100644 docs/functions/a.html create mode 100644 docs/functions/get_public_key_from_private_key.html create mode 100644 docs/interfaces/AccountBalanceRPC.html create mode 100644 docs/interfaces/AccountHistoryBlock.html create mode 100644 docs/interfaces/AccountHistoryRPC.html create mode 100644 docs/interfaces/AccountHistoryRawBlock.html create mode 100644 docs/interfaces/AccountHistoryRawRPC.html create mode 100644 docs/interfaces/AccountInfoRPC.html create mode 100644 docs/interfaces/AccountReceivableRPC.html create mode 100644 docs/interfaces/AccountReceivableSourceRPC.html create mode 100644 docs/interfaces/AccountRepresentativeRPC.html create mode 100644 docs/interfaces/AccountWeightRPC.html create mode 100644 docs/interfaces/AccountsBalancesRPC.html create mode 100644 docs/interfaces/AccountsRepresentativesRPC.html create mode 100644 docs/interfaces/Block.html create mode 100644 docs/interfaces/BlockInfoRPC.html create mode 100644 docs/interfaces/BlocksInfoRPC.html create mode 100644 docs/interfaces/BlocksRPC.html create mode 100644 docs/interfaces/DelegatorsCountRPC.html create mode 100644 docs/interfaces/DelegatorsRPC.html create mode 100644 docs/interfaces/RepresentativesOnlineRPC.html create mode 100644 docs/interfaces/RepresentativesOnlineWeightRPC.html create mode 100644 docs/interfaces/RepresentativesRPC.html create mode 100644 docs/interfaces/WorkProvider.html create mode 100644 docs/types/Address.html create mode 100644 docs/types/BananoAddress.html create mode 100644 docs/types/BlockAllTypes.html create mode 100644 docs/types/BlockBasicTypes.html create mode 100644 docs/types/BlockHash.html create mode 100644 docs/types/BlockLegacyTypes.html create mode 100644 docs/types/BlockStateChangeTypes.html create mode 100644 docs/types/BlockSubtype.html create mode 100644 docs/types/NanoAddress.html create mode 100644 work.ts diff --git a/.gitignore b/.gitignore index f28228d..216d34d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules !node_test/index.js !banani-browser.js !docs/*/*.js +example*.txt diff --git a/banani-browser.js b/banani-browser.js index 933f806..be18927 100644 --- a/banani-browser.js +++ b/banani-browser.js @@ -1 +1,5 @@ -(()=>{var TA=Object.create;var d=Object.defineProperty;var vA=Object.getOwnPropertyDescriptor;var XA=Object.getOwnPropertyNames;var qA=Object.getPrototypeOf,jA=Object.prototype.hasOwnProperty;var g=(A,I)=>d(A,"name",{value:I,configurable:!0});var c=(A,I)=>()=>(I||A((I={exports:{}}).exports,I),I.exports),N=(A,I)=>{for(var i in I)d(A,i,{get:I[i],enumerable:!0})},WA=(A,I,i,t)=>{if(I&&typeof I=="object"||typeof I=="function")for(let e of XA(I))!jA.call(A,e)&&e!==i&&d(A,e,{get:()=>I[e],enumerable:!(t=vA(I,e))||t.enumerable});return A};var zA=(A,I,i)=>(i=A!=null?TA(qA(A)):{},WA(I||!A||!A.__esModule?d(i,"default",{value:A,enumerable:!0}):i,A));var _=c((ti,Z)=>{Z.exports=z;var L=class extends Error{static{g(this,"AssertionError")}};L.prototype.name="AssertionError";function z(A,I){if(!A){var i=new L(I);throw Error.captureStackTrace&&Error.captureStackTrace(i,z),i}}g(z,"assert")});var IA=c((ni,AA)=>{function $(A){return A.length}g($,"byteLength");function ZA(A){let I=A.byteLength,i="";for(let t=0;t{var x="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",F=new Uint8Array(256);for(let A=0;A1&&A.charCodeAt(I-1)===61&&I--,I*3>>>2}g(iA,"byteLength");function AI(A){let I=A.byteLength,i="";for(let t=0;t>2]+x[(A[t]&3)<<4|A[t+1]>>4]+x[(A[t+1]&15)<<2|A[t+2]>>6]+x[A[t+2]&63];return I%3===2?i=i.substring(0,i.length-1)+"=":I%3===1&&(i=i.substring(0,i.length-2)+"=="),i}g(AI,"toString");function II(A,I,i=0,t=iA(I)){let e=Math.min(t,A.byteLength-i);for(let n=0,C=0;C>4,A[C++]=(o&15)<<4|Q>>2,A[C++]=(Q&3)<<6|E&63}return e}g(II,"write");tA.exports={byteLength:iA,toString:AI,write:II}});var rA=c((hi,CA)=>{function gA(A){return A.length>>>1}g(gA,"byteLength");function iI(A){let I=A.byteLength;A=new DataView(A.buffer,A.byteOffset,I);let i="",t=0;for(let e=I-I%4;t=48&&A<=57)return A-48;if(A>=65&&A<=70)return A-65+10;if(A>=97&&A<=102)return A-97+10}g(nA,"hexValue")});var oA=c((Ei,hA)=>{function O(A){let I=0;for(let i=0,t=A.length;i=55296&&e<=56319&&i+1=56320&&n<=57343){I+=4,i++;continue}}e<=127?I+=1:e<=2047?I+=2:I+=3}return I}g(O,"byteLength");var k;if(typeof TextDecoder<"u"){let A=new TextDecoder;k=g(function(i){return A.decode(i)},"toString")}else k=g(function(I){let i=I.byteLength,t="",e=0;for(;e0){let o=0;for(;o>Q,Q-=6;Q>=0;)I[h++]=128|o>>Q&63,Q-=6;C+=o>=65536?2:1}return n},"write");hA.exports={byteLength:O,toString:k,write:J}});var BA=c((Bi,QA)=>{function EA(A){return A.length*2}g(EA,"byteLength");function eI(A){let I=A.byteLength,i="";for(let t=0;t>8,Q=h%256;A[i+C*2]=Q,A[i+C*2+1]=o}return e}g(nI,"write");QA.exports={byteLength:EA,toString:eI,write:nI}});var wA=c((T,aA)=>{var gI=IA(),CI=eA(),rI=rA(),hI=oA(),oI=BA(),V=new Uint8Array(Uint16Array.of(255).buffer)[0]===255;function Y(A){switch(A){case"ascii":return gI;case"base64":return CI;case"hex":return rI;case"utf8":case"utf-8":case void 0:return hI;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return oI;default:throw new Error(`Unknown encoding: ${A}`)}}g(Y,"codecFor");function fA(A){return A instanceof Uint8Array}g(fA,"isBuffer");function EI(A){try{return Y(A),!0}catch{return!1}}g(EI,"isEncoding");function QI(A,I,i){let t=new Uint8Array(A);return I!==void 0&&T.fill(t,I,0,t.byteLength,i),t}g(QI,"alloc");function BI(A){return new Uint8Array(A)}g(BI,"allocUnsafe");function fI(A){return new Uint8Array(A)}g(fI,"allocUnsafeSlow");function sI(A,I){return Y(I).byteLength(A)}g(sI,"byteLength");function yI(A,I){if(A===I)return 0;let i=Math.min(A.byteLength,I.byteLength);A=new DataView(A.buffer,A.byteOffset,A.byteLength),I=new DataView(I.buffer,I.byteOffset,I.byteLength);let t=0;for(let e=i-i%4;tn)return 1}return A.byteLength>I.byteLength?1:A.byteLengthe+n.byteLength,0));let i=new Uint8Array(I),t=0;for(let e of A){if(t+e.byteLength>i.byteLength){let n=e.subarray(0,i.byteLength-t);return i.set(n,t),i}i.set(e,t),t+=e.byteLength}return i}g(aI,"concat");function wI(A,I,i=0,t=0,e=A.byteLength){if(e>0&&e=A.byteLength)throw new RangeError("sourceStart is out of range");if(e<0)throw new RangeError("sourceEnd is out of range");i>=I.byteLength&&(i=I.byteLength),e>A.byteLength&&(e=A.byteLength),I.byteLength-i=A.byteLength){if(e)return-1;i=A.byteLength-1}else if(i<0)if(e)i=0;else return-1;if(typeof I=="string")I=R(I,t);else if(typeof I=="number")return I=I&255,e?A.indexOf(I,i):A.lastIndexOf(I,i);if(I.byteLength===0)return-1;if(e){let n=-1;for(let C=i;CA.byteLength&&(i=A.byteLength-I.byteLength);for(let n=i;n>=0;n--){let C=!0;for(let h=0;h=e||t<=i?"":(i<0&&(i=0),t>e&&(t=e),(i!==0||t{var OI=g((A,I)=>g(function(){return I||(0,A[Object.keys(A)[0]])((I={exports:{}}).exports,I),I.exports},"__require"),"__commonJS"),kI=(()=>{for(var A=new Uint8Array(128),I=0;I<64;I++)A[I<26?I+65:I<52?I+71:I<62?I-4:I*4-205]=I;return i=>{for(var t=i.length,e=new Uint8Array((t-(i[t-1]=="=")-(i[t-2]=="="))*3/4|0),n=0,C=0;n>4,e[C++]=o<<4|Q>>2,e[C++]=Q<<6|E}return e}})(),JI=OI({"wasm-binary:./blake2b.wat"(A,I){I.exports=kI("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")}}),RI=JI(),TI=WebAssembly.compile(RI);cA.exports=async A=>(await WebAssembly.instantiate(await TI,A)).exports});var pA=c((Di,D)=>{var y=_(),vI=wA(),l=null,uA=typeof WebAssembly<"u"&&DA()().then(A=>{l=A}),u=64,M=[];D.exports=f;var lA=D.exports.BYTES_MIN=16,UA=D.exports.BYTES_MAX=64,wi=D.exports.BYTES=32,SA=D.exports.KEYBYTES_MIN=16,FA=D.exports.KEYBYTES_MAX=64,ci=D.exports.KEYBYTES=32,KA=D.exports.SALTBYTES=16,xA=D.exports.PERSONALBYTES=16;function f(A,I,i,t,e){if(!(this instanceof f))return new f(A,I,i,t,e);if(!l)throw new Error("WASM not loaded. Wait for Blake2b.ready(cb)");A||(A=32),e!==!0&&(y(A>=lA,"digestLength must be at least "+lA+", was given "+A),y(A<=UA,"digestLength must be at most "+UA+", was given "+A),I!=null&&(y(I instanceof Uint8Array,"key must be Uint8Array or Buffer"),y(I.length>=SA,"key must be at least "+SA+", was given "+I.length),y(I.length<=FA,"key must be at least "+FA+", was given "+I.length)),i!=null&&(y(i instanceof Uint8Array,"salt must be Uint8Array or Buffer"),y(i.length===KA,"salt must be exactly "+KA+", was given "+i.length)),t!=null&&(y(t instanceof Uint8Array,"personal must be Uint8Array or Buffer"),y(t.length===xA,"personal must be exactly "+xA+", was given "+t.length))),M.length||(M.push(u),u+=216),this.digestLength=A,this.finalized=!1,this.pointer=M.pop(),this._memory=new Uint8Array(l.memory.buffer),this._memory.fill(0,0,64),this._memory[0]=this.digestLength,this._memory[1]=I?I.length:0,this._memory[2]=1,this._memory[3]=1,i&&this._memory.set(i,32),t&&this._memory.set(t,48),this.pointer+216>this._memory.length&&this._realloc(this.pointer+216),l.blake2b_init(this.pointer,this.digestLength),I&&(this.update(I),this._memory.fill(0,u,u+I.length),this._memory[this.pointer+200]=128)}g(f,"Blake2b");f.prototype._realloc=function(A){l.memory.grow(Math.max(0,Math.ceil(Math.abs(A-this._memory.length)/65536))),this._memory=new Uint8Array(l.memory.buffer)};f.prototype.update=function(A){return y(this.finalized===!1,"Hash instance finalized"),y(A instanceof Uint8Array,"input must be Uint8Array or Buffer"),u+A.length>this._memory.length&&this._realloc(u+A.length),this._memory.set(A,u),l.blake2b_update(this.pointer,u,u+A.length),this};f.prototype.digest=function(A){if(y(this.finalized===!1,"Hash instance finalized"),this.finalized=!0,M.push(this.pointer),l.blake2b_final(this.pointer),!A||A==="binary")return this._memory.slice(this.pointer+128,this.pointer+128+this.digestLength);if(typeof A=="string")return vI.toString(this._memory,A,this.pointer+128,this.pointer+128+this.digestLength);y(A instanceof Uint8Array&&A.length>=this.digestLength,"input must be Uint8Array or Buffer");for(var I=0;IA(),A):A(new Error("WebAssembly not supported"))};f.prototype.ready=f.ready;f.prototype.getPartialHash=function(){return this._memory.slice(this.pointer,this.pointer+216)};f.prototype.setPartialHash=function(A){this._memory.set(A,this.pointer)};function XI(){}g(XI,"noop")});var _A=c((Si,s)=>{var a=_(),m=pA();function G(A,I,i){var t=A[I]+A[i],e=A[I+1]+A[i+1];t>=4294967296&&e++,A[I]=t,A[I+1]=e}g(G,"ADD64AA");function YA(A,I,i,t){var e=A[I]+i;i<0&&(e+=4294967296);var n=A[I+1]+t;e>=4294967296&&n++,A[I]=e,A[I+1]=n}g(YA,"ADD64AC");function GA(A,I){return A[I]^A[I+1]<<8^A[I+2]<<16^A[I+3]<<24}g(GA,"B2B_GET32");function U(A,I,i,t,e,n){var C=H[e],h=H[e+1],o=H[n],Q=H[n+1];G(r,A,I),YA(r,A,C,h);var E=r[t]^r[A],w=r[t+1]^r[A+1];r[t]=w,r[t+1]=E,G(r,i,t),E=r[I]^r[i],w=r[I+1]^r[i+1],r[I]=E>>>24^w<<8,r[I+1]=w>>>24^E<<8,G(r,A,I),YA(r,A,o,Q),E=r[t]^r[A],w=r[t+1]^r[A+1],r[t]=E>>>16^w<<16,r[t+1]=w>>>16^E<<16,G(r,i,t),E=r[I]^r[i],w=r[I+1]^r[i+1],r[I]=w>>>31^E<<1,r[I+1]=E>>>31^w<<1}g(U,"B2B_G");var PA=new Uint32Array([4089235720,1779033703,2227873595,3144134277,4271175723,1013904242,1595750129,2773480762,2917565137,1359893119,725511199,2600822924,4215389547,528734635,327033209,1541459225]),qI=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3],B=new Uint8Array(qI.map(function(A){return A*2})),r=new Uint32Array(32),H=new Uint32Array(32);function bA(A,I){var i=0;for(i=0;i<16;i++)r[i]=A.h[i],r[i+16]=PA[i];for(r[24]=r[24]^A.t,r[25]=r[25]^A.t/4294967296,I&&(r[28]=~r[28],r[29]=~r[29]),i=0;i<32;i++)H[i]=GA(A.b,4*i);for(i=0;i<12;i++)U(0,8,16,24,B[i*16+0],B[i*16+1]),U(2,10,18,26,B[i*16+2],B[i*16+3]),U(4,12,20,28,B[i*16+4],B[i*16+5]),U(6,14,22,30,B[i*16+6],B[i*16+7]),U(0,10,20,30,B[i*16+8],B[i*16+9]),U(2,12,22,24,B[i*16+10],B[i*16+11]),U(4,14,16,26,B[i*16+12],B[i*16+13]),U(6,8,18,28,B[i*16+14],B[i*16+15]);for(i=0;i<16;i++)A.h[i]=A.h[i]^r[i]^r[i+16]}g(bA,"blake2bCompress");var S=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);function p(A,I,i,t){S.fill(0),this.b=new Uint8Array(128),this.h=new Uint32Array(16),this.t=0,this.c=0,this.outlen=A,S[0]=A,I&&(S[1]=I.length),S[2]=1,S[3]=1,i&&S.set(i,32),t&&S.set(t,48);for(var e=0;e<16;e++)this.h[e]=PA[e]^GA(S,e*4);I&&(NA(this,I),this.c=128)}g(p,"Blake2b");p.prototype.update=function(A){return a(A instanceof Uint8Array,"input must be Uint8Array or Buffer"),NA(this,A),this};p.prototype.digest=function(A){var I=!A||A==="binary"||A==="hex"?new Uint8Array(this.outlen):A;return a(I instanceof Uint8Array,'out must be "binary", "hex", Uint8Array, or Buffer'),a(I.length>=this.outlen,"out must have at least outlen bytes of space"),jI(this,I),A==="hex"?WI(I):I};p.prototype.final=p.prototype.digest;p.ready=function(A){m.ready(function(){A()})};function NA(A,I){for(var i=0;i>2]>>8*(i&3);return I}g(jI,"blake2bFinal");function WI(A){for(var I="",i=0;i=HA,"outlen must be at least "+HA+", was given "+I),a(I<=mA,"outlen must be at most "+mA+", was given "+I),i!=null&&(a(i instanceof Uint8Array,"key must be Uint8Array or Buffer"),a(i.length>=dA,"key must be at least "+dA+", was given "+i.length),a(i.length<=LA,"key must be at most "+LA+", was given "+i.length)),t!=null&&(a(t instanceof Uint8Array,"salt must be Uint8Array or Buffer"),a(t.length===VA,"salt must be exactly "+VA+", was given "+t.length)),e!=null&&(a(e instanceof Uint8Array,"personal must be Uint8Array or Buffer"),a(e.length===MA,"personal must be exactly "+MA+", was given "+e.length))),new ZI(I,i,t,e)},"createHash");s.exports.ready=function(A){m.ready(function(){A()})};s.exports.WASM_SUPPORTED=m.SUPPORTED;s.exports.WASM_LOADED=!1;var HA=s.exports.BYTES_MIN=16,mA=s.exports.BYTES_MAX=64,li=s.exports.BYTES=32,dA=s.exports.KEYBYTES_MIN=16,LA=s.exports.KEYBYTES_MAX=64,Ui=s.exports.KEYBYTES=32,VA=s.exports.SALTBYTES=16,MA=s.exports.PERSONALBYTES=16;m.ready(function(A){A||(s.exports.WASM_LOADED=!0,s.exports=m)})});var b={};N(b,{get_private_key_from_seed:()=>Ii,hex_to_uint8array:()=>kA,int_to_uint8array:()=>JA,raw_to_whole:()=>Ai,uint8array_to_hex:()=>v,whole_to_raw:()=>$I});var OA=zA(_A());var P=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];function v(A){let I="";for(let i=0;i0;n--)e-=i[I-n]*16**(2*(n-1));i[I-t]=Math.floor(e/16**(2*(t-1)))}return i}g(JA,"int_to_uint8array");var RA=29;function $I(A,I=RA){let i;if(A.includes(".")){let t=A.split(".");if(0>I-t[1].length)throw Error(`Too many decimals, cannot exceed ${I}`);i=BigInt(t[0])*BigInt(10)**BigInt(I)+BigInt(t[1])*BigInt(10)**BigInt(I-t[1].length)}else i=BigInt(A)*BigInt(10)**BigInt(I);return i}g($I,"whole_to_raw");function Ai(A,I=RA){let i=A.toString(),t;if(i.length>I)t=i.slice(0,-I)+"."+i.slice(-I);else{let n=I-i.length;t="0."+"0".repeat(n>0?n:0)+i}let e=t.length;for(let n=0;nX});var X=class{static{g(this,"RPC")}constructor(I,i=!1){this.rpc_url=I,this.use_pending=i}async call(I){let i=await fetch(this.rpc_url,{method:"POST",headers:this.headers??{},body:JSON.stringify(I)});if(!i.ok)throw Error(`Request to RPC node failed with status code ${i.status}`);let t=await i.json();if(t.error)throw Error(`RPC node response: ${t.error}`);return t}async get_block_count(){return await this.call({action:"block_count"})}};var W={};N(W,{Wallet:()=>j});var j=class A{constructor(I,i){this.index=0;this.seed=i}static{g(this,"Wallet")}static gen_random_wallet(I){let i=new Uint8Array(32);crypto.getRandomValues(i);let t=v(i);return new A(I,t)}};window.banani={...q,...W,...b};})(); +(()=>{var tn=Object.create;var Ue=Object.defineProperty;var rn=Object.getOwnPropertyDescriptor;var nn=Object.getOwnPropertyNames;var An=Object.getPrototypeOf,on=Object.prototype.hasOwnProperty;var a=(e,r)=>Ue(e,"name",{value:r,configurable:!0}),Gt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var R=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),_e=(e,r)=>{for(var t in r)Ue(e,t,{get:r[t],enumerable:!0})},In=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let c of nn(r))!on.call(e,c)&&c!==t&&Ue(e,c,{get:()=>r[c],enumerable:!(o=rn(r,c))||o.enumerable});return e};var Tt=(e,r,t)=>(t=e!=null?tn(An(e)):{},In(r||!e||!e.__esModule?Ue(t,"default",{value:e,enumerable:!0}):t,e));var nt=R((uA,Nt)=>{Nt.exports=Ot;var Se=class extends Error{static{a(this,"AssertionError")}};Se.prototype.name="AssertionError";function Ot(e,r){if(!e){var t=new Se(r);throw Error.captureStackTrace&&Error.captureStackTrace(t,Ot),t}}a(Ot,"assert")});var Xt=R((yA,jt)=>{function Jt(e){return e.length}a(Jt,"byteLength");function gn(e){let r=e.byteLength,t="";for(let o=0;o{var ne="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",X=new Uint8Array(256);for(let e=0;e1&&e.charCodeAt(r-1)===61&&r--,r*3>>>2}a(qt,"byteLength");function hn(e){let r=e.byteLength,t="";for(let o=0;o>2]+ne[(e[o]&3)<<4|e[o+1]>>4]+ne[(e[o+1]&15)<<2|e[o+2]>>6]+ne[e[o+2]&63];return r%3===2?t=t.substring(0,t.length-1)+"=":r%3===1&&(t=t.substring(0,t.length-2)+"=="),t}a(hn,"toString");function fn(e,r,t=0,o=qt(r)){let c=Math.min(o,e.byteLength-t);for(let u=0,w=0;w>4,e[w++]=(d&15)<<4|D>>2,e[w++]=(D&3)<<6|p&63}return c}a(fn,"write");Wt.exports={byteLength:qt,toString:hn,write:fn}});var tr=R((lA,er)=>{function $t(e){return e.length>>>1}a($t,"byteLength");function cn(e){let r=e.byteLength;e=new DataView(e.buffer,e.byteOffset,r);let t="",o=0;for(let c=r-r%4;o=48&&e<=57)return e-48;if(e>=65&&e<=70)return e-65+10;if(e>=97&&e<=102)return e-97+10}a(Zt,"hexValue")});var nr=R((dA,rr)=>{function At(e){let r=0;for(let t=0,o=e.length;t=55296&&c<=56319&&t+1=56320&&u<=57343){r+=4,t++;continue}}c<=127?r+=1:c<=2047?r+=2:r+=3}return r}a(At,"byteLength");var it;if(typeof TextDecoder<"u"){let e=new TextDecoder;it=a(function(t){return e.decode(t)},"toString")}else it=a(function(r){let t=r.byteLength,o="",c=0;for(;c0){let d=0;for(;d>D,D-=6;D>=0;)r[Q++]=128|d>>D&63,D-=6;w+=d>=65536?2:1}return u},"write");rr.exports={byteLength:At,toString:it,write:ot}});var or=R((pA,ir)=>{function Ar(e){return e.length*2}a(Ar,"byteLength");function sn(e){let r=e.byteLength,t="";for(let o=0;o>8,D=Q%256;e[t+w*2]=D,e[t+w*2+1]=d}return c}a(un,"write");ir.exports={byteLength:Ar,toString:sn,write:un}});var fr=R((gt,hr)=>{var En=Xt(),yn=zt(),wn=tr(),Bn=nr(),xn=or(),me=new Uint8Array(Uint16Array.of(255).buffer)[0]===255;function Ce(e){switch(e){case"ascii":return En;case"base64":return yn;case"hex":return wn;case"utf8":case"utf-8":case void 0:return Bn;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return xn;default:throw new Error(`Unknown encoding: ${e}`)}}a(Ce,"codecFor");function Ir(e){return e instanceof Uint8Array}a(Ir,"isBuffer");function ln(e){try{return Ce(e),!0}catch{return!1}}a(ln,"isEncoding");function Qn(e,r,t){let o=new Uint8Array(e);return r!==void 0&>.fill(o,r,0,o.byteLength,t),o}a(Qn,"alloc");function dn(e){return new Uint8Array(e)}a(dn,"allocUnsafe");function bn(e){return new Uint8Array(e)}a(bn,"allocUnsafeSlow");function pn(e,r){return Ce(r).byteLength(e)}a(pn,"byteLength");function Dn(e,r){if(e===r)return 0;let t=Math.min(e.byteLength,r.byteLength);e=new DataView(e.buffer,e.byteOffset,e.byteLength),r=new DataView(r.buffer,r.byteOffset,r.byteLength);let o=0;for(let c=t-t%4;ou)return 1}return e.byteLength>r.byteLength?1:e.byteLengthc+u.byteLength,0));let t=new Uint8Array(r),o=0;for(let c of e){if(o+c.byteLength>t.byteLength){let u=c.subarray(0,t.byteLength-o);return t.set(u,o),t}t.set(c,o),o+=c.byteLength}return t}a(Un,"concat");function _n(e,r,t=0,o=0,c=e.byteLength){if(c>0&&c=e.byteLength)throw new RangeError("sourceStart is out of range");if(c<0)throw new RangeError("sourceEnd is out of range");t>=r.byteLength&&(t=r.byteLength),c>e.byteLength&&(c=e.byteLength),r.byteLength-t=e.byteLength){if(c)return-1;t=e.byteLength-1}else if(t<0)if(c)t=0;else return-1;if(typeof r=="string")r=It(r,o);else if(typeof r=="number")return r=r&255,c?e.indexOf(r,t):e.lastIndexOf(r,t);if(r.byteLength===0)return-1;if(c){let u=-1;for(let w=t;we.byteLength&&(t=e.byteLength-r.byteLength);for(let u=t;u>=0;u--){let w=!0;for(let Q=0;Q=c||o<=t?"":(t<0&&(t=0),o>c&&(o=c),(t!==0||o{var zn=a((e,r)=>a(function(){return r||(0,e[Object.keys(e)[0]])((r={exports:{}}).exports,r),r.exports},"__require"),"__commonJS"),Zn=(()=>{for(var e=new Uint8Array(128),r=0;r<64;r++)e[r<26?r+65:r<52?r+71:r<62?r-4:r*4-205]=r;return t=>{for(var o=t.length,c=new Uint8Array((o-(t[o-1]=="=")-(t[o-2]=="="))*3/4|0),u=0,w=0;u>4,c[w++]=d<<4|D>>2,c[w++]=D<<6|p}return c}})(),$n=zn({"wasm-binary:./blake2b.wat"(e,r){r.exports=Zn("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")}}),eA=$n(),tA=WebAssembly.compile(eA);cr.exports=async e=>(await WebAssembly.instantiate(await tA,e)).exports});var lr=R((KA,k)=>{var F=nt(),rA=fr(),O=null,sr=typeof WebAssembly<"u"&&Cr()().then(e=>{O=e}),T=64,Fe=[];k.exports=_;var ur=k.exports.BYTES_MIN=16,Er=k.exports.BYTES_MAX=64,mA=k.exports.BYTES=32,yr=k.exports.KEYBYTES_MIN=16,wr=k.exports.KEYBYTES_MAX=64,FA=k.exports.KEYBYTES=32,Br=k.exports.SALTBYTES=16,xr=k.exports.PERSONALBYTES=16;function _(e,r,t,o,c){if(!(this instanceof _))return new _(e,r,t,o,c);if(!O)throw new Error("WASM not loaded. Wait for Blake2b.ready(cb)");e||(e=32),c!==!0&&(F(e>=ur,"digestLength must be at least "+ur+", was given "+e),F(e<=Er,"digestLength must be at most "+Er+", was given "+e),r!=null&&(F(r instanceof Uint8Array,"key must be Uint8Array or Buffer"),F(r.length>=yr,"key must be at least "+yr+", was given "+r.length),F(r.length<=wr,"key must be at least "+wr+", was given "+r.length)),t!=null&&(F(t instanceof Uint8Array,"salt must be Uint8Array or Buffer"),F(t.length===Br,"salt must be exactly "+Br+", was given "+t.length)),o!=null&&(F(o instanceof Uint8Array,"personal must be Uint8Array or Buffer"),F(o.length===xr,"personal must be exactly "+xr+", was given "+o.length))),Fe.length||(Fe.push(T),T+=216),this.digestLength=e,this.finalized=!1,this.pointer=Fe.pop(),this._memory=new Uint8Array(O.memory.buffer),this._memory.fill(0,0,64),this._memory[0]=this.digestLength,this._memory[1]=r?r.length:0,this._memory[2]=1,this._memory[3]=1,t&&this._memory.set(t,32),o&&this._memory.set(o,48),this.pointer+216>this._memory.length&&this._realloc(this.pointer+216),O.blake2b_init(this.pointer,this.digestLength),r&&(this.update(r),this._memory.fill(0,T,T+r.length),this._memory[this.pointer+200]=128)}a(_,"Blake2b");_.prototype._realloc=function(e){O.memory.grow(Math.max(0,Math.ceil(Math.abs(e-this._memory.length)/65536))),this._memory=new Uint8Array(O.memory.buffer)};_.prototype.update=function(e){return F(this.finalized===!1,"Hash instance finalized"),F(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),T+e.length>this._memory.length&&this._realloc(T+e.length),this._memory.set(e,T),O.blake2b_update(this.pointer,T,T+e.length),this};_.prototype.digest=function(e){if(F(this.finalized===!1,"Hash instance finalized"),this.finalized=!0,Fe.push(this.pointer),O.blake2b_final(this.pointer),!e||e==="binary")return this._memory.slice(this.pointer+128,this.pointer+128+this.digestLength);if(typeof e=="string")return rA.toString(this._memory,e,this.pointer+128,this.pointer+128+this.digestLength);F(e instanceof Uint8Array&&e.length>=this.digestLength,"input must be Uint8Array or Buffer");for(var r=0;re(),e):e(new Error("WebAssembly not supported"))};_.prototype.ready=_.ready;_.prototype.getPartialHash=function(){return this._memory.slice(this.pointer,this.pointer+216)};_.prototype.setPartialHash=function(e){this._memory.set(e,this.pointer)};function nA(){}a(nA,"noop")});var at=R((HA,S)=>{var P=nt(),ue=lr();function Ke(e,r,t){var o=e[r]+e[t],c=e[r+1]+e[t+1];o>=4294967296&&c++,e[r]=o,e[r+1]=c}a(Ke,"ADD64AA");function Qr(e,r,t,o){var c=e[r]+t;t<0&&(c+=4294967296);var u=e[r+1]+o;c>=4294967296&&u++,e[r]=c,e[r+1]=u}a(Qr,"ADD64AC");function Sr(e,r){return e[r]^e[r+1]<<8^e[r+2]<<16^e[r+3]<<24}a(Sr,"B2B_GET32");function N(e,r,t,o,c,u){var w=se[c],Q=se[c+1],d=se[u],D=se[u+1];Ke(B,e,r),Qr(B,e,w,Q);var p=B[o]^B[e],K=B[o+1]^B[e+1];B[o]=K,B[o+1]=p,Ke(B,t,o),p=B[r]^B[t],K=B[r+1]^B[t+1],B[r]=p>>>24^K<<8,B[r+1]=K>>>24^p<<8,Ke(B,e,r),Qr(B,e,d,D),p=B[o]^B[e],K=B[o+1]^B[e+1],B[o]=p>>>16^K<<16,B[o+1]=K>>>16^p<<16,Ke(B,t,o),p=B[r]^B[t],K=B[r+1]^B[t+1],B[r]=K>>>31^p<<1,B[r+1]=p>>>31^K<<1}a(N,"B2B_G");var mr=new Uint32Array([4089235720,1779033703,2227873595,3144134277,4271175723,1013904242,1595750129,2773480762,2917565137,1359893119,725511199,2600822924,4215389547,528734635,327033209,1541459225]),AA=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3],U=new Uint8Array(AA.map(function(e){return e*2})),B=new Uint32Array(32),se=new Uint32Array(32);function Fr(e,r){var t=0;for(t=0;t<16;t++)B[t]=e.h[t],B[t+16]=mr[t];for(B[24]=B[24]^e.t,B[25]=B[25]^e.t/4294967296,r&&(B[28]=~B[28],B[29]=~B[29]),t=0;t<32;t++)se[t]=Sr(e.b,4*t);for(t=0;t<12;t++)N(0,8,16,24,U[t*16+0],U[t*16+1]),N(2,10,18,26,U[t*16+2],U[t*16+3]),N(4,12,20,28,U[t*16+4],U[t*16+5]),N(6,14,22,30,U[t*16+6],U[t*16+7]),N(0,10,20,30,U[t*16+8],U[t*16+9]),N(2,12,22,24,U[t*16+10],U[t*16+11]),N(4,14,16,26,U[t*16+12],U[t*16+13]),N(6,8,18,28,U[t*16+14],U[t*16+15]);for(t=0;t<16;t++)e.h[t]=e.h[t]^B[t]^B[t+16]}a(Fr,"blake2bCompress");var J=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);function Ae(e,r,t,o){J.fill(0),this.b=new Uint8Array(128),this.h=new Uint32Array(16),this.t=0,this.c=0,this.outlen=e,J[0]=e,r&&(J[1]=r.length),J[2]=1,J[3]=1,t&&J.set(t,32),o&&J.set(o,48);for(var c=0;c<16;c++)this.h[c]=mr[c]^Sr(J,c*4);r&&(Kr(this,r),this.c=128)}a(Ae,"Blake2b");Ae.prototype.update=function(e){return P(e instanceof Uint8Array,"input must be Uint8Array or Buffer"),Kr(this,e),this};Ae.prototype.digest=function(e){var r=!e||e==="binary"||e==="hex"?new Uint8Array(this.outlen):e;return P(r instanceof Uint8Array,'out must be "binary", "hex", Uint8Array, or Buffer'),P(r.length>=this.outlen,"out must have at least outlen bytes of space"),iA(this,r),e==="hex"?oA(r):r};Ae.prototype.final=Ae.prototype.digest;Ae.ready=function(e){ue.ready(function(){e()})};function Kr(e,r){for(var t=0;t>2]>>8*(t&3);return r}a(iA,"blake2bFinal");function oA(e){for(var r="",t=0;t=dr,"outlen must be at least "+dr+", was given "+r),P(r<=br,"outlen must be at most "+br+", was given "+r),t!=null&&(P(t instanceof Uint8Array,"key must be Uint8Array or Buffer"),P(t.length>=pr,"key must be at least "+pr+", was given "+t.length),P(t.length<=Dr,"key must be at most "+Dr+", was given "+t.length)),o!=null&&(P(o instanceof Uint8Array,"salt must be Uint8Array or Buffer"),P(o.length===Ur,"salt must be exactly "+Ur+", was given "+o.length)),c!=null&&(P(c instanceof Uint8Array,"personal must be Uint8Array or Buffer"),P(c.length===_r,"personal must be exactly "+_r+", was given "+c.length))),new gA(r,t,o,c)},"createHash");S.exports.ready=function(e){ue.ready(function(){e()})};S.exports.WASM_SUPPORTED=ue.SUPPORTED;S.exports.WASM_LOADED=!1;var dr=S.exports.BYTES_MIN=16,br=S.exports.BYTES_MAX=64,PA=S.exports.BYTES=32,pr=S.exports.KEYBYTES_MIN=16,Dr=S.exports.KEYBYTES_MAX=64,YA=S.exports.KEYBYTES=32,Ur=S.exports.SALTBYTES=16,_r=S.exports.PERSONALBYTES=16;ue.ready(function(e){e||(S.exports.WASM_LOADED=!0,S.exports=ue)})});var vr=R((RA,ve)=>{(function(e){"use strict";let r=at();var t=a(function(n,i){this.hi=n|0,this.lo=i|0},"u64"),o=a(function(n){var i,A=new Float64Array(16);if(n)for(i=0;i>>32-i}a(Ee,"L32");function W(n,i){var A=n[i+3]&255;return A=A<<8|n[i+2]&255,A=A<<8|n[i+1]&255,A<<8|n[i+0]&255}a(W,"ld32");function xt(n,i){var A=n[i]<<24|n[i+1]<<16|n[i+2]<<8|n[i+3],I=n[i+4]<<24|n[i+5]<<16|n[i+6]<<8|n[i+7];return new t(A,I)}a(xt,"dl64");function Re(n,i,A){var I;for(I=0;I<4;I++)n[i+I]=A&255,A>>>=8}a(Re,"st32");function lt(n,i,A){n[i]=A.hi>>24&255,n[i+1]=A.hi>>16&255,n[i+2]=A.hi>>8&255,n[i+3]=A.hi&255,n[i+4]=A.lo>>24&255,n[i+5]=A.lo>>16&255,n[i+6]=A.lo>>8&255,n[i+7]=A.lo&255}a(lt,"ts64");function Ve(n,i,A,I,g){var h,s=0;for(h=0;h>>8)-1}a(Ve,"vn");function Qt(n,i,A,I){return Ve(n,i,A,I,16)}a(Qt,"crypto_verify_16");function ke(n,i,A,I){return Ve(n,i,A,I,32)}a(ke,"crypto_verify_32");function dt(n,i,A,I,g){var h=new Uint32Array(16),s=new Uint32Array(16),E=new Uint32Array(16),f=new Uint32Array(4),C,y,l;for(C=0;C<4;C++)s[5*C]=W(I,4*C),s[1+C]=W(A,4*C),s[6+C]=W(i,4*C),s[11+C]=W(A,16+4*C);for(C=0;C<16;C++)E[C]=s[C];for(C=0;C<20;C++){for(y=0;y<4;y++){for(l=0;l<4;l++)f[l]=s[(5*y+4*l)%16];for(f[1]^=Ee(f[0]+f[3]|0,7),f[2]^=Ee(f[1]+f[0]|0,9),f[3]^=Ee(f[2]+f[1]|0,13),f[0]^=Ee(f[3]+f[2]|0,18),l=0;l<4;l++)h[4*y+(y+l)%4]=f[l]}for(l=0;l<16;l++)s[l]=h[l]}if(g){for(C=0;C<16;C++)s[C]=s[C]+E[C]|0;for(C=0;C<4;C++)s[5*C]=s[5*C]-W(I,4*C)|0,s[6+C]=s[6+C]-W(i,4*C)|0;for(C=0;C<4;C++)Re(n,4*C,s[5*C]),Re(n,16+4*C,s[6+C])}else for(C=0;C<16;C++)Re(n,4*C,s[C]+E[C]|0)}a(dt,"core");function bt(n,i,A,I){return dt(n,i,A,I,!1),0}a(bt,"crypto_core_salsa20");function ye(n,i,A,I){return dt(n,i,A,I,!0),0}a(ye,"crypto_core_hsalsa20");var ie=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function Me(n,i,A,I,g,h,s){var E=new Uint8Array(16),f=new Uint8Array(64),C,y;if(!g)return 0;for(y=0;y<16;y++)E[y]=0;for(y=0;y<8;y++)E[y]=h[y];for(;g>=64;){for(bt(f,E,s,ie),y=0;y<64;y++)n[i+y]=(A?A[I+y]:0)^f[y];for(C=1,y=8;y<16;y++)C=C+(E[y]&255)|0,E[y]=C&255,C>>>=8;g-=64,i+=64,A&&(I+=64)}if(g>0)for(bt(f,E,s,ie),y=0;y>>=8}a(Te,"add1305");var Rr=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]);function Oe(n,i,A,I,g,h){var s,E,f,C,y=new Uint32Array(17),l=new Uint32Array(17),b=new Uint32Array(17),L=new Uint32Array(17),re=new Uint32Array(17);for(f=0;f<17;f++)l[f]=b[f]=0;for(f=0;f<16;f++)l[f]=h[f];for(l[3]&=15,l[4]&=252,l[7]&=15,l[8]&=252,l[11]&=15,l[12]&=252,l[15]&=15;g>0;){for(f=0;f<17;f++)L[f]=0;for(f=0;f<16&&f>>=8;for(C=C+b[16]|0,b[16]=C&3,C=5*(C>>>2)|0,f=0;f<16;f++)C=C+b[f]|0,b[f]=C&255,C>>>=8;C=C+b[16]|0,b[16]=C}for(f=0;f<17;f++)re[f]=b[f];for(Te(b,Rr),s=-(b[16]>>>7)|0,f=0;f<17;f++)b[f]^=s&(re[f]^b[f]);for(f=0;f<16;f++)L[f]=h[f+16];for(L[16]=0,Te(b,L),f=0;f<16;f++)n[i+f]=b[f];return 0}a(Oe,"crypto_onetimeauth");function Ut(n,i,A,I,g,h){var s=new Uint8Array(16);return Oe(s,0,A,I,g,h),Qt(n,i,s,0)}a(Ut,"crypto_onetimeauth_verify");function Ne(n,i,A,I,g){var h;if(A<32)return-1;for(Ge(n,0,i,0,A,I,g),Oe(n,16,n,32,A-32,n),h=0;h<16;h++)n[h]=0;return 0}a(Ne,"crypto_secretbox");function Je(n,i,A,I,g){var h,s=new Uint8Array(32);if(A<32||(Dt(s,0,32,I,g),Ut(i,16,i,32,A-32,s)!==0))return-1;for(Ge(n,0,i,0,A,I,g),h=0;h<32;h++)n[h]=0;return 0}a(Je,"crypto_secretbox_open");function M(n,i){var A;for(A=0;A<16;A++)n[A]=i[A]|0}a(M,"set25519");function oe(n){var i,A;for(A=0;A<16;A++)n[A]+=65536,i=Math.floor(n[A]/65536),n[(A+1)*(A<15?1:0)]+=i-1+37*(i-1)*(A===15?1:0),n[A]-=i*65536}a(oe,"car25519");function z(n,i,A){for(var I,g=~(A-1),h=0;h<16;h++)I=g&(n[h]^i[h]),n[h]^=I,i[h]^=I}a(z,"sel25519");function Z(n,i){var A,I,g,h=o(),s=o();for(A=0;A<16;A++)s[A]=i[A];for(oe(s),oe(s),oe(s),I=0;I<2;I++){for(h[0]=s[0]-65517,A=1;A<15;A++)h[A]=s[A]-65535-(h[A-1]>>16&1),h[A-1]&=65535;h[15]=s[15]-32767-(h[14]>>16&1),g=h[15]>>16&1,h[14]&=65535,z(s,h,1-g)}for(A=0;A<16;A++)n[2*A]=s[A]&255,n[2*A+1]=s[A]>>8}a(Z,"pack25519");function _t(n,i){var A=new Uint8Array(32),I=new Uint8Array(32);return Z(A,n),Z(I,i),ke(A,0,I,0)}a(_t,"neq25519");function St(n){var i=new Uint8Array(32);return Z(i,n),i[0]&1}a(St,"par25519");function je(n,i){var A;for(A=0;A<16;A++)n[A]=i[2*A]+(i[2*A+1]<<8);n[15]&=32767}a(je,"unpack25519");function Y(n,i,A){var I;for(I=0;I<16;I++)n[I]=i[I]+A[I]|0}a(Y,"A");function H(n,i,A){var I;for(I=0;I<16;I++)n[I]=i[I]-A[I]|0}a(H,"Z");function x(n,i,A){var I,g,h=new Float64Array(31);for(I=0;I<31;I++)h[I]=0;for(I=0;I<16;I++)for(g=0;g<16;g++)h[I+g]+=i[I]*A[g];for(I=0;I<15;I++)h[I]+=38*h[I+16];for(I=0;I<16;I++)n[I]=h[I];oe(n),oe(n)}a(x,"M");function v(n,i){x(n,i,i)}a(v,"S");function mt(n,i){var A=o(),I;for(I=0;I<16;I++)A[I]=i[I];for(I=253;I>=0;I--)v(A,A),I!==2&&I!==4&&x(A,A,i);for(I=0;I<16;I++)n[I]=A[I]}a(mt,"inv25519");function Ft(n,i){var A=o(),I;for(I=0;I<16;I++)A[I]=i[I];for(I=250;I>=0;I--)v(A,A),I!==1&&x(A,A,i);for(I=0;I<16;I++)n[I]=A[I]}a(Ft,"pow2523");function we(n,i,A){var I=new Uint8Array(32),g=new Float64Array(80),h,s,E=o(),f=o(),C=o(),y=o(),l=o(),b=o();for(s=0;s<31;s++)I[s]=i[s];for(I[31]=i[31]&127|64,I[0]&=248,je(g,A),s=0;s<16;s++)f[s]=g[s],y[s]=E[s]=C[s]=0;for(E[0]=y[0]=1,s=254;s>=0;--s)h=I[s>>>3]>>>(s&7)&1,z(E,f,h),z(C,y,h),Y(l,E,C),H(E,E,C),Y(C,f,y),H(f,f,y),v(y,l),v(b,E),x(E,C,E),x(C,f,l),Y(l,E,C),H(E,E,C),v(f,E),H(C,y,b),x(E,C,D),Y(E,E,y),x(C,C,E),x(E,y,b),x(y,f,g),v(f,l),z(E,f,h),z(C,y,h);for(s=0;s<16;s++)g[s+16]=E[s],g[s+32]=C[s],g[s+48]=f[s],g[s+64]=y[s];var L=g.subarray(32),re=g.subarray(16);return mt(L,L),x(re,re,L),Z(n,re),0}a(we,"crypto_scalarmult");function Be(n,i){return we(n,i,w)}a(Be,"crypto_scalarmult_base");function Kt(n,i){return c(i,32),Be(n,i)}a(Kt,"crypto_box_keypair");function xe(n,i,A){var I=new Uint8Array(32);return we(I,A,i),ye(n,u,I,ie)}a(xe,"crypto_box_beforenm");var vt=Ne,Vr=Je;function kr(n,i,A,I,g,h){var s=new Uint8Array(32);return xe(s,g,h),vt(n,i,A,I,s)}a(kr,"crypto_box");function Mr(n,i,A,I,g,h){var s=new Uint8Array(32);return xe(s,g,h),Vr(n,i,A,I,s)}a(Mr,"crypto_box_open");function Ie(){var n=0,i=0,A=0,I=0,g=65535,h,s,E;for(E=0;E>>16,A+=s&g,I+=s>>>16;return i+=n>>>16,A+=i>>>16,I+=A>>>16,new t(A&g|I<<16,n&g|i<<16)}a(Ie,"add64");function Pt(n,i){return new t(n.hi>>>i,n.lo>>>i|n.hi<<32-i)}a(Pt,"shr64");function le(){var n=0,i=0,A;for(A=0;A>>i|n.lo<>>i|n.hi<>>i|n.hi<>>i|n.lo<=128;){for(f=0;f<16;f++)s[f]=xt(i,8*f+y);for(f=0;f<80;f++){for(C=0;C<8;C++)g[C]=h[C];for(E=Ie(h[7],Nr(h[4]),Gr(h[4],h[5],h[6]),Xr[f],s[f%16]),g[7]=Ie(E,Or(h[0]),Tr(h[0],h[1],h[2])),g[3]=Ie(g[3],E),C=0;C<8;C++)h[(C+1)%8]=g[C];if(f%16===15)for(C=0;C<16;C++)s[C]=Ie(s[C],s[(C+9)%16],Jr(s[(C+1)%16]),jr(s[(C+14)%16]))}for(f=0;f<8;f++)h[f]=Ie(h[f],I[f]),I[f]=h[f];y+=128,A-=128}for(f=0;f<8;f++)lt(n,8*f,I[f]);return A}a(Yt,"crypto_hashblocks");let Ht=a((n,i)=>r(i).update(n).digest(),"crypto_hash_blake2b");var qr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]);function $(n,i,A){var I=new Uint8Array(64),g=new Uint8Array(256),h,s=A;for(h=0;h<64;h++)I[h]=qr[h];for(Yt(I,i,A),A%=128,h=0;h<256;h++)g[h]=0;for(h=0;h=0;--g)I=A[g/8|0]>>(g&7)&1,Lt(n,i,I),Qe(i,n),Qe(n,n),Lt(n,i,I)}a(Xe,"scalarmult");function ge(n,i){var A=[o(),o(),o(),o()];M(A[0],wt),M(A[1],Bt),M(A[2],d),x(A[3],wt,Bt),Xe(n,A,i)}a(ge,"scalarbase");function qe(n,i,A){var I=new Uint8Array(64),g=[o(),o(),o(),o()],h;A||c(i,32);I=Ht(i,64),I[0]&=248,I[31]&=127,I[31]|=64,ge(g,I),de(n,g);return 0}a(qe,"crypto_sign_keypair");var be=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function We(n,i){var A,I,g,h;for(I=63;I>=32;--I){for(A=0,g=I-32,h=I-12;g>4)*be[g],A=i[g]>>8,i[g]&=255;for(g=0;g<32;g++)i[g]-=A*be[g];for(I=0;I<32;I++)i[I+1]+=i[I]>>8,n[I]=i[I]&255}a(We,"modL");function ze(n){var i=new Float64Array(64),A;for(A=0;A<64;A++)i[A]=n[A];for(A=0;A<64;A++)n[A]=0;We(n,i)}a(ze,"reduce");function Rt(n,i,A,I){var g=new Uint8Array(64),h=new Uint8Array(64),s=new Uint8Array(64),E,f,C=new Float64Array(64),y=[o(),o(),o(),o()];$(g,I,32),g[0]&=248,g[31]&=127,g[31]|=64;var l=A+64;for(E=0;E>7&&H(n[0],Q,n[0]),x(n[3],n[0],n[1]),0)}a(Wr,"unpackneg");function Ze(n,i,A,I){var g,h=new Uint8Array(32),s=new Uint8Array(64),E=[o(),o(),o(),o()],f=[o(),o(),o(),o()];if(A<64||Wr(f,I))return-1;for(g=0;g=0};function en(n){let i=new Uint8Array(64),A=[o(),o(),o(),o()],I,g=new Uint8Array(32);return i=Ht(n,64),i[0]&=248,i[31]&=127,i[31]|=64,ge(A,i),de(g,A),g}a(en,"derivePublicFromSecret"),e.sign.keyPair=function(){var n=new Uint8Array(j),i=new Uint8Array(te);return qe(n,i),{publicKey:n,secretKey:i}},e.sign.keyPair.fromSecretKey=function(n){if(m(n),n.length!==te)throw new Error("bad secret key size");var i=new Uint8Array(j);return i=en(n),{publicKey:i,secretKey:new Uint8Array(n)}},e.sign.keyPair.fromSeed=function(n){if(m(n),n.length!==tt)throw new Error("bad seed size");for(var i=new Uint8Array(j),A=new Uint8Array(te),I=0;I<32;I++)A[I]=n[I];return qe(i,A,!0),{publicKey:i,secretKey:A}},e.sign.publicKeyLength=j,e.sign.secretKeyLength=te,e.sign.seedLength=tt,e.sign.signatureLength=G,e.hash=function(n){m(n);var i=new Uint8Array(rt);return $(i,n,n.length),i},e.hash.hashLength=rt,e.verify=function(n,i){return m(n,i),n.length===0||i.length===0||n.length!==i.length?!1:Ve(n,0,i,0,n.length)===0},e.setPRNG=function(n){c=n},function(){var n=typeof self<"u"?self.crypto||self.msCrypto:null;if(n&&n.getRandomValues){var i=65536;e.setPRNG(function(A,I){var g,h=new Uint8Array(I);for(g=0;gcA,get_private_key_from_seed:()=>fA,get_public_key_from_private_key:()=>CA,hex_to_uint8array:()=>ft,int_to_uint8array:()=>Yr,raw_to_whole:()=>hA,uint8array_to_hex:()=>Ye,whole_to_raw:()=>aA});var Pr=Tt(vr()),ht=Tt(at());var Pe=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];function Ye(e){let r="";for(let t=0;t0;u--)c-=t[r-u]*16**(2*(u-1));t[r-o]=Math.floor(c/16**(2*(o-1)))}return t}a(Yr,"int_to_uint8array");var Hr=29;function aA(e,r=Hr){let t;if(e.includes(".")){let o=e.split(".");if(0>r-o[1].length)throw Error(`Too many decimals, cannot exceed ${r}`);t=BigInt(o[0])*BigInt(10)**BigInt(r)+BigInt(o[1])*BigInt(10)**BigInt(r-o[1].length)}else t=BigInt(e)*BigInt(10)**BigInt(r);return t}a(aA,"whole_to_raw");function hA(e,r=Hr){let t=e.toString(),o;if(t.length>r)o=t.slice(0,-r)+"."+t.slice(-r);else{let u=r-t.length;o="0."+"0".repeat(u>0?u:0)+t}let c=o.length;for(let u=0;uLe,RPCWithBackup:()=>ct});var Le=class{static{a(this,"RPC")}constructor(r,t=!1){this.rpc_url=r,this.use_pending=t}async call(r){let t=await fetch(this.rpc_url,{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!t.ok)throw Error(`Request to RPC node failed with status code ${t.status}`);let o=await t.json();if(o.error)throw Error(`RPC node response: ${o.error}`);return o}async get_block_count(){return await this.call({action:"block_count"})}async get_block_info(r){return await this.call({action:"block_info",hash:r,json_block:!0})}async get_blocks(r){return await this.call({action:"blocks",hashes:r,json_block:!0})}async get_blocks_info(r){return await this.call({action:"blocks_info",hashes:r,json_block:!0})}async get_representatives(){return await this.call({action:"representatives"})}async get_representatives_online(r){return await this.call({action:"representatives_online",weight:r?"true":void 0})}async get_account_history(r,t,o,c,u,w,Q){return await this.call({action:"account_history",account:r,count:`${t}`,raw:o?"true":void 0,head:c,offset:u?`${u}`:void 0,reverse:w?"true":void 0,account_filter:Q})}async get_account_info(r,t,o,c,u){return await this.call({action:"account_info",account:r,representative:o?"true":void 0,weight:c?"true":void 0,pending:u?"true":void 0})}async get_account_balance(r){return await this.call({action:"account_balance",account:r})}async get_accounts_balances(r){return await this.call({action:"accounts_balances",accounts:r})}async get_account_representative(r){return await this.call({action:"account_representative",account:r})}async get_accounts_representatives(r){return await this.call({action:"accounts_representatives",account:r})}async get_account_weight(r){return await this.call({action:"account_weight",account:r})}async get_account_receivable(r,t,o,c){return await this.call({action:this.use_pending?"pending":"receivable",account:r,count:t?`${t}`:void 0,threshold:o?`${o}`:void 0})}async get_delegators(r,t,o,c){return await this.call({action:"delegators",account:r,threshold:t?`${t}`:void 0,count:o?`${o}`:void 0,start:c})}async get_delegators_count(r){return await this.call({action:"account_weight",account:r})}},ct=class extends Le{static{a(this,"RPCWithBackup")}constructor(r,t,o=!1){if(r.length<2)throw Error("Must provide at least two RPC URLs");super(r[0],o),this.rpc_urls=r}async call(r){let t=0;for(;;)try{let o=await fetch(this.rpc_urls[t],{method:"POST",headers:this.headers??{"Content-Type":"application/json"},body:JSON.stringify(r),signal:AbortSignal.timeout(this.timeout)});if(!o.ok)throw Error(`Request to RPC node failed with status code ${o.status}`);let c=await o.json();if(c.error)throw Error(`RPC node response: ${c.error}`);return c}catch(o){if(!this.rpc_urls[++t])throw Error(o)}}};var ut={};_e(ut,{Wallet:()=>st});var st=class e{constructor(r,t,o=0,c=!1){this.add_do_work=!1;this.seed=t,this.index=o}static{a(this,"Wallet")}static gen_random_wallet(r){let t=new Uint8Array(32);crypto.getRandomValues(t);let o=Ye(t);return new e(r,o)}get public_key(){return"placeholder"}get address(){return"ban_placeholder"}async send_process(r,t){return(await this.rpc.call({action:"process",json_block:"true",subtype:t,block:r,do_work:!r.work&&this.add_do_work?"true":void 0})).hash}};var yt={};_e(yt,{RPCWorkProvider:()=>Et});var Et=class{constructor(r){this.extra_payload={};this.rpc=r}static{a(this,"RPCWorkProvider")}async request_work(r){return(await this.rpc.call({action:"work_generate",hash:r,...this.extra_payload})).work}};window.banani={...He,...Ct,...ut,...yt};})(); +//!!! BANANO CHANGE: we are replacing the below line with blake2b +//!!! BANANO CHANGE: below line commented out +//!!! BANANO CHANGE: New function. I don't know what's going on, just looking at what bananojs changed +//!!! BANANO CHANGE: we are replacing the below line with other... math stuff. Again, I don't know what's going on, just looking at what bananojs changed diff --git a/browser-main.ts b/browser-main.ts index 81b9ce2..1435826 100644 --- a/browser-main.ts +++ b/browser-main.ts @@ -1,7 +1,8 @@ import * as util from "./util"; import * as rpc from "./rpc"; import * as wallet from "./wallet"; +import * as work from "./work"; //for browsers or whatever -window.banani = { ...rpc, ...wallet, ...util }; +window.banani = { ...util, ...rpc, ...wallet, ...work }; diff --git a/browser_test/index.html b/browser_test/index.html index 9ff7b0e..bbfaace 100644 --- a/browser_test/index.html +++ b/browser_test/index.html @@ -5,6 +5,7 @@ Banani browser test +

@@ -21,8 +22,10 @@ document.getElementById("units").textContent = raw + "\n" + window.banani.raw_to_whole(raw); } let random_wallet = window.banani.Wallet.gen_random_wallet(); - console.log(random_wallet.seed); - console.log(window.banani.get_private_key_from_seed(random_wallet.seed, 0)); + console.log("seed", random_wallet.seed); + let pk = window.banani.get_private_key_from_seed(random_wallet.seed, 0); + console.log("privkey", pk); + console.log("pubkey", window.banani.get_public_key_from_private_key(pk)); diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 33a3967..65997e3 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA4WQsW7CMBCG38UzKiUqlDKWia1iYUDIssKFRDF2ZF+ACPHunKna2Dh1x9x9//f7sr0yhAuyBVt/LdmINQJL+silsBbsmIYvJR4lbepK7dliks1vo9/MRkgJGMe+56nkp9R5vdStwqC3UgimEDk5AiJUZdOZp6L16ic2aPKBlGhTaukZsGvcKW74lHr9eJ9MMy95AOSNqU4CgdfQ8cLoI7cA+95WtCrHSis7/hMOW2ZvXkEJF46at3TVXBgjuiFxBCWExPwvjKCE0IizY8/hP+xd/j6h6bscTRcNuSIoIXwUOoweMOTy95Fmdwenw/L+HwMAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA5XW30/bMBAH8P8lz2iMajDGG+0eQJoYgkl9mKbo6l4bq8aubKelmva/z2mBOPWPcx+b+97nnNSO8vtvZfHVVjfV0+OkOqvWYBv3gwkwBs25u/ipsS/CVVZczqubi9H1vzO/Z8ptMwa2atfR7r5MOUqvHrXa8DnquOQFctYUhEAbEofruc5bxlQr7RgESIaD58GlRb0A5pwgNSRHl1checeNVXo3FoqtcqifK2eJlfapE0jYli72PXoSXrjkfbAAvpcLRZBvkQLsCRnyDcwEtQUGwZPgZ9VqcodF4kVD1hoNSguWb+gRR+GCAVPky8YS8EeoADRvR8kQpp8rYYc3R+phPDckfTrIw7APTPaPP7GkQYKkcpvfD5CQISVTTOUZgviOApfg3gAm+5jCWBlKewTlyvfvbVHJD2Sh4Z77KQWXyTObCp88IH+C8y0nDCscQKDx7wKPS38XHL0W5nM31vSG3a2743+4fNT5+dvXi8uRv6tBglQJY1Akpe4E3Arxq2sNJL9YJI3BcJa2+nKRdgemiTpdoUj44Y4Q26UX5NWLvGe3TXDSgFxiGj0OlcntrCPi4KFGOQ/pPfFQviOmjRLBMvYXqU7ouxatZJYrac5h2HX1xWtYoq3X2n1VWKxXuKsXWr3UBnEeg5JhakA7E5z1LZ6RHJNuyQxr8LW2qm7d2+AatIYoH4QyoMvQYBDKgBq2XXY7/Id7y69nmH5Wl3Z3FLOCUAbcD+xibgExy68HzJ//ag6ZVjUOAAA=" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 84871d7..64988f1 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA6VYQZOiOhD+L8yVckwLCh7fnvb26h12DpZFsZhZqVGwAHd2yvK/bwcZ0y1pxHnHkK+/Dv196QROXlW+195ydfLe8mLjLeeB7xXpXntL75gXTZRWVfqRNGWy1X883ztWO5x5PRZZk5dF/dzDTLbNfofAbJfWtUZmzzv7DnKEmggb7yDvYcaSY8Bd8h5mLPn7ttxpE1ql7w5eOj2WEqEmog11UNLpsZS/dJMcqvx32ujkTX8kr1W5T2qtNw5+ETuYDKbxQoVwzfjCVt98HHT9/HJ3yRDOrwz//fvte9Ho6jXNLFH++aR+pvODpGoKpLiHLDFUYwifLJgQ+94hrXTR3C5RSHisdXLQxSYvfo1LygMeSgzTILomztLdyNfskF9PZSzzc1dmb0lWHjFqVNZ+0GNFhoha5ZqzIzEJB10RKmvWDH3fVMesKSuR54mDxLWONV6Pf4TZHvFYj3+kr6QcW51udFXL/BYwhlu2ar/wd+z5qCt7CR5wotCr/jHR30wwtSKxPwOM71bidurzPQ2vna9Q8lGRbXX2Ro6F4ZQU/z/SZnqP6NFZCfzBpKRlvKCpdN8Tl8d3TjrmsQKP9mKDR+T7XcYnF9r9Ct3yHm9XNN2YjtVLxJRhVwRXig7wFW7sd4PUl/mvMOMTcj11cX8ihtnXfke1PHm/sbXh9QhnYTKbxAh/zfVuYy7Ll7RIVu6NMb11N/dDm8obxAXyPPX81dSHeBKHi/XaX31GtBPtgxamcKRcMMVggCNwwYDBZjiauWAzBgtwFLhgAYOFOApdsJDB5jiau2BzBlvgaOGCLRgswlHkQzCJgpjBIgZDUVaxCxbz8ppqq6kLqG6EaJVQTiTXQpma4w51IbkcypRdzZxIrogKpNdWXBMVSi+uuCrKVF85VVZcGLWQa8S1UZFcIy6PMjIop3kUVwhahZz+Aa4QtAo5LQQ3u6VVKHIiuULQKhQ7kVwhMDqAc0cDlwhCUXXgGoERApzbH7hGsBA9B1wjMEKAu1dcNGo7HbY4PFW/Xzoe9qz2StTeKtpWfPKSrhuiiF2rPXko3fJ0PtvuZ0ZthvbWRoKmJGhqYL6HXhKCr0c8IYgsAUomBNIjj8TOSPLZJTkWXuJoL1Ikek4yT4Uox9luGYC8PFpDYri5hpIVKLJ+1RUvGuARPvYtI5FQqsP1Qk/WEZB1zMW43s8cwkAIhPjucCbVA1I96a0df3kIAyEQ4vlfFxtK3lgS7nZ7kGwKOrNJTr9+9dl44vOok3ogc27/kViKhaWQEt8aAogyIEnr+AloGYjHpU1CPhhIvchqQTIF+3q1sbENjbtaSXbu70pFomEmhd0agjQDqUz8p6ANJV3ImQ7b8CE/6F1eIGa1Pp//At6+kf6RFQAA"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/RPC.html b/docs/classes/RPC.html index 2c37036..1d0abcd 100644 --- a/docs/classes/RPC.html +++ b/docs/classes/RPC.html @@ -1,12 +1,42 @@ RPC | banani

Class RPC

Sends RPC requests to the RPC node, also has wrappers for actions that only read the network (write actions are handled by the Wallet class)

-

Implements

Constructors

Hierarchy (view full)

Implements

Constructors

  • Parameters

    • rpc_url: string
    • Optional use_pending: boolean = false

      If true, uses "pending" instead of "receivable" in RPC action names, for compatibility with older versions of the node

      -

    Returns RPC

Properties

headers: Record<string, string>

HTTP headers to send with any RPC requests

-
rpc_url: string
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    -

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file +

Returns RPC

Properties

headers: Record<string, string>

HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

+
rpc_url: string
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    +

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file diff --git a/docs/classes/RPCWithBackup.html b/docs/classes/RPCWithBackup.html new file mode 100644 index 0000000..529e4e5 --- /dev/null +++ b/docs/classes/RPCWithBackup.html @@ -0,0 +1,44 @@ +RPCWithBackup | banani

Class RPCWithBackup

Sends RPC requests to the RPC node, also has wrappers for actions that only read the network (write actions are handled by the Wallet class)

+

Hierarchy (view full)

  • RPC
    • RPCWithBackup

Constructors

  • Parameters

    • rpc_urls: string[]
    • Optional timeout: number

      Request to RPC timeout, in milliseconds. If RPC request fails or timeouts, tries the next RPC

      +
    • use_pending: boolean = false

    Returns RPCWithBackup

Properties

headers: Record<string, string>

HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" }

+
rpc_url: string
rpc_urls: string[]
timeout: number
use_pending: boolean

Methods

  • The function that sends the RPC POST request

    +

    Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, any>>

\ No newline at end of file diff --git a/docs/classes/RPCWorkProvider.html b/docs/classes/RPCWorkProvider.html new file mode 100644 index 0000000..7f1c52e --- /dev/null +++ b/docs/classes/RPCWorkProvider.html @@ -0,0 +1,6 @@ +RPCWorkProvider | banani

Class RPCWorkProvider

Constructors

Properties

Methods

Constructors

Properties

extra_payload: Record<string, any> = {}

Extra json to send with the rpc payload. Needed for rpc.nano.to's work_generate, unfortunately

+
rpc: RPC

Methods

  • Parameters

    • block_hash: string

    Returns Promise<string>

\ No newline at end of file diff --git a/docs/classes/Wallet.html b/docs/classes/Wallet.html index b000536..a3820aa 100644 --- a/docs/classes/Wallet.html +++ b/docs/classes/Wallet.html @@ -1,9 +1,14 @@ Wallet | banani

Class Wallet

Wallets are created from seeds, so they can have multiple addresses by changing the index. Use Wallets to "write" (send, receive, change rep) to the network

-

Constructors

Properties

Constructors

Properties

Methods

Constructors

  • Parameters

    • rpc: RPCInterface
    • Optional seed: string

      Seed for the wallet from which private keys are derived. 64 character hex string (32 bytes)

      -

    Returns Wallet

Properties

index: number = 0
seed: string

Methods

\ No newline at end of file +try_work +

Accessors

Methods

Constructors

  • Parameters

    • rpc: RPCInterface
    • Optional seed: string

      Seed for the wallet from which private keys are derived. 64 character hex string (32 bytes)

      +
    • index: number = 0
    • try_work: boolean = false

    Returns Wallet

Properties

add_do_work: boolean = false
index: number
seed: string
try_work: boolean

Accessors

  • get public_key(): string
  • Returns string

Methods

\ No newline at end of file diff --git a/docs/functions/a.html b/docs/functions/a.html new file mode 100644 index 0000000..2c003c6 --- /dev/null +++ b/docs/functions/a.html @@ -0,0 +1 @@ +a | banani

Function a

  • Parameters

    • b: any

    Returns any

\ No newline at end of file diff --git a/docs/functions/get_private_key_from_seed.html b/docs/functions/get_private_key_from_seed.html index 4a29ec4..cdb3e80 100644 --- a/docs/functions/get_private_key_from_seed.html +++ b/docs/functions/get_private_key_from_seed.html @@ -1 +1 @@ -get_private_key_from_seed | banani

Function get_private_key_from_seed

  • Parameters

    • seed: string
    • index: number

    Returns string

\ No newline at end of file +get_private_key_from_seed | banani

Function get_private_key_from_seed

  • Parameters

    • seed: string
    • index: number

    Returns string

\ No newline at end of file diff --git a/docs/functions/get_public_key_from_private_key.html b/docs/functions/get_public_key_from_private_key.html new file mode 100644 index 0000000..0f0619a --- /dev/null +++ b/docs/functions/get_public_key_from_private_key.html @@ -0,0 +1 @@ +get_public_key_from_private_key | banani

Function get_public_key_from_private_key

  • Parameters

    • private_key: string

    Returns string

\ No newline at end of file diff --git a/docs/functions/hex_to_uint8array.html b/docs/functions/hex_to_uint8array.html index f6eb18d..aa63580 100644 --- a/docs/functions/hex_to_uint8array.html +++ b/docs/functions/hex_to_uint8array.html @@ -1 +1 @@ -hex_to_uint8array | banani

Function hex_to_uint8array

  • Parameters

    • hex: string

    Returns Uint8Array

\ No newline at end of file +hex_to_uint8array | banani

Function hex_to_uint8array

  • Parameters

    • hex: string

    Returns Uint8Array

\ No newline at end of file diff --git a/docs/functions/int_to_uint8array.html b/docs/functions/int_to_uint8array.html index 7551286..ad57028 100644 --- a/docs/functions/int_to_uint8array.html +++ b/docs/functions/int_to_uint8array.html @@ -1 +1 @@ -int_to_uint8array | banani

Function int_to_uint8array

  • Parameters

    • int: number
    • len: number

    Returns Uint8Array

\ No newline at end of file +int_to_uint8array | banani

Function int_to_uint8array

  • Parameters

    • int: number
    • len: number

    Returns Uint8Array

\ No newline at end of file diff --git a/docs/functions/raw_to_whole.html b/docs/functions/raw_to_whole.html index 9387ba1..8751fb4 100644 --- a/docs/functions/raw_to_whole.html +++ b/docs/functions/raw_to_whole.html @@ -1,2 +1,2 @@ raw_to_whole | banani

Function raw_to_whole

  • Turn raw Bananos (BigInt) into whole Bananos (string)

    -

    Parameters

    • raw: BigInt
    • decimals: number = BANANO_DECIMALS

    Returns Whole

\ No newline at end of file +

Parameters

  • raw: BigInt
  • decimals: number = BANANO_DECIMALS

Returns Whole

\ No newline at end of file diff --git a/docs/functions/uint8array_to_hex.html b/docs/functions/uint8array_to_hex.html index af442d0..24b9996 100644 --- a/docs/functions/uint8array_to_hex.html +++ b/docs/functions/uint8array_to_hex.html @@ -1 +1 @@ -uint8array_to_hex | banani

Function uint8array_to_hex

  • Parameters

    • uint8array: Uint8Array

    Returns string

\ No newline at end of file +uint8array_to_hex | banani

Function uint8array_to_hex

  • Parameters

    • uint8array: Uint8Array

    Returns string

\ No newline at end of file diff --git a/docs/functions/whole_to_raw.html b/docs/functions/whole_to_raw.html index 04272d4..076475e 100644 --- a/docs/functions/whole_to_raw.html +++ b/docs/functions/whole_to_raw.html @@ -1,2 +1,2 @@ whole_to_raw | banani

Function whole_to_raw

  • Turn whole Bananos (string) into raw Bananos (BigInt)

    -

    Parameters

    • whole: `${number}`
    • decimals: number = BANANO_DECIMALS

    Returns BigInt

\ No newline at end of file +

Parameters

  • whole: `${number}`
  • decimals: number = BANANO_DECIMALS

Returns BigInt

\ No newline at end of file diff --git a/docs/hierarchy.html b/docs/hierarchy.html index ca1020e..30b56fc 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -banani

banani

Class Hierarchy

\ No newline at end of file +banani

banani

Class Hierarchy

\ No newline at end of file diff --git a/docs/interfaces/AccountBalanceRPC.html b/docs/interfaces/AccountBalanceRPC.html new file mode 100644 index 0000000..9cbcad7 --- /dev/null +++ b/docs/interfaces/AccountBalanceRPC.html @@ -0,0 +1,4 @@ +AccountBalanceRPC | banani

Interface AccountBalanceRPC

interface AccountBalanceRPC {
    balance: `${number}`;
    pending: `${number}`;
    receivable?: `${number}`;
}

Properties

balance: `${number}`
pending: `${number}`
receivable?: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/AccountHistoryBlock.html b/docs/interfaces/AccountHistoryBlock.html new file mode 100644 index 0000000..aa25868 --- /dev/null +++ b/docs/interfaces/AccountHistoryBlock.html @@ -0,0 +1,8 @@ +AccountHistoryBlock | banani

Interface AccountHistoryBlock

interface AccountHistoryBlock {
    account: Address;
    amount: `${number}`;
    confirmed: boolean;
    hash: string;
    height: `${number}`;
    local_timestamp: `${number}`;
    type: BlockStateChangeTypes;
}

Properties

account: Address
amount: `${number}`
confirmed: boolean
hash: string
height: `${number}`
local_timestamp: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRPC.html b/docs/interfaces/AccountHistoryRPC.html new file mode 100644 index 0000000..206da91 --- /dev/null +++ b/docs/interfaces/AccountHistoryRPC.html @@ -0,0 +1,4 @@ +AccountHistoryRPC | banani

Interface AccountHistoryRPC

interface AccountHistoryRPC {
    account: Address;
    history: AccountHistoryBlock[];
    previous?: string;
}

Properties

Properties

account: Address
previous?: string
\ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRawBlock.html b/docs/interfaces/AccountHistoryRawBlock.html new file mode 100644 index 0000000..3e656a8 --- /dev/null +++ b/docs/interfaces/AccountHistoryRawBlock.html @@ -0,0 +1,17 @@ +AccountHistoryRawBlock | banani

Interface AccountHistoryRawBlock

interface AccountHistoryRawBlock {
    account: Address;
    amount: `${number}`;
    amount_decimal: `${number}`;
    balance: `${number}`;
    balance_decimal: `${number}`;
    confirmed: "false" | "true";
    hash: string;
    height: `${number}`;
    link: string;
    local_timestamp: `${number}`;
    previous: string;
    representative: Address;
    signature: string;
    subtype: BlockSubtype;
    type: BlockAllTypes;
    work: string;
}

Properties

account: Address
amount: `${number}`
amount_decimal: `${number}`
balance: `${number}`
balance_decimal: `${number}`
confirmed: "false" | "true"
hash: string
height: `${number}`
link: string
local_timestamp: `${number}`
previous: string
representative: Address
signature: string
subtype: BlockSubtype
work: string
\ No newline at end of file diff --git a/docs/interfaces/AccountHistoryRawRPC.html b/docs/interfaces/AccountHistoryRawRPC.html new file mode 100644 index 0000000..3f63fb4 --- /dev/null +++ b/docs/interfaces/AccountHistoryRawRPC.html @@ -0,0 +1,4 @@ +AccountHistoryRawRPC | banani

Interface AccountHistoryRawRPC

interface AccountHistoryRawRPC {
    account: Address;
    history: AccountHistoryRawBlock[];
    previous?: string;
}

Properties

Properties

account: Address
previous?: string
\ No newline at end of file diff --git a/docs/interfaces/AccountInfoRPC.html b/docs/interfaces/AccountInfoRPC.html new file mode 100644 index 0000000..e568a54 --- /dev/null +++ b/docs/interfaces/AccountInfoRPC.html @@ -0,0 +1,20 @@ +AccountInfoRPC | banani

Interface AccountInfoRPC

interface AccountInfoRPC {
    account_version: `${number}`;
    balance: `${number}`;
    block_count: `${number}`;
    confirmation_height?: `${number}`;
    confirmation_height_frontier?: string;
    confirmed_balance?: `${number}`;
    confirmed_frontier?: string;
    confirmed_height?: `${number}`;
    confirmed_pending?: `${number}`;
    confirmed_receivable?: `${number}`;
    confirmed_representative?: Address;
    frontier: string;
    modified_timestamp: `${number}`;
    open_block: string;
    pending?: `${number}`;
    receivable?: `${number}`;
    representative?: Address;
    representative_block: string;
    weight?: `${number}`;
}

Properties

account_version: `${number}`
balance: `${number}`
block_count: `${number}`
confirmation_height?: `${number}`
confirmation_height_frontier?: string
confirmed_balance?: `${number}`
confirmed_frontier?: string
confirmed_height?: `${number}`
confirmed_pending?: `${number}`
confirmed_receivable?: `${number}`
confirmed_representative?: Address
frontier: string
modified_timestamp: `${number}`
open_block: string
pending?: `${number}`
receivable?: `${number}`
representative?: Address
representative_block: string
weight?: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/AccountReceivableRPC.html b/docs/interfaces/AccountReceivableRPC.html new file mode 100644 index 0000000..d731d9c --- /dev/null +++ b/docs/interfaces/AccountReceivableRPC.html @@ -0,0 +1,2 @@ +AccountReceivableRPC | banani

Interface AccountReceivableRPC

interface AccountReceivableRPC {
    blocks: Record<string, `${number}`>;
}

Properties

Properties

blocks: Record<string, `${number}`>
\ No newline at end of file diff --git a/docs/interfaces/AccountReceivableSourceRPC.html b/docs/interfaces/AccountReceivableSourceRPC.html new file mode 100644 index 0000000..ec508f4 --- /dev/null +++ b/docs/interfaces/AccountReceivableSourceRPC.html @@ -0,0 +1,2 @@ +AccountReceivableSourceRPC | banani

Interface AccountReceivableSourceRPC

interface AccountReceivableSourceRPC {
    blocks: Record<string, {
        amount: `${number}`;
        source: Address;
    }>;
}

Properties

Properties

blocks: Record<string, {
    amount: `${number}`;
    source: Address;
}>

Type declaration

\ No newline at end of file diff --git a/docs/interfaces/AccountRepresentativeRPC.html b/docs/interfaces/AccountRepresentativeRPC.html new file mode 100644 index 0000000..bbf966f --- /dev/null +++ b/docs/interfaces/AccountRepresentativeRPC.html @@ -0,0 +1,2 @@ +AccountRepresentativeRPC | banani

Interface AccountRepresentativeRPC

interface AccountRepresentativeRPC {
    representative: Address;
}

Properties

Properties

representative: Address
\ No newline at end of file diff --git a/docs/interfaces/AccountWeightRPC.html b/docs/interfaces/AccountWeightRPC.html new file mode 100644 index 0000000..1d49a62 --- /dev/null +++ b/docs/interfaces/AccountWeightRPC.html @@ -0,0 +1,2 @@ +AccountWeightRPC | banani

Interface AccountWeightRPC

interface AccountWeightRPC {
    weight: `${number}`;
}

Properties

Properties

weight: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/AccountsBalancesRPC.html b/docs/interfaces/AccountsBalancesRPC.html new file mode 100644 index 0000000..35486d9 --- /dev/null +++ b/docs/interfaces/AccountsBalancesRPC.html @@ -0,0 +1,2 @@ +AccountsBalancesRPC | banani

Interface AccountsBalancesRPC

interface AccountsBalancesRPC {
    balances: Record<Address, AccountBalanceRPC>;
}

Properties

Properties

balances: Record<Address, AccountBalanceRPC>
\ No newline at end of file diff --git a/docs/interfaces/AccountsRepresentativesRPC.html b/docs/interfaces/AccountsRepresentativesRPC.html new file mode 100644 index 0000000..0649f09 --- /dev/null +++ b/docs/interfaces/AccountsRepresentativesRPC.html @@ -0,0 +1,2 @@ +AccountsRepresentativesRPC | banani

Interface AccountsRepresentativesRPC

interface AccountsRepresentativesRPC {
    representatives: Record<Address, Address>;
}

Properties

Properties

representatives: Record<Address, Address>
\ No newline at end of file diff --git a/docs/interfaces/Block.html b/docs/interfaces/Block.html new file mode 100644 index 0000000..56510e5 --- /dev/null +++ b/docs/interfaces/Block.html @@ -0,0 +1,10 @@ +Block | banani

Interface Block

interface Block {
    account: Address;
    balance: `${number}`;
    link: string;
    link_as_account: Address;
    previous: string;
    representative: Address;
    signature: string;
    type: BlockAllTypes;
    work?: string;
}

Properties

account: Address
balance: `${number}`
link: string
link_as_account: Address
previous: string
representative: Address
signature: string
work?: string
\ No newline at end of file diff --git a/docs/interfaces/BlockCountRPC.html b/docs/interfaces/BlockCountRPC.html index e0c2ee7..efbf232 100644 --- a/docs/interfaces/BlockCountRPC.html +++ b/docs/interfaces/BlockCountRPC.html @@ -1,4 +1,4 @@ -BlockCountRPC | banani

Interface BlockCountRPC

interface BlockCountRPC {
    cemented?: `${number}`;
    count: `${number}`;
    unchecked: `${number}`;
}

Properties

cemented? +BlockCountRPC | banani

Interface BlockCountRPC

interface BlockCountRPC {
    cemented?: `${number}`;
    count: `${number}`;
    unchecked: `${number}`;
}

Properties

cemented?: `${number}`
count: `${number}`
unchecked: `${number}`
\ No newline at end of file +

Properties

cemented?: `${number}`
count: `${number}`
unchecked: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/BlockInfoRPC.html b/docs/interfaces/BlockInfoRPC.html new file mode 100644 index 0000000..c2fd2cc --- /dev/null +++ b/docs/interfaces/BlockInfoRPC.html @@ -0,0 +1,10 @@ +BlockInfoRPC | banani

Interface BlockInfoRPC

interface BlockInfoRPC {
    amount: `${number}`;
    balance: `${number}`;
    block_account: Address;
    confirmed?: "false" | "true";
    contents: Block;
    height: `${number}`;
    subtype?: BlockSubtype;
    successor?: string;
    timestamp: `${number}`;
}

Properties

amount: `${number}`
balance: `${number}`
block_account: Address
confirmed?: "false" | "true"
contents: Block
height: `${number}`
subtype?: BlockSubtype
successor?: string
timestamp: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/BlocksInfoRPC.html b/docs/interfaces/BlocksInfoRPC.html new file mode 100644 index 0000000..a9931c6 --- /dev/null +++ b/docs/interfaces/BlocksInfoRPC.html @@ -0,0 +1,2 @@ +BlocksInfoRPC | banani

Interface BlocksInfoRPC

interface BlocksInfoRPC {
    blocks: Record<string, BlockInfoRPC>;
}

Properties

Properties

blocks: Record<string, BlockInfoRPC>
\ No newline at end of file diff --git a/docs/interfaces/BlocksRPC.html b/docs/interfaces/BlocksRPC.html new file mode 100644 index 0000000..69f6754 --- /dev/null +++ b/docs/interfaces/BlocksRPC.html @@ -0,0 +1,2 @@ +BlocksRPC | banani

Interface BlocksRPC

interface BlocksRPC {
    blocks: Record<string, Block>;
}

Properties

Properties

blocks: Record<string, Block>
\ No newline at end of file diff --git a/docs/interfaces/DelegatorsCountRPC.html b/docs/interfaces/DelegatorsCountRPC.html new file mode 100644 index 0000000..48116a1 --- /dev/null +++ b/docs/interfaces/DelegatorsCountRPC.html @@ -0,0 +1,2 @@ +DelegatorsCountRPC | banani

Interface DelegatorsCountRPC

interface DelegatorsCountRPC {
    count: `${number}`;
}

Properties

Properties

count: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/DelegatorsRPC.html b/docs/interfaces/DelegatorsRPC.html new file mode 100644 index 0000000..9fa919d --- /dev/null +++ b/docs/interfaces/DelegatorsRPC.html @@ -0,0 +1,2 @@ +DelegatorsRPC | banani

Interface DelegatorsRPC

interface DelegatorsRPC {
    delegators: Record<Address, `${number}`>;
}

Properties

Properties

delegators: Record<Address, `${number}`>
\ No newline at end of file diff --git a/docs/interfaces/RPCInterface.html b/docs/interfaces/RPCInterface.html index aa89fdd..a3a5e0b 100644 --- a/docs/interfaces/RPCInterface.html +++ b/docs/interfaces/RPCInterface.html @@ -1,6 +1,8 @@ RPCInterface | banani

Interface RPCInterface

Implement this interface if the built-in RPC class does not fit your needs. The easiest way to do this is by just extending the built-in RPC class

-
interface RPCInterface {
    rpc_url: string;
    use_pending: boolean;
    call(payload): Promise<Record<string, string>>;
    get_block_count(): Promise<BlockCountRPC>;
}

Implemented by

Properties

interface RPCInterface {
    rpc_url: string;
    use_pending: boolean;
    call(payload): Promise<Record<string, string>>;
    get_account_info(account, include_confirmed?, representative?, weight?, pending?): Promise<AccountInfoRPC>;
    get_account_receivable<T>(account, count?, threshold?, source?): Promise<T extends true
        ? AccountReceivableSourceRPC
        : AccountReceivableRPC>;
    get_block_info(block_hash): Promise<BlockInfoRPC>;
}

Implemented by

Properties

rpc_url: string
use_pending: boolean

Methods

  • Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, string>>

\ No newline at end of file +get_account_info +get_account_receivable +get_block_info +

Properties

rpc_url: string
use_pending: boolean

Methods

  • Parameters

    • payload: Record<string, any>

    Returns Promise<Record<string, string>>

  • Parameters

    • account: Address
    • Optional include_confirmed: boolean
    • Optional representative: boolean
    • Optional weight: boolean
    • Optional pending: boolean

    Returns Promise<AccountInfoRPC>

\ No newline at end of file diff --git a/docs/interfaces/RepresentativesOnlineRPC.html b/docs/interfaces/RepresentativesOnlineRPC.html new file mode 100644 index 0000000..9872e5b --- /dev/null +++ b/docs/interfaces/RepresentativesOnlineRPC.html @@ -0,0 +1,2 @@ +RepresentativesOnlineRPC | banani

Interface RepresentativesOnlineRPC

interface RepresentativesOnlineRPC {
    representatives: Address[];
}

Properties

Properties

representatives: Address[]
\ No newline at end of file diff --git a/docs/interfaces/RepresentativesOnlineWeightRPC.html b/docs/interfaces/RepresentativesOnlineWeightRPC.html new file mode 100644 index 0000000..36cb948 --- /dev/null +++ b/docs/interfaces/RepresentativesOnlineWeightRPC.html @@ -0,0 +1,2 @@ +RepresentativesOnlineWeightRPC | banani

Interface RepresentativesOnlineWeightRPC

interface RepresentativesOnlineWeightRPC {
    representatives: Record<Address, {
        weight: `${number}`;
    }>;
}

Properties

Properties

representatives: Record<Address, {
    weight: `${number}`;
}>

Type declaration

  • weight: `${number}`
\ No newline at end of file diff --git a/docs/interfaces/RepresentativesRPC.html b/docs/interfaces/RepresentativesRPC.html new file mode 100644 index 0000000..3295c05 --- /dev/null +++ b/docs/interfaces/RepresentativesRPC.html @@ -0,0 +1,2 @@ +RepresentativesRPC | banani

Interface RepresentativesRPC

interface RepresentativesRPC {
    representatives: Record<Address, `${number}`>;
}

Properties

Properties

representatives: Record<Address, `${number}`>
\ No newline at end of file diff --git a/docs/interfaces/WorkProvider.html b/docs/interfaces/WorkProvider.html new file mode 100644 index 0000000..d0c61f6 --- /dev/null +++ b/docs/interfaces/WorkProvider.html @@ -0,0 +1,2 @@ +WorkProvider | banani

Interface WorkProvider

interface WorkProvider {
    request_work(block_hash): Promise<string>;
}

Methods

Methods

  • Parameters

    • block_hash: string

    Returns Promise<string>

\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index fa13815..6a2b151 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,9 +1,44 @@ banani

banani

Index

Classes

Interfaces

Interfaces

Type Aliases

Functions

Type Aliases

Functions

a +get_private_key_from_seed +get_public_key_from_private_key hex_to_uint8array int_to_uint8array raw_to_whole diff --git a/docs/types/Address.html b/docs/types/Address.html new file mode 100644 index 0000000..8a581f0 --- /dev/null +++ b/docs/types/Address.html @@ -0,0 +1 @@ +Address | banani

Type alias Address

\ No newline at end of file diff --git a/docs/types/BananoAddress.html b/docs/types/BananoAddress.html new file mode 100644 index 0000000..6884587 --- /dev/null +++ b/docs/types/BananoAddress.html @@ -0,0 +1 @@ +BananoAddress | banani

Type alias BananoAddress

BananoAddress: `ban_${string}`
\ No newline at end of file diff --git a/docs/types/BlockAllTypes.html b/docs/types/BlockAllTypes.html new file mode 100644 index 0000000..c401dd1 --- /dev/null +++ b/docs/types/BlockAllTypes.html @@ -0,0 +1 @@ +BlockAllTypes | banani

Type alias BlockAllTypes

BlockAllTypes: BlockLegacyTypes | "state"
\ No newline at end of file diff --git a/docs/types/BlockBasicTypes.html b/docs/types/BlockBasicTypes.html new file mode 100644 index 0000000..7784693 --- /dev/null +++ b/docs/types/BlockBasicTypes.html @@ -0,0 +1 @@ +BlockBasicTypes | banani

Type alias BlockBasicTypes

BlockBasicTypes: BlockStateChangeTypes | "change"
\ No newline at end of file diff --git a/docs/types/BlockHash.html b/docs/types/BlockHash.html new file mode 100644 index 0000000..1b21ae5 --- /dev/null +++ b/docs/types/BlockHash.html @@ -0,0 +1,2 @@ +BlockHash | banani

Type alias BlockHash

BlockHash: string

32 byte block hash represented as 64 char hexadecimal

+
\ No newline at end of file diff --git a/docs/types/BlockLegacyTypes.html b/docs/types/BlockLegacyTypes.html new file mode 100644 index 0000000..4f6ff15 --- /dev/null +++ b/docs/types/BlockLegacyTypes.html @@ -0,0 +1 @@ +BlockLegacyTypes | banani

Type alias BlockLegacyTypes

BlockLegacyTypes: BlockBasicTypes | "open"
\ No newline at end of file diff --git a/docs/types/BlockStateChangeTypes.html b/docs/types/BlockStateChangeTypes.html new file mode 100644 index 0000000..9e6fc81 --- /dev/null +++ b/docs/types/BlockStateChangeTypes.html @@ -0,0 +1 @@ +BlockStateChangeTypes | banani

Type alias BlockStateChangeTypes

BlockStateChangeTypes: "send" | "receive"
\ No newline at end of file diff --git a/docs/types/BlockSubtype.html b/docs/types/BlockSubtype.html new file mode 100644 index 0000000..aaaec4d --- /dev/null +++ b/docs/types/BlockSubtype.html @@ -0,0 +1 @@ +BlockSubtype | banani

Type alias BlockSubtype

BlockSubtype: BlockBasicTypes | "epoch"
\ No newline at end of file diff --git a/docs/types/NanoAddress.html b/docs/types/NanoAddress.html new file mode 100644 index 0000000..c7b0892 --- /dev/null +++ b/docs/types/NanoAddress.html @@ -0,0 +1 @@ +NanoAddress | banani

Type alias NanoAddress

NanoAddress: `nano_${string}`
\ No newline at end of file diff --git a/docs/types/Whole.html b/docs/types/Whole.html index f576dbd..077aede 100644 --- a/docs/types/Whole.html +++ b/docs/types/Whole.html @@ -1 +1 @@ -Whole | banani

Type alias Whole

Whole: `${number}`
\ No newline at end of file +Whole | banani

Type alias Whole

Whole: `${number}`
\ No newline at end of file diff --git a/main.ts b/main.ts index 898deb8..3a6778b 100644 --- a/main.ts +++ b/main.ts @@ -2,4 +2,5 @@ export * from "./util"; export * from "./rpc"; export * from "./rpc_types"; export * from "./wallet"; +export * from "./work"; diff --git a/package-lock.json b/package-lock.json index f4c11bd..d570fa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -395,7 +395,8 @@ "node_modules/b4a": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -407,6 +408,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "license": "ISC", "dependencies": { "blake2b-wasm": "^2.4.0", "nanoassert": "^2.0.0" @@ -416,6 +418,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "license": "MIT", "dependencies": { "b4a": "^1.0.1", "nanoassert": "^2.0.0" @@ -510,7 +513,8 @@ "node_modules/nanoassert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" }, "node_modules/shiki": { "version": "0.14.7", diff --git a/package.json b/package.json index c9ea297..d7975c1 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "scripts": { "compile": "tsc -p .", "docs": "typedoc --name banani --entryPoints ./main.ts", - "browser": "esbuild browser-main.ts --bundle --minify --keep-names --outfile=banani-browser.js", - "build": "npm run compile && npm run docs && npm run browser" + "browser": "esbuild browser-main.ts --bundle --minify --keep-names --drop-labels=NODE --outfile=banani-browser.js", + "build": "npm run compile && npm run docs && npm run browser", + "cryptodiff": "diff tweetnacl_og.js tweetnacl_mod.js" }, "repository": { "type": "git", diff --git a/rpc.ts b/rpc.ts index 2643feb..754f613 100644 --- a/rpc.ts +++ b/rpc.ts @@ -1,21 +1,22 @@ -import type { BlockCountRPC } from "./rpc_types"; +import type { Address, BlockHash, BlockCountRPC, BlockInfoRPC, BlocksRPC, BlocksInfoRPC, RepresentativesRPC, RepresentativesOnlineRPC, RepresentativesOnlineWeightRPC, AccountHistoryRPC, AccountHistoryRawRPC, AccountInfoRPC, AccountBalanceRPC, AccountsBalancesRPC, AccountRepresentativeRPC, AccountsRepresentativesRPC, AccountWeightRPC, AccountReceivableRPC, AccountReceivableSourceRPC, DelegatorsRPC, DelegatorsCountRPC } from "./rpc_types"; /** Implement this interface if the built-in RPC class does not fit your needs. The easiest way to do this is by just extending the built-in RPC class */ export interface RPCInterface { - readonly rpc_url: string; - use_pending: boolean; - call(payload: Record): Promise>; - get_block_count(): Promise; - // + rpc_url: string, + use_pending: boolean, + call(payload: Record): Promise>, + get_block_info(block_hash: BlockHash): Promise, + get_account_info(account: Address, include_confirmed?: boolean, representative?: boolean, weight?: boolean, pending?: boolean): Promise, + get_account_receivable(account: Address, count?: number, threshold?: number, source?: T): Promise, } /** Sends RPC requests to the RPC node, also has wrappers for actions that only read the network (write actions are handled by the Wallet class) */ export class RPC implements RPCInterface { - readonly rpc_url: string; + rpc_url: string; - readonly use_pending: boolean; + use_pending: boolean; - /** HTTP headers to send with any RPC requests */ + /** HTTP headers to send with any RPC requests, defaults to { "Content-Type": "application/json" } */ headers: Record | undefined; /** @@ -25,11 +26,14 @@ export class RPC implements RPCInterface { this.rpc_url = rpc_url; this.use_pending = use_pending; } + + //Network information related + /** The function that sends the RPC POST request */ async call(payload: Record): Promise> { const resp = await fetch(this.rpc_url, { method: "POST", - headers: this.headers ?? {}, + headers: this.headers ?? { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); if (!resp.ok) throw Error(`Request to RPC node failed with status code ${resp.status}`); @@ -40,8 +44,166 @@ export class RPC implements RPCInterface { /** See https://docs.nano.org/commands/rpc-protocol/#block_count */ async get_block_count(): Promise { return (await this.call({ - "action": "block_count", + action: "block_count", })) as BlockCountRPC; } - // + /** See https://docs.nano.org/commands/rpc-protocol/#block_info */ + async get_block_info(block_hash: BlockHash): Promise { + return (await this.call({ + action: "block_info", + hash: block_hash, + json_block: true, + })) as BlockInfoRPC; + } + /** See https://docs.nano.org/commands/rpc-protocol/#blocks */ + async get_blocks(block_hashes: BlockHash[]): Promise { + return (await this.call({ + action: "blocks", + hashes: block_hashes, + json_block: true, + })) as BlocksRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#blocks_info */ + async get_blocks_info(block_hashes: BlockHash[]): Promise { + return (await this.call({ + action: "blocks_info", + hashes: block_hashes, + json_block: true, + })) as BlocksInfoRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#representatives */ + async get_representatives(): Promise { + return (await this.call({ + action: "representatives", + })) as RepresentativesRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#representatives_online */ + async get_representatives_online(weight?: T): Promise { + return (await this.call({ + action: "representatives_online", + weight: weight ? "true" : undefined, //better not to include "weight" if false, rather than sending "weight": false + })) as Promise; + } + + //Account information related + + /** https://docs.nano.org/commands/rpc-protocol/#account_history */ + async get_account_history(account: Address, count: number, raw?: boolean, head?: BlockHash, offset?: number, reverse?: boolean, account_filter?: Address[]): Promise { + return (await this.call({ + action: "account_history", + account, + count: `${count}`, + raw: raw ? "true" : undefined, + head, + offset: offset ? `${offset}` : undefined, + reverse: reverse ? "true" : undefined, + account_filter, + })) as Promise; + } + /** https://docs.nano.org/commands/rpc-protocol/#account_info */ + async get_account_info(account: Address, include_confirmed?: boolean, representative?: boolean, weight?: boolean, pending?: boolean): Promise { + return (await this.call({ + action: "account_info", + account, + representative: representative ? "true" : undefined, + weight: weight ? "true" : undefined, + pending: pending ? "true" : undefined, + })) as AccountInfoRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#account_balance */ + async get_account_balance(account: Address): Promise { + return (await this.call({ + action: "account_balance", + account, + })) as AccountBalanceRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#accounts_balances */ + async get_accounts_balances(accounts: Address[]): Promise { + return (await this.call({ + action: "accounts_balances", + accounts, + })) as AccountsBalancesRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#account_representative */ + async get_account_representative(account: Address): Promise { + return (await this.call({ + action: "account_representative", + account, + })) as AccountRepresentativeRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#accounts_representatives */ + async get_accounts_representatives(account: Address): Promise { + return (await this.call({ + action: "accounts_representatives", + account, + })) as AccountsRepresentativesRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#account_weight */ + async get_account_weight(account: Address): Promise { + return (await this.call({ + action: "account_weight", + account, + })) as AccountWeightRPC; + } + /** Keep in mind "threshold" parameter is in raw. https://docs.nano.org/commands/rpc-protocol/#receivable */ + async get_account_receivable(account: Address, count?: number, threshold?: number, source?: T): Promise{ + return (await this.call({ + action: this.use_pending ? "pending" : "receivable", + account, + count: count ? `${count}` : undefined, + threshold: threshold ? `${threshold}` : undefined, + })) as T extends true ? AccountReceivableSourceRPC : AccountReceivableRPC; + } + /** Keep in mind "threshold" parameter is in raw. https://docs.nano.org/commands/rpc-protocol/#delegators */ + async get_delegators(account: Address, threshold?: number, count?: number, start?: Address): Promise { + return (await this.call({ + action: "delegators", + account, + threshold: threshold ? `${threshold}` : undefined, + count: count ? `${count}` : undefined, + start, + })) as DelegatorsRPC; + } + /** https://docs.nano.org/commands/rpc-protocol/#account_weight */ + async get_delegators_count(account: Address): Promise { + return (await this.call({ + action: "account_weight", + account, + })) as DelegatorsCountRPC; + } } + +export class RPCWithBackup extends RPC { + readonly rpc_urls: string[]; + readonly timeout: number; + + /** + * @param {number} [timeout] Request to RPC timeout, in milliseconds. If RPC request fails or timeouts, tries the next RPC + */ + constructor(rpc_urls: string[], timeout: number, use_pending: boolean = false) { + if (rpc_urls.length < 2) throw Error("Must provide at least two RPC URLs"); + super(rpc_urls[0], use_pending); + this.rpc_urls = rpc_urls; + } + async call(payload: Record): Promise> { + let i = 0; + while (true) { + try { + const resp = await fetch(this.rpc_urls[i], { + method: "POST", + headers: this.headers ?? { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + signal: AbortSignal.timeout(this.timeout), + }); + if (!resp.ok) throw Error(`Request to RPC node failed with status code ${resp.status}`); + const resp_json = await resp.json(); + if (resp_json.error) throw Error(`RPC node response: ${resp_json.error}`); + return resp_json; + } catch (e) { + //increment (so try next RPC in provided list), if all RPCs exhausted (all failed), throw error + if (!this.rpc_urls[++i]) throw Error(e); + } + } + } +} + diff --git a/rpc_types.ts b/rpc_types.ts index 8f8dca4..aa741dd 100644 --- a/rpc_types.ts +++ b/rpc_types.ts @@ -1,6 +1,171 @@ +export type BananoAddress = `ban_${string}`; +export type NanoAddress = `nano_${string}`; +export type Address = BananoAddress | NanoAddress; + +/** 32 byte block hash represented as 64 char hexadecimal */ +export type BlockHash = string; + +export type BlockStateChangeTypes = "send" | "receive"; +export type BlockBasicTypes = BlockStateChangeTypes | "change"; +export type BlockSubtype = BlockBasicTypes | "epoch"; +export type BlockLegacyTypes = BlockBasicTypes | "open"; +export type BlockAllTypes = BlockLegacyTypes | "state"; + +export interface Block { + type: BlockAllTypes, + account: Address, + previous: BlockHash, + representative: Address, + balance: `${number}`, + link: BlockHash, + link_as_account: Address, + signature: string, + work?: string, +} + export interface BlockCountRPC { count: `${number}`, unchecked: `${number}`, cemented?: `${number}`, -}; +} + +export interface BlockInfoRPC { + block_account: Address, + amount: `${number}`, + balance: `${number}`, + height: `${number}`, + timestamp: `${number}`, + contents: Block, + //v19 or newer only + confirmed?: `${boolean}`, + subtype?: BlockSubtype, //for state blocks only + //v23 or newer only + successor?: `${string}`, +} + +export interface BlocksRPC { + blocks: Record, +} + +export interface BlocksInfoRPC { + blocks: Record, +} + +export interface RepresentativesRPC { + representatives: Record, +} + +export interface RepresentativesOnlineRPC { + representatives: Address[], +} + +export interface RepresentativesOnlineWeightRPC { + representatives: Record, +} + +export interface AccountHistoryBlock { + type: BlockStateChangeTypes, + account: Address, + amount: `${number}`, + local_timestamp: `${number}`, + height: `${number}`, + hash: BlockHash, + confirmed: boolean, +} + +export interface AccountHistoryRawBlock { + account: Address, + amount: `${number}`, + amount_decimal: `${number}`, + balance: `${number}`, + balance_decimal: `${number}`, + confirmed: `${boolean}`, + hash: BlockHash, + height: `${number}`, + link: BlockHash, + local_timestamp: `${number}`, + previous: BlockHash, + representative: Address, + signature: string, + subtype: BlockSubtype, + type: BlockAllTypes, + work: string, +} + +export interface AccountHistoryRPC { + account: Address, + history: AccountHistoryBlock[], + previous?: BlockHash, +} + +export interface AccountHistoryRawRPC { + account: Address, + history: AccountHistoryRawBlock[], + previous?: BlockHash, +} + +export interface AccountInfoRPC { + frontier: BlockHash, + open_block: BlockHash, + representative_block: BlockHash, + balance: `${number}`, + modified_timestamp: `${number}`, + block_count: `${number}`, + account_version: `${number}`, + confirmation_height?: `${number}`, + confirmation_height_frontier?: BlockHash, + representative?: Address, + weight?: `${number}`, + pending?: `${number}`, + receivable?: `${number}`, + confirmed_balance?: `${number}`, + confirmed_height?: `${number}`, + confirmed_frontier?: BlockHash, + confirmed_representative?: Address, + confirmed_receivable?: `${number}`, + confirmed_pending?: `${number}`, +} + +export interface AccountBalanceRPC { + balance: `${number}`, + pending: `${number}`, + receivable?: `${number}`, +} + +export interface AccountsBalancesRPC { + balances: Record, +} + +export interface AccountRepresentativeRPC { + representative: Address, +} + +export interface AccountsRepresentativesRPC { + representatives: Record, +} + +export interface AccountWeightRPC { + weight: `${number}`, +} + +export interface AccountReceivableRPC { + blocks: Record, +} + +export interface AccountReceivableSourceRPC { + blocks: Record, +} + +export interface DelegatorsRPC { + delegators: Record, +} + +export interface DelegatorsCountRPC { + count: `${number}`, +} + +// diff --git a/util.ts b/util.ts index f71d443..b74917b 100644 --- a/util.ts +++ b/util.ts @@ -1,5 +1,5 @@ -import * as nacl from "tweetnacl"; //currently unused -import blake2b from "blake2b"; //currently unused +import * as nacl from "./tweetnacl_mod"; +import blake2b from "blake2b"; // byte related @@ -16,8 +16,9 @@ export function uint8array_to_hex(uint8array: Uint8Array): string { //assumes the hex length is multiple of 2 export function hex_to_uint8array(hex: string): Uint8Array { - let uint8array: Uint8Array = new Uint8Array(hex.length / 2); - for (let i = 0; i < hex.length / 2; i++) { + hex = hex.toUpperCase(); + let uint8array: Uint8Array = new Uint8Array(Math.floor(hex.length / 2)); + for (let i = 0; i < Math.floor(hex.length / 2); i++) { uint8array[i] = HEX_CHARS.indexOf(hex[i * 2]) * 16 + HEX_CHARS.indexOf(hex[i * 2 + 1]); } return uint8array; @@ -84,7 +85,15 @@ export function raw_to_whole(raw: BigInt, decimals = BANANO_DECIMALS): Whole { export function get_private_key_from_seed(seed: string, index: number): string { //index is 4 bytes - return blake2b(32).update(hex_to_uint8array(seed)).update(int_to_uint8array(index, 4)).digest("hex") + return blake2b(32).update(hex_to_uint8array(seed)).update(int_to_uint8array(index, 4)).digest("hex"); +} + +export function a(b) { + return blake2b(64).update(b).digest(); +} + +export function get_public_key_from_private_key(private_key: string): string { + return uint8array_to_hex(nacl.sign.keyPair.fromSecretKey(hex_to_uint8array(private_key)).publicKey); } // diff --git a/wallet.ts b/wallet.ts index bf8baa7..6ee8ba5 100644 --- a/wallet.ts +++ b/wallet.ts @@ -1,18 +1,24 @@ import * as util from "./util"; -import type { RPCInterface } from "./rpc"; +import type { Address, Block, BlockSubtype, BlockHash } from "./rpc_types"; +import type { RPCInterface, RPC } from "./rpc"; /** Wallets are created from seeds, so they can have multiple addresses by changing the index. Use Wallets to "write" (send, receive, change rep) to the network */ export class Wallet { readonly seed: string; readonly rpc: RPCInterface; - index: number = 0; + index: number; + + try_work: boolean; + add_do_work: boolean = false; /** * @param {string} [seed] Seed for the wallet from which private keys are derived. 64 character hex string (32 bytes) */ - constructor(rpc: RPCInterface, seed: string) { + constructor(rpc: RPCInterface, seed: string, index: number = 0, try_work: boolean = false) { this.seed = seed; + this.index = index; } + /** Generate a cryptographically secure random wallet using [crypto.getRandomValues](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) */ static gen_random_wallet(rpc: RPCInterface): Wallet { let random_bytes = new Uint8Array(32); @@ -20,6 +26,30 @@ export class Wallet { const random_seed = util.uint8array_to_hex(random_bytes); return new Wallet(rpc, random_seed); } + + //Own properties + get public_key(): string { + // + return "placeholder"; + } + get address(): Address { + // + return "ban_placeholder"; + } + + //Actions + async send_process(block: Block, subtype: BlockSubtype): Promise { + return (await this.rpc.call({ + action: "process", + json_block: "true", + subtype, + block, + do_work: (!block.work && this.add_do_work) ? "true" : undefined, + })).hash as BlockHash; + } + //send, send_all, receive, receive_all, change_representative, sign_message_in_dummy_block + + //Double wrapped functions // } diff --git a/work.ts b/work.ts new file mode 100644 index 0000000..aa09d3c --- /dev/null +++ b/work.ts @@ -0,0 +1,29 @@ +import type { BlockHash } from "./rpc_types"; +import type { RPC } from "./rpc"; + +export interface WorkProvider { + request_work(block_hash: BlockHash): Promise, +} + + +export class RPCWorkProvider { + readonly rpc: RPC; + + /** Extra json to send with the rpc payload. Needed for rpc.nano.to's work_generate, unfortunately */ + extra_payload: Record = {}; + + constructor(rpc: RPC) { + this.rpc = rpc; + } + + async request_work(block_hash: BlockHash): Promise { + return (await this.rpc.call({ + action: "work_generate", + hash: block_hash, + ...this.extra_payload, + })).work; + } +} + +// +