UNPKG

@samudai_xyz/web3-sdk

Version:

## All in one web3 integrations for Samudai

1 lines 13.3 kB
"use strict";(this.webpackChunkexampleTypescriptPackage=this.webpackChunkexampleTypescriptPackage||[]).push([[459],{6459:(e,t,s)=>{s.r(t),s.d(t,{AlchemyWebSocketProvider:()=>p,getAlchemyEventTag:()=>N});var i=s(46797),r=s(2593),n=s(60214),o=s(54178),l=s(60624),c=s(79861);s(34359);class a{constructor(e){this.provider=e,this.maxBackfillBlocks=120}getNewHeadsBackfill(e,t,s){return(0,i._)(this,void 0,void 0,(function*(){f(e);const r=yield this.getBlockNumber();if(f(e),0===t.length)return this.getHeadEventsInRange(Math.max(s,r-this.maxBackfillBlocks)+1,r+1);const n=(0,i.f)(t[t.length-1].number),o=r-this.maxBackfillBlocks+1;if(n<=o)return this.getHeadEventsInRange(o,r+1);const l=yield this.getReorgHeads(e,t);f(e);const c=yield this.getHeadEventsInRange(n+1,r+1);return f(e),[...l,...c]}))}getLogsBackfill(e,t,s,r){return(0,i._)(this,void 0,void 0,(function*(){f(e);const n=yield this.getBlockNumber();if(f(e),0===s.length)return this.getLogsInRange(t,Math.max(r,n-this.maxBackfillBlocks)+1,n+1);const o=(0,i.f)(s[s.length-1].blockNumber),l=n-this.maxBackfillBlocks+1;if(o<l)return this.getLogsInRange(t,l,n+1);const c=yield this.getCommonAncestor(e,s);f(e);const a=s.filter((e=>(0,i.f)(e.blockNumber)>c.blockNumber)).map((e=>Object.assign(Object.assign({},e),{removed:!0}))),h=c.blockNumber===Number.NEGATIVE_INFINITY?(0,i.f)(s[0].blockNumber):c.blockNumber;let u=yield this.getLogsInRange(t,h,n+1);return u=u.filter((e=>e&&((0,i.f)(e.blockNumber)>c.blockNumber||(0,i.f)(e.logIndex)>c.logIndex))),f(e),[...a,...u]}))}setMaxBackfillBlock(e){this.maxBackfillBlocks=e}getBlockNumber(){return(0,i._)(this,void 0,void 0,(function*(){const e=yield this.provider.send("eth_blockNumber");return(0,i.f)(e)}))}getHeadEventsInRange(e,t){return(0,i._)(this,void 0,void 0,(function*(){if(e>=t)return[];const s=[];for(let r=e;r<t;r++)s.push({method:"eth_getBlockByNumber",params:[(0,i.t)(r),!1]});return(yield this.provider.sendBatch(s)).reduce(((e,t)=>e.concat(t)),[]).map(h)}))}getReorgHeads(e,t){return(0,i._)(this,void 0,void 0,(function*(){const s=[];for(let r=t.length-1;r>=0;r--){const n=t[r],o=yield this.getBlockByNumber((0,i.f)(n.number));if(f(e),n.hash===o.hash)break;s.push(h(o))}return s.reverse()}))}getBlockByNumber(e){return(0,i._)(this,void 0,void 0,(function*(){return this.provider.send("eth_getBlockByNumber",[(0,i.t)(e),!1])}))}getCommonAncestor(e,t){return(0,i._)(this,void 0,void 0,(function*(){let s=yield this.getBlockByNumber((0,i.f)(t[t.length-1].blockNumber));f(e);for(let e=t.length-1;e>=0;e--){const r=t[e];if(r.blockNumber!==s.number&&(s=yield this.getBlockByNumber((0,i.f)(r.blockNumber))),r.blockHash===s.hash)return{blockNumber:(0,i.f)(r.blockNumber),logIndex:(0,i.f)(r.logIndex)}}return{blockNumber:Number.NEGATIVE_INFINITY,logIndex:Number.NEGATIVE_INFINITY}}))}getLogsInRange(e,t,s){return(0,i._)(this,void 0,void 0,(function*(){if(t>=s)return[];const r=Object.assign(Object.assign({},e),{fromBlock:(0,i.t)(t),toBlock:(0,i.t)(s-1)});return this.provider.send("eth_getLogs",[r])}))}}function h(e){const t=Object.assign({},e);return delete t.totalDifficulty,delete t.transactions,delete t.uncles,t}function u(e,t){const s=new Set,i=[];return e.forEach((e=>{const r=t(e);s.has(r)||(s.add(r),i.push(e))})),i}const d=new Error("Cancelled");function f(e){if(e())throw d}const m="alchemy-pending-transactions",v="alchemy_pendingTransactions";class b extends class{constructor(e,t,s){this.listener=t,this.tag=e,this.once=s,this._lastBlockNumber=-2,this._inflight=!1}get event(){switch(this.type){case"tx":return this.hash;case"filter":return this.filter;default:return this.tag}}get type(){return this.tag.split(":")[0]}get hash(){const e=this.tag.split(":");if("tx"!==e[0])throw new Error("Not a transaction event");return e[1]}get filter(){const e=this.tag.split(":");if("filter"!==e[0])throw new Error("Not a transaction event");const t=e[1],s=""===(r=e[2])?[]:r.split(/&/g).map((e=>{if(""===e)return[];const t=e.split("|").map((e=>"null"===e?null:e));return 1===t.length?t[0]:t})),i={};var r;return s.length>0&&(i.topics=s),t&&"*"!==t&&(i.address=t),i}pollable(){return this.tag.indexOf(":")>=0||["block","network","pending","poll"].indexOf(this.tag)>=0}}{get fromAddress(){const e=this.tag.split(":");if(e[0]===m)return e[1]&&"*"!==e[1]?g(e[1]):void 0}get toAddress(){const e=this.tag.split(":");if(e[0]===m)return e[2]&&"*"!==e[2]?g(e[2]):void 0}get hashesOnly(){const e=this.tag.split(":");if(e[0]===m)return e[3]&&"*"!==e[3]?"true"===e[3]:void 0}}function g(e){if(""===e)return;const t=e.split("|");return 1===t.length?t[0]:t}class p extends l.q{constructor(e,t){var r;const l=n.AlchemyProvider.getApiKey(e.apiKey),c=n.AlchemyProvider.getAlchemyNetwork(e.network),h=n.AlchemyProvider.getAlchemyConnectionInfo(c,l,"wss"),u=`alchemy-sdk-${i.V}`;super(new o.Z(null!==(r=e.url)&&void 0!==r?r:h.url,u,{wsConstructor:null!=t?t:"undefined"!=typeof process&&null!=process&&null!=process.versions&&null!=process.versions.node?s(45840).w3cwebsocket:WebSocket}),i.E[c]),this._events=[],this.virtualSubscriptionsById=new Map,this.virtualIdsByPhysicalId=new Map,this.handleMessage=e=>{const t=JSON.parse(e.data);if(!function(e){return!function(e){return Array.isArray(e)||"2.0"===e.jsonrpc&&void 0!==e.id}(e)}(t))return;const s=t.params.subscription,i=this.virtualIdsByPhysicalId.get(s);if(!i)return;const r=this.virtualSubscriptionsById.get(i);if("eth_subscribe"===r.method)switch(r.params[0]){case"newHeads":{const e=r,n=t,{isBackfilling:o,backfillBuffer:l}=e,{result:c}=n.params;o?function(e,t){I(e,t,B)}(l,c):s!==i?this.emitAndRememberEvent(i,c,B):this.rememberEvent(i,c,B);break}case"logs":{const e=r,n=t,{isBackfilling:o,backfillBuffer:l}=e,{result:c}=n.params;o?function(e,t){I(e,t,E)}(l,c):i!==s?this.emitAndRememberEvent(i,c,E):this.rememberEvent(i,c,E);break}}},this.handleReopen=()=>{this.virtualIdsByPhysicalId.clear();const{cancel:e,isCancelled:t}=function(){let e=!1;return{cancel:()=>e=!0,isCancelled:()=>e}}();this.cancelBackfill=e;for(const e of this.virtualSubscriptionsById.values())(()=>{(0,i._)(this,void 0,void 0,(function*(){try{yield this.resubscribeAndBackfill(t,e)}catch(s){t()||console.error(`Error while backfilling "${e.params[0]}" subscription. Some events may be missing.`,s)}}))})();this.startHeartbeat()},this.stopHeartbeatAndBackfill=()=>{null!=this.heartbeatIntervalId&&(clearInterval(this.heartbeatIntervalId),this.heartbeatIntervalId=void 0),this.cancelBackfill()},this.apiKey=l,this.backfiller=new a(this),this.addSocketListeners(),this.startHeartbeat(),this.cancelBackfill=i.n}static getNetwork(e){return"string"==typeof e&&e in i.C?i.C[e]:(0,c.H)(e)}on(e,t){return this._addEventListener(e,t,!1)}once(e,t){return this._addEventListener(e,t,!0)}off(e,t){return w(e)?this._off(e,t):super.off(e,t)}removeAllListeners(e){return void 0!==e&&w(e)?this._removeAllListeners(e):super.removeAllListeners(e)}listenerCount(e){return void 0!==e&&w(e)?this._listenerCount(e):super.listenerCount(e)}listeners(e){return void 0!==e&&w(e)?this._listeners(e):super.listeners(e)}_addEventListener(e,t,s){if(w(e)){!function(e){if(e.method!==v)throw new Error(`Invalid method name ${e.method}. Accepted method names: alchemy_pendingTransactions`)}(e);const i=new b(N(e),t,s);return this._events.push(i),this._startEvent(i),this}return super._addEventListener(e,t,s)}_startEvent(e){[m,"block","filter"].includes(e.type)?this.customStartEvent(e):super._startEvent(e)}_subscribe(e,t,s,r){return(0,i._)(this,void 0,void 0,(function*(){let i=this._subIds[e];const n=yield this.getBlockNumber();null==i&&(i=Promise.all(t).then((e=>this.send("eth_subscribe",e))),this._subIds[e]=i);const o=yield i,l=yield Promise.all(t);this.virtualSubscriptionsById.set(o,{event:r,method:"eth_subscribe",params:l,startingBlockNumber:n,virtualId:o,physicalId:o,sentEvents:[],isBackfilling:!1,backfillBuffer:[]}),this.virtualIdsByPhysicalId.set(o,o),this._subs[o]={tag:e,processFunc:s}}))}emit(e,...t){if(w(e)){let s=!1;const i=[],r=N(e);return this._events=this._events.filter((e=>e.tag!==r||(setTimeout((()=>{e.listener.apply(this,t)}),0),s=!0,!e.once||(i.push(e),!1)))),i.forEach((e=>{this._stopEvent(e)})),s}return super.emit(e,...t)}sendBatch(e){return(0,i._)(this,void 0,void 0,(function*(){let t=0;const s=e.map((({method:e,params:s})=>({method:e,params:s,jsonrpc:"2.0",id:"alchemy-sdk:"+t++}))),i=yield this.sendBatchConcurrently(s),r=i.find((e=>!!e.error));if(r)throw new Error(r.error.message);return i.sort(((e,t)=>e.id-t.id)).map((e=>e.result))}))}destroy(){return this.removeSocketListeners(),this.stopHeartbeatAndBackfill(),super.destroy()}isCommunityResource(){return this.apiKey===i.D}_stopEvent(e){let t=e.tag;if(e.type===m){if(this._events.filter((e=>e.type===m)).length)return}else if("tx"===e.type){if(this._events.filter((e=>"tx"===e.type)).length)return;t="tx"}else if(this.listenerCount(e.event))return;const s=this._subIds[t];s&&(delete this._subIds[t],s.then((e=>{this._subs[e]&&(delete this._subs[e],this.send("eth_unsubscribe",[e]))})))}addSocketListeners(){this._websocket.addEventListener("message",this.handleMessage),this._websocket.addEventListener("reopen",this.handleReopen),this._websocket.addEventListener("down",this.stopHeartbeatAndBackfill)}removeSocketListeners(){this._websocket.removeEventListener("message",this.handleMessage),this._websocket.removeEventListener("reopen",this.handleReopen),this._websocket.removeEventListener("down",this.stopHeartbeatAndBackfill)}resubscribeAndBackfill(e,t){return(0,i._)(this,void 0,void 0,(function*(){const{virtualId:s,method:i,params:r,sentEvents:n,backfillBuffer:o,startingBlockNumber:l}=t;t.isBackfilling=!0,o.length=0;try{const a=yield this.send(i,r);switch(f(e),t.physicalId=a,this.virtualIdsByPhysicalId.set(a,s),r[0]){case"newHeads":{const t=yield k((()=>_(this.backfiller.getNewHeadsBackfill(e,n,l),6e4)),5,(()=>!e()));f(e),(c=[...t,...o],u(c,(e=>e.hash))).forEach((e=>this.emitNewHeadsEvent(s,e)));break}case"logs":{const t=r[1]||{},i=yield k((()=>_(this.backfiller.getLogsBackfill(e,t,n,l),6e4)),5,(()=>!e()));f(e),function(e){return u(e,(e=>`${e.blockHash}/${e.logIndex}`))}([...i,...o]).forEach((e=>this.emitLogsEvent(s,e)));break}}}finally{t.isBackfilling=!1,o.length=0}var c}))}emitNewHeadsEvent(e,t){this.emitAndRememberEvent(e,t,B)}emitLogsEvent(e,t){this.emitAndRememberEvent(e,t,E)}emitAndRememberEvent(e,t,s){this.rememberEvent(e,t,s);const i=this.virtualSubscriptionsById.get(e);i&&this.emitGenericEvent(i,t)}rememberEvent(e,t,s){const i=this.virtualSubscriptionsById.get(e);i&&I(i.sentEvents,Object.assign({},t),s)}emitGenericEvent(e,t){this.emitProcessFn(e.event)(t)}startHeartbeat(){null==this.heartbeatIntervalId&&(this.heartbeatIntervalId=setInterval((()=>(0,i._)(this,void 0,void 0,(function*(){try{yield _(this.send("net_version"),1e4)}catch(e){this._websocket.reconnect()}}))),3e4))}sendBatchConcurrently(e){return(0,i._)(this,void 0,void 0,(function*(){return Promise.all(e.map((e=>this.send(e.method,e.params))))}))}customStartEvent(e){if(e.type===m){const{fromAddress:t,toAddress:s,hashesOnly:i}=e;this._subscribe(e.tag,[v,{fromAddress:t,toAddress:s,hashesOnly:i}],this.emitProcessFn(e),e)}else"block"===e.type?this._subscribe("block",["newHeads"],this.emitProcessFn(e),e):"filter"===e.type&&this._subscribe(e.tag,["logs",this._getFilter(e.filter)],this.emitProcessFn(e),e)}emitProcessFn(e){switch(e.type){case m:const{fromAddress:t,toAddress:s,hashesOnly:i}=e;return e=>this.emit({method:v,fromAddress:t,toAddress:s,hashesOnly:i},e);case"block":return e=>{const t=r.O$.from(e.number).toNumber();this._emitted.block=t,this.emit("block",t)};case"filter":return t=>{null==t.removed&&(t.removed=!1),this.emit(e.filter,this.formatter.filterLog(t))};default:throw new Error("Invalid event type to `emitProcessFn()`")}}_off(e,t){if(null==t)return this.removeAllListeners(e);const s=[];let i=!1;const r=N(e);return this._events=this._events.filter((e=>e.tag!==r||e.listener!=t||!!i||(i=!0,s.push(e),!1))),s.forEach((e=>{this._stopEvent(e)})),this}_removeAllListeners(e){let t=[];if(null==e)t=this._events,this._events=[];else{const s=N(e);this._events=this._events.filter((e=>e.tag!==s||(t.push(e),!1)))}return t.forEach((e=>{this._stopEvent(e)})),this}_listenerCount(e){if(!e)return this._events.length;const t=N(e);return this._events.filter((e=>e.tag===t)).length}_listeners(e){if(null==e)return this._events.map((e=>e.listener));const t=N(e);return this._events.filter((e=>e.tag===t)).map((e=>e.listener))}}function k(e,t,s=(()=>!0)){return(0,i._)(this,void 0,void 0,(function*(){let i=0,r=0;for(;;)try{return yield e()}catch(e){if(r++,r>=t||!s(e))throw e;if(yield y(i),!s(e))throw e;i=0===i?1e3:Math.min(3e4,2*i)}}))}function y(e){return new Promise((t=>setTimeout(t,e)))}function _(e,t){return Promise.race([e,new Promise(((e,s)=>setTimeout((()=>s(new Error("Timeout"))),t)))])}function B(e){return(0,i.f)(e.number)}function E(e){return(0,i.f)(e.blockNumber)}function I(e,t,s){const i=s(t),r=e.findIndex((e=>s(e)>i-10));-1===r?e.length=0:e.splice(0,r),e.push(t)}function w(e){return"object"==typeof e&&"method"in e}function N(e){if(!w(e))throw new Error("Event tag requires AlchemyEventType");var t;return"alchemy-pending-transactions:"+A(e.fromAddress)+":"+A(e.toAddress)+":"+(void 0===(t=e.hashesOnly)?"*":t.toString())}function A(e){return void 0===e?"*":Array.isArray(e)?e.join("|"):e}}}]);