@sentio/sdk-bundle 2.55.2 → 2.55.3-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/lib/aptos/builtin/0x1.js +1 -1
  2. package/lib/aptos/builtin/0x3.js +1 -1
  3. package/lib/aptos/builtin/0x4.js +1 -1
  4. package/lib/aptos/builtin/index.js +1 -1
  5. package/lib/aptos/ext/index.js +1 -1
  6. package/lib/aptos/index.js +1 -1
  7. package/lib/btc/index.js +1 -1
  8. package/lib/{chunk-VA46M7OL.js → chunk-323G3QNZ.js} +2 -2
  9. package/lib/{chunk-SQBMMGFT.js → chunk-3A7CIH53.js} +2 -2
  10. package/lib/chunk-5O5M5YQD.js +6 -0
  11. package/lib/{chunk-ZSDI5U4B.js.map → chunk-5O5M5YQD.js.map} +1 -1
  12. package/lib/chunk-5XKFO4JV.js +5 -0
  13. package/lib/{chunk-YQ346IMF.js.map → chunk-5XKFO4JV.js.map} +1 -1
  14. package/lib/{chunk-EJ3LB3BV.js → chunk-7RRC3JWT.js} +2 -2
  15. package/lib/{chunk-26VKFV5Y.js → chunk-E3M3GQJ4.js} +2 -2
  16. package/lib/{chunk-RIHABKWB.js → chunk-GEXJAJDW.js} +2 -2
  17. package/lib/{chunk-6P4HU4KH.js → chunk-IBMK3RZC.js} +2 -2
  18. package/lib/{chunk-24TKIKAC.js → chunk-ITM4JOFD.js} +2 -2
  19. package/lib/{chunk-VLD3QNSH.js → chunk-IWL7MOEJ.js} +10 -10
  20. package/lib/{chunk-VLD3QNSH.js.map → chunk-IWL7MOEJ.js.map} +1 -1
  21. package/lib/{chunk-RZTTP64K.js → chunk-KBQ57663.js} +2 -2
  22. package/lib/{chunk-JUDV27KS.js → chunk-NXGACDOG.js} +2 -2
  23. package/lib/{chunk-HWODJFVJ.js → chunk-P53F66G2.js} +2 -2
  24. package/lib/{chunk-4ZKROMHQ.js → chunk-P7MTDMBH.js} +2 -2
  25. package/lib/{chunk-NEZRMKYM.js → chunk-PIPP432V.js} +2 -2
  26. package/lib/{chunk-SXK7O76Y.js → chunk-PJIGTPJK.js} +2 -2
  27. package/lib/{chunk-5NXOOGVA.js → chunk-Q4I47PIC.js} +2 -2
  28. package/lib/{chunk-A3BBP3JY.js → chunk-VZ66OUNB.js} +2 -2
  29. package/lib/{chunk-CQUL5GH2.js → chunk-X2U3GK7O.js} +2 -2
  30. package/lib/{chunk-QR7CH6SO.js → chunk-XIUJYZEA.js} +3 -3
  31. package/lib/{chunk-QR7CH6SO.js.map → chunk-XIUJYZEA.js.map} +1 -1
  32. package/lib/core/index.js +1 -1
  33. package/lib/eth/builtin/eacaggregatorproxy.js +1 -1
  34. package/lib/eth/builtin/erc1155.js +1 -1
  35. package/lib/eth/builtin/erc20.js +1 -1
  36. package/lib/eth/builtin/erc721.js +1 -1
  37. package/lib/eth/builtin/index.js +1 -1
  38. package/lib/eth/builtin/weth9.js +1 -1
  39. package/lib/eth/index.js +1 -1
  40. package/lib/fuel/index.js +1 -1
  41. package/lib/index.js +1 -1
  42. package/lib/move/index.js +1 -1
  43. package/lib/solana/builtin/index.js +1 -1
  44. package/lib/solana/index.js +1 -1
  45. package/lib/stark/index.js +1 -1
  46. package/lib/store/index.js +1 -1
  47. package/lib/store/index.js.map +1 -1
  48. package/lib/sui/builtin/0x1.js +1 -1
  49. package/lib/sui/builtin/0x2.js +1 -1
  50. package/lib/sui/builtin/0x3.js +1 -1
  51. package/lib/sui/builtin/index.js +1 -1
  52. package/lib/sui/ext/index.js +1 -1
  53. package/lib/sui/index.js +1 -1
  54. package/lib/testing/index.js +15 -15
  55. package/lib/testing/index.js.map +1 -1
  56. package/lib/utils/index.js +1 -1
  57. package/package.json +2 -2
  58. package/lib/chunk-YQ346IMF.js +0 -5
  59. package/lib/chunk-ZSDI5U4B.js +0 -6
  60. /package/lib/{chunk-VA46M7OL.js.map → chunk-323G3QNZ.js.map} +0 -0
  61. /package/lib/{chunk-SQBMMGFT.js.map → chunk-3A7CIH53.js.map} +0 -0
  62. /package/lib/{chunk-EJ3LB3BV.js.map → chunk-7RRC3JWT.js.map} +0 -0
  63. /package/lib/{chunk-26VKFV5Y.js.map → chunk-E3M3GQJ4.js.map} +0 -0
  64. /package/lib/{chunk-RIHABKWB.js.map → chunk-GEXJAJDW.js.map} +0 -0
  65. /package/lib/{chunk-6P4HU4KH.js.map → chunk-IBMK3RZC.js.map} +0 -0
  66. /package/lib/{chunk-24TKIKAC.js.map → chunk-ITM4JOFD.js.map} +0 -0
  67. /package/lib/{chunk-RZTTP64K.js.map → chunk-KBQ57663.js.map} +0 -0
  68. /package/lib/{chunk-JUDV27KS.js.map → chunk-NXGACDOG.js.map} +0 -0
  69. /package/lib/{chunk-HWODJFVJ.js.map → chunk-P53F66G2.js.map} +0 -0
  70. /package/lib/{chunk-4ZKROMHQ.js.map → chunk-P7MTDMBH.js.map} +0 -0
  71. /package/lib/{chunk-NEZRMKYM.js.map → chunk-PIPP432V.js.map} +0 -0
  72. /package/lib/{chunk-SXK7O76Y.js.map → chunk-PJIGTPJK.js.map} +0 -0
  73. /package/lib/{chunk-5NXOOGVA.js.map → chunk-Q4I47PIC.js.map} +0 -0
  74. /package/lib/{chunk-A3BBP3JY.js.map → chunk-VZ66OUNB.js.map} +0 -0
  75. /package/lib/{chunk-CQUL5GH2.js.map → chunk-X2U3GK7O.js.map} +0 -0
@@ -0,0 +1,6 @@
1
+ import { createRequire as createRequireSdkShim } from 'module'; const require = createRequireSdkShim(import.meta.url);
2
+ import{a as C,b}from"./chunk-4WNGQ3EZ.js";import{a as lt}from"./chunk-IVMOWPFA.js";import{Ac as J,Ad as rt,Bd as nt,C as T,Cd as st,Eb as q,Ed as at,Ub as F,Ud as it,V as Z,Vb as M,oe as ct,te as R,vc as tt,ve as K,wc as A,xc as B,yc as et,yd as j,zc as L,zd as ot}from"./chunk-IWL7MOEJ.js";import{a as i,f as H}from"./chunk-G5BIPHMS.js";import{errorString as O,GLOBAL_CONFIG as X,mergeProcessResults as Y,Plugin as yt,PluginManager as kt,USER_PROCESSOR as vt}from"@sentio/runtime";var f=H(it(),1);import{MapStateStorage as Ct}from"@sentio/runtime";var h=class e extends Ct{static{i(this,"FuelProcessorState")}static INSTANCE=new e};import("node:process").then(e=>e.stdout.write(""));var W=H(lt(),1);import{Endpoints as It}from"@sentio/runtime";var Pt={MAIN_NET:W.FuelChainId.FUEL_MAINNET,TEST_NET:W.FuelChainId.FUEL_TESTNET};function Tt(e){switch(e){case Pt.TEST_NET:return"https://testnet.fuel.network/v1/graphql"}return"https://mainnet.fuel.network/v1/graphql"}i(Tt,"getRpcEndpoint");function v(e){let t=It.INSTANCE.chainServer.get(e);return t||(t=Tt(e)),nt.create(t)}i(v,"getProvider");import("node:process").then(e=>e.stdout.write(""));var S=class{constructor(t,o,r,a,s){this.args=a;this.logs=s}static{i(this,"FuelCall")}},I=class extends ct{constructor(o,r,a,s,n,l){super({});this.chainId=o;this.contractAddress=r;this.contractName=a;this.timestamp=s;this.transaction=n;this.block=l}static{i(this,"FuelContext")}logIndex=-1;getChainId(){return this.chainId}setLogIndex(o){this.logIndex=o}getMetaDataInternal(o,r){return{address:this.contractAddress,contractName:this.contractName,blockNumber:BigInt(this.block?.height?.toString()??(this.transaction?.blockNumber||0)),transactionIndex:0,transactionHash:this.transaction?.id||"",chainId:this.getChainId(),name:o,logIndex:this.logIndex,labels:at(r)}}},N=class extends I{constructor(o,r,a,s,n,l,c){super(o,a,s,n,l,c);this.chainId=o;this.contract=r;this.contractAddress=a;this.contractName=s;this.timestamp=n;this.transaction=l;this.block=c}static{i(this,"FuelContractContext")}get provider(){return this.contract.provider}};import("node:process").then(e=>e.stdout.write(""));var y={includeFailed:!1};function dt(e,t){for(let o of e||[])if(o.type==B.Coin&&o.assetId==t)return o.owner}i(dt,"findSenderFromInputs");function w(e,t){let o=M(e.rawPayload),r=e?.status.receipts?.map(j)||[],[a]=new J().decode(o,0),{gasCosts:s,feeParameters:n,txParameters:l,baseAssetId:c}=t.getChain().consensusParameters,g=e.status?.block?.header?.height,{gasPriceFactor:d,gasPerByte:m}=n,{maxInputs:p,maxGasPerTx:P}=l,u={type:e.status?.__typename,...e.status};return{...ot({id:e.id,receipts:r,transaction:a,transactionBytes:o,gqlTransactionStatus:u,gasPerByte:F(m),gasPriceFactor:F(d),maxInputs:p,gasCosts:s,gasPrice:F(e.gasPrice),maxGasPerTx:P,baseAssetId:c}),blockNumber:g,sender:dt(a.inputs,c)}}i(w,"decodeFuelTransaction");function $(e,t){if(e&&(e.type===L.LogData||e.type===L.Log)){let o=new A(t),r=e.type===L.Log?new tt("u64").encode(e.val0):e.data,a=e.val1.toString(),[s]=o.decodeLog(r,a);return{logId:a,data:s}}return null}i($,"decodeLog");async function z(e,t,o){let r=M(e.rawPayload),[a]=new J().decode(r,0),s=e?.status.receipts?.map(j)||[],n={type:e.status?.__typename,...e.status},l=n?.block?.header?.height,c=Object.values(t)[0],g=[];s.forEach((p,P)=>{try{let u=$(p,c);u&&g.push({...u,receiptIndex:P})}catch(u){console.warn("Failed to decode log",u)}});let d=new rt(e.status.transactionId,o,{main:Object.values(t)[0],otherContractsAbis:{}});return d.gqlTransaction={...e,status:n},{...await d.getTransactionSummary(),blockNumber:l,logs:g,sender:dt(a.inputs,o.getChain().consensusParameters.baseAssetId)}}i(z,"decodeFuelTransactionWithAbi");import("node:process").then(e=>e.stdout.write(""));var E=H(it(),1);var k=class e{constructor(t){this.config=t;return b(this)}static{i(this,"FuelProcessor")}txHandlers=[];blockHandlers=[];logHandlers=[];provider;contract;static bind(t){let o=new e(t);return bt(t,o),o}latestGasPrice;async configure(){this.provider=await v(this.config.chainId),this.provider.getLatestGasPrice=async()=>{if(this.latestGasPrice)return F(this.latestGasPrice);let{latestGasPrice:t}=await this.provider.operations.getLatestGasPrice();return this.latestGasPrice=t?.gasPrice,F(t.gasPrice)},this.contract=new st(this.config.address,this.config.abi,this.provider)}onTransaction(t,o=y){let r={handlerName:C(),handler:i(async a=>{let s=this.config.abi?{[this.config.address]:this.config.abi}:{},n=await z(a.transaction,s,this.provider),l=new N(this.config.chainId,this.contract,this.config.address,this.config.name??this.config.address,a.timestamp||new Date(0),n,null);return await t(n,l),l.stopAndGetResult()},"handler"),fetchConfig:{filters:[],...o}};return this.txHandlers.push(r),this}onCall(t,o,r=y){let a=new Set(Array.isArray(t)?t:[t]);if(!this.config.abi)throw new Error("ABI must be provided to use onCall");let s=this.config.abi,n={},l=new A(s);for(let g of a)try{let d=l.functions[g],m=F(d.selector,"hex").toString();n[d.name]={function:m,includeFailed:!!r.includeFailed}}catch(d){console.error(d)}let c={handlerName:C(),handler:i(async g=>{try{let d=g.transaction,m=await z(d,{[this.config.address]:s},this.provider),p=new I(this.config.chainId,this.config.address,this.config.name??this.config.address,g.timestamp||new Date(0),m,null);for(let P of m.operations)for(let u of P.calls||[])if(a.has(u.functionName)){let U=this.contract.functions[u.functionName],pt=Object.values(u.argumentsProvided||{}),ht=U(...pt),Ft=new S(ht,m,!1,u.argumentsProvided,m.logs);await o(Ft,p)}return p.stopAndGetResult()}catch(d){return console.error(d),{gauges:[],counters:[],events:[],exports:[],states:{configUpdated:!1}}}},"handler"),fetchConfig:{filters:Object.values(n)}};return this.txHandlers.push(c),this}onLog(t,o){let r=new Set(Array.isArray(t)?t:[t]),a={handlerName:C(),handler:i(async({transaction:s,receiptIndex:n,timestamp:l})=>{try{let c=w(s,this.provider),g=Number(n),d=c.receipts[g],m=$(d,this.config.abi);if(m){let p=new N(this.config.chainId,this.contract,this.config.address,this.config.name??this.config.address,l||new Date(0),c,null);return p.setLogIndex(g),await o({receiptIndex:g,...m},p),p.stopAndGetResult()}else console.error(`Log with receipt index ${n} not found in tx`)}catch(c){console.error(c)}return q.fromPartial({})},"handler"),logConfig:{logIds:Array.from(r)}};return this.logHandlers.push(a),this}onInterval(t,o,r){o&&o.backfillInterval<o.recentInterval&&(o.backfillInterval=o.recentInterval);let a=this;return this.blockHandlers.push({blockInterval:r,timeIntervalInMinutes:o,handlerName:C(),handler:i(async function(s){let n=s.block;if(!n)throw new E.ServerError(E.Status.INVALID_ARGUMENT,"Block is empty");let l={id:n.id,height:F(n.height),time:n.time,header:{applicationHash:n.applicationHash,daHeight:F(n.daHeight),eventInboxRoot:n.eventInboxRoot,messageOutboxRoot:n.messageOutboxRoot,prevRoot:n.prevRoot,stateTransitionBytecodeVersion:n.stateTransitionBytecodeVersion,transactionsCount:n.transactionsCount,transactionsRoot:n.transactionsRoot}},c=new N(a.config.chainId,a.contract,a.config.address,a.config.name??a.config.address,s.timestamp||new Date(0),null,l);return await t(l,c),c.stopAndGetResult()},"handler")}),this}onBlockInterval(t,o=250,r=1e3){return this.onInterval(t,void 0,{recentInterval:o,backfillInterval:r})}onTimeInterval(t,o=60,r=240){return this.onInterval(t,{recentInterval:o,backfillInterval:r},void 0)}};function x(e){let t=[e.address];return e.chainId&&t.push(e.chainId),e.name&&t.push(e.name),e.startBlock&&t.push(e.startBlock.toString()),e.endBlock&&t.push(e.endBlock.toString()),t.join("_")}i(x,"getOptionsSignature");function pe(e){let t=x(e);return h.INSTANCE.getValue(t)}i(pe,"getFuelProcessor");function bt(e,t){let o=x(e);h.INSTANCE.getOrSetValue(o,t)}i(bt,"addFuelProcessor");import("node:process").then(e=>e.stdout.write(""));var _=class e{constructor(t){this.config=t;return b(this)}static{i(this,"FuelAssetProcessor")}txHandlers=[];blockHandlers=[];provider;static bind(t){let o=new e(t),r="assets_"+x({...t,address:"*"});return h.INSTANCE.getOrSetValue(r,o),o}async configure(){this.provider=await v(this.config.chainId)}onTransfer(t,o){let r=[],a=Q(t.assetId),s=Q(t.from),n=Q(t.to);for(let c of a)for(let g of s)for(let d of n)r.push({assetId:c,fromAddress:g,toAddress:d});let l={handlerName:C(),handler:i(async c=>{let g=c.transaction,d=w(g,this.provider),m={from:[],to:[]};for(let u of d.transaction.inputs||[])u.type==B.Coin&&m.from.push({address:u.owner,assetId:u.assetId,amount:BigInt(u.amount.toString(10))});for(let u of d.transaction.outputs||[])if(u.type==et.Coin){let U=u.amount.toString(10);m.to.push({address:u.to,amount:BigInt(U),assetId:u.assetId})}let p=m.from[0].assetId||"",P=new I(this.config.chainId,p,this.config.name??"",c.timestamp||new Date(0),d,null);return await o(m,P),P.stopAndGetResult()},"handler"),assetConfig:{filters:r}};return this.txHandlers.push(l),this}};function Q(e){return e?Array.isArray(e)?e.length>0?e:[void 0]:[e]:[void 0]}i(Q,"arrayify");import("node:process").then(e=>e.stdout.write(""));import{mergeProcessResults as xt}from"@sentio/runtime";var D=class e{constructor(t){this.config=t;return b(this)}static{i(this,"FuelGlobalProcessor")}txHandlers=[];blockHandlers=[];provider;static bind(t){let o=new e(t),r="global_"+x({...t,address:K});return h.INSTANCE.getOrSetValue(r,o),o}async configure(){this.provider=await v(this.config.chainId)}onTransaction(t,o=y){let r={handlerName:C(),handler:i(async a=>{let s;try{s=w(a.transaction,this.provider)}catch(l){return console.error("error decoding transaction",l),xt([])}let n=new I(this.config.chainId,K,this.config.name??"*",a.timestamp||new Date(0),s,null);return await t(s,n),n.stopAndGetResult()},"handler"),fetchConfig:{filters:[],...o}};return this.txHandlers.push(r),this}};import("node:process").then(e=>e.stdout.write(""));var V=class extends yt{static{i(this,"FuelPlugin")}name="FuelPlugin";handlers={transactionHandlers:[],blockHandlers:[],logHandlers:[]};async configure(t){let o={transactionHandlers:[],blockHandlers:[],logHandlers:[]};for(let r of h.INSTANCE.getValues()){let a=Z.fromPartial({processorType:vt,contract:{name:r.config.name,chainId:r.config.chainId.toString(),address:r.config.address||"*",abi:""},startBlock:r.config.startBlock,endBlock:r.config.endBlock});for(let s of r.txHandlers){let n=o.transactionHandlers.push(s.handler)-1,l=s.handlerName;if(r instanceof k){let c={handlerId:n,handlerName:l};a.fuelTransactionConfigs.push(c)}else if(r instanceof _){let c=s.assetConfig;a.assetConfigs.push({filters:c?.filters||[],handlerId:n,handlerName:l})}else if(r instanceof D){let c={handlerId:n,handlerName:l,filters:[]};a.fuelTransactionConfigs.push(c),a.contract.address="*"}}for(let s of r.logHandlers??[]){let n=o.logHandlers.push(s.handler)-1,l=s.handlerName;r instanceof k&&a.fuelLogConfigs.push({logIds:s.logConfig?.logIds||[],handlerId:n,handlerName:l})}for(let s of r.blockHandlers){let n=o.blockHandlers.push(s.handler)-1;a.intervalConfigs.push({slot:0,slotInterval:s.blockInterval,minutes:0,minutesInterval:s.timeIntervalInMinutes,handlerId:n,handlerName:s.handlerName,fetchConfig:void 0})}t.contractConfigs.push(a)}this.handlers=o}supportedHandlers=[T.FUEL_TRANSACTION,T.FUEL_RECEIPT,T.FUEL_CALL,T.FUEL_BLOCK];processBinding(t){switch(t.handlerType){case T.FUEL_TRANSACTION:return this.processTransaction(t);case T.FUEL_RECEIPT:return this.processLog(t);case T.FUEL_BLOCK:return this.processBlock(t);default:throw new f.ServerError(f.Status.INVALID_ARGUMENT,"No handle type registered "+t.handlerType)}}async start(t){try{for(let o of h.INSTANCE.getValues())await o.configure()}catch(o){throw new f.ServerError(f.Status.INTERNAL,"error starting FuelPlugin: "+O(o))}}stateDiff(t){return R.INSTANCE.getValues().length!==t.templateInstances.length}async processLog(t){if(!t.data?.fuelLog?.transaction)throw new f.ServerError(f.Status.INVALID_ARGUMENT,"transaction can't be null");let o=t.data.fuelLog,r=[];for(let a of t.handlerIds){let s=this.handlers.logHandlers[a](o).catch(n=>{throw new f.ServerError(f.Status.INTERNAL,"error processing transaction: "+JSON.stringify(o)+`
3
+ `+O(n))});X.execution.sequential&&await s,r.push(s)}return Y(await Promise.all(r))}async processTransaction(t){if(!t.data?.fuelTransaction?.transaction)throw new f.ServerError(f.Status.INVALID_ARGUMENT,"transaction can't be null");let o=t.data.fuelTransaction,r=[];for(let a of t.handlerIds){let s=this.handlers.transactionHandlers[a](o).catch(n=>{throw new f.ServerError(f.Status.INTERNAL,"error processing transaction: "+JSON.stringify(o.transaction)+`
4
+ `+O(n))});X.execution.sequential&&await s,r.push(s)}return Y(await Promise.all(r))}async processBlock(t){if(!t.data?.fuelBlock?.block)throw new f.ServerError(f.Status.INVALID_ARGUMENT,"Block can't be empty");let o=t.data.fuelBlock,r=[];for(let a of t.handlerIds){let s=this.handlers.blockHandlers[a](o).catch(n=>{throw console.error("error processing block: ",n),new f.ServerError(f.Status.INTERNAL,"error processing block: "+o.block?.height+`
5
+ `+O(n))});X.execution.sequential&&await s,r.push(s)}return Y(await Promise.all(r))}};kt.INSTANCE.register(new V);import("node:process").then(e=>e.stdout.write(""));import{ListStateStorage as Nt}from"@sentio/runtime";var G=class e extends Nt{static{i(this,"FuelProcessorTemplateProcessorState")}static INSTANCE=new e},ut=class{static{i(this,"FuelBaseProcessorTemplate")}id;binds=new Set;blockHandlers=[];logHandlers=[];transactionHandlers=[];constructor(){this.id=G.INSTANCE.getValues().length,G.INSTANCE.addValue(this)}bind(t,o){let r=x({address:t.address,chainId:o.chainId});if(this.binds.has(r)){console.log(`Same address can be bind to one template only once, ignore duplicate bind: ${r}`);return}this.binds.add(r);let a=this.bindInternal({...t,chainId:o.chainId});for(let n of this.logHandlers)a.onLog(n.logIdFilter,n.handler);for(let n of this.blockHandlers)a.onInterval(n.handler,n.timeIntervalInMinutes,n.blockInterval);for(let n of this.transactionHandlers)a.onTransaction(n.handler);let s={templateId:this.id,contract:{address:t.address,name:t.name||"",chainId:o.chainId,abi:""},startBlock:BigInt(t.startBlock||0),endBlock:BigInt(t.endBlock||0),baseLabels:{}};R.INSTANCE.addValue(s),o.update({states:{configUpdated:!0}})}onLog(t,o){return this.logHandlers.push({logIdFilter:t,handler:o}),this}onBlockInterval(t,o=1e3,r=4e3){return this.onInterval(t,void 0,{recentInterval:o,backfillInterval:r})}onTimeInterval(t,o=60,r=240){return this.onInterval(t,{recentInterval:o,backfillInterval:r},void 0)}onInterval(t,o,r){return this.blockHandlers.push({handler:t,timeIntervalInMinutes:o,blockInterval:r}),this}onTransaction(t,o=y){return this.transactionHandlers.push({handler:t,fetchConfig:o}),this}};import("node:process").then(e=>e.stdout.write(""));var mt=H(lt(),1);var ft=class extends k{static{i(this,"FuelAbstractProcessor")}constructor(t,o){return o||(o={chainId:mt.FuelChainId.FUEL_MAINNET,address:"*"}),super({...o,abi:t}),b(this)}},gt=class{static{i(this,"TypedCall")}args;returnValue;argsObject;logs};import("node:process").then(e=>e.stdout.write(""));import("node:process").then(e=>e.stdout.write(""));export{h as a,Pt as b,Tt as c,v as d,S as e,I as f,N as g,y as h,w as i,$ as j,z as k,k as l,x as m,pe as n,bt as o,_ as p,D as q,V as r,G as s,ut as t,ft as u,gt as v};
6
+ //# sourceMappingURL=chunk-5O5M5YQD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fuel/fuel-plugin.ts","../src/fuel/types.ts","../src/fuel/network.ts","../src/fuel/context.ts","../src/fuel/transaction.ts","../src/fuel/fuel-processor.ts","../src/fuel/asset-processor.ts","../src/fuel/global-processor.ts","../src/fuel/fuel-processor-template.ts","../src/fuel/base-processor.ts","../src/fuel/index.ts"],"sourcesContent":["import { errorString, GLOBAL_CONFIG, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n ContractConfig,\n Data_FuelBlock,\n Data_FuelReceipt,\n Data_FuelTransaction,\n DataBinding,\n HandlerType,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { FuelAssetProcessor } from './asset-processor.js'\nimport { FuelProcessorState } from './types.js'\nimport { FuelProcessor } from './fuel-processor.js'\nimport { FuelGlobalProcessor } from './global-processor.js'\n\ninterface Handlers {\n transactionHandlers: ((trace: Data_FuelTransaction) => Promise<ProcessResult>)[]\n blockHandlers: ((block: Data_FuelBlock) => Promise<ProcessResult>)[]\n logHandlers: ((log: Data_FuelReceipt) => Promise<ProcessResult>)[]\n}\n\nexport class FuelPlugin extends Plugin {\n name: string = 'FuelPlugin'\n handlers: Handlers = {\n transactionHandlers: [],\n blockHandlers: [],\n logHandlers: []\n }\n\n async configure(config: ProcessConfigResponse) {\n const handlers: Handlers = {\n transactionHandlers: [],\n blockHandlers: [],\n logHandlers: []\n }\n\n for (const processor of FuelProcessorState.INSTANCE.getValues()) {\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: processor.config.chainId.toString(),\n address: processor.config.address || '*',\n abi: ''\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock\n })\n for (const txHandler of processor.txHandlers) {\n const handlerId = handlers.transactionHandlers.push(txHandler.handler) - 1\n const handlerName = txHandler.handlerName\n if (processor instanceof FuelProcessor) {\n // on transaction\n const fetchConfig = {\n handlerId,\n handlerName\n }\n contractConfig.fuelTransactionConfigs.push(fetchConfig)\n } else if (processor instanceof FuelAssetProcessor) {\n const assetConfig = txHandler.assetConfig\n contractConfig.assetConfigs.push({\n filters: assetConfig?.filters || [],\n handlerId,\n handlerName\n })\n } else if (processor instanceof FuelGlobalProcessor) {\n const fetchConfig = {\n handlerId,\n handlerName,\n filters: []\n }\n contractConfig.fuelTransactionConfigs.push(fetchConfig)\n contractConfig.contract!.address = '*'\n }\n }\n\n for (const logHandler of processor.logHandlers ?? []) {\n const handlerId = handlers.logHandlers.push(logHandler.handler) - 1\n const handlerName = logHandler.handlerName\n if (processor instanceof FuelProcessor) {\n contractConfig.fuelLogConfigs.push({\n logIds: logHandler.logConfig?.logIds || [],\n handlerId,\n handlerName\n })\n }\n }\n\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = handlers.blockHandlers.push(blockHandler.handler) - 1\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId: handlerId,\n handlerName: blockHandler.handlerName,\n fetchConfig: undefined\n // fetchConfig: blockHandler.fetchConfig\n })\n }\n\n config.contractConfigs.push(contractConfig)\n }\n\n this.handlers = handlers\n }\n\n supportedHandlers = [\n HandlerType.FUEL_TRANSACTION,\n HandlerType.FUEL_RECEIPT,\n HandlerType.FUEL_CALL,\n HandlerType.FUEL_BLOCK\n ]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n switch (request.handlerType) {\n case HandlerType.FUEL_TRANSACTION:\n return this.processTransaction(request)\n case HandlerType.FUEL_RECEIPT:\n return this.processLog(request)\n case HandlerType.FUEL_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {\n try {\n for (const processor of FuelProcessorState.INSTANCE.getValues()) {\n await processor.configure()\n }\n } catch (e) {\n throw new ServerError(Status.INTERNAL, 'error starting FuelPlugin: ' + errorString(e))\n }\n }\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processLog(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelLog?.transaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"transaction can't be null\")\n }\n const log = binding.data.fuelLog\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.logHandlers[handlerId](log).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(log) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n async processTransaction(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelTransaction?.transaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"transaction can't be null\")\n }\n const fuelTransaction = binding.data.fuelTransaction\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.transactionHandlers[handlerId](fuelTransaction).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(fuelTransaction.transaction) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processBlock(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelBlock?.block) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n const ethBlock = binding.data.fuelBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.blockHandlers[handlerId](ethBlock).catch((e) => {\n console.error('error processing block: ', e)\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + ethBlock.block?.height + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new FuelPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { MapStateStorage } from '@sentio/runtime'\nimport {\n Data_FuelBlock,\n Data_FuelReceipt,\n Data_FuelTransaction,\n FuelAssetHandlerConfig,\n FuelCallHandlerConfig,\n HandleInterval,\n OnIntervalConfig,\n ProcessResult\n} from '@sentio/protos'\nimport { Block, TransactionSummary } from 'fuels'\n\nexport interface FuelBaseProcessor<T> {\n configure(): Promise<void>\n config: T\n txHandlers: CallHandler<Data_FuelTransaction>[]\n blockHandlers: BlockHandler[]\n logHandlers?: LogHandler<Data_FuelReceipt>[]\n}\n\nexport class FuelProcessorState extends MapStateStorage<FuelBaseProcessor<any>> {\n static INSTANCE = new FuelProcessorState()\n}\n\nexport type CallHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n fetchConfig?: Partial<FuelCallHandlerConfig>\n assetConfig?: Partial<FuelAssetHandlerConfig>\n}\n\nexport type LogHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n logConfig?: {\n logIds: string[]\n }\n}\n\nexport type BlockHandler = {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_FuelBlock) => Promise<ProcessResult>\n handlerName: string\n fetchConfig?: Partial<OnIntervalConfig>\n}\n\nexport interface FuelLog<T> {\n logId: string\n data: T\n receiptIndex: number\n}\n\nexport type FuelTransaction = TransactionSummary & {\n blockNumber?: string\n logs?: FuelLog<any>[]\n sender?: string\n}\n\nexport type FuelBlock = Omit<Block, 'transactionIds'>\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { FuelChainId } from '@sentio/chain'\nimport { Endpoints } from '@sentio/runtime'\nimport { Provider } from 'fuels'\n\nexport type FuelNetwork = FuelChainId\nexport const FuelNetwork = <const>{\n MAIN_NET: FuelChainId.FUEL_MAINNET,\n TEST_NET: FuelChainId.FUEL_TESTNET\n}\n\nexport function getRpcEndpoint(network: FuelNetwork): string {\n switch (network) {\n case FuelNetwork.TEST_NET:\n return 'https://testnet.fuel.network/v1/graphql'\n }\n return 'https://mainnet.fuel.network/v1/graphql'\n}\n\nexport function getProvider(network: FuelNetwork): Promise<Provider> {\n let chainServer = Endpoints.INSTANCE.chainServer.get(network)\n if (!chainServer) {\n chainServer = getRpcEndpoint(network)\n // throw new ServerError(Status.INTERNAL, 'RPC endpoint not provided')\n }\n return Provider.create(chainServer)\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { BaseContext, Labels, normalizeLabels } from '../core/index.js'\nimport { FuelChainId } from '@sentio/chain'\nimport { RecordMetaData } from '@sentio/protos'\nimport type { CallResult, Contract } from 'fuels'\nimport { InvocationScopeLike } from 'fuels'\nimport { FuelBlock, FuelLog, FuelTransaction } from './types.js'\n\nexport class FuelCall {\n constructor(\n funcScopes: InvocationScopeLike | Array<InvocationScopeLike>,\n callResult: CallResult,\n isMultiCall: boolean,\n readonly args?: Record<string, any>,\n readonly logs?: FuelLog<unknown>[]\n ) {\n // super(funcScopes, callResult, isMultiCall)\n }\n}\n\nexport class FuelContext extends BaseContext {\n private logIndex: number = -1\n constructor(\n readonly chainId: FuelChainId,\n readonly contractAddress: string,\n readonly contractName: string,\n readonly timestamp: Date,\n readonly transaction: FuelTransaction | null,\n readonly block: FuelBlock | null\n ) {\n super({})\n }\n\n getChainId(): FuelChainId {\n return this.chainId\n }\n\n setLogIndex(logIndex: number): void {\n this.logIndex = logIndex\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.contractAddress,\n contractName: this.contractName,\n blockNumber: BigInt(this.block?.height?.toString() ?? (this.transaction?.blockNumber || 0)),\n transactionIndex: 0,\n transactionHash: this.transaction?.id || '', // TODO\n chainId: this.getChainId(),\n name: name,\n logIndex: this.logIndex,\n labels: normalizeLabels(labels)\n }\n }\n}\n\nexport class FuelContractContext<TContract extends Contract> extends FuelContext {\n constructor(\n readonly chainId: FuelChainId,\n readonly contract: TContract,\n readonly contractAddress: string,\n readonly contractName: string,\n readonly timestamp: Date,\n readonly transaction: FuelTransaction | null,\n readonly block: FuelBlock | null\n ) {\n super(chainId, contractAddress, contractName, timestamp, transaction, block)\n }\n\n get provider() {\n return this.contract.provider\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n AbiMap,\n arrayify,\n assembleTransactionSummary,\n BigNumberCoder,\n bn,\n Input,\n InputType,\n Interface,\n JsonAbi,\n processGqlReceipt,\n Provider,\n ReceiptType,\n TransactionCoder,\n TransactionResponse\n} from 'fuels'\nimport { FuelLog, FuelTransaction } from './types.js'\n\nexport type FuelFetchConfig = {\n includeFailed?: boolean\n}\n\nexport const DEFAULT_FUEL_FETCH_CONFIG: FuelFetchConfig = {\n includeFailed: false\n}\n\nfunction findSenderFromInputs(inputs: Input[] | undefined, baseAssetId: string): string | undefined {\n for (const input of inputs || []) {\n if (input.type == InputType.Coin && input.assetId == baseAssetId) {\n return input.owner\n }\n }\n return undefined\n}\n\nexport function decodeFuelTransaction(gqlTransaction: any, provider: Provider): FuelTransaction {\n const rawPayload = arrayify(gqlTransaction.rawPayload)\n const receipts = gqlTransaction?.status.receipts?.map(processGqlReceipt) || []\n\n const [decodedTransaction] = new TransactionCoder().decode(rawPayload, 0)\n const { gasCosts, feeParameters, txParameters, baseAssetId } = provider.getChain().consensusParameters\n const blockNumber = gqlTransaction.status?.block?.header?.height\n const { gasPriceFactor, gasPerByte } = feeParameters\n const { maxInputs, maxGasPerTx } = txParameters\n const gqlTransactionStatus = {\n type: gqlTransaction.status?.__typename,\n ...gqlTransaction.status\n }\n return {\n ...assembleTransactionSummary({\n id: gqlTransaction.id,\n receipts,\n transaction: decodedTransaction,\n transactionBytes: rawPayload,\n gqlTransactionStatus,\n gasPerByte: bn(gasPerByte),\n gasPriceFactor: bn(gasPriceFactor),\n maxInputs,\n gasCosts,\n gasPrice: bn(gqlTransaction.gasPrice),\n maxGasPerTx,\n baseAssetId\n }),\n blockNumber,\n sender: findSenderFromInputs(decodedTransaction.inputs, baseAssetId)\n }\n}\n\nexport function decodeLog(receipt: any | undefined, abi: JsonAbi) {\n if (receipt && (receipt.type === ReceiptType.LogData || receipt.type === ReceiptType.Log)) {\n const interfaceToUse = new Interface(abi)\n const data = receipt.type === ReceiptType.Log ? new BigNumberCoder('u64').encode(receipt.val0) : receipt.data\n const logId: string = receipt.val1.toString()\n const [decodedLog] = interfaceToUse.decodeLog(data, logId)\n return { logId, data: decodedLog }\n }\n return null\n}\n\nexport async function decodeFuelTransactionWithAbi(\n gqlTransaction: any,\n abiMap: AbiMap,\n provider: Provider\n): Promise<FuelTransaction> {\n const rawPayload = arrayify(gqlTransaction.rawPayload)\n const [decodedTransaction] = new TransactionCoder().decode(rawPayload, 0)\n\n const receipts = gqlTransaction?.status.receipts?.map(processGqlReceipt) || []\n\n // const {\n // consensusParameters: {\n // feeParameters: { gasPerByte, gasPriceFactor },\n // txParameters: { maxInputs, maxGasPerTx },\n // gasCosts\n // }\n // } = provider.getChain()\n //\n const gqlTransactionStatus = {\n type: gqlTransaction.status?.__typename,\n ...gqlTransaction.status\n }\n\n const blockNumber = gqlTransactionStatus?.block?.header?.height\n const abi = Object.values(abiMap)[0]\n const logs = [] as FuelLog<any>[]\n ;(receipts as any[]).forEach((receipt, idx) => {\n try {\n const log = decodeLog(receipt, abi)\n if (log) {\n logs.push({ ...log, receiptIndex: idx })\n }\n } catch (e) {\n console.warn('Failed to decode log', e)\n }\n })\n\n const txResponse = new TransactionResponse(gqlTransaction.status.transactionId, provider, {\n main: Object.values(abiMap)[0],\n otherContractsAbis: {}\n })\n\n // @ts-ignore - hack\n txResponse.gqlTransaction = {\n ...gqlTransaction,\n status: gqlTransactionStatus\n }\n const summary = await txResponse.getTransactionSummary()\n\n return {\n /*...assembleTransactionSummary({\n id: gqlTransaction.id,\n receipts,\n transaction: decodedTransaction,\n transactionBytes: rawPayload,\n gqlTransactionStatus,\n gasPerByte: bn(gasPerByte),\n gasPriceFactor: bn(gasPriceFactor),\n abiMap,\n maxInputs,\n gasCosts,\n maxGasPerTx,\n gasPrice: bn(gqlTransaction.gasPrice)\n }),*/\n ...summary,\n blockNumber,\n logs,\n sender: findSenderFromInputs(decodedTransaction.inputs, provider.getChain().consensusParameters.baseAssetId)\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n Data_FuelBlock,\n Data_FuelTransaction,\n Data_FuelReceipt,\n FuelCallFilter,\n HandleInterval,\n ProcessResult\n} from '@sentio/protos'\nimport { FuelCall, FuelContext, FuelContractContext } from './context.js'\nimport { bn, Contract, Interface, JsonAbi, Provider } from 'fuels'\nimport { FuelNetwork, getProvider } from './network.js'\nimport {\n decodeFuelTransaction,\n decodeFuelTransactionWithAbi,\n decodeLog,\n DEFAULT_FUEL_FETCH_CONFIG,\n FuelFetchConfig\n} from './transaction.js'\nimport {\n BlockHandler,\n CallHandler,\n FuelBaseProcessor,\n FuelBlock,\n FuelLog,\n FuelProcessorState,\n FuelTransaction,\n LogHandler\n} from './types.js'\nimport { PromiseOrVoid } from '../core/index.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class FuelProcessor<TContract extends Contract> implements FuelBaseProcessor<FuelProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers: BlockHandler[] = []\n logHandlers: LogHandler<Data_FuelReceipt>[] = []\n\n private provider: Provider\n private contract: TContract\n\n static bind(config: FuelProcessorConfig): FuelProcessor<any> {\n const processor = new FuelProcessor(config)\n addFuelProcessor(config, processor)\n return processor\n }\n\n constructor(readonly config: FuelProcessorConfig) {\n return proxyProcessor(this)\n }\n\n latestGasPrice: string | undefined\n\n async configure() {\n this.provider = await getProvider(this.config.chainId)\n this.provider.getLatestGasPrice = async () => {\n // avoid flood the endpoint, cache the latest gas price\n if (this.latestGasPrice) {\n return bn(this.latestGasPrice)\n }\n const { latestGasPrice } = await this.provider.operations.getLatestGasPrice()\n this.latestGasPrice = latestGasPrice?.gasPrice\n return bn(latestGasPrice.gasPrice)\n }\n\n this.contract = new Contract(this.config.address, this.config.abi!, this.provider) as TContract\n }\n\n public onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n const abiMap = this.config.abi\n ? {\n [this.config.address]: this.config.abi\n }\n : {}\n const tx = await decodeFuelTransactionWithAbi(call.transaction, abiMap, this.provider)\n\n const ctx = new FuelContractContext(\n this.config.chainId,\n this.contract,\n this.config.address,\n this.config.name ?? this.config.address,\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig: {\n filters: [],\n ...config\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n\n // hide onCall for now\n private onCall(\n nameFilter: string | string[],\n handler: (call: FuelCall, ctx: FuelContext) => void | Promise<void>,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const names = new Set(Array.isArray(nameFilter) ? nameFilter : [nameFilter])\n\n if (!this.config.abi) {\n throw new Error('ABI must be provided to use onCall')\n }\n const abi = this.config.abi\n\n const filters: Record<string, FuelCallFilter> = {}\n const abiInterface = new Interface(abi)\n for (const name of names) {\n try {\n const func = abiInterface.functions[name]\n const filter = bn(func.selector, 'hex').toString()\n filters[func.name] = {\n function: filter,\n includeFailed: !!config.includeFailed\n }\n } catch (e) {\n console.error(e)\n }\n }\n\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n try {\n // const contract = new Contract(this.config.address, abi, this.provider)\n const gqlTransaction = call.transaction\n const tx = await decodeFuelTransactionWithAbi(gqlTransaction, { [this.config.address]: abi }, this.provider)\n\n const ctx = new FuelContext(\n this.config.chainId,\n this.config.address,\n this.config.name ?? this.config.address,\n call.timestamp || new Date(0),\n tx,\n null\n )\n for (const op of tx.operations) {\n for (const call of op.calls || []) {\n if (names.has(call.functionName)) {\n const fn = this.contract.functions[call.functionName]\n const args = Object.values(call.argumentsProvided || {})\n const scope = fn(...args)\n const invocationResult = new FuelCall(scope, tx, false, call.argumentsProvided, tx.logs)\n await handler(invocationResult, ctx)\n }\n }\n }\n\n return ctx.stopAndGetResult()\n } catch (e) {\n console.error(e)\n return {\n gauges: [],\n counters: [],\n events: [],\n exports: [],\n states: {\n configUpdated: false\n }\n }\n }\n },\n fetchConfig: {\n filters: Object.values(filters)\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n\n public onLog<T>(\n logIdFilter: string | string[],\n handler: (logs: FuelLog<T>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n ) {\n const logIds = new Set(Array.isArray(logIdFilter) ? logIdFilter : [logIdFilter])\n\n const logHandler = {\n handlerName: getHandlerName(),\n handler: async ({ transaction, receiptIndex, timestamp }: Data_FuelReceipt) => {\n try {\n const tx = decodeFuelTransaction(transaction, this.provider)\n const index = Number(receiptIndex)\n const receipt = tx.receipts[index]\n const log = decodeLog(receipt, this.config.abi)\n if (log) {\n const ctx = new FuelContractContext(\n this.config.chainId,\n this.contract,\n this.config.address,\n this.config.name ?? this.config.address,\n timestamp || new Date(0),\n tx,\n null\n )\n ctx.setLogIndex(index)\n await handler({ receiptIndex: index, ...log }, ctx)\n return ctx.stopAndGetResult()\n } else {\n console.error(`Log with receipt index ${receiptIndex} not found in tx`)\n }\n } catch (e) {\n console.error(e)\n }\n\n return ProcessResult.fromPartial({})\n },\n logConfig: {\n logIds: Array.from(logIds)\n }\n }\n this.logHandlers.push(logHandler)\n return this\n }\n\n public onInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n // fetchConfig: Partial<FuelFetchConfig> | undefined\n ): this {\n if (timeInterval) {\n if (timeInterval.backfillInterval < timeInterval.recentInterval) {\n timeInterval.backfillInterval = timeInterval.recentInterval\n }\n }\n\n const processor = this\n\n this.blockHandlers.push({\n blockInterval,\n timeIntervalInMinutes: timeInterval,\n handlerName: getHandlerName(),\n handler: async function (data: Data_FuelBlock) {\n const header = data.block\n if (!header) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const block: FuelBlock = {\n id: header.id,\n height: bn(header.height),\n time: header.time,\n header: {\n applicationHash: header.applicationHash,\n daHeight: bn(header.daHeight),\n eventInboxRoot: header.eventInboxRoot,\n messageOutboxRoot: header.messageOutboxRoot,\n prevRoot: header.prevRoot,\n stateTransitionBytecodeVersion: header.stateTransitionBytecodeVersion,\n transactionsCount: header.transactionsCount,\n transactionsRoot: header.transactionsRoot\n }\n }\n\n const ctx = new FuelContractContext(\n processor.config.chainId,\n processor.contract,\n processor.config.address,\n processor.config.name ?? processor.config.address,\n data.timestamp || new Date(0),\n null,\n block\n )\n await handler(block, ctx)\n return ctx.stopAndGetResult()\n }\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000\n // fetchConfig?: Partial<FuelFetchConfig>\n ): this {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n }\n // fetchConfig,\n )\n }\n\n public onTimeInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240\n // fetchConfig?: Partial<FuelFetchConfig>,\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined\n // fetchConfig\n )\n }\n}\n\nexport type FuelProcessorConfig = {\n address: string\n name?: string\n chainId: FuelNetwork\n startBlock?: bigint\n endBlock?: bigint\n abi: JsonAbi\n}\n\nexport function getOptionsSignature(opts: Omit<FuelProcessorConfig, 'abi'>): string {\n const sig = [opts.address]\n if (opts.chainId) {\n sig.push(opts.chainId)\n }\n if (opts.name) {\n sig.push(opts.name)\n }\n if (opts.startBlock) {\n sig.push(opts.startBlock.toString())\n }\n if (opts.endBlock) {\n sig.push(opts.endBlock.toString())\n }\n return sig.join('_')\n}\n\n// Dedup processor that bind multiple times\nexport function getFuelProcessor(opts: Omit<FuelProcessorConfig, 'abi'>) {\n const sig = getOptionsSignature(opts)\n return FuelProcessorState.INSTANCE.getValue(sig)\n}\n\nexport function addFuelProcessor(opts: Omit<FuelProcessorConfig, 'abi'>, processor: FuelBaseProcessor<any>) {\n const sig = getOptionsSignature(opts)\n\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { CallHandler, FuelBaseProcessor, FuelProcessorState } from './types.js'\nimport { Data_FuelTransaction, FuelAssetHandlerConfig_AssetFilter } from '@sentio/protos'\nimport { FuelNetwork, getProvider } from './network.js'\nimport { FuelContext } from './context.js'\nimport { decodeFuelTransaction } from './transaction.js'\nimport { Provider, InputType, OutputType } from 'fuels'\nimport { getOptionsSignature } from './fuel-processor.js'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class FuelAssetProcessor implements FuelBaseProcessor<FuelAssetProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers = []\n private provider: Provider\n\n static bind(config: FuelAssetProcessorConfig): FuelAssetProcessor {\n const processor = new FuelAssetProcessor(config)\n const sig =\n 'assets_' +\n getOptionsSignature({\n ...config,\n address: '*'\n })\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n return processor\n }\n\n constructor(readonly config: FuelAssetProcessorConfig) {\n return proxyProcessor(this)\n }\n\n async configure(): Promise<void> {\n this.provider = await getProvider(this.config.chainId)\n }\n\n onTransfer(filter: TransferFilter, handler: (transfers: FuelTransfer, ctx: FuelContext) => void | Promise<void>) {\n const filters: FuelAssetHandlerConfig_AssetFilter[] = []\n\n const assetIds = arrayify(filter.assetId)\n const froms = arrayify(filter.from)\n const tos = arrayify(filter.to)\n\n for (const assetId of assetIds) {\n for (const from of froms) {\n for (const to of tos) {\n filters.push({\n assetId: assetId,\n fromAddress: from,\n toAddress: to\n })\n }\n }\n }\n\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n const gqlTransaction = call.transaction\n const tx = decodeFuelTransaction(gqlTransaction, this.provider)\n\n const transfer: FuelTransfer = {\n from: [],\n to: []\n }\n for (const input of tx.transaction.inputs || []) {\n if (input.type == InputType.Coin) {\n transfer.from.push({\n address: input.owner,\n assetId: input.assetId,\n amount: BigInt(input.amount.toString(10))\n })\n }\n }\n\n for (const output of tx.transaction.outputs || []) {\n if (output.type == OutputType.Coin) {\n const value = output.amount.toString(10)\n transfer.to.push({\n address: output.to,\n amount: BigInt(value),\n assetId: output.assetId\n })\n }\n }\n\n const assetId = transfer.from[0].assetId || ''\n\n const ctx = new FuelContext(\n this.config.chainId,\n assetId,\n this.config.name ?? '',\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(transfer, ctx)\n return ctx.stopAndGetResult()\n },\n assetConfig: {\n filters\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n}\n\nexport type FuelAssetProcessorConfig = {\n name?: string\n chainId: FuelNetwork\n startBlock?: bigint\n endBlock?: bigint\n}\n\nexport type TransferFilter = {\n from?: string | string[]\n to?: string | string[]\n assetId?: string | string[]\n}\n\nexport type FuelTransfer = {\n from: {\n assetId: string\n address: string\n amount: bigint\n }[]\n to: {\n address: string\n amount: bigint\n assetId: string\n }[]\n}\n\nfunction arrayify(value?: string | string[]): Array<string | undefined> {\n if (value) {\n if (Array.isArray(value)) {\n return value.length > 0 ? value : [undefined]\n }\n return [value]\n }\n return [undefined]\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { CallHandler, FuelBaseProcessor, FuelProcessorState, FuelTransaction } from './types.js'\nimport { Data_FuelTransaction } from '@sentio/protos'\nimport { Provider } from 'fuels'\nimport { getProvider } from './network.js'\nimport { decodeFuelTransaction, DEFAULT_FUEL_FETCH_CONFIG, FuelFetchConfig } from './transaction.js'\nimport { FuelContext } from './context.js'\nimport { FuelProcessorConfig, getOptionsSignature } from './fuel-processor.js'\nimport { mergeProcessResults } from '@sentio/runtime'\nimport { ALL_ADDRESS } from '../core/index.js'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\ntype GlobalFuelProcessorConfig = Omit<FuelProcessorConfig, 'address' | 'abi'>\n\nexport class FuelGlobalProcessor implements FuelBaseProcessor<GlobalFuelProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers = []\n\n private provider: Provider\n\n static bind(config: GlobalFuelProcessorConfig): FuelGlobalProcessor {\n const processor = new FuelGlobalProcessor(config)\n const sig =\n 'global_' +\n getOptionsSignature({\n ...config,\n address: ALL_ADDRESS\n })\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n return processor\n }\n\n constructor(readonly config: GlobalFuelProcessorConfig) {\n return proxyProcessor(this)\n }\n\n async configure() {\n this.provider = await getProvider(this.config.chainId)\n }\n\n public onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContext) => void | Promise<void>,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n let tx: FuelTransaction\n try {\n tx = decodeFuelTransaction(call.transaction, this.provider)\n } catch (e) {\n console.error('error decoding transaction', e)\n return mergeProcessResults([])\n }\n const ctx = new FuelContext(\n this.config.chainId,\n ALL_ADDRESS,\n this.config.name ?? '*',\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig: {\n filters: [],\n ...config\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { FuelContext, FuelContractContext } from './context.js'\nimport { HandleInterval, TemplateInstance } from '@sentio/protos'\nimport { PromiseOrVoid } from '../core/promises.js'\nimport { ListStateStorage } from '@sentio/runtime'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { Contract } from 'fuels'\nimport { FuelBlock, FuelLog, FuelTransaction } from './types.js'\nimport { DEFAULT_FUEL_FETCH_CONFIG, FuelFetchConfig } from './transaction.js'\nimport { FuelProcessor, FuelProcessorConfig, getOptionsSignature } from './fuel-processor.js'\n\nexport class FuelProcessorTemplateProcessorState extends ListStateStorage<FuelBaseProcessorTemplate<Contract>> {\n static INSTANCE = new FuelProcessorTemplateProcessorState()\n}\n\nexport abstract class FuelBaseProcessorTemplate<TContract extends Contract> {\n id: number\n binds = new Set<string>()\n blockHandlers: {\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n // fetchConfig?: FuelFetchConfig\n }[] = []\n\n logHandlers: {\n logIdFilter: string | string[]\n handler: (logs: FuelLog<any>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n // fetchConfig?: FuelFetchConfig\n }[] = []\n\n transactionHandlers: {\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n fetchConfig: FuelFetchConfig\n }[] = []\n\n constructor() {\n this.id = FuelProcessorTemplateProcessorState.INSTANCE.getValues().length\n FuelProcessorTemplateProcessorState.INSTANCE.addValue(this)\n }\n\n /**\n * Bind template using {@param options}, using {@param ctx}'s network value if not provided in the option\n * @param options\n * @param ctx\n */\n public bind(options: Omit<Omit<FuelProcessorConfig, 'chainId'>, 'abi'>, ctx: FuelContext): void {\n const sig = getOptionsSignature({\n address: options.address,\n chainId: ctx.chainId\n })\n if (this.binds.has(sig)) {\n console.log(`Same address can be bind to one template only once, ignore duplicate bind: ${sig}`)\n return\n }\n this.binds.add(sig)\n\n const processor = this.bindInternal({ ...options, chainId: ctx.chainId })\n\n for (const eh of this.logHandlers) {\n processor.onLog(eh.logIdFilter, eh.handler)\n }\n for (const bh of this.blockHandlers) {\n processor.onInterval(bh.handler, bh.timeIntervalInMinutes, bh.blockInterval)\n }\n for (const th of this.transactionHandlers) {\n processor.onTransaction(th.handler)\n }\n\n const instance: TemplateInstance = {\n templateId: this.id,\n contract: {\n address: options.address,\n name: options.name || '',\n chainId: ctx.chainId,\n abi: ''\n },\n startBlock: BigInt(options.startBlock || 0),\n endBlock: BigInt(options.endBlock || 0),\n baseLabels: {}\n // baseLabels: options.baseLabels\n }\n TemplateInstanceState.INSTANCE.addValue(instance)\n ctx.update({\n states: {\n configUpdated: true\n }\n })\n }\n\n protected onLog<T>(\n logIdFilter: string | string[],\n handler: (logs: FuelLog<T>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n this.logHandlers.push({\n logIdFilter,\n handler\n // fetchConfig: { ...fetchConfig}\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n blockInterval = 1000,\n backfillBlockInterval = 4000\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n }\n // fetchConfig\n )\n }\n\n public onTimeInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillBlockInterval = 240\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillBlockInterval },\n undefined\n // fetchConfig\n )\n }\n\n public onInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n // fetchConfig?: FuelFetchConfig\n ) {\n this.blockHandlers.push({\n handler,\n timeIntervalInMinutes: timeInterval,\n blockInterval\n // fetchConfig: { ...fetchConfig }\n })\n return this\n }\n\n protected onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n this.transactionHandlers.push({\n handler,\n fetchConfig: config\n })\n return this\n }\n\n protected abstract bindInternal(options: Omit<FuelProcessorConfig, 'abi'>): FuelProcessor<TContract>\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { addFuelProcessor, FuelProcessor, FuelProcessorConfig } from './fuel-processor.js'\nimport { Contract, JsonAbi } from 'fuels'\n// import { FuelCall } from './context.js'\nimport { FuelChainId } from '@sentio/chain'\nimport { FuelLog } from './types.js'\nimport { proxyProcessor } from '../utils/metrics.js'\n\nexport abstract class FuelAbstractProcessor<TContract extends Contract> extends FuelProcessor<TContract> {\n protected constructor(abi: JsonAbi, config?: Omit<FuelProcessorConfig, 'abi'>) {\n if (!config) {\n config = {\n chainId: FuelChainId.FUEL_MAINNET,\n address: '*'\n }\n }\n super({\n ...config,\n abi\n })\n addFuelProcessor(config, this)\n return proxyProcessor(this)\n }\n}\n\nexport class TypedCall<T extends Array<any>, R> {\n args: T\n returnValue: R\n argsObject?: Record<string, any>\n logs?: FuelLog<unknown>[]\n\n // constructor(call: FuelCall) {\n // this.args = call.args as T\n // this.returnValue = call.value as R\n // this.argsObject = call.args\n // this.logs = call.logs\n // }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","export { FuelPlugin } from './fuel-plugin.js'\nexport * from './context.js'\nexport * from './fuel-processor.js'\nexport * from './fuel-processor-template.js'\nexport * from './network.js'\nexport * from './transaction.js'\nexport * from './base-processor.js'\nexport * from './asset-processor.js'\nexport * from './types.js'\nexport * from './global-processor.js'\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["errorString","GLOBAL_CONFIG","mergeProcessResults","Plugin","PluginManager","USER_PROCESSOR","import_nice_grpc","MapStateStorage","FuelProcessorState","_FuelProcessorState","MapStateStorage","__name","p","import_chain","Endpoints","FuelNetwork","getRpcEndpoint","network","__name","getProvider","chainServer","Endpoints","Provider","p","FuelCall","funcScopes","callResult","isMultiCall","args","logs","__name","FuelContext","BaseContext","chainId","contractAddress","contractName","timestamp","transaction","block","logIndex","name","labels","normalizeLabels","FuelContractContext","contract","p","DEFAULT_FUEL_FETCH_CONFIG","findSenderFromInputs","inputs","baseAssetId","input","InputType","__name","decodeFuelTransaction","gqlTransaction","provider","rawPayload","arrayify","receipts","processGqlReceipt","decodedTransaction","TransactionCoder","gasCosts","feeParameters","txParameters","blockNumber","gasPriceFactor","gasPerByte","maxInputs","maxGasPerTx","gqlTransactionStatus","assembleTransactionSummary","bn","decodeLog","receipt","abi","ReceiptType","interfaceToUse","Interface","data","BigNumberCoder","logId","decodedLog","decodeFuelTransactionWithAbi","abiMap","logs","idx","log","e","txResponse","TransactionResponse","p","import_nice_grpc","FuelProcessor","_FuelProcessor","config","proxyProcessor","__name","processor","addFuelProcessor","getProvider","bn","latestGasPrice","Contract","handler","DEFAULT_FUEL_FETCH_CONFIG","callHandler","getHandlerName","call","abiMap","tx","decodeFuelTransactionWithAbi","ctx","FuelContractContext","nameFilter","names","abi","filters","abiInterface","Interface","name","func","filter","e","gqlTransaction","FuelContext","op","fn","args","scope","invocationResult","FuelCall","logIdFilter","logIds","logHandler","transaction","receiptIndex","timestamp","decodeFuelTransaction","index","receipt","log","decodeLog","ProcessResult","timeInterval","blockInterval","data","header","block","backfillBlockInterval","timeIntervalInMinutes","backfillTimeIntervalInMinutes","getOptionsSignature","opts","sig","getFuelProcessor","FuelProcessorState","p","FuelAssetProcessor","_FuelAssetProcessor","config","proxyProcessor","__name","processor","sig","getOptionsSignature","FuelProcessorState","getProvider","filter","handler","filters","assetIds","arrayify","froms","tos","assetId","from","to","callHandler","getHandlerName","call","gqlTransaction","tx","decodeFuelTransaction","transfer","input","InputType","output","OutputType","value","ctx","FuelContext","p","mergeProcessResults","FuelGlobalProcessor","_FuelGlobalProcessor","config","proxyProcessor","__name","processor","sig","getOptionsSignature","ALL_ADDRESS","FuelProcessorState","getProvider","handler","DEFAULT_FUEL_FETCH_CONFIG","callHandler","getHandlerName","call","tx","decodeFuelTransaction","e","mergeProcessResults","ctx","FuelContext","p","FuelPlugin","Plugin","__name","config","handlers","processor","FuelProcessorState","contractConfig","ContractConfig","USER_PROCESSOR","txHandler","handlerId","handlerName","FuelProcessor","fetchConfig","FuelAssetProcessor","assetConfig","FuelGlobalProcessor","logHandler","blockHandler","HandlerType","request","errorString","TemplateInstanceState","binding","log","promises","promise","e","GLOBAL_CONFIG","mergeProcessResults","fuelTransaction","ethBlock","PluginManager","p","ListStateStorage","FuelProcessorTemplateProcessorState","_FuelProcessorTemplateProcessorState","ListStateStorage","__name","FuelBaseProcessorTemplate","options","ctx","sig","getOptionsSignature","processor","eh","bh","th","instance","TemplateInstanceState","logIdFilter","handler","blockInterval","backfillBlockInterval","timeIntervalInMinutes","timeInterval","config","DEFAULT_FUEL_FETCH_CONFIG","p","import_chain","FuelAbstractProcessor","FuelProcessor","__name","abi","config","addFuelProcessor","proxyProcessor","TypedCall","p","p"]}
1
+ {"version":3,"sources":["../src/fuel/fuel-plugin.ts","../src/fuel/types.ts","../src/fuel/network.ts","../src/fuel/context.ts","../src/fuel/transaction.ts","../src/fuel/fuel-processor.ts","../src/fuel/asset-processor.ts","../src/fuel/global-processor.ts","../src/fuel/fuel-processor-template.ts","../src/fuel/base-processor.ts","../src/fuel/index.ts"],"sourcesContent":["import { errorString, GLOBAL_CONFIG, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n ContractConfig,\n Data_FuelBlock,\n Data_FuelReceipt,\n Data_FuelTransaction,\n DataBinding,\n HandlerType,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { FuelAssetProcessor } from './asset-processor.js'\nimport { FuelProcessorState } from './types.js'\nimport { FuelProcessor } from './fuel-processor.js'\nimport { FuelGlobalProcessor } from './global-processor.js'\n\ninterface Handlers {\n transactionHandlers: ((trace: Data_FuelTransaction) => Promise<ProcessResult>)[]\n blockHandlers: ((block: Data_FuelBlock) => Promise<ProcessResult>)[]\n logHandlers: ((log: Data_FuelReceipt) => Promise<ProcessResult>)[]\n}\n\nexport class FuelPlugin extends Plugin {\n name: string = 'FuelPlugin'\n handlers: Handlers = {\n transactionHandlers: [],\n blockHandlers: [],\n logHandlers: []\n }\n\n async configure(config: ProcessConfigResponse) {\n const handlers: Handlers = {\n transactionHandlers: [],\n blockHandlers: [],\n logHandlers: []\n }\n\n for (const processor of FuelProcessorState.INSTANCE.getValues()) {\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: processor.config.chainId.toString(),\n address: processor.config.address || '*',\n abi: ''\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock\n })\n for (const txHandler of processor.txHandlers) {\n const handlerId = handlers.transactionHandlers.push(txHandler.handler) - 1\n const handlerName = txHandler.handlerName\n if (processor instanceof FuelProcessor) {\n // on transaction\n const fetchConfig = {\n handlerId,\n handlerName\n }\n contractConfig.fuelTransactionConfigs.push(fetchConfig)\n } else if (processor instanceof FuelAssetProcessor) {\n const assetConfig = txHandler.assetConfig\n contractConfig.assetConfigs.push({\n filters: assetConfig?.filters || [],\n handlerId,\n handlerName\n })\n } else if (processor instanceof FuelGlobalProcessor) {\n const fetchConfig = {\n handlerId,\n handlerName,\n filters: []\n }\n contractConfig.fuelTransactionConfigs.push(fetchConfig)\n contractConfig.contract!.address = '*'\n }\n }\n\n for (const logHandler of processor.logHandlers ?? []) {\n const handlerId = handlers.logHandlers.push(logHandler.handler) - 1\n const handlerName = logHandler.handlerName\n if (processor instanceof FuelProcessor) {\n contractConfig.fuelLogConfigs.push({\n logIds: logHandler.logConfig?.logIds || [],\n handlerId,\n handlerName\n })\n }\n }\n\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = handlers.blockHandlers.push(blockHandler.handler) - 1\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId: handlerId,\n handlerName: blockHandler.handlerName,\n fetchConfig: undefined\n // fetchConfig: blockHandler.fetchConfig\n })\n }\n\n config.contractConfigs.push(contractConfig)\n }\n\n this.handlers = handlers\n }\n\n supportedHandlers = [\n HandlerType.FUEL_TRANSACTION,\n HandlerType.FUEL_RECEIPT,\n HandlerType.FUEL_CALL,\n HandlerType.FUEL_BLOCK\n ]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n switch (request.handlerType) {\n case HandlerType.FUEL_TRANSACTION:\n return this.processTransaction(request)\n case HandlerType.FUEL_RECEIPT:\n return this.processLog(request)\n case HandlerType.FUEL_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {\n try {\n for (const processor of FuelProcessorState.INSTANCE.getValues()) {\n await processor.configure()\n }\n } catch (e) {\n throw new ServerError(Status.INTERNAL, 'error starting FuelPlugin: ' + errorString(e))\n }\n }\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processLog(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelLog?.transaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"transaction can't be null\")\n }\n const log = binding.data.fuelLog\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.logHandlers[handlerId](log).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(log) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n async processTransaction(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelTransaction?.transaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"transaction can't be null\")\n }\n const fuelTransaction = binding.data.fuelTransaction\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.transactionHandlers[handlerId](fuelTransaction).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(fuelTransaction.transaction) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processBlock(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.fuelBlock?.block) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n const ethBlock = binding.data.fuelBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.blockHandlers[handlerId](ethBlock).catch((e) => {\n console.error('error processing block: ', e)\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + ethBlock.block?.height + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new FuelPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { MapStateStorage } from '@sentio/runtime'\nimport {\n Data_FuelBlock,\n Data_FuelReceipt,\n Data_FuelTransaction,\n FuelAssetHandlerConfig,\n FuelCallHandlerConfig,\n HandleInterval,\n OnIntervalConfig,\n ProcessResult\n} from '@sentio/protos'\nimport { Block, TransactionSummary } from 'fuels'\n\nexport interface FuelBaseProcessor<T> {\n configure(): Promise<void>\n config: T\n txHandlers: CallHandler<Data_FuelTransaction>[]\n blockHandlers: BlockHandler[]\n logHandlers?: LogHandler<Data_FuelReceipt>[]\n}\n\nexport class FuelProcessorState extends MapStateStorage<FuelBaseProcessor<any>> {\n static INSTANCE = new FuelProcessorState()\n}\n\nexport type CallHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n fetchConfig?: Partial<FuelCallHandlerConfig>\n assetConfig?: Partial<FuelAssetHandlerConfig>\n}\n\nexport type LogHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n logConfig?: {\n logIds: string[]\n }\n}\n\nexport type BlockHandler = {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_FuelBlock) => Promise<ProcessResult>\n handlerName: string\n fetchConfig?: Partial<OnIntervalConfig>\n}\n\nexport interface FuelLog<T> {\n logId: string\n data: T\n receiptIndex: number\n}\n\nexport type FuelTransaction = TransactionSummary & {\n blockNumber?: string\n logs?: FuelLog<any>[]\n sender?: string\n}\n\nexport type FuelBlock = Omit<Block, 'transactionIds'>\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { FuelChainId } from '@sentio/chain'\nimport { Endpoints } from '@sentio/runtime'\nimport { Provider } from 'fuels'\n\nexport type FuelNetwork = FuelChainId\nexport const FuelNetwork = <const>{\n MAIN_NET: FuelChainId.FUEL_MAINNET,\n TEST_NET: FuelChainId.FUEL_TESTNET\n}\n\nexport function getRpcEndpoint(network: FuelNetwork): string {\n switch (network) {\n case FuelNetwork.TEST_NET:\n return 'https://testnet.fuel.network/v1/graphql'\n }\n return 'https://mainnet.fuel.network/v1/graphql'\n}\n\nexport function getProvider(network: FuelNetwork): Promise<Provider> {\n let chainServer = Endpoints.INSTANCE.chainServer.get(network)\n if (!chainServer) {\n chainServer = getRpcEndpoint(network)\n // throw new ServerError(Status.INTERNAL, 'RPC endpoint not provided')\n }\n return Provider.create(chainServer)\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { BaseContext, Labels, normalizeLabels } from '../core/index.js'\nimport { FuelChainId } from '@sentio/chain'\nimport { RecordMetaData } from '@sentio/protos'\nimport type { CallResult, Contract } from 'fuels'\nimport { InvocationScopeLike } from 'fuels'\nimport { FuelBlock, FuelLog, FuelTransaction } from './types.js'\n\nexport class FuelCall {\n constructor(\n funcScopes: InvocationScopeLike | Array<InvocationScopeLike>,\n callResult: CallResult,\n isMultiCall: boolean,\n readonly args?: Record<string, any>,\n readonly logs?: FuelLog<unknown>[]\n ) {\n // super(funcScopes, callResult, isMultiCall)\n }\n}\n\nexport class FuelContext extends BaseContext {\n private logIndex: number = -1\n constructor(\n readonly chainId: FuelChainId,\n readonly contractAddress: string,\n readonly contractName: string,\n readonly timestamp: Date,\n readonly transaction: FuelTransaction | null,\n readonly block: FuelBlock | null\n ) {\n super({})\n }\n\n getChainId(): FuelChainId {\n return this.chainId\n }\n\n setLogIndex(logIndex: number): void {\n this.logIndex = logIndex\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.contractAddress,\n contractName: this.contractName,\n blockNumber: BigInt(this.block?.height?.toString() ?? (this.transaction?.blockNumber || 0)),\n transactionIndex: 0,\n transactionHash: this.transaction?.id || '', // TODO\n chainId: this.getChainId(),\n name: name,\n logIndex: this.logIndex,\n labels: normalizeLabels(labels)\n }\n }\n}\n\nexport class FuelContractContext<TContract extends Contract> extends FuelContext {\n constructor(\n readonly chainId: FuelChainId,\n readonly contract: TContract,\n readonly contractAddress: string,\n readonly contractName: string,\n readonly timestamp: Date,\n readonly transaction: FuelTransaction | null,\n readonly block: FuelBlock | null\n ) {\n super(chainId, contractAddress, contractName, timestamp, transaction, block)\n }\n\n get provider() {\n return this.contract.provider\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n AbiMap,\n arrayify,\n assembleTransactionSummary,\n BigNumberCoder,\n bn,\n Input,\n InputType,\n Interface,\n JsonAbi,\n processGqlReceipt,\n Provider,\n ReceiptType,\n TransactionCoder,\n TransactionResponse\n} from 'fuels'\nimport { FuelLog, FuelTransaction } from './types.js'\n\nexport type FuelFetchConfig = {\n includeFailed?: boolean\n}\n\nexport const DEFAULT_FUEL_FETCH_CONFIG: FuelFetchConfig = {\n includeFailed: false\n}\n\nfunction findSenderFromInputs(inputs: Input[] | undefined, baseAssetId: string): string | undefined {\n for (const input of inputs || []) {\n if (input.type == InputType.Coin && input.assetId == baseAssetId) {\n return input.owner\n }\n }\n return undefined\n}\n\nexport function decodeFuelTransaction(gqlTransaction: any, provider: Provider): FuelTransaction {\n const rawPayload = arrayify(gqlTransaction.rawPayload)\n const receipts = gqlTransaction?.status.receipts?.map(processGqlReceipt) || []\n\n const [decodedTransaction] = new TransactionCoder().decode(rawPayload, 0)\n const { gasCosts, feeParameters, txParameters, baseAssetId } = provider.getChain().consensusParameters\n const blockNumber = gqlTransaction.status?.block?.header?.height\n const { gasPriceFactor, gasPerByte } = feeParameters\n const { maxInputs, maxGasPerTx } = txParameters\n const gqlTransactionStatus = {\n type: gqlTransaction.status?.__typename,\n ...gqlTransaction.status\n }\n return {\n ...assembleTransactionSummary({\n id: gqlTransaction.id,\n receipts,\n transaction: decodedTransaction,\n transactionBytes: rawPayload,\n gqlTransactionStatus,\n gasPerByte: bn(gasPerByte),\n gasPriceFactor: bn(gasPriceFactor),\n maxInputs,\n gasCosts,\n gasPrice: bn(gqlTransaction.gasPrice),\n maxGasPerTx,\n baseAssetId\n }),\n blockNumber,\n sender: findSenderFromInputs(decodedTransaction.inputs, baseAssetId)\n }\n}\n\nexport function decodeLog(receipt: any | undefined, abi: JsonAbi) {\n if (receipt && (receipt.type === ReceiptType.LogData || receipt.type === ReceiptType.Log)) {\n const interfaceToUse = new Interface(abi)\n const data = receipt.type === ReceiptType.Log ? new BigNumberCoder('u64').encode(receipt.val0) : receipt.data\n const logId: string = receipt.val1.toString()\n const [decodedLog] = interfaceToUse.decodeLog(data, logId)\n return { logId, data: decodedLog }\n }\n return null\n}\n\nexport async function decodeFuelTransactionWithAbi(\n gqlTransaction: any,\n abiMap: AbiMap,\n provider: Provider\n): Promise<FuelTransaction> {\n const rawPayload = arrayify(gqlTransaction.rawPayload)\n const [decodedTransaction] = new TransactionCoder().decode(rawPayload, 0)\n\n const receipts = gqlTransaction?.status.receipts?.map(processGqlReceipt) || []\n\n // const {\n // consensusParameters: {\n // feeParameters: { gasPerByte, gasPriceFactor },\n // txParameters: { maxInputs, maxGasPerTx },\n // gasCosts\n // }\n // } = provider.getChain()\n //\n const gqlTransactionStatus = {\n type: gqlTransaction.status?.__typename,\n ...gqlTransaction.status\n }\n\n const blockNumber = gqlTransactionStatus?.block?.header?.height\n const abi = Object.values(abiMap)[0]\n const logs = [] as FuelLog<any>[]\n ;(receipts as any[]).forEach((receipt, idx) => {\n try {\n const log = decodeLog(receipt, abi)\n if (log) {\n logs.push({ ...log, receiptIndex: idx })\n }\n } catch (e) {\n console.warn('Failed to decode log', e)\n }\n })\n\n const txResponse = new TransactionResponse(gqlTransaction.status.transactionId, provider, {\n main: Object.values(abiMap)[0],\n otherContractsAbis: {}\n })\n\n // @ts-ignore - hack\n txResponse.gqlTransaction = {\n ...gqlTransaction,\n status: gqlTransactionStatus\n }\n const summary = await txResponse.getTransactionSummary()\n\n return {\n /*...assembleTransactionSummary({\n id: gqlTransaction.id,\n receipts,\n transaction: decodedTransaction,\n transactionBytes: rawPayload,\n gqlTransactionStatus,\n gasPerByte: bn(gasPerByte),\n gasPriceFactor: bn(gasPriceFactor),\n abiMap,\n maxInputs,\n gasCosts,\n maxGasPerTx,\n gasPrice: bn(gqlTransaction.gasPrice)\n }),*/\n ...summary,\n blockNumber,\n logs,\n sender: findSenderFromInputs(decodedTransaction.inputs, provider.getChain().consensusParameters.baseAssetId)\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n Data_FuelBlock,\n Data_FuelTransaction,\n Data_FuelReceipt,\n FuelCallFilter,\n HandleInterval,\n ProcessResult\n} from '@sentio/protos'\nimport { FuelCall, FuelContext, FuelContractContext } from './context.js'\nimport { bn, Contract, Interface, JsonAbi, Provider } from 'fuels'\nimport { FuelNetwork, getProvider } from './network.js'\nimport {\n decodeFuelTransaction,\n decodeFuelTransactionWithAbi,\n decodeLog,\n DEFAULT_FUEL_FETCH_CONFIG,\n FuelFetchConfig\n} from './transaction.js'\nimport {\n BlockHandler,\n CallHandler,\n FuelBaseProcessor,\n FuelBlock,\n FuelLog,\n FuelProcessorState,\n FuelTransaction,\n LogHandler\n} from './types.js'\nimport { PromiseOrVoid } from '../core/index.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class FuelProcessor<TContract extends Contract> implements FuelBaseProcessor<FuelProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers: BlockHandler[] = []\n logHandlers: LogHandler<Data_FuelReceipt>[] = []\n\n private provider: Provider\n private contract: TContract\n\n static bind(config: FuelProcessorConfig): FuelProcessor<any> {\n const processor = new FuelProcessor(config)\n addFuelProcessor(config, processor)\n return processor\n }\n\n constructor(readonly config: FuelProcessorConfig) {\n return proxyProcessor(this)\n }\n\n latestGasPrice: string | undefined\n\n async configure() {\n this.provider = await getProvider(this.config.chainId)\n this.provider.getLatestGasPrice = async () => {\n // avoid flood the endpoint, cache the latest gas price\n if (this.latestGasPrice) {\n return bn(this.latestGasPrice)\n }\n const { latestGasPrice } = await this.provider.operations.getLatestGasPrice()\n this.latestGasPrice = latestGasPrice?.gasPrice\n return bn(latestGasPrice.gasPrice)\n }\n\n this.contract = new Contract(this.config.address, this.config.abi!, this.provider) as TContract\n }\n\n public onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n const abiMap = this.config.abi\n ? {\n [this.config.address]: this.config.abi\n }\n : {}\n const tx = await decodeFuelTransactionWithAbi(call.transaction, abiMap, this.provider)\n\n const ctx = new FuelContractContext(\n this.config.chainId,\n this.contract,\n this.config.address,\n this.config.name ?? this.config.address,\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig: {\n filters: [],\n ...config\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n\n // hide onCall for now\n private onCall(\n nameFilter: string | string[],\n handler: (call: FuelCall, ctx: FuelContext) => void | Promise<void>,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const names = new Set(Array.isArray(nameFilter) ? nameFilter : [nameFilter])\n\n if (!this.config.abi) {\n throw new Error('ABI must be provided to use onCall')\n }\n const abi = this.config.abi\n\n const filters: Record<string, FuelCallFilter> = {}\n const abiInterface = new Interface(abi)\n for (const name of names) {\n try {\n const func = abiInterface.functions[name]\n const filter = bn(func.selector, 'hex').toString()\n filters[func.name] = {\n function: filter,\n includeFailed: !!config.includeFailed\n }\n } catch (e) {\n console.error(e)\n }\n }\n\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n try {\n // const contract = new Contract(this.config.address, abi, this.provider)\n const gqlTransaction = call.transaction\n const tx = await decodeFuelTransactionWithAbi(gqlTransaction, { [this.config.address]: abi }, this.provider)\n\n const ctx = new FuelContext(\n this.config.chainId,\n this.config.address,\n this.config.name ?? this.config.address,\n call.timestamp || new Date(0),\n tx,\n null\n )\n for (const op of tx.operations) {\n for (const call of op.calls || []) {\n if (names.has(call.functionName)) {\n const fn = this.contract.functions[call.functionName]\n const args = Object.values(call.argumentsProvided || {})\n const scope = fn(...args)\n const invocationResult = new FuelCall(scope, tx, false, call.argumentsProvided, tx.logs)\n await handler(invocationResult, ctx)\n }\n }\n }\n\n return ctx.stopAndGetResult()\n } catch (e) {\n console.error(e)\n return {\n gauges: [],\n counters: [],\n events: [],\n exports: [],\n states: {\n configUpdated: false\n }\n }\n }\n },\n fetchConfig: {\n filters: Object.values(filters)\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n\n public onLog<T>(\n logIdFilter: string | string[],\n handler: (logs: FuelLog<T>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n ) {\n const logIds = new Set(Array.isArray(logIdFilter) ? logIdFilter : [logIdFilter])\n\n const logHandler = {\n handlerName: getHandlerName(),\n handler: async ({ transaction, receiptIndex, timestamp }: Data_FuelReceipt) => {\n try {\n const tx = decodeFuelTransaction(transaction, this.provider)\n const index = Number(receiptIndex)\n const receipt = tx.receipts[index]\n const log = decodeLog(receipt, this.config.abi)\n if (log) {\n const ctx = new FuelContractContext(\n this.config.chainId,\n this.contract,\n this.config.address,\n this.config.name ?? this.config.address,\n timestamp || new Date(0),\n tx,\n null\n )\n ctx.setLogIndex(index)\n await handler({ receiptIndex: index, ...log }, ctx)\n return ctx.stopAndGetResult()\n } else {\n console.error(`Log with receipt index ${receiptIndex} not found in tx`)\n }\n } catch (e) {\n console.error(e)\n }\n\n return ProcessResult.fromPartial({})\n },\n logConfig: {\n logIds: Array.from(logIds)\n }\n }\n this.logHandlers.push(logHandler)\n return this\n }\n\n public onInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n // fetchConfig: Partial<FuelFetchConfig> | undefined\n ): this {\n if (timeInterval) {\n if (timeInterval.backfillInterval < timeInterval.recentInterval) {\n timeInterval.backfillInterval = timeInterval.recentInterval\n }\n }\n\n const processor = this\n\n this.blockHandlers.push({\n blockInterval,\n timeIntervalInMinutes: timeInterval,\n handlerName: getHandlerName(),\n handler: async function (data: Data_FuelBlock) {\n const header = data.block\n if (!header) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const block: FuelBlock = {\n id: header.id,\n height: bn(header.height),\n time: header.time,\n header: {\n applicationHash: header.applicationHash,\n daHeight: bn(header.daHeight),\n eventInboxRoot: header.eventInboxRoot,\n messageOutboxRoot: header.messageOutboxRoot,\n prevRoot: header.prevRoot,\n stateTransitionBytecodeVersion: header.stateTransitionBytecodeVersion,\n transactionsCount: header.transactionsCount,\n transactionsRoot: header.transactionsRoot\n }\n }\n\n const ctx = new FuelContractContext(\n processor.config.chainId,\n processor.contract,\n processor.config.address,\n processor.config.name ?? processor.config.address,\n data.timestamp || new Date(0),\n null,\n block\n )\n await handler(block, ctx)\n return ctx.stopAndGetResult()\n }\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000\n // fetchConfig?: Partial<FuelFetchConfig>\n ): this {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n }\n // fetchConfig,\n )\n }\n\n public onTimeInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240\n // fetchConfig?: Partial<FuelFetchConfig>,\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined\n // fetchConfig\n )\n }\n}\n\nexport type FuelProcessorConfig = {\n address: string\n name?: string\n chainId: FuelNetwork\n startBlock?: bigint\n endBlock?: bigint\n abi: JsonAbi\n}\n\nexport function getOptionsSignature(opts: Omit<FuelProcessorConfig, 'abi'>): string {\n const sig = [opts.address]\n if (opts.chainId) {\n sig.push(opts.chainId)\n }\n if (opts.name) {\n sig.push(opts.name)\n }\n if (opts.startBlock) {\n sig.push(opts.startBlock.toString())\n }\n if (opts.endBlock) {\n sig.push(opts.endBlock.toString())\n }\n return sig.join('_')\n}\n\n// Dedup processor that bind multiple times\nexport function getFuelProcessor(opts: Omit<FuelProcessorConfig, 'abi'>) {\n const sig = getOptionsSignature(opts)\n return FuelProcessorState.INSTANCE.getValue(sig)\n}\n\nexport function addFuelProcessor(opts: Omit<FuelProcessorConfig, 'abi'>, processor: FuelBaseProcessor<any>) {\n const sig = getOptionsSignature(opts)\n\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { CallHandler, FuelBaseProcessor, FuelProcessorState } from './types.js'\nimport { Data_FuelTransaction, FuelAssetHandlerConfig_AssetFilter } from '@sentio/protos'\nimport { FuelNetwork, getProvider } from './network.js'\nimport { FuelContext } from './context.js'\nimport { decodeFuelTransaction } from './transaction.js'\nimport { Provider, InputType, OutputType } from 'fuels'\nimport { getOptionsSignature } from './fuel-processor.js'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class FuelAssetProcessor implements FuelBaseProcessor<FuelAssetProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers = []\n private provider: Provider\n\n static bind(config: FuelAssetProcessorConfig): FuelAssetProcessor {\n const processor = new FuelAssetProcessor(config)\n const sig =\n 'assets_' +\n getOptionsSignature({\n ...config,\n address: '*'\n })\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n return processor\n }\n\n constructor(readonly config: FuelAssetProcessorConfig) {\n return proxyProcessor(this)\n }\n\n async configure(): Promise<void> {\n this.provider = await getProvider(this.config.chainId)\n }\n\n onTransfer(filter: TransferFilter, handler: (transfers: FuelTransfer, ctx: FuelContext) => void | Promise<void>) {\n const filters: FuelAssetHandlerConfig_AssetFilter[] = []\n\n const assetIds = arrayify(filter.assetId)\n const froms = arrayify(filter.from)\n const tos = arrayify(filter.to)\n\n for (const assetId of assetIds) {\n for (const from of froms) {\n for (const to of tos) {\n filters.push({\n assetId: assetId,\n fromAddress: from,\n toAddress: to\n })\n }\n }\n }\n\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n const gqlTransaction = call.transaction\n const tx = decodeFuelTransaction(gqlTransaction, this.provider)\n\n const transfer: FuelTransfer = {\n from: [],\n to: []\n }\n for (const input of tx.transaction.inputs || []) {\n if (input.type == InputType.Coin) {\n transfer.from.push({\n address: input.owner,\n assetId: input.assetId,\n amount: BigInt(input.amount.toString(10))\n })\n }\n }\n\n for (const output of tx.transaction.outputs || []) {\n if (output.type == OutputType.Coin) {\n const value = output.amount.toString(10)\n transfer.to.push({\n address: output.to,\n amount: BigInt(value),\n assetId: output.assetId\n })\n }\n }\n\n const assetId = transfer.from[0].assetId || ''\n\n const ctx = new FuelContext(\n this.config.chainId,\n assetId,\n this.config.name ?? '',\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(transfer, ctx)\n return ctx.stopAndGetResult()\n },\n assetConfig: {\n filters\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n}\n\nexport type FuelAssetProcessorConfig = {\n name?: string\n chainId: FuelNetwork\n startBlock?: bigint\n endBlock?: bigint\n}\n\nexport type TransferFilter = {\n from?: string | string[]\n to?: string | string[]\n assetId?: string | string[]\n}\n\nexport type FuelTransfer = {\n from: {\n assetId: string\n address: string\n amount: bigint\n }[]\n to: {\n address: string\n amount: bigint\n assetId: string\n }[]\n}\n\nfunction arrayify(value?: string | string[]): Array<string | undefined> {\n if (value) {\n if (Array.isArray(value)) {\n return value.length > 0 ? value : [undefined]\n }\n return [value]\n }\n return [undefined]\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { CallHandler, FuelBaseProcessor, FuelProcessorState, FuelTransaction } from './types.js'\nimport { Data_FuelTransaction } from '@sentio/protos'\nimport { Provider } from 'fuels'\nimport { getProvider } from './network.js'\nimport { decodeFuelTransaction, DEFAULT_FUEL_FETCH_CONFIG, FuelFetchConfig } from './transaction.js'\nimport { FuelContext } from './context.js'\nimport { FuelProcessorConfig, getOptionsSignature } from './fuel-processor.js'\nimport { mergeProcessResults } from '@sentio/runtime'\nimport { ALL_ADDRESS } from '../core/index.js'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\ntype GlobalFuelProcessorConfig = Omit<FuelProcessorConfig, 'address' | 'abi'>\n\nexport class FuelGlobalProcessor implements FuelBaseProcessor<GlobalFuelProcessorConfig> {\n txHandlers: CallHandler<Data_FuelTransaction>[] = []\n blockHandlers = []\n\n private provider: Provider\n\n static bind(config: GlobalFuelProcessorConfig): FuelGlobalProcessor {\n const processor = new FuelGlobalProcessor(config)\n const sig =\n 'global_' +\n getOptionsSignature({\n ...config,\n address: ALL_ADDRESS\n })\n FuelProcessorState.INSTANCE.getOrSetValue(sig, processor)\n return processor\n }\n\n constructor(readonly config: GlobalFuelProcessorConfig) {\n return proxyProcessor(this)\n }\n\n async configure() {\n this.provider = await getProvider(this.config.chainId)\n }\n\n public onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContext) => void | Promise<void>,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_FuelTransaction) => {\n let tx: FuelTransaction\n try {\n tx = decodeFuelTransaction(call.transaction, this.provider)\n } catch (e) {\n console.error('error decoding transaction', e)\n return mergeProcessResults([])\n }\n const ctx = new FuelContext(\n this.config.chainId,\n ALL_ADDRESS,\n this.config.name ?? '*',\n call.timestamp || new Date(0),\n tx,\n null\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig: {\n filters: [],\n ...config\n }\n }\n this.txHandlers.push(callHandler)\n return this\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { FuelContext, FuelContractContext } from './context.js'\nimport { HandleInterval, TemplateInstance } from '@sentio/protos'\nimport { PromiseOrVoid } from '../core/promises.js'\nimport { ListStateStorage } from '@sentio/runtime'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { Contract } from 'fuels'\nimport { FuelBlock, FuelLog, FuelTransaction } from './types.js'\nimport { DEFAULT_FUEL_FETCH_CONFIG, FuelFetchConfig } from './transaction.js'\nimport { FuelProcessor, FuelProcessorConfig, getOptionsSignature } from './fuel-processor.js'\n\nexport class FuelProcessorTemplateProcessorState extends ListStateStorage<FuelBaseProcessorTemplate<Contract>> {\n static INSTANCE = new FuelProcessorTemplateProcessorState()\n}\n\nexport abstract class FuelBaseProcessorTemplate<TContract extends Contract> {\n id: number\n binds = new Set<string>()\n blockHandlers: {\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n // fetchConfig?: FuelFetchConfig\n }[] = []\n\n logHandlers: {\n logIdFilter: string | string[]\n handler: (logs: FuelLog<any>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n // fetchConfig?: FuelFetchConfig\n }[] = []\n\n transactionHandlers: {\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n fetchConfig: FuelFetchConfig\n }[] = []\n\n constructor() {\n this.id = FuelProcessorTemplateProcessorState.INSTANCE.getValues().length\n FuelProcessorTemplateProcessorState.INSTANCE.addValue(this)\n }\n\n /**\n * Bind template using {@param options}, using {@param ctx}'s network value if not provided in the option\n * @param options\n * @param ctx\n */\n public bind(options: Omit<Omit<FuelProcessorConfig, 'chainId'>, 'abi'>, ctx: FuelContext): void {\n const sig = getOptionsSignature({\n address: options.address,\n chainId: ctx.chainId\n })\n if (this.binds.has(sig)) {\n console.log(`Same address can be bind to one template only once, ignore duplicate bind: ${sig}`)\n return\n }\n this.binds.add(sig)\n\n const processor = this.bindInternal({ ...options, chainId: ctx.chainId })\n\n for (const eh of this.logHandlers) {\n processor.onLog(eh.logIdFilter, eh.handler)\n }\n for (const bh of this.blockHandlers) {\n processor.onInterval(bh.handler, bh.timeIntervalInMinutes, bh.blockInterval)\n }\n for (const th of this.transactionHandlers) {\n processor.onTransaction(th.handler)\n }\n\n const instance: TemplateInstance = {\n templateId: this.id,\n contract: {\n address: options.address,\n name: options.name || '',\n chainId: ctx.chainId,\n abi: ''\n },\n startBlock: BigInt(options.startBlock || 0),\n endBlock: BigInt(options.endBlock || 0),\n baseLabels: {}\n // baseLabels: options.baseLabels\n }\n TemplateInstanceState.INSTANCE.addValue(instance)\n ctx.update({\n states: {\n configUpdated: true\n }\n })\n }\n\n protected onLog<T>(\n logIdFilter: string | string[],\n handler: (logs: FuelLog<T>, ctx: FuelContractContext<TContract>) => PromiseOrVoid\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n this.logHandlers.push({\n logIdFilter,\n handler\n // fetchConfig: { ...fetchConfig}\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n blockInterval = 1000,\n backfillBlockInterval = 4000\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n }\n // fetchConfig\n )\n }\n\n public onTimeInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillBlockInterval = 240\n // fetchConfig?: Partial<FuelFetchConfig>\n ) {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillBlockInterval },\n undefined\n // fetchConfig\n )\n }\n\n public onInterval(\n handler: (block: FuelBlock, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n // fetchConfig?: FuelFetchConfig\n ) {\n this.blockHandlers.push({\n handler,\n timeIntervalInMinutes: timeInterval,\n blockInterval\n // fetchConfig: { ...fetchConfig }\n })\n return this\n }\n\n protected onTransaction(\n handler: (transaction: FuelTransaction, ctx: FuelContractContext<TContract>) => PromiseOrVoid,\n config: FuelFetchConfig = DEFAULT_FUEL_FETCH_CONFIG\n ) {\n this.transactionHandlers.push({\n handler,\n fetchConfig: config\n })\n return this\n }\n\n protected abstract bindInternal(options: Omit<FuelProcessorConfig, 'abi'>): FuelProcessor<TContract>\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { FuelProcessor, FuelProcessorConfig } from './fuel-processor.js'\nimport { Contract, JsonAbi } from 'fuels'\n// import { FuelCall } from './context.js'\nimport { FuelChainId } from '@sentio/chain'\nimport { FuelLog } from './types.js'\nimport { proxyProcessor } from '../utils/metrics.js'\n\nexport abstract class FuelAbstractProcessor<TContract extends Contract> extends FuelProcessor<TContract> {\n protected constructor(abi: JsonAbi, config?: Omit<FuelProcessorConfig, 'abi'>) {\n if (!config) {\n config = {\n chainId: FuelChainId.FUEL_MAINNET,\n address: '*'\n }\n }\n super({\n ...config,\n abi\n })\n return proxyProcessor(this)\n }\n}\n\nexport class TypedCall<T extends Array<any>, R> {\n args: T\n returnValue: R\n argsObject?: Record<string, any>\n logs?: FuelLog<unknown>[]\n\n // constructor(call: FuelCall) {\n // this.args = call.args as T\n // this.returnValue = call.value as R\n // this.argsObject = call.args\n // this.logs = call.logs\n // }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","export { FuelPlugin } from './fuel-plugin.js'\nexport * from './context.js'\nexport * from './fuel-processor.js'\nexport * from './fuel-processor-template.js'\nexport * from './network.js'\nexport * from './transaction.js'\nexport * from './base-processor.js'\nexport * from './asset-processor.js'\nexport * from './types.js'\nexport * from './global-processor.js'\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["errorString","GLOBAL_CONFIG","mergeProcessResults","Plugin","PluginManager","USER_PROCESSOR","import_nice_grpc","MapStateStorage","FuelProcessorState","_FuelProcessorState","MapStateStorage","__name","p","import_chain","Endpoints","FuelNetwork","getRpcEndpoint","network","__name","getProvider","chainServer","Endpoints","Provider","p","FuelCall","funcScopes","callResult","isMultiCall","args","logs","__name","FuelContext","BaseContext","chainId","contractAddress","contractName","timestamp","transaction","block","logIndex","name","labels","normalizeLabels","FuelContractContext","contract","p","DEFAULT_FUEL_FETCH_CONFIG","findSenderFromInputs","inputs","baseAssetId","input","InputType","__name","decodeFuelTransaction","gqlTransaction","provider","rawPayload","arrayify","receipts","processGqlReceipt","decodedTransaction","TransactionCoder","gasCosts","feeParameters","txParameters","blockNumber","gasPriceFactor","gasPerByte","maxInputs","maxGasPerTx","gqlTransactionStatus","assembleTransactionSummary","bn","decodeLog","receipt","abi","ReceiptType","interfaceToUse","Interface","data","BigNumberCoder","logId","decodedLog","decodeFuelTransactionWithAbi","abiMap","logs","idx","log","e","txResponse","TransactionResponse","p","import_nice_grpc","FuelProcessor","_FuelProcessor","config","proxyProcessor","__name","processor","addFuelProcessor","getProvider","bn","latestGasPrice","Contract","handler","DEFAULT_FUEL_FETCH_CONFIG","callHandler","getHandlerName","call","abiMap","tx","decodeFuelTransactionWithAbi","ctx","FuelContractContext","nameFilter","names","abi","filters","abiInterface","Interface","name","func","filter","e","gqlTransaction","FuelContext","op","fn","args","scope","invocationResult","FuelCall","logIdFilter","logIds","logHandler","transaction","receiptIndex","timestamp","decodeFuelTransaction","index","receipt","log","decodeLog","ProcessResult","timeInterval","blockInterval","data","header","block","backfillBlockInterval","timeIntervalInMinutes","backfillTimeIntervalInMinutes","getOptionsSignature","opts","sig","getFuelProcessor","FuelProcessorState","p","FuelAssetProcessor","_FuelAssetProcessor","config","proxyProcessor","__name","processor","sig","getOptionsSignature","FuelProcessorState","getProvider","filter","handler","filters","assetIds","arrayify","froms","tos","assetId","from","to","callHandler","getHandlerName","call","gqlTransaction","tx","decodeFuelTransaction","transfer","input","InputType","output","OutputType","value","ctx","FuelContext","p","mergeProcessResults","FuelGlobalProcessor","_FuelGlobalProcessor","config","proxyProcessor","__name","processor","sig","getOptionsSignature","ALL_ADDRESS","FuelProcessorState","getProvider","handler","DEFAULT_FUEL_FETCH_CONFIG","callHandler","getHandlerName","call","tx","decodeFuelTransaction","e","mergeProcessResults","ctx","FuelContext","p","FuelPlugin","Plugin","__name","config","handlers","processor","FuelProcessorState","contractConfig","ContractConfig","USER_PROCESSOR","txHandler","handlerId","handlerName","FuelProcessor","fetchConfig","FuelAssetProcessor","assetConfig","FuelGlobalProcessor","logHandler","blockHandler","HandlerType","request","e","errorString","TemplateInstanceState","binding","log","promises","promise","GLOBAL_CONFIG","mergeProcessResults","fuelTransaction","ethBlock","PluginManager","p","ListStateStorage","FuelProcessorTemplateProcessorState","_FuelProcessorTemplateProcessorState","ListStateStorage","__name","FuelBaseProcessorTemplate","options","ctx","sig","getOptionsSignature","processor","eh","bh","th","instance","TemplateInstanceState","logIdFilter","handler","blockInterval","backfillBlockInterval","timeIntervalInMinutes","timeInterval","config","DEFAULT_FUEL_FETCH_CONFIG","p","import_chain","FuelAbstractProcessor","FuelProcessor","__name","abi","config","proxyProcessor","TypedCall","p","p"]}
@@ -0,0 +1,5 @@
1
+ import { createRequire as createRequireSdkShim } from 'module'; const require = createRequireSdkShim(import.meta.url);
2
+ import{a as I,b as R}from"./chunk-4WNGQ3EZ.js";import{C as f,Ed as B,Ja as P,Ka as N,Ma as b,Na as _,Oa as O,Ud as A,V,ke as l,oe as F,te as H}from"./chunk-IWL7MOEJ.js";import{a as v}from"./chunk-RA75ESSD.js";import{a as o,f as x}from"./chunk-G5BIPHMS.js";var h=class extends F{constructor(e,n,a,s){super({});this.chainId=e;this.name=n;this.tx=a;this.address=s}static{o(this,"BTCContext")}getMetaDataInternal(e,n){return{address:this.address,contractName:this.name,blockNumber:BigInt(this.tx.blockheight??0),transactionIndex:0,transactionHash:this.tx.txid,chainId:this.getChainId(),name:e,logIndex:0,labels:B(n)}}getChainId(){return this.chainId}},m=class extends F{constructor(e,n,a,s){super({});this.chainId=e;this.name=n;this.block=a;this.address=s}static{o(this,"BTCBlockContext")}getMetaDataInternal(e,n){return{address:this.address??"",contractName:this.name,blockNumber:BigInt(this.block.height??0),transactionIndex:0,transactionHash:"",chainId:this.getChainId(),name:e,logIndex:0,labels:B(n)}}getChainId(){return this.chainId}};import("node:process").then(r=>r.stdout.write(""));import{ListStateStorage as M}from"@sentio/runtime";var g=x(A(),1);var u=class r extends M{static{o(this,"BTCProcessorState")}static INSTANCE=new r},w=class r{constructor(t){this.config=t;return R(this)}static{o(this,"BTCProcessor")}callHandlers=[];blockHandlers=[];static bind(t){let e=new r(t);return u.INSTANCE.addValue(e),e}onTransaction(t,e){let n={handlerName:I(),handler:o(async a=>{let s=a.transaction,i=new h(this.config.chainId,this.config.name??this.config.address??"",s,this.config.address??s.vout?.[0]?.scriptPubKey?.address);return await t(s,i),i.stopAndGetResult()},"handler"),filter:e};return this.callHandlers.push(n),this}onInterval(t,e,n,a){e&&e.backfillInterval<e.recentInterval&&(e.backfillInterval=e.recentInterval);let s=this;return this.blockHandlers.push({blockInterval:n,timeIntervalInMinutes:e,handlerName:I(),handler:o(async function(i){let d=i.block;if(!d)throw new g.ServerError(g.Status.INVALID_ARGUMENT,"Block is empty");let p={...d};a?.getTransactions&&(p.tx=d.rawtx?.map(L=>L));let y=new m(s.config.chainId,s.config.name??s.config.address??"",p,s.config.address);return await t(p,y),y.stopAndGetResult()},"handler"),fetchConfig:a}),this}onBlockInterval(t,e=250,n=1e3,a){return this.onInterval(t,void 0,{recentInterval:e,backfillInterval:n},a)}onTimeInterval(t,e=60,n=240,a){return this.onInterval(t,{recentInterval:e,backfillInterval:n},void 0,a)}};import("node:process").then(r=>r.stdout.write(""));function q(r){if(r){let t=_.create(),e=[],n=[],a=[];for(let s of Array.isArray(r)?r:[r]){let{preVOut:i,preTransaction:d,...p}=s;e.push(p),i&&n.push(i),d&&a.push(d)}if(t.filters=b.create({filters:T(e)}),n.length>0){let s=T(n);s&&s.length>0&&(t.preVOut=s[0])}return a.length>0&&(t.preTransaction=C(a)?.[0]),t}}o(q,"toVinFilter");function G(r){if(r){let t=O.create(),e=Array.isArray(r)?r:[r];return t.filters=b.create({filters:T(e)}),t}}o(G,"toVOutFilter");function C(r){return(Array.isArray(r)?r:[r]).map(e=>({filter:T(e.filter),inputFilter:q(e.inputFilter),outputFilter:G(e.outputFilter)}))}o(C,"filters2Proto");function z(r){let t=P.create();r instanceof Date&&(t.eq=l(r)),typeof r=="number"&&(t.eq=l(r)),typeof r=="string"&&(t.eq=l(r)),r instanceof v&&(t.eq=l(r)),typeof r=="bigint"&&(t.eq=l(r)),typeof r=="boolean"&&(t.eq=l(r)),Array.isArray(r)&&(t.in={values:r.map(e=>l(e))});for(let[e,n]of Object.entries(r))switch(e){case"prefix":case"contains":case"notContains":t[e]=n.toString();break;case"length":t.lengthEq=n;break;case"lengthGt":case"lengthLt":t[e]=n;break;case"hasAny":case"hasAll":case"in":t[e]={values:n.map(a=>l(a))};break;case"eq":case"gt":case"gte":case"lt":case"lte":case"ne":t[e]=l(n);break;default:throw new Error("Unknown condition op: "+e)}return t}o(z,"toCondition");function T(r){if(r&&r.length>0){let t=[];for(let e of r){let n=N.create();for(let[a,s]of Object.entries(e))n.conditions[a]=z(s);t.push(n)}return t}return[]}o(T,"convertFilters");import("node:process").then(r=>r.stdout.write(""));import{errorString as D,GLOBAL_CONFIG as S,mergeProcessResults as E,Plugin as K,PluginManager as U,USER_PROCESSOR as j}from"@sentio/runtime";var c=x(A(),1);var k=class extends K{static{o(this,"BTCPlugin")}name="BTCPlugin";handlers={txHandlers:[],blockHandlers:[]};async configure(t){let e={txHandlers:[],blockHandlers:[]};for(let n of u.INSTANCE.getValues()){let a=V.fromPartial({processorType:j,contract:{name:n.config.name,chainId:n.config.chainId.toString(),address:n.config.address||"*",abi:""},startBlock:n.config.startBlock,endBlock:n.config.endBlock});for(let s of n.callHandlers){let i=e.txHandlers.push(s.handler)-1,d=s.handlerName;s.filter?a.btcTransactionConfigs.push({filters:C(s.filter),handlerId:i,handlerName:d}):a.contract?.address!="*"&&a.btcTransactionConfigs.push({filters:C({outputFilter:{script_address:n.config.address}}),handlerId:i,handlerName:d})}for(let s of n.blockHandlers){let i=e.blockHandlers.push(s.handler)-1;a.intervalConfigs.push({slot:0,slotInterval:s.blockInterval,minutes:0,minutesInterval:s.timeIntervalInMinutes,handlerId:i,handlerName:s.handlerName,fetchConfig:{transaction:s.fetchConfig?.getTransactions??!1,trace:!1,block:!0,transactionReceipt:!1,transactionReceiptLogs:!1}})}t.contractConfigs.push(a)}this.handlers=e}supportedHandlers=[f.BTC_TRANSACTION,f.BTC_BLOCK];processBinding(t){switch(t.handlerType){case f.BTC_TRANSACTION:return this.processTransaction(t);case f.BTC_BLOCK:return this.processBlock(t);default:throw new c.ServerError(c.Status.INVALID_ARGUMENT,"No handle type registered "+t.handlerType)}}async start(t){}stateDiff(t){return H.INSTANCE.getValues().length!==t.templateInstances.length}async processTransaction(t){if(!t.data?.btcTransaction)throw new c.ServerError(c.Status.INVALID_ARGUMENT,"BTCEvents can't be null");let e=[],n=t.data?.btcTransaction;for(let a of t.handlerIds){let s=this.handlers.txHandlers[a](t.data?.btcTransaction).catch(i=>{throw new c.ServerError(c.Status.INTERNAL,"error processing transaction: "+JSON.stringify(n)+`
3
+ `+D(i))});S.execution.sequential&&await s,e.push(s)}return E(await Promise.all(e))}async processBlock(t){if(!t.data?.btcBlock)throw new c.ServerError(c.Status.INVALID_ARGUMENT,"Block can't be empty");let e=t.data.btcBlock,n=[];for(let a of t.handlerIds){let s=this.handlers.blockHandlers[a](e).catch(i=>{throw new c.ServerError(c.Status.INTERNAL,"error processing block: "+JSON.stringify(e)+`
4
+ `+D(i))});S.execution.sequential&&await s,n.push(s)}return E(await Promise.all(n))}};U.INSTANCE.register(new k);import("node:process").then(r=>r.stdout.write(""));export{h as a,m as b,u as c,w as d,C as e,k as f};
5
+ //# sourceMappingURL=chunk-5XKFO4JV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/btc/types.ts","../src/btc/btc-processor.ts","../src/btc/filter.ts","../src/btc/btc-plugin.ts"],"sourcesContent":["import { BaseContext, Labels, normalizeLabels } from '../core/index.js'\nimport { Data_BTCBlock, HandleInterval, ProcessResult, RecordMetaData } from '@sentio/protos'\nimport { ChainId } from '@sentio/chain'\n\nexport type Transaction = {\n txid: string\n hash: string\n txindex: number\n blockhash: string\n blockheight: number\n blocktime: number\n size: number\n vsize: number\n version: number\n locktime: number\n vin: Vin[]\n vout: Vout[]\n}\n\nexport type Vin = {\n vin_index: number\n coinbase?: string\n txid?: string\n vout?: number\n sequence: number\n witness?: string[]\n scriptSig: {\n asm: string\n hex: string\n }\n pre_vout?: Vout\n pre_transaction?: Transaction\n}\n\nexport type Vout = {\n value: number\n n: number\n scriptPubKey: {\n asm: string\n hex: string\n reqSigs: number\n type: string\n address: string\n }\n}\n\nexport type BTCBlock = {\n hash: string\n confirmations: number\n strippedsize: number\n size: number\n weight: number\n height: number\n version: number\n merkleroot: string\n tx?: Transaction[]\n time: number\n nonce: number\n bits: string\n difficulty: number\n previousblockhash: string\n nextblockhash: string\n}\n\nexport class BTCContext extends BaseContext {\n constructor(\n readonly chainId: string,\n readonly name: string,\n readonly tx: Transaction,\n readonly address: string\n ) {\n super({})\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.address,\n contractName: this.name,\n blockNumber: BigInt(this.tx.blockheight ?? 0),\n transactionIndex: 0,\n transactionHash: this.tx.txid,\n chainId: this.getChainId(),\n name: name,\n logIndex: 0,\n labels: normalizeLabels(labels)\n }\n }\n\n getChainId(): ChainId {\n return this.chainId as ChainId\n }\n}\n\nexport class BTCBlockContext extends BaseContext {\n constructor(\n readonly chainId: string,\n readonly name: string,\n readonly block: BTCBlock,\n readonly address?: string\n ) {\n super({})\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.address ?? '',\n contractName: this.name,\n blockNumber: BigInt(this.block.height ?? 0),\n transactionIndex: 0,\n transactionHash: '',\n chainId: this.getChainId(),\n name: name,\n logIndex: 0,\n labels: normalizeLabels(labels)\n }\n }\n\n getChainId(): ChainId {\n return this.chainId as ChainId\n }\n}\n\nexport type BlockHandler = {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_BTCBlock) => Promise<ProcessResult>\n handlerName: string\n fetchConfig?: BTCOnIntervalFetchConfig\n}\n\nexport type BTCOnIntervalFetchConfig = {\n getTransactions: boolean\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { ListStateStorage } from '@sentio/runtime'\nimport { BlockHandler, BTCBlock, BTCBlockContext, BTCContext, BTCOnIntervalFetchConfig, Transaction } from './types.js'\nimport { Data_BTCBlock, Data_BTCTransaction, HandleInterval, ProcessResult } from '@sentio/protos'\nimport { TransactionFilters } from './filter.js'\nimport { PromiseOrVoid } from '../core/index.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class BTCProcessorState extends ListStateStorage<BTCProcessor> {\n static INSTANCE = new BTCProcessorState()\n}\n\nexport class BTCProcessor {\n callHandlers: CallHandler<Data_BTCTransaction>[] = []\n blockHandlers: BlockHandler[] = []\n\n constructor(readonly config: BTCProcessorConfig) {\n return proxyProcessor(this)\n }\n\n static bind(config: BTCProcessorConfig): BTCProcessor {\n const processor = new BTCProcessor(config)\n BTCProcessorState.INSTANCE.addValue(processor)\n return processor\n }\n\n public onTransaction(\n handler: (transaction: Transaction, ctx: BTCContext) => void | Promise<void>,\n filter?: TransactionFilters\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_BTCTransaction) => {\n const tx = call.transaction as Transaction\n\n const ctx = new BTCContext(\n this.config.chainId,\n this.config.name ?? this.config.address ?? '',\n tx,\n this.config.address ?? tx.vout?.[0]?.scriptPubKey?.address\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n filter\n }\n this.callHandlers.push(callHandler)\n return this\n }\n\n public onInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n if (timeInterval) {\n if (timeInterval.backfillInterval < timeInterval.recentInterval) {\n timeInterval.backfillInterval = timeInterval.recentInterval\n }\n }\n\n const processor = this\n\n this.blockHandlers.push({\n blockInterval,\n timeIntervalInMinutes: timeInterval,\n handlerName: getHandlerName(),\n handler: async function (data: Data_BTCBlock) {\n const header = data.block\n if (!header) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const block = {\n ...header\n } as BTCBlock\n if (fetchConfig?.getTransactions) {\n block.tx = header.rawtx?.map((tx: any) => tx as Transaction)\n }\n\n const ctx = new BTCBlockContext(\n processor.config.chainId,\n processor.config.name ?? processor.config.address ?? '',\n block,\n processor.config.address\n )\n await handler(block, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n },\n fetchConfig\n )\n }\n\n public onTimeInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined,\n fetchConfig\n )\n }\n}\n\ninterface BTCProcessorConfig {\n chainId: string\n name?: string\n address?: string\n startBlock?: bigint\n endBlock?: bigint\n}\n\nexport type CallHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n filter?: TransactionFilters\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n BTCTransactionFilter,\n BTCTransactionFilter_Condition,\n BTCTransactionFilter_Filter,\n BTCTransactionFilter_Filters,\n BTCTransactionFilter_VinFilter,\n BTCTransactionFilter_VOutFilter\n} from '@sentio/protos'\nimport { serializeRichValue } from '../store/util.js'\nimport { BigDecimal } from '@sentio/bigdecimal'\nimport { Transaction, Vin, Vout } from './types.js'\n\nexport type TransactionFields = keyof Omit<Transaction, 'vin' | 'vout'>\n\nexport type VinFields = keyof Omit<Vin, 'pre_vout' | 'pre_transaction' | 'scriptSig'> | 'script_asm' | 'script_hex'\n\nexport type VOutFields =\n | keyof Omit<Vout, 'scriptPubKey'>\n | 'script_asm'\n | 'script_hex'\n | 'script_type'\n | 'script_address'\n\nexport type Filter<F extends string> = {\n [K in F]?: Condition | Comparable\n}\n\nexport type Condition = {\n eq?: Comparable\n gt?: Comparable\n gte?: Comparable\n lt?: Comparable\n lte?: Comparable\n ne?: Comparable\n // string has the prefix\n prefix?: string\n // string contains\n contains?: string\n notContains?: string\n length?: number\n lengthGt?: number\n lengthLt?: number\n // array contains any of the values\n hasAny?: Array<Comparable>\n // array contains all the values\n hasAll?: Array<Comparable>\n in?: Array<Comparable>\n}\n\nexport type Filters<T extends string> = Filter<T> | Filter<T>[]\n\nexport type VinFilter = Filter<VinFields> & {\n preVOut?: Filter<VOutFields>\n preTransaction?: {\n filter?: Array<Filter<TransactionFields>>\n outputFilter?: Filters<VOutFields>\n // can't have inputFilter here, we can only support one level of nesting\n }\n}\n\nexport type VOutFilter = Filter<VOutFields>\n\nexport type TransactionFilter = {\n inputFilter?: VinFilter | VinFilter[]\n outputFilter?: VOutFilter | VOutFilter[]\n filter?: Array<Filter<TransactionFields>>\n}\n\nexport type Comparable = number | BigDecimal | bigint | Date | string | boolean\n\nexport type TransactionFilters = TransactionFilter | TransactionFilter[]\n\nfunction toVinFilter(inputFilter?: VinFilter | VinFilter[]): BTCTransactionFilter_VinFilter | undefined {\n if (inputFilter) {\n const ret = BTCTransactionFilter_VinFilter.create()\n const filters = []\n const vouts: Filter<VOutFields>[] = []\n const txs: TransactionFilters = []\n\n for (const f of Array.isArray(inputFilter) ? inputFilter : [inputFilter]) {\n const { preVOut, preTransaction, ...rest } = f\n filters.push(rest)\n if (preVOut) {\n vouts.push(preVOut)\n }\n if (preTransaction) {\n txs.push(preTransaction)\n }\n }\n ret.filters = BTCTransactionFilter_Filters.create({\n filters: convertFilters(filters)\n })\n\n if (vouts.length > 0) {\n const voutFilters = convertFilters(vouts)\n if (voutFilters && voutFilters.length > 0) {\n ret.preVOut = voutFilters[0]\n }\n }\n if (txs.length > 0) {\n ret.preTransaction = filters2Proto(txs)?.[0]\n }\n\n return ret\n }\n\n return undefined\n}\n\nfunction toVOutFilter(outputFilter?: VOutFilter | VOutFilter[]): BTCTransactionFilter_VOutFilter | undefined {\n if (outputFilter) {\n const ret = BTCTransactionFilter_VOutFilter.create()\n const filters = Array.isArray(outputFilter) ? outputFilter : ([outputFilter] as Filter<VOutFields>[])\n ret.filters = BTCTransactionFilter_Filters.create({\n filters: convertFilters(filters)\n })\n\n return ret\n }\n return undefined\n}\n\nexport function filters2Proto(filter: TransactionFilters): BTCTransactionFilter[] {\n const filters = Array.isArray(filter) ? filter : [filter]\n return filters.map((f) => {\n return {\n filter: convertFilters(f.filter),\n inputFilter: toVinFilter(f.inputFilter),\n outputFilter: toVOutFilter(f.outputFilter)\n } as BTCTransactionFilter\n })\n}\n\nfunction toCondition(value: Condition | Comparable): BTCTransactionFilter_Condition {\n const ret: BTCTransactionFilter_Condition = BTCTransactionFilter_Condition.create()\n if (value instanceof Date) {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'number') {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'string') {\n ret.eq = serializeRichValue(value)\n }\n if (value instanceof BigDecimal) {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'bigint') {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'boolean') {\n ret.eq = serializeRichValue(value)\n }\n if (Array.isArray(value)) {\n ret.in = { values: value.map((v) => serializeRichValue(v)) }\n }\n\n for (const [k, v] of Object.entries(value)) {\n switch (k) {\n case 'prefix':\n case 'contains':\n case 'notContains':\n ret[k] = v.toString()\n break\n case 'length':\n ret['lengthEq'] = v\n break\n case 'lengthGt':\n case 'lengthLt':\n ret[k] = v\n break\n case 'hasAny':\n case 'hasAll':\n case 'in':\n ret[k] = { values: v.map((v: any) => serializeRichValue(v)) }\n break\n case 'eq':\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte':\n case 'ne':\n ret[k] = serializeRichValue(v)\n break\n default:\n throw new Error('Unknown condition op: ' + k)\n }\n }\n\n return ret\n}\n\nfunction convertFilters<T extends string>(filters?: Array<Filter<T>>): BTCTransactionFilter_Filter[] | undefined {\n if (filters && filters.length > 0) {\n const ret: BTCTransactionFilter_Filter[] = []\n for (const filter of filters) {\n const f: BTCTransactionFilter_Filter = BTCTransactionFilter_Filter.create()\n for (const [key, value] of Object.entries(filter)) {\n f.conditions[key] = toCondition(value as any)\n }\n ret.push(f)\n }\n return ret\n }\n return []\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { errorString, GLOBAL_CONFIG, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n ContractConfig,\n Data_BTCBlock,\n Data_BTCTransaction,\n DataBinding,\n HandlerType,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { BTCProcessorState } from './btc-processor.js'\nimport { filters2Proto, TransactionFilter } from './filter.js'\n\ninterface Handlers {\n txHandlers: ((trace: Data_BTCTransaction) => Promise<ProcessResult>)[]\n blockHandlers: ((trace: Data_BTCBlock) => Promise<ProcessResult>)[]\n}\n\nexport class BTCPlugin extends Plugin {\n name: string = 'BTCPlugin'\n handlers: Handlers = {\n txHandlers: [],\n blockHandlers: []\n }\n\n async configure(config: ProcessConfigResponse) {\n const handlers: Handlers = {\n txHandlers: [],\n blockHandlers: []\n }\n\n for (const processor of BTCProcessorState.INSTANCE.getValues()) {\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: processor.config.chainId.toString(),\n address: processor.config.address || '*',\n abi: ''\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock\n })\n for (const callHandler of processor.callHandlers) {\n const handlerId = handlers.txHandlers.push(callHandler.handler) - 1\n const handlerName = callHandler.handlerName\n\n if (callHandler.filter) {\n contractConfig.btcTransactionConfigs.push({\n filters: filters2Proto(callHandler.filter),\n handlerId,\n handlerName\n })\n } else if (contractConfig.contract?.address != '*') {\n contractConfig.btcTransactionConfigs.push({\n filters: filters2Proto({\n outputFilter: {\n script_address: processor.config.address\n }\n } as TransactionFilter),\n handlerId,\n handlerName\n })\n }\n }\n\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = handlers.blockHandlers.push(blockHandler.handler) - 1\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId,\n handlerName: blockHandler.handlerName,\n fetchConfig: {\n transaction: blockHandler.fetchConfig?.getTransactions ?? false,\n trace: false,\n block: true,\n transactionReceipt: false,\n transactionReceiptLogs: false\n }\n })\n }\n\n // Finish up a contract\n config.contractConfigs.push(contractConfig)\n }\n\n this.handlers = handlers\n }\n\n supportedHandlers = [HandlerType.BTC_TRANSACTION, HandlerType.BTC_BLOCK]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n switch (request.handlerType) {\n case HandlerType.BTC_TRANSACTION:\n return this.processTransaction(request)\n case HandlerType.BTC_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {}\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processTransaction(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.btcTransaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"BTCEvents can't be null\")\n }\n\n const promises: Promise<ProcessResult>[] = []\n\n const result = binding.data?.btcTransaction\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.txHandlers[handlerId](binding.data?.btcTransaction).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(result) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n private async processBlock(request: DataBinding) {\n if (!request.data?.btcBlock) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n\n const block = request.data.btcBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of request.handlerIds) {\n const promise = this.handlers.blockHandlers[handlerId](block).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + JSON.stringify(block) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new BTCPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["BTCContext","BaseContext","chainId","name","tx","address","__name","labels","normalizeLabels","BTCBlockContext","block","p","ListStateStorage","import_nice_grpc","BTCProcessorState","_BTCProcessorState","ListStateStorage","__name","BTCProcessor","_BTCProcessor","config","proxyProcessor","processor","handler","filter","callHandler","getHandlerName","call","tx","ctx","BTCContext","timeInterval","blockInterval","fetchConfig","data","header","block","BTCBlockContext","backfillBlockInterval","timeIntervalInMinutes","backfillTimeIntervalInMinutes","p","toVinFilter","inputFilter","ret","BTCTransactionFilter_VinFilter","filters","vouts","txs","f","preVOut","preTransaction","rest","BTCTransactionFilter_Filters","convertFilters","voutFilters","filters2Proto","__name","toVOutFilter","outputFilter","BTCTransactionFilter_VOutFilter","filter","toCondition","value","BTCTransactionFilter_Condition","serializeRichValue","BigDecimal","v","k","BTCTransactionFilter_Filter","key","p","errorString","GLOBAL_CONFIG","mergeProcessResults","Plugin","PluginManager","USER_PROCESSOR","import_nice_grpc","BTCPlugin","Plugin","__name","config","handlers","processor","BTCProcessorState","contractConfig","ContractConfig","USER_PROCESSOR","callHandler","handlerId","handlerName","filters2Proto","blockHandler","HandlerType","request","TemplateInstanceState","binding","promises","result","promise","e","errorString","GLOBAL_CONFIG","mergeProcessResults","block","PluginManager","p"]}
1
+ {"version":3,"sources":["../src/btc/types.ts","../src/btc/btc-processor.ts","../src/btc/filter.ts","../src/btc/btc-plugin.ts"],"sourcesContent":["import { BaseContext, Labels, normalizeLabels } from '../core/index.js'\nimport { Data_BTCBlock, HandleInterval, ProcessResult, RecordMetaData } from '@sentio/protos'\nimport { ChainId } from '@sentio/chain'\n\nexport type Transaction = {\n txid: string\n hash: string\n txindex: number\n blockhash: string\n blockheight: number\n blocktime: number\n size: number\n vsize: number\n version: number\n locktime: number\n vin: Vin[]\n vout: Vout[]\n}\n\nexport type Vin = {\n vin_index: number\n coinbase?: string\n txid?: string\n vout?: number\n sequence: number\n witness?: string[]\n scriptSig: {\n asm: string\n hex: string\n }\n pre_vout?: Vout\n pre_transaction?: Transaction\n}\n\nexport type Vout = {\n value: number\n n: number\n scriptPubKey: {\n asm: string\n hex: string\n reqSigs: number\n type: string\n address: string\n }\n}\n\nexport type BTCBlock = {\n hash: string\n confirmations: number\n strippedsize: number\n size: number\n weight: number\n height: number\n version: number\n merkleroot: string\n tx?: Transaction[]\n time: number\n nonce: number\n bits: string\n difficulty: number\n previousblockhash: string\n nextblockhash: string\n}\n\nexport class BTCContext extends BaseContext {\n constructor(\n readonly chainId: string,\n readonly name: string,\n readonly tx: Transaction,\n readonly address: string\n ) {\n super({})\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.address,\n contractName: this.name,\n blockNumber: BigInt(this.tx.blockheight ?? 0),\n transactionIndex: 0,\n transactionHash: this.tx.txid,\n chainId: this.getChainId(),\n name: name,\n logIndex: 0,\n labels: normalizeLabels(labels)\n }\n }\n\n getChainId(): ChainId {\n return this.chainId as ChainId\n }\n}\n\nexport class BTCBlockContext extends BaseContext {\n constructor(\n readonly chainId: string,\n readonly name: string,\n readonly block: BTCBlock,\n readonly address?: string\n ) {\n super({})\n }\n\n protected getMetaDataInternal(name: string, labels: Labels): RecordMetaData {\n return {\n address: this.address ?? '',\n contractName: this.name,\n blockNumber: BigInt(this.block.height ?? 0),\n transactionIndex: 0,\n transactionHash: '',\n chainId: this.getChainId(),\n name: name,\n logIndex: 0,\n labels: normalizeLabels(labels)\n }\n }\n\n getChainId(): ChainId {\n return this.chainId as ChainId\n }\n}\n\nexport type BlockHandler = {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_BTCBlock) => Promise<ProcessResult>\n handlerName: string\n fetchConfig?: BTCOnIntervalFetchConfig\n}\n\nexport type BTCOnIntervalFetchConfig = {\n getTransactions: boolean\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { ListStateStorage } from '@sentio/runtime'\nimport { BlockHandler, BTCBlock, BTCBlockContext, BTCContext, BTCOnIntervalFetchConfig, Transaction } from './types.js'\nimport { Data_BTCBlock, Data_BTCTransaction, HandleInterval, ProcessResult } from '@sentio/protos'\nimport { TransactionFilters } from './filter.js'\nimport { PromiseOrVoid } from '../core/index.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { getHandlerName, proxyProcessor } from '../utils/metrics.js'\n\nexport class BTCProcessorState extends ListStateStorage<BTCProcessor> {\n static INSTANCE = new BTCProcessorState()\n}\n\nexport class BTCProcessor {\n callHandlers: CallHandler<Data_BTCTransaction>[] = []\n blockHandlers: BlockHandler[] = []\n\n constructor(readonly config: BTCProcessorConfig) {\n return proxyProcessor(this)\n }\n\n static bind(config: BTCProcessorConfig): BTCProcessor {\n const processor = new BTCProcessor(config)\n BTCProcessorState.INSTANCE.addValue(processor)\n return processor\n }\n\n public onTransaction(\n handler: (transaction: Transaction, ctx: BTCContext) => void | Promise<void>,\n filter?: TransactionFilters\n ) {\n const callHandler = {\n handlerName: getHandlerName(),\n handler: async (call: Data_BTCTransaction) => {\n const tx = call.transaction as Transaction\n\n const ctx = new BTCContext(\n this.config.chainId,\n this.config.name ?? this.config.address ?? '',\n tx,\n this.config.address ?? tx.vout?.[0]?.scriptPubKey?.address\n )\n await handler(tx, ctx)\n return ctx.stopAndGetResult()\n },\n filter\n }\n this.callHandlers.push(callHandler)\n return this\n }\n\n public onInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n if (timeInterval) {\n if (timeInterval.backfillInterval < timeInterval.recentInterval) {\n timeInterval.backfillInterval = timeInterval.recentInterval\n }\n }\n\n const processor = this\n\n this.blockHandlers.push({\n blockInterval,\n timeIntervalInMinutes: timeInterval,\n handlerName: getHandlerName(),\n handler: async function (data: Data_BTCBlock) {\n const header = data.block\n if (!header) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const block = {\n ...header\n } as BTCBlock\n if (fetchConfig?.getTransactions) {\n block.tx = header.rawtx?.map((tx: any) => tx as Transaction)\n }\n\n const ctx = new BTCBlockContext(\n processor.config.chainId,\n processor.config.name ?? processor.config.address ?? '',\n block,\n processor.config.address\n )\n await handler(block, ctx)\n return ctx.stopAndGetResult()\n },\n fetchConfig\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n return this.onInterval(\n handler,\n undefined,\n {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval\n },\n fetchConfig\n )\n }\n\n public onTimeInterval(\n handler: (block: BTCBlock, ctx: BTCBlockContext) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240,\n fetchConfig?: BTCOnIntervalFetchConfig\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined,\n fetchConfig\n )\n }\n}\n\ninterface BTCProcessorConfig {\n chainId: string\n name?: string\n address?: string\n startBlock?: bigint\n endBlock?: bigint\n}\n\nexport type CallHandler<T> = {\n handlerName: string\n handler: (call: T) => Promise<ProcessResult>\n filter?: TransactionFilters\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import {\n BTCTransactionFilter,\n BTCTransactionFilter_Condition,\n BTCTransactionFilter_Filter,\n BTCTransactionFilter_Filters,\n BTCTransactionFilter_VinFilter,\n BTCTransactionFilter_VOutFilter\n} from '@sentio/protos'\nimport { serializeRichValue } from '../store/util.js'\nimport { BigDecimal } from '@sentio/bigdecimal'\nimport { Transaction, Vin, Vout } from './types.js'\n\nexport type TransactionFields = keyof Omit<Transaction, 'vin' | 'vout'>\n\nexport type VinFields = keyof Omit<Vin, 'pre_vout' | 'pre_transaction' | 'scriptSig'> | 'script_asm' | 'script_hex'\n\nexport type VOutFields =\n | keyof Omit<Vout, 'scriptPubKey'>\n | 'script_asm'\n | 'script_hex'\n | 'script_type'\n | 'script_address'\n\nexport type Filter<F extends string> = {\n [K in F]?: Condition | Comparable\n}\n\nexport type Condition = {\n eq?: Comparable\n gt?: Comparable\n gte?: Comparable\n lt?: Comparable\n lte?: Comparable\n ne?: Comparable\n // string has the prefix\n prefix?: string\n // string contains\n contains?: string\n notContains?: string\n length?: number\n lengthGt?: number\n lengthLt?: number\n // array contains any of the values\n hasAny?: Array<Comparable>\n // array contains all the values\n hasAll?: Array<Comparable>\n in?: Array<Comparable>\n}\n\nexport type Filters<T extends string> = Filter<T> | Filter<T>[]\n\nexport type VinFilter = Filter<VinFields> & {\n preVOut?: Filter<VOutFields>\n preTransaction?: {\n filter?: Array<Filter<TransactionFields>>\n outputFilter?: Filters<VOutFields>\n // can't have inputFilter here, we can only support one level of nesting\n }\n}\n\nexport type VOutFilter = Filter<VOutFields>\n\nexport type TransactionFilter = {\n inputFilter?: VinFilter | VinFilter[]\n outputFilter?: VOutFilter | VOutFilter[]\n filter?: Array<Filter<TransactionFields>>\n}\n\nexport type Comparable = number | BigDecimal | bigint | Date | string | boolean\n\nexport type TransactionFilters = TransactionFilter | TransactionFilter[]\n\nfunction toVinFilter(inputFilter?: VinFilter | VinFilter[]): BTCTransactionFilter_VinFilter | undefined {\n if (inputFilter) {\n const ret = BTCTransactionFilter_VinFilter.create()\n const filters = []\n const vouts: Filter<VOutFields>[] = []\n const txs: TransactionFilters = []\n\n for (const f of Array.isArray(inputFilter) ? inputFilter : [inputFilter]) {\n const { preVOut, preTransaction, ...rest } = f\n filters.push(rest)\n if (preVOut) {\n vouts.push(preVOut)\n }\n if (preTransaction) {\n txs.push(preTransaction)\n }\n }\n ret.filters = BTCTransactionFilter_Filters.create({\n filters: convertFilters(filters)\n })\n\n if (vouts.length > 0) {\n const voutFilters = convertFilters(vouts)\n if (voutFilters && voutFilters.length > 0) {\n ret.preVOut = voutFilters[0]\n }\n }\n if (txs.length > 0) {\n ret.preTransaction = filters2Proto(txs)?.[0]\n }\n\n return ret\n }\n\n return undefined\n}\n\nfunction toVOutFilter(outputFilter?: VOutFilter | VOutFilter[]): BTCTransactionFilter_VOutFilter | undefined {\n if (outputFilter) {\n const ret = BTCTransactionFilter_VOutFilter.create()\n const filters = Array.isArray(outputFilter) ? outputFilter : ([outputFilter] as Filter<VOutFields>[])\n ret.filters = BTCTransactionFilter_Filters.create({\n filters: convertFilters(filters)\n })\n\n return ret\n }\n return undefined\n}\n\nexport function filters2Proto(filter: TransactionFilters): BTCTransactionFilter[] {\n const filters = Array.isArray(filter) ? filter : [filter]\n return filters.map((f) => {\n return {\n filter: convertFilters(f.filter),\n inputFilter: toVinFilter(f.inputFilter),\n outputFilter: toVOutFilter(f.outputFilter)\n } as BTCTransactionFilter\n })\n}\n\nfunction toCondition(value: Condition | Comparable): BTCTransactionFilter_Condition {\n const ret: BTCTransactionFilter_Condition = BTCTransactionFilter_Condition.create()\n if (value instanceof Date) {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'number') {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'string') {\n ret.eq = serializeRichValue(value)\n }\n if (value instanceof BigDecimal) {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'bigint') {\n ret.eq = serializeRichValue(value)\n }\n if (typeof value === 'boolean') {\n ret.eq = serializeRichValue(value)\n }\n if (Array.isArray(value)) {\n ret.in = { values: value.map((v) => serializeRichValue(v)) }\n }\n\n for (const [k, v] of Object.entries(value)) {\n switch (k) {\n case 'prefix':\n case 'contains':\n case 'notContains':\n ret[k] = v.toString()\n break\n case 'length':\n ret['lengthEq'] = v\n break\n case 'lengthGt':\n case 'lengthLt':\n ret[k] = v\n break\n case 'hasAny':\n case 'hasAll':\n case 'in':\n ret[k] = { values: v.map((v: any) => serializeRichValue(v)) }\n break\n case 'eq':\n case 'gt':\n case 'gte':\n case 'lt':\n case 'lte':\n case 'ne':\n ret[k] = serializeRichValue(v)\n break\n default:\n throw new Error('Unknown condition op: ' + k)\n }\n }\n\n return ret\n}\n\nfunction convertFilters<T extends string>(filters?: Array<Filter<T>>): BTCTransactionFilter_Filter[] | undefined {\n if (filters && filters.length > 0) {\n const ret: BTCTransactionFilter_Filter[] = []\n for (const filter of filters) {\n const f: BTCTransactionFilter_Filter = BTCTransactionFilter_Filter.create()\n for (const [key, value] of Object.entries(filter)) {\n f.conditions[key] = toCondition(value as any)\n }\n ret.push(f)\n }\n return ret\n }\n return []\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { errorString, GLOBAL_CONFIG, mergeProcessResults, Plugin, PluginManager, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n ContractConfig,\n Data_BTCBlock,\n Data_BTCTransaction,\n DataBinding,\n HandlerType,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { TemplateInstanceState } from '../core/template.js'\nimport { BTCProcessorState } from './btc-processor.js'\nimport { filters2Proto, TransactionFilter } from './filter.js'\n\ninterface Handlers {\n txHandlers: ((trace: Data_BTCTransaction) => Promise<ProcessResult>)[]\n blockHandlers: ((trace: Data_BTCBlock) => Promise<ProcessResult>)[]\n}\n\nexport class BTCPlugin extends Plugin {\n name: string = 'BTCPlugin'\n handlers: Handlers = {\n txHandlers: [],\n blockHandlers: []\n }\n\n async configure(config: ProcessConfigResponse) {\n const handlers: Handlers = {\n txHandlers: [],\n blockHandlers: []\n }\n\n for (const processor of BTCProcessorState.INSTANCE.getValues()) {\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: processor.config.chainId.toString(),\n address: processor.config.address || '*',\n abi: ''\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock\n })\n for (const callHandler of processor.callHandlers) {\n const handlerId = handlers.txHandlers.push(callHandler.handler) - 1\n const handlerName = callHandler.handlerName\n\n if (callHandler.filter) {\n contractConfig.btcTransactionConfigs.push({\n filters: filters2Proto(callHandler.filter),\n handlerId,\n handlerName\n })\n } else if (contractConfig.contract?.address != '*') {\n contractConfig.btcTransactionConfigs.push({\n filters: filters2Proto({\n outputFilter: {\n script_address: processor.config.address\n }\n } as TransactionFilter),\n handlerId,\n handlerName\n })\n }\n }\n\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = handlers.blockHandlers.push(blockHandler.handler) - 1\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId,\n handlerName: blockHandler.handlerName,\n fetchConfig: {\n transaction: blockHandler.fetchConfig?.getTransactions ?? false,\n trace: false,\n block: true,\n transactionReceipt: false,\n transactionReceiptLogs: false\n }\n })\n }\n\n // Finish up a contract\n config.contractConfigs.push(contractConfig)\n }\n\n this.handlers = handlers\n }\n\n supportedHandlers = [HandlerType.BTC_TRANSACTION, HandlerType.BTC_BLOCK]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n switch (request.handlerType) {\n case HandlerType.BTC_TRANSACTION:\n return this.processTransaction(request)\n case HandlerType.BTC_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {}\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processTransaction(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.btcTransaction) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"BTCEvents can't be null\")\n }\n\n const promises: Promise<ProcessResult>[] = []\n\n const result = binding.data?.btcTransaction\n\n for (const handlerId of binding.handlerIds) {\n const promise = this.handlers.txHandlers[handlerId](binding.data?.btcTransaction).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing transaction: ' + JSON.stringify(result) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n private async processBlock(request: DataBinding) {\n if (!request.data?.btcBlock) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n\n const block = request.data.btcBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of request.handlerIds) {\n const promise = this.handlers.blockHandlers[handlerId](block).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + JSON.stringify(block) + '\\n' + errorString(e)\n )\n })\n if (GLOBAL_CONFIG.execution.sequential) {\n await promise\n }\n promises.push(promise)\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new BTCPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["BTCContext","BaseContext","chainId","name","tx","address","__name","labels","normalizeLabels","BTCBlockContext","block","p","ListStateStorage","import_nice_grpc","BTCProcessorState","_BTCProcessorState","ListStateStorage","__name","BTCProcessor","_BTCProcessor","config","proxyProcessor","processor","handler","filter","callHandler","getHandlerName","call","tx","ctx","BTCContext","timeInterval","blockInterval","fetchConfig","data","header","block","BTCBlockContext","backfillBlockInterval","timeIntervalInMinutes","backfillTimeIntervalInMinutes","p","toVinFilter","inputFilter","ret","BTCTransactionFilter_VinFilter","filters","vouts","txs","f","preVOut","preTransaction","rest","BTCTransactionFilter_Filters","convertFilters","voutFilters","filters2Proto","__name","toVOutFilter","outputFilter","BTCTransactionFilter_VOutFilter","filter","toCondition","value","BTCTransactionFilter_Condition","serializeRichValue","BigDecimal","v","k","BTCTransactionFilter_Filter","key","p","errorString","GLOBAL_CONFIG","mergeProcessResults","Plugin","PluginManager","USER_PROCESSOR","import_nice_grpc","BTCPlugin","Plugin","__name","config","handlers","processor","BTCProcessorState","contractConfig","ContractConfig","USER_PROCESSOR","callHandler","handlerId","handlerName","filters2Proto","blockHandler","HandlerType","request","TemplateInstanceState","binding","promises","result","promise","e","errorString","GLOBAL_CONFIG","mergeProcessResults","block","PluginManager","p"]}