wowok
Version:
Wowok Blockchain TypeScript API
1 lines • 12.4 kB
JavaScript
import{fromBase64}from'../_deps/bcs/index.js';import{bcs}from'../bcs/index.js';import{Transaction}from'../transactions/Transaction.js';import{jsonRpcClientResolveTransactionPlugin}from'./json-rpc-resolver.js';import{TransactionDataBuilder}from'../transactions/TransactionData.js';import{chunk}from'../_deps/utils/index.js';import{normalizeWowAddress}from'../utils/wow-types.js';import{Experimental_CoreClient}from'../experimental/core.js';import{ObjectError}from'../experimental/errors.js';import{parseTransactionBcs,parseTransactionEffectsBcs}from'../experimental/index.js';export class JSONRpcCoreClient extends Experimental_CoreClient{#jsonRpcClient;constructor({jsonRpcClient:a}){super({'network':a['network'],'base':a}),this.#jsonRpcClient=a;}async['getObjects'](a){const b=chunk(a['objectIds'],0x32),c=[];for(const d of b){const e=await this.#jsonRpcClient['multiGetObjects']({'ids':d,'options':{'showOwner':!![],'showType':!![],'showBcs':!![],'showPreviousTransaction':!![]},'signal':a['signal']});for(const [f,g]of e['entries']()){g['error']?c['push'](ObjectError['fromResponse'](g['error'],d[f])):c['push'](parseObject(g['data']));}}return{'objects':c};}async['getOwnedObjects'](a){const b=await this.#jsonRpcClient['getOwnedObjects']({'owner':a['address'],'limit':a['limit'],'cursor':a['cursor'],'options':{'showOwner':!![],'showType':!![],'showBcs':!![],'showPreviousTransaction':!![]},'filter':a['type']?{'StructType':a['type']}:null,'signal':a['signal']});return{'objects':b['data']['map'](c=>{if(c['error'])throw ObjectError['fromResponse'](c['error']);return parseObject(c['data']);}),'hasNextPage':b['hasNextPage'],'cursor':b['nextCursor']??null};}async['getCoins'](a){const b=await this.#jsonRpcClient['getCoins']({'owner':a['address'],'coinType':a['coinType'],'limit':a['limit'],'cursor':a['cursor'],'signal':a['signal']});return{'objects':b['data']['map'](c=>{return{'id':c['coinObjectId'],'version':c['version'],'digest':c['digest'],'balance':c['balance'],'type':'0x2::coin::Coin<'+c['coinType']+'>','content':Promise['resolve'](Coin['serialize']({'id':c['coinObjectId'],'balance':{'value':c['balance']}})['toBytes']()),'owner':{'$kind':'ObjectOwner','ObjectOwner':a['address']},'previousTransaction':c['previousTransaction']};}),'hasNextPage':b['hasNextPage'],'cursor':b['nextCursor']??null};}async['getBalance'](a){const b=await this.#jsonRpcClient['getBalance']({'owner':a['address'],'coinType':a['coinType'],'signal':a['signal']});return{'balance':{'coinType':b['coinType'],'balance':b['totalBalance']}};}async['getAllBalances'](a){const b=await this.#jsonRpcClient['getAllBalances']({'owner':a['address'],'signal':a['signal']});return{'balances':b['map'](c=>({'coinType':c['coinType'],'balance':c['totalBalance']})),'hasNextPage':![],'cursor':null};}async['getTransaction'](a){const b=await this.#jsonRpcClient['getTransactionBlock']({'digest':a['digest'],'options':{'showRawInput':!![],'showObjectChanges':!![],'showRawEffects':!![],'showEvents':!![],'showEffects':!![],'showBalanceChanges':!![]},'signal':a['signal']});return{'transaction':parseTransaction(b)};}async['executeTransaction'](a){const b=await this.#jsonRpcClient['executeTransactionBlock']({'transactionBlock':a['transaction'],'signature':a['signatures'],'options':{'showRawEffects':!![],'showEvents':!![],'showObjectChanges':!![],'showRawInput':!![],'showEffects':!![],'showBalanceChanges':!![]},'signal':a['signal']});return{'transaction':parseTransaction(b)};}async['dryRunTransaction'](a){const b=Transaction['from'](a['transaction']),c=await this.#jsonRpcClient['dryRunTransactionBlock']({'transactionBlock':a['transaction'],'signal':a['signal']}),{effects:d,objectTypes:e}=parseTransactionEffectsJson({'effects':c['effects'],'objectChanges':c['objectChanges']});return{'transaction':{'digest':await b['getDigest'](),'epoch':null,'effects':d,'objectTypes':Promise['resolve'](e),'signatures':[],'transaction':parseTransactionBcs(a['transaction']),'balanceChanges':c['balanceChanges']['map'](f=>({'coinType':f['coinType'],'address':parseOwnerAddress(f['owner']),'amount':f['amount']}))}};}async['getReferenceGasPrice'](a){const b=await this.#jsonRpcClient['getReferenceGasPrice']({'signal':a?.['signal']});return{'referenceGasPrice':String(b)};}async['getDynamicFields'](a){const b=await this.#jsonRpcClient['getDynamicFields']({'parentId':a['parentId'],'limit':a['limit'],'cursor':a['cursor']});return{'dynamicFields':b['data']['map'](c=>{return{'id':c['objectId'],'type':c['objectType'],'name':{'type':c['name']['type'],'bcs':fromBase64(c['bcsName'])}};}),'hasNextPage':b['hasNextPage'],'cursor':b['nextCursor']};}['resolveTransactionPlugin'](){return jsonRpcClientResolveTransactionPlugin(this.#jsonRpcClient);}async['getMoveFunction'](a){const b=await this.#jsonRpcClient['getNormalizedMoveFunction']({'package':a['packageId'],'module':a['moduleName'],'function':a['name']});return{'function':{'packageId':normalizeWowAddress(a['packageId']),'moduleName':a['moduleName'],'name':a['name'],'visibility':parseVisibility(b['visibility']),'isEntry':b['isEntry'],'typeParameters':b['typeParameters']['map'](c=>({'isPhantom':![],'constraints':parseAbilities(c)})),'parameters':b['parameters']['map'](c=>parseNormalizedWowMoveType(c)),'returns':b['return']['map'](c=>parseNormalizedWowMoveType(c))}};}}function parseObject(a){return{'id':a['objectId'],'version':a['version'],'digest':a['digest'],'type':a['type'],'content':Promise['resolve'](a['bcs']?.['dataType']==='moveObject'?fromBase64(a['bcs']['bcsBytes']):new Uint8Array()),'owner':parseOwner(a['owner']),'previousTransaction':a['previousTransaction']??null};}function parseOwner(a){if(a==='Immutable')return{'$kind':'Immutable','Immutable':!![]};if('ConsensusAddressOwner'in a)return{'$kind':'ConsensusAddressOwner','ConsensusAddressOwner':{'owner':a['ConsensusAddressOwner']['owner'],'startVersion':a['ConsensusAddressOwner']['start_version']}};if('AddressOwner'in a)return{'$kind':'AddressOwner','AddressOwner':a['AddressOwner']};if('ObjectOwner'in a)return{'$kind':'ObjectOwner','ObjectOwner':a['ObjectOwner']};if('Shared'in a)return{'$kind':'Shared','Shared':{'initialSharedVersion':a['Shared']['initial_shared_version']}};throw new Error('Unknown\x20owner\x20type:\x20'+JSON['stringify'](a));}function parseOwnerAddress(a){if(a==='Immutable')return null;if('ConsensusAddressOwner'in a)return a['ConsensusAddressOwner']['owner'];if('AddressOwner'in a)return a['AddressOwner'];if('ObjectOwner'in a)return a['ObjectOwner'];if('Shared'in a)return null;throw new Error('Unknown\x20owner\x20type:\x20'+JSON['stringify'](a));}function parseTransaction(a){const b=bcs['SenderSignedData']['parse'](fromBase64(a['rawTransaction']))[0x0],c={};a['objectChanges']?.['forEach'](f=>{f['type']!=='published'&&(c[f['objectId']]=f['objectType']);});const d=bcs['TransactionData']['serialize'](b['intentMessage']['value'])['toBytes'](),e=TransactionDataBuilder['restore']({'version':0x2,'sender':b['intentMessage']['value']['V1']['sender'],'expiration':b['intentMessage']['value']['V1']['expiration'],'gasData':b['intentMessage']['value']['V1']['gasData'],'inputs':b['intentMessage']['value']['V1']['kind']['ProgrammableTransaction']['inputs'],'commands':b['intentMessage']['value']['V1']['kind']['ProgrammableTransaction']['commands']});return{'digest':a['digest'],'epoch':a['effects']?.['executedEpoch']??null,'effects':parseTransactionEffectsBcs(new Uint8Array(a['rawEffects'])),'objectTypes':Promise['resolve'](c),'transaction':{...e,'bcs':d},'signatures':b['txSignatures'],'balanceChanges':a['balanceChanges']?.['map'](f=>({'coinType':f['coinType'],'address':parseOwnerAddress(f['owner']),'amount':f['amount']}))??[]};}function parseTransactionEffectsJson({bytes:a,effects:b,objectChanges:c}){const d=[],e=[],f={};return c?.['forEach'](g=>{switch(g['type']){case'published':d['push']({'id':g['packageId'],'inputState':'DoesNotExist','inputVersion':null,'inputDigest':null,'inputOwner':null,'outputState':'PackageWrite','outputVersion':g['version'],'outputDigest':g['digest'],'outputOwner':null,'idOperation':'Created'});break;case'transferred':d['push']({'id':g['objectId'],'inputState':'Exists','inputVersion':g['version'],'inputDigest':g['digest'],'inputOwner':{'$kind':'AddressOwner','AddressOwner':g['sender']},'outputState':'ObjectWrite','outputVersion':g['version'],'outputDigest':g['digest'],'outputOwner':parseOwner(g['recipient']),'idOperation':'None'}),f[g['objectId']]=g['objectType'];break;case'mutated':d['push']({'id':g['objectId'],'inputState':'Exists','inputVersion':g['previousVersion'],'inputDigest':null,'inputOwner':parseOwner(g['owner']),'outputState':'ObjectWrite','outputVersion':g['version'],'outputDigest':g['digest'],'outputOwner':parseOwner(g['owner']),'idOperation':'None'}),f[g['objectId']]=g['objectType'];break;case'deleted':d['push']({'id':g['objectId'],'inputState':'Exists','inputVersion':g['version'],'inputDigest':b['deleted']?.['find'](h=>h['objectId']===g['objectId'])?.['digest']??null,'inputOwner':null,'outputState':'DoesNotExist','outputVersion':null,'outputDigest':null,'outputOwner':null,'idOperation':'Deleted'}),f[g['objectId']]=g['objectType'];break;case'wrapped':d['push']({'id':g['objectId'],'inputState':'Exists','inputVersion':g['version'],'inputDigest':null,'inputOwner':{'$kind':'AddressOwner','AddressOwner':g['sender']},'outputState':'ObjectWrite','outputVersion':g['version'],'outputDigest':b['wrapped']?.['find'](h=>h['objectId']===g['objectId'])?.['digest']??null,'outputOwner':{'$kind':'ObjectOwner','ObjectOwner':g['sender']},'idOperation':'None'}),f[g['objectId']]=g['objectType'];break;case'created':d['push']({'id':g['objectId'],'inputState':'DoesNotExist','inputVersion':null,'inputDigest':null,'inputOwner':null,'outputState':'ObjectWrite','outputVersion':g['version'],'outputDigest':g['digest'],'outputOwner':parseOwner(g['owner']),'idOperation':'Created'}),f[g['objectId']]=g['objectType'];break;}}),{'objectTypes':f,'effects':{'bcs':a??null,'digest':b['transactionDigest'],'version':0x2,'status':b['status']['status']==='success'?{'success':!![],'error':null}:{'success':![],'error':b['status']['error']},'gasUsed':b['gasUsed'],'transactionDigest':b['transactionDigest'],'gasObject':{'id':b['gasObject']?.['reference']['objectId'],'inputState':'Exists','inputVersion':null,'inputDigest':null,'inputOwner':null,'outputState':'ObjectWrite','outputVersion':b['gasObject']['reference']['version'],'outputDigest':b['gasObject']['reference']['digest'],'outputOwner':parseOwner(b['gasObject']['owner']),'idOperation':'None'},'eventsDigest':b['eventsDigest']??null,'dependencies':b['dependencies']??[],'lamportVersion':b['gasObject']['reference']['version'],'changedObjects':d,'unchangedConsensusObjects':e,'auxiliaryDataDigest':null}};}const Balance=bcs['struct']('Balance',{'value':bcs['u64']()}),Coin=bcs['struct']('Coin',{'id':bcs['Address'],'balance':Balance});function parseNormalizedWowMoveType(a){if(typeof a!=='string'){if('Reference'in a)return{'reference':'immutable','body':parseNormalizedWowMoveTypeBody(a['Reference'])};if('MutableReference'in a)return{'reference':'mutable','body':parseNormalizedWowMoveTypeBody(a['MutableReference'])};}return{'reference':null,'body':parseNormalizedWowMoveTypeBody(a)};}function parseNormalizedWowMoveTypeBody(a){switch(a){case'Address':return{'$kind':'address'};case'Bool':return{'$kind':'bool'};case'U8':return{'$kind':'u8'};case'U16':return{'$kind':'u16'};case'U32':return{'$kind':'u32'};case'U64':return{'$kind':'u64'};case'U128':return{'$kind':'u128'};case'U256':return{'$kind':'u256'};}if(typeof a==='string')throw new Error('Unknown\x20type:\x20'+a);if('Vector'in a)return{'$kind':'vector','vector':parseNormalizedWowMoveTypeBody(a['Vector'])};if('Struct'in a)return{'$kind':'datatype','datatype':{'typeName':normalizeWowAddress(a['Struct']['address'])+'::'+a['Struct']['module']+'::'+a['Struct']['name'],'typeParameters':a['Struct']['typeArguments']['map'](b=>parseNormalizedWowMoveTypeBody(b))}};if('TypeParameter'in a)return{'$kind':'typeParameter','index':a['TypeParameter']};throw new Error('Unknown\x20type:\x20'+JSON['stringify'](a));}function parseAbilities(a){return a['abilities']['map'](b=>{switch(b){case'Copy':return'copy';case'Drop':return'drop';case'Store':return'store';case'Key':return'key';default:return'unknown';}});}function parseVisibility(a){switch(a){case'Public':return'public';case'Private':return'private';case'Friend':return'friend';default:return'unknown';}}