wowok
Version:
Wowok Blockchain TypeScript API
1 lines • 6.94 kB
JavaScript
import{parse}from'valibot';import{normalizeWowAddress,normalizeWowObjectId,WOW_TYPE_ARG}from'../utils/index.js';import{ObjectRefSchema}from'../transactions/data/internal.js';import{Inputs}from'../transactions/Inputs.js';import{getPureBcsSchema,isTxContext,normalizedTypeToMoveTypeSignature}from'../transactions/serializer.js';import{chunk}from'../_deps/utils/index.js';const MAX_OBJECTS_PER_FETCH=0x32,GAS_SAFE_OVERHEAD=0x3e8n,MAX_GAS=0xba43b7400;export function jsonRpcClientResolveTransactionPlugin(a){return async function b(c,d,e){return await normalizeInputs(c,a),await resolveObjectReferences(c,a),!d['onlyTransactionKind']&&(await setGasPrice(c,a),await setGasBudget(c,a),await setGasPayment(c,a)),await e();};}async function setGasPrice(a,b){!a['gasConfig']['price']&&(a['gasConfig']['price']=String(await b['getReferenceGasPrice']()));}async function setGasBudget(a,b){if(a['gasConfig']['budget'])return;const c=await b['dryRunTransactionBlock']({'transactionBlock':a['build']({'overrides':{'gasData':{'budget':String(MAX_GAS),'payment':[]}}})});if(c['effects']['status']['status']!=='success'){const g=new Error('Dry\x20run\x20failed,\x20could\x20not\x20automatically\x20determine\x20a\x20budget:\x20'+c['effects']['status']['error']);g['cause']=c;throw g;}const d=GAS_SAFE_OVERHEAD*BigInt(a['gasConfig']['price']||0x1n),e=BigInt(c['effects']['gasUsed']['computationCost'])+d,f=e+BigInt(c['effects']['gasUsed']['storageCost'])-BigInt(c['effects']['gasUsed']['storageRebate']);a['gasConfig']['budget']=String(f>e?f:e);}async function setGasPayment(a,b){if(!a['gasConfig']['payment']){const c=await b['getCoins']({'owner':a['gasConfig']['owner']||a['sender'],'coinType':WOW_TYPE_ARG}),d=c['data']['filter'](e=>{const f=a['inputs']['find'](g=>{if(g['Object']?.['ImmOrOwnedObject'])return e['coinObjectId']===g['Object']['ImmOrOwnedObject']['objectId'];return![];});return!f;})['map'](e=>({'objectId':e['coinObjectId'],'digest':e['digest'],'version':e['version']}));if(!d['length'])throw new Error('No\x20valid\x20gas\x20coins\x20found\x20for\x20the\x20transaction.');a['gasConfig']['payment']=d['map'](e=>parse(ObjectRefSchema,e));}}async function resolveObjectReferences(a,b){const c=a['inputs']['filter'](k=>{return k['UnresolvedObject']&&!(k['UnresolvedObject']['version']||k['UnresolvedObject']?.['initialSharedVersion']);}),d=[...new Set(c['map'](k=>normalizeWowObjectId(k['UnresolvedObject']['objectId'])))],e=d['length']?chunk(d,MAX_OBJECTS_PER_FETCH):[],f=(await Promise['all'](e['map'](k=>b['multiGetObjects']({'ids':k,'options':{'showOwner':!![]}}))))['flat'](),g=new Map(d['map']((k,l)=>{return[k,f[l]];})),h=Array['from'](g)['filter'](([k,l])=>l['error'])['map'](([k,l])=>JSON['stringify'](l['error']));if(h['length'])throw new Error('The\x20following\x20input\x20objects\x20are\x20invalid:\x20'+h['join'](',\x20'));const i=f['map'](k=>{if(k['error']||!k['data'])throw new Error('Failed\x20to\x20fetch\x20object:\x20'+k['error']);const l=k['data']['owner'],m=l&&typeof l==='object'?'Shared'in l?l['Shared']['initial_shared_version']:'ConsensusAddressOwner'in l?l['ConsensusAddressOwner']['start_version']:null:null;return{'objectId':k['data']['objectId'],'digest':k['data']['digest'],'version':k['data']['version'],'initialSharedVersion':m};}),j=new Map(d['map']((k,l)=>{return[k,i[l]];}));for(const [k,l]of a['inputs']['entries']()){if(!l['UnresolvedObject'])continue;let m;const n=normalizeWowAddress(l['UnresolvedObject']['objectId']),o=j['get'](n);if(l['UnresolvedObject']['initialSharedVersion']??o?.['initialSharedVersion'])m=Inputs['SharedObjectRef']({'objectId':n,'initialSharedVersion':l['UnresolvedObject']['initialSharedVersion']||o?.['initialSharedVersion'],'mutable':l['UnresolvedObject']['mutable']||isUsedAsMutable(a,k)});else isUsedAsReceiving(a,k)&&(m=Inputs['ReceivingRef']({'objectId':n,'digest':l['UnresolvedObject']['digest']??o?.['digest'],'version':l['UnresolvedObject']['version']??o?.['version']}));a['inputs'][a['inputs']['indexOf'](l)]=m??Inputs['ObjectRef']({'objectId':n,'digest':l['UnresolvedObject']['digest']??o?.['digest'],'version':l['UnresolvedObject']['version']??o?.['version']});}}async function normalizeInputs(a,b){const {inputs:c,commands:d}=a,e=[],f=new Set();d['forEach'](h=>{if(h['MoveCall']){if(h['MoveCall']['_argumentTypes'])return;const i=h['MoveCall']['arguments']['map'](k=>{if(k['$kind']==='Input')return a['inputs'][k['Input']];return null;}),j=i['some'](k=>k?.['UnresolvedPure']||k?.['UnresolvedObject']&&typeof k?.['UnresolvedObject']['mutable']!=='boolean');if(j){const k=h['MoveCall']['package']+'::'+h['MoveCall']['module']+'::'+h['MoveCall']['function'];f['add'](k),e['push'](h['MoveCall']);}}});const g=new Map();f['size']>0x0&&await Promise['all']([...f]['map'](async h=>{const [i,j,k]=h['split']('::'),l=await b['getNormalizedMoveFunction']({'package':i,'module':j,'function':k});g['set'](h,l['parameters']['map'](m=>normalizedTypeToMoveTypeSignature(m)));})),e['length']&&await Promise['all'](e['map'](async h=>{const i=g['get'](h['package']+'::'+h['module']+'::'+h['function']);if(!i)return;const j=i['length']>0x0&&isTxContext(i[i['length']-0x1]),k=j?i['slice'](0x0,i['length']-0x1):i;h['_argumentTypes']=k;})),d['forEach'](h=>{if(!h['MoveCall'])return;const i=h['MoveCall'],j=i['package']+'::'+i['module']+'::'+i['function'],k=i['_argumentTypes'];if(!k)return;if(k['length']!==h['MoveCall']['arguments']['length'])throw new Error('Incorrect\x20number\x20of\x20arguments\x20for\x20'+j);k['forEach']((l,m)=>{const n=i['arguments'][m];if(n['$kind']!=='Input')return;const o=c[n['Input']];if(!o['UnresolvedPure']&&!o['UnresolvedObject'])return;const p=o['UnresolvedPure']?.['value']??o['UnresolvedObject']?.['objectId'],q=getPureBcsSchema(l['body']);if(q){n['type']='pure',c[c['indexOf'](o)]=Inputs['Pure'](q['serialize'](p));return;}if(typeof p!=='string')throw new Error('Expect\x20the\x20argument\x20to\x20be\x20an\x20object\x20id\x20string,\x20got\x20'+JSON['stringify'](p,null,0x2));n['type']='object';const r=o['UnresolvedPure']?{'$kind':'UnresolvedObject','UnresolvedObject':{'objectId':p}}:o;c[n['Input']]=r;});});}function isUsedAsMutable(a,b){let c=![];return a['getInputUses'](b,(d,e)=>{if(e['MoveCall']&&e['MoveCall']['_argumentTypes']){const f=e['MoveCall']['arguments']['indexOf'](d);c=e['MoveCall']['_argumentTypes'][f]['ref']!=='&'||c;}(e['$kind']==='MakeMoveVec'||e['$kind']==='MergeCoins'||e['$kind']==='SplitCoins'||e['$kind']==='TransferObjects')&&(c=!![]);}),c;}function isUsedAsReceiving(a,b){let c=![];return a['getInputUses'](b,(d,e)=>{if(e['MoveCall']&&e['MoveCall']['_argumentTypes']){const f=e['MoveCall']['arguments']['indexOf'](d);c=isReceivingType(e['MoveCall']['_argumentTypes'][f])||c;}}),c;}function isReceivingType(a){if(typeof a['body']!=='object'||!('datatype'in a['body']))return![];return a['body']['datatype']['package']==='0x2'&&a['body']['datatype']['module']==='transfer'&&a['body']['datatype']['type']==='Receiving';}