wowok
Version:
Wowok Blockchain TypeScript API
1 lines • 13.9 kB
JavaScript
var _a;import{fromBase64,isSerializedBcs}from'../_deps/bcs/index.js';import{is,parse}from'valibot';import{normalizeWowAddress}from'../utils/wow-types.js';import{Commands}from'./Commands.js';import{ArgumentSchema,NormalizedCallArg,ObjectRefSchema,TransactionExpiration}from'./data/internal.js';import{serializeV1TransactionData}from'./data/v1.js';import{SerializedTransactionDataV2Schema}from'./data/v2.js';import{Inputs}from'./Inputs.js';import{needsTransactionResolution,resolveTransactionPlugin}from'./resolve.js';import{createObjectMethods}from'./object.js';import{createPure}from'./pure.js';import{TransactionDataBuilder}from'./TransactionData.js';import{getIdFromCallArg}from'./utils.js';import{namedPackagesPlugin}from'./plugins/NamedPackagesPlugin.js';function createTransactionResult(a,b=Infinity){const c={'$kind':'Result',get 'Result'(){return typeof a==='function'?a():a;}},d=[],e=f=>d[f]??={'$kind':'NestedResult',get 'NestedResult'(){return[typeof a==='function'?a():a,f];}};return new Proxy(c,{'set'(){throw new Error('The\x20transaction\x20result\x20is\x20a\x20proxy,\x20and\x20does\x20not\x20support\x20setting\x20properties\x20directly');},'get'(f,g){if(g in f)return Reflect['get'](f,g);if(g===Symbol['iterator'])return function*(){let j=0x0;while(j<b){yield e(j),j++;}};if(typeof g==='symbol')return;const h=parseInt(g,0xa);if(Number['isNaN'](h)||h<0x0)return;return e(h);}});}const TRANSACTION_BRAND=Symbol['for']('@mysten/transaction');export function isTransaction(a){return!!a&&typeof a==='object'&&a[TRANSACTION_BRAND]===!![];}const modulePluginRegistry={'buildPlugins':new Map(),'serializationPlugins':new Map()},TRANSACTION_REGISTRY_KEY=Symbol['for']('@mysten/transaction/registry');function getGlobalPluginRegistry(){try{const a=globalThis;return!a[TRANSACTION_REGISTRY_KEY]&&(a[TRANSACTION_REGISTRY_KEY]=modulePluginRegistry),a[TRANSACTION_REGISTRY_KEY];}catch{return modulePluginRegistry;}}export class Transaction{#serializationPlugins;#buildPlugins;#intentResolvers=new Map();#inputSection=[];#commandSection=[];#availableResults=new Set();#pendingPromises=new Set();#added=new Map();static['fromKind'](a){const b=new _a();return b.#data=TransactionDataBuilder['fromKindBytes'](typeof a==='string'?fromBase64(a):a),b.#inputSection=b.#data['inputs']['slice'](),b.#commandSection=b.#data['commands']['slice'](),b.#availableResults=new Set(b.#commandSection['map']((c,d)=>d)),b;}static['from'](a){const b=new _a();if(isTransaction(a))b.#data=TransactionDataBuilder['restore'](a['getData']());else typeof a!=='string'||!a['startsWith']('{')?b.#data=TransactionDataBuilder['fromBytes'](typeof a==='string'?fromBase64(a):a):b.#data=TransactionDataBuilder['restore'](JSON['parse'](a));return b.#inputSection=b.#data['inputs']['slice'](),b.#commandSection=b.#data['commands']['slice'](),b.#availableResults=new Set(b.#commandSection['map']((c,d)=>d)),b;}static['registerGlobalSerializationPlugin'](a,b){getGlobalPluginRegistry()['serializationPlugins']['set'](a,b??a);}static['unregisterGlobalSerializationPlugin'](a){getGlobalPluginRegistry()['serializationPlugins']['delete'](a);}static['registerGlobalBuildPlugin'](a,b){getGlobalPluginRegistry()['buildPlugins']['set'](a,b??a);}static['unregisterGlobalBuildPlugin'](a){getGlobalPluginRegistry()['buildPlugins']['delete'](a);}['addSerializationPlugin'](a){this.#serializationPlugins['push'](a);}['addBuildPlugin'](a){this.#buildPlugins['push'](a);}['addIntentResolver'](a,b){if(this.#intentResolvers['has'](a)&&this.#intentResolvers['get'](a)!==b)throw new Error('Intent\x20resolver\x20for\x20'+a+'\x20already\x20exists');this.#intentResolvers['set'](a,b);}['setSender'](a){this.#data['sender']=a;}['setSenderIfNotSet'](a){!this.#data['sender']&&(this.#data['sender']=a);}['setExpiration'](a){this.#data['expiration']=a?parse(TransactionExpiration,a):null;}['setGasPrice'](a){this.#data['gasConfig']['price']=String(a);}['setGasBudget'](a){this.#data['gasConfig']['budget']=String(a);}['setGasBudgetIfNotSet'](a){this.#data['gasData']['budget']==null&&(this.#data['gasConfig']['budget']=String(a));}['setGasOwner'](a){this.#data['gasConfig']['owner']=a;}['setGasPayment'](a){this.#data['gasConfig']['payment']=a['map'](b=>parse(ObjectRefSchema,b));}#data;get['blockData'](){return serializeV1TransactionData(this.#data['snapshot']());}['getData'](){return this.#data['snapshot']();}get[TRANSACTION_BRAND](){return!![];}get['pure'](){return Object['defineProperty'](this,'pure',{'enumerable':![],'value':createPure(a=>{if(isSerializedBcs(a))return this.#addInput('pure',{'$kind':'Pure','Pure':{'bytes':a['toBase64']()}});return this.#addInput('pure',is(NormalizedCallArg,a)?parse(NormalizedCallArg,a):a instanceof Uint8Array?Inputs['Pure'](a):{'$kind':'UnresolvedPure','UnresolvedPure':{'value':a}});})}),this['pure'];}constructor(){const a=getGlobalPluginRegistry();this.#data=new TransactionDataBuilder(),this.#buildPlugins=[...a['buildPlugins']['values']()],this.#serializationPlugins=[...a['serializationPlugins']['values']()];}get['gas'](){return{'$kind':'GasCoin','GasCoin':!![]};}['object']=createObjectMethods(value=>{if(typeof value==='function')return this['object'](this['add'](value));if(typeof value==='object'&&is(ArgumentSchema,value))return value;const id=getIdFromCallArg(value),inserted=this.#data['inputs']['find'](i=>id===getIdFromCallArg(i));return inserted?.['Object']?.['SharedObject']&&typeof value==='object'&&value['Object']?.['SharedObject']&&(inserted['Object']['SharedObject']['mutable']=inserted['Object']['SharedObject']['mutable']||value['Object']['SharedObject']['mutable']),inserted?{'$kind':'Input','Input':this.#data['inputs']['indexOf'](inserted),'type':'object'}:this.#addInput('object',typeof value==='string'?{'$kind':'UnresolvedObject','UnresolvedObject':{'objectId':normalizeWowAddress(value)}}:value);});['objectRef'](...a){return this['object'](Inputs['ObjectRef'](...a));}['receivingRef'](...a){return this['object'](Inputs['ReceivingRef'](...a));}['sharedObjectRef'](...a){return this['object'](Inputs['SharedObjectRef'](...a));}#fork(){const a=new _a();return a.#data=this.#data,a.#serializationPlugins=this.#serializationPlugins,a.#buildPlugins=this.#buildPlugins,a.#intentResolvers=this.#intentResolvers,a.#pendingPromises=this.#pendingPromises,a.#availableResults=new Set(this.#availableResults),a.#added=this.#added,this.#inputSection['push'](a.#inputSection),this.#commandSection['push'](a.#commandSection),a;}['add'](a){if(typeof a==='function'){if(this.#added['has'](a))return this.#added['get'](a);const b=this.#fork(),c=a(b);if(!(c&&typeof c==='object'&&'then'in c))return this.#availableResults=b.#availableResults,this.#added['set'](a,c),c;const d=this.#addCommand({'$kind':'$Intent','$Intent':{'name':'AsyncTransactionThunk','inputs':{},'data':{'resultIndex':this.#data['commands']['length'],'result':null}}});this.#pendingPromises['add'](Promise['resolve'](c)['then'](f=>{d['$Intent']['data']['result']=f;}));const e=createTransactionResult(()=>d['$Intent']['data']['resultIndex']);return this.#added['set'](a,e),e;}else this.#addCommand(a);return createTransactionResult(this.#data['commands']['length']-0x1);}#addCommand(a){const b=this.#data['commands']['length'];return this.#commandSection['push'](a),this.#availableResults['add'](b),this.#data['commands']['push'](a),this.#data['mapCommandArguments'](b,c=>{if(c['$kind']==='Result'&&!this.#availableResults['has'](c['Result']))throw new Error('Result\x20{\x20Result:\x20'+c['Result']+'\x20}\x20is\x20not\x20available\x20to\x20use\x20in\x20the\x20current\x20transaction');if(c['$kind']==='NestedResult'&&!this.#availableResults['has'](c['NestedResult'][0x0]))throw new Error('Result\x20{\x20NestedResult:\x20['+c['NestedResult'][0x0]+',\x20'+c['NestedResult'][0x1]+']\x20}\x20is\x20not\x20available\x20to\x20use\x20in\x20the\x20current\x20transaction');if(c['$kind']==='Input'&&c['Input']>=this.#data['inputs']['length'])throw new Error('Input\x20{\x20Input:\x20'+c['Input']+'\x20}\x20references\x20an\x20input\x20that\x20does\x20not\x20exist\x20in\x20the\x20current\x20transaction');return c;}),a;}#addInput(a,b){return this.#inputSection['push'](b),this.#data['addInput'](a,b);}#normalizeTransactionArgument(a){if(isSerializedBcs(a))return this['pure'](a);return this.#resolveArgument(a);}#resolveArgument(a){if(typeof a==='function'){const b=this['add'](a);if(typeof b==='function')return this.#resolveArgument(b);return parse(ArgumentSchema,b);}return parse(ArgumentSchema,a);}['splitCoins'](a,b){const c=Commands['SplitCoins'](typeof a==='string'?this['object'](a):this.#resolveArgument(a),b['map'](d=>typeof d==='number'||typeof d==='bigint'||typeof d==='string'?this['pure']['u64'](d):this.#normalizeTransactionArgument(d)));return this.#addCommand(c),createTransactionResult(this.#data['commands']['length']-0x1,b['length']);}['mergeCoins'](a,b){return this['add'](Commands['MergeCoins'](this['object'](a),b['map'](c=>this['object'](c))));}['publish']({modules:a,dependencies:b}){return this['add'](Commands['Publish']({'modules':a,'dependencies':b}));}['upgrade']({modules:a,dependencies:b,package:c,ticket:d}){return this['add'](Commands['Upgrade']({'modules':a,'dependencies':b,'package':c,'ticket':this['object'](d)}));}['moveCall']({arguments:a,...b}){return this['add'](Commands['MoveCall']({...b,'arguments':a?.['map'](c=>this.#normalizeTransactionArgument(c))}));}['transferObjects'](a,b){return this['add'](Commands['TransferObjects'](a['map'](c=>this['object'](c)),typeof b==='string'?this['pure']['address'](b):this.#normalizeTransactionArgument(b)));}['makeMoveVec']({type:a,elements:b}){return this['add'](Commands['MakeMoveVec']({'type':a,'elements':b['map'](c=>this['object'](c))}));}['serialize'](){return JSON['stringify'](serializeV1TransactionData(this.#data['snapshot']()));}async['toJSON'](a={}){await this['prepareForSerialization'](a);const b=this['isFullyResolved']();return JSON['stringify'](parse(SerializedTransactionDataV2Schema,b?{...this.#data['snapshot'](),'digest':this.#data['getDigest']()}:this.#data['snapshot']()),(c,d)=>typeof d==='bigint'?d['toString']():d,0x2);}async['sign'](a){const {signer:b,...c}=a,d=await this['build'](c);return b['signTransaction'](d);}['isFullyResolved'](){if(!this.#data['sender'])return![];if(this.#pendingPromises['size']>0x0)return![];if(this.#data['commands']['some'](a=>a['$Intent']))return![];if(needsTransactionResolution(this.#data,{}))return![];return!![];}async['build'](a={}){return await this['prepareForSerialization'](a),await this.#prepareBuild(a),this.#data['build']({'onlyTransactionKind':a['onlyTransactionKind']});}async['getDigest'](a={}){return await this['prepareForSerialization'](a),await this.#prepareBuild(a),this.#data['getDigest']();}async #prepareBuild(a){if(!a['onlyTransactionKind']&&!this.#data['sender'])throw new Error('Missing\x20transaction\x20sender');await this.#runPlugins([...this.#buildPlugins,resolveTransactionPlugin],a);}async #runPlugins(a,b){try{const c=d=>{if(d>=a['length'])return()=>{};const e=a[d];return async()=>{const f=c(d+0x1);let g=![],h=![];await e(this.#data,b,async()=>{if(g)throw new Error('next()\x20was\x20call\x20multiple\x20times\x20in\x20TransactionPlugin\x20'+d);g=!![],await f(),h=!![];});if(!g)throw new Error('next()\x20was\x20not\x20called\x20in\x20TransactionPlugin\x20'+d);if(!h)throw new Error('next()\x20was\x20not\x20awaited\x20in\x20TransactionPlugin\x20'+d);};};await c(0x0)();}finally{this.#inputSection=this.#data['inputs']['slice'](),this.#commandSection=this.#data['commands']['slice'](),this.#availableResults=new Set(this.#commandSection['map']((d,e)=>e));}}async #waitForPendingTasks(){while(this.#pendingPromises['size']>0x0){const a=Promise['all'](this.#pendingPromises);this.#pendingPromises['clear'](),this.#pendingPromises['add'](a),await a,this.#pendingPromises['delete'](a);}}#sortCommandsAndInputs(){const a=this.#data['commands'],b=this.#data['inputs'],c=this.#commandSection['flat'](Infinity),d=this.#inputSection['flat'](Infinity);if(c['length']!==a['length'])throw new Error('Unexpected\x20number\x20of\x20commands\x20found\x20in\x20transaction\x20data');if(d['length']!==b['length'])throw new Error('Unexpected\x20number\x20of\x20inputs\x20found\x20in\x20transaction\x20data');const e=c['filter'](g=>g['$Intent']?.['name']!=='AsyncTransactionThunk');this.#data['commands']=e,this.#data['inputs']=d,this.#commandSection=e,this.#inputSection=d,this.#availableResults=new Set(e['map']((g,h)=>h));function f(g){const h=a[g];if(h['$Intent']?.['name']==='AsyncTransactionThunk'){const k=h['$Intent']['data']['result'];if(k==null)throw new Error('AsyncTransactionThunk\x20has\x20not\x20been\x20resolved');return f(k['Result']);}const j=e['indexOf'](h);if(j===-0x1)throw new Error('Unable\x20to\x20find\x20original\x20index\x20for\x20command');return j;}this.#data['mapArguments'](g=>{if(g['$kind']==='Input'){const h=d['indexOf'](b[g['Input']]);if(h===-0x1)throw new Error('Input\x20has\x20not\x20been\x20resolved');return{...g,'Input':h};}else{if(g['$kind']==='Result'){const j=f(g['Result']);return{...g,'Result':j};}else{if(g['$kind']==='NestedResult'){const k=f(g['NestedResult'][0x0]);return{...g,'NestedResult':[k,g['NestedResult'][0x1]]};}}}return g;});for(const [g,h]of a['entries']()){if(h['$Intent']?.['name']==='AsyncTransactionThunk')try{h['$Intent']['data']['resultIndex']=f(g);}catch{}}}async['prepareForSerialization'](a){await this.#waitForPendingTasks(),this.#sortCommandsAndInputs();const b=new Set();for(const d of this.#data['commands']){d['$Intent']&&b['add'](d['$Intent']['name']);}const c=[...this.#serializationPlugins];for(const e of b){if(a['supportedIntents']?.['includes'](e))continue;if(!this.#intentResolvers['has'](e))throw new Error('Missing\x20intent\x20resolver\x20for\x20'+e);c['push'](this.#intentResolvers['get'](e));}c['push'](namedPackagesPlugin()),await this.#runPlugins(c,a);}}_a=Transaction;