UNPKG

wowok

Version:

Wowok Blockchain TypeScript API

1 lines 2.24 kB
import{toBase64}from'../../_deps/bcs/index.js';import{isTransaction,Transaction}from'../Transaction.js';import{CachingTransactionExecutor}from'./caching.js';import{SerialQueue}from'./queue.js';export class SerialTransactionExecutor{#queue=new SerialQueue();#signer;#cache;#defaultGasBudget;constructor({signer:a,defaultGasBudget:defaultGasBudget=0x2faf080n,...b}){this.#signer=a,this.#defaultGasBudget=defaultGasBudget,this.#cache=new CachingTransactionExecutor({'client':b['client'],'cache':b['cache'],'onEffects':c=>this.#cacheGasCoin(c)});}async['applyEffects'](a){return this.#cache['applyEffects'](a);}#cacheGasCoin=async a=>{if(!a['V2'])return;const b=getGasCoinFromEffects(a)['ref'];b?this.#cache['cache']['setCustom']('gasCoin',b):this.#cache['cache']['deleteCustom']('gasCoin');};async['buildTransaction'](a){return this.#queue['runTask'](()=>this.#buildTransaction(a));}#buildTransaction=async a=>{const b=await this.#cache['cache']['getCustom']('gasCoin'),c=Transaction['from'](a);return b&&c['setGasPayment']([b]),c['setGasBudgetIfNotSet'](this.#defaultGasBudget),c['setSenderIfNotSet'](this.#signer['toWAddress']()),this.#cache['buildTransaction']({'transaction':c});};['resetCache'](){return this.#cache['reset']();}['waitForLastTransaction'](){return this.#cache['waitForLastTransaction']();}['executeTransaction'](a,b,c=[]){return this.#queue['runTask'](async()=>{const d=isTransaction(a)?await this.#buildTransaction(a):a,{signature:e}=await this.#signer['signTransaction'](d),f=await this.#cache['executeTransaction']({'signature':[e,...c],'transaction':d,'options':b})['catch'](async h=>{await this['resetCache']();throw h;}),g=Uint8Array['from'](f['rawEffects']);return{'digest':f['digest'],'effects':toBase64(g),'data':f};});}}export function getGasCoinFromEffects(a){if(!a['V2'])throw new Error('Unexpected\x20effects\x20version');const b=a['V2']['changedObjects'][a['V2']['gasObjectIndex']];if(!b)throw new Error('Gas\x20object\x20not\x20found\x20in\x20effects');const [c,{outputState:d}]=b;if(!d['ObjectWrite'])throw new Error('Unexpected\x20gas\x20object\x20state');const [e,f]=d['ObjectWrite'];return{'ref':{'objectId':c,'digest':e,'version':a['V2']['lamportVersion']},'owner':f['AddressOwner']||f['ObjectOwner']};}