@wowok/wowok 3.0.6 → 3.0.7
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.
- package/dist/esm/{arb-CNTnpKU4.mjs → arb-CXTekz6P.mjs} +1 -1
- package/dist/esm/{call-Zj4BGD5O.mjs → call-c56KBPmQ.mjs} +1 -1
- package/dist/esm/client/index.d.mts +1 -1
- package/dist/esm/client/index.mjs +1 -1
- package/dist/esm/{client-HlvevC--.mjs → client-BYIflYp_.mjs} +1 -1
- package/dist/esm/cryptography/index.d.mts +1 -1
- package/dist/esm/{fund-approval-B0Y1YRF5.mjs → fund-approval-Cee3vmP8.mjs} +1 -1
- package/dist/esm/graphql/index.d.mts +1 -1
- package/dist/esm/graphql/index.mjs +1 -1
- package/dist/esm/{graphql-Dm6C2KN9.mjs → graphql-DDWKR2yj.mjs} +1 -1
- package/dist/esm/grpc/index.d.mts +1 -1
- package/dist/esm/grpc/index.mjs +1 -1
- package/dist/esm/{grpc-AmhWNnDx.mjs → grpc-D9wyZZs1.mjs} +1 -1
- package/dist/esm/{index-5DmaIrpk.d.mts → index-BQOp8Peb.d.mts} +434 -38
- package/dist/esm/index.d.mts +3 -3
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/jsonRpc/index.d.mts +1 -1
- package/dist/esm/jsonRpc/index.mjs +1 -1
- package/dist/esm/keypairs/ed25519/index.d.mts +1 -1
- package/dist/esm/keypairs/falcon512/index.d.mts +1 -1
- package/dist/esm/keypairs/passkey/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256k1/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256r1/index.d.mts +1 -1
- package/dist/esm/messenger-D9cIgjVB.mjs +1 -0
- package/dist/esm/messenger-api-BkZ1Urhv.mjs +1 -0
- package/dist/esm/multisig/index.d.mts +1 -1
- package/dist/esm/{networks-ByH0We-G.d.mts → networks-DgObqYrB.d.mts} +16 -1
- package/dist/esm/{proof-BgXYvVg_.mjs → proof-DN-LYZHK.mjs} +1 -1
- package/dist/esm/{received-BumlehnN.mjs → received-BeCU01U-.mjs} +1 -1
- package/dist/esm/{service-Bf6Sljmf.mjs → service-JWjnxOnc.mjs} +1 -1
- package/dist/esm/transactions/index.d.mts +1 -1
- package/dist/esm/util-CQi8j1Df.mjs +1 -0
- package/dist/esm/{util-kGpbSSrV.mjs → util-DtomxQB5.mjs} +1 -1
- package/dist/esm/verify/index.d.mts +1 -1
- package/dist/esm/w/call/allocation.d.mts +1 -1
- package/dist/esm/w/call/allocation.mjs +1 -1
- package/dist/esm/w/call/arbitration.d.mts +1 -1
- package/dist/esm/w/call/arbitration.mjs +1 -1
- package/dist/esm/w/call/base.d.mts +1 -1
- package/dist/esm/w/call/base.mjs +1 -1
- package/dist/esm/w/call/demand.d.mts +1 -1
- package/dist/esm/w/call/demand.mjs +1 -1
- package/dist/esm/w/call/guard.d.mts +1 -1
- package/dist/esm/w/call/guard.mjs +1 -1
- package/dist/esm/w/call/index.d.mts +1 -1
- package/dist/esm/w/call/index.mjs +1 -1
- package/dist/esm/w/call/machine.d.mts +1 -1
- package/dist/esm/w/call/machine.mjs +1 -1
- package/dist/esm/w/call/passport.d.mts +1 -1
- package/dist/esm/w/call/passport.mjs +1 -1
- package/dist/esm/w/call/payment.d.mts +1 -1
- package/dist/esm/w/call/payment.mjs +1 -1
- package/dist/esm/w/call/permission.d.mts +1 -1
- package/dist/esm/w/call/permission.mjs +1 -1
- package/dist/esm/w/call/progress.d.mts +1 -1
- package/dist/esm/w/call/progress.mjs +1 -1
- package/dist/esm/w/call/repository.d.mts +1 -1
- package/dist/esm/w/call/repository.mjs +1 -1
- package/dist/esm/w/call/reward.d.mts +1 -1
- package/dist/esm/w/call/reward.mjs +1 -1
- package/dist/esm/w/call/service.d.mts +1 -1
- package/dist/esm/w/call/service.mjs +1 -1
- package/dist/esm/w/call/treasury.d.mts +1 -1
- package/dist/esm/w/call/treasury.mjs +1 -1
- package/dist/esm/w/common.d.mts +1 -1
- package/dist/esm/w/index.d.mts +3 -3
- package/dist/esm/w/index.mjs +1 -1
- package/dist/esm/w/local/account.d.mts +2 -2
- package/dist/esm/w/local/account.mjs +1 -1
- package/dist/esm/w/local/evm/networks.d.mts +1 -1
- package/dist/esm/w/local/evm/networks.mjs +1 -1
- package/dist/esm/w/local/fund-approval.mjs +1 -1
- package/dist/esm/w/local/index.d.mts +3 -3
- package/dist/esm/w/local/index.mjs +1 -1
- package/dist/esm/w/local/token.d.mts +1 -1
- package/dist/esm/w/local/token.mjs +1 -1
- package/dist/esm/w/messenger/attachment.d.mts +2 -0
- package/dist/esm/w/messenger/attachment.mjs +1 -0
- package/dist/esm/w/messenger/index.d.mts +2 -2
- package/dist/esm/w/messenger/index.mjs +1 -1
- package/dist/esm/w/messenger/messenger-api.d.mts +2 -2
- package/dist/esm/w/messenger/messenger-api.mjs +1 -1
- package/dist/esm/w/messenger/messenger.d.mts +1 -1
- package/dist/esm/w/messenger/messenger.mjs +1 -1
- package/dist/esm/w/messenger/pq/crypto.mjs +1 -1
- package/dist/esm/w/messenger/reply.d.mts +1 -1
- package/dist/esm/w/messenger/storage.d.mts +1 -1
- package/dist/esm/w/messenger/storage.mjs +1 -1
- package/dist/esm/w/messenger/types.d.mts +2 -2
- package/dist/esm/w/messenger/types.mjs +1 -1
- package/dist/esm/w/messenger/utils.d.mts +31 -0
- package/dist/esm/w/messenger/utils.mjs +1 -0
- package/dist/esm/w/query/index.d.mts +1 -1
- package/dist/esm/w/query/index.mjs +1 -1
- package/dist/esm/w/query/object.d.mts +1 -1
- package/dist/esm/w/query/object.mjs +1 -1
- package/dist/esm/{w-DcAJ-L_L.mjs → w-C4MkpJSy.mjs} +1 -1
- package/package.json +7 -2
- package/dist/esm/messenger-Cq0kGhTg.mjs +0 -1
- package/dist/esm/messenger-api-DdKAABD8.mjs +0 -1
- package/dist/esm/util-DttciwF8.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as a108a}from'./client-HlvevC--.mjs';import{t as a108b}from'./Transaction-CrzrFqPW.mjs';import{o as a108c}from'./exception-o3XVk35a.mjs';import{a as a108d}from'./network-UpRYD8EM.mjs';import{d as a108e,i as a108f}from'./storage-D1bEi2b7.mjs';import{Config}from'./w/local/config.mjs';import{r as a108g}from'./logger-Da7dKX2V.mjs';import{Account}from'./w/local/account.mjs';import{c as a108h,l as a108i,o as a108j,p as a108k}from'./fund-approval-B0Y1YRF5.mjs';import{bigIntToBytes,bytesToHex,hexToBytes as a108l}from'./w/local/evm/rlp.mjs';import{registerBridgeEvmNetworks}from'./w/local/evm/networks.mjs';import{EvmAccount}from'./w/local/evm-account.mjs';import{keccak_256}from'@noble/hashes/sha3.js';const BRIDGE_ETH_V2_SIG='bridgeETHV2(bytes,uint8)',BRIDGE_ETH_V2_SELECTOR='b4b7068c',BRIDGE_ETH_V1_SELECTOR='9449ebd2',BRIDGE_ERC20_V1_SELECTOR='212afaff',BRIDGE_ERC20_V2_SIG='bridgeERC20V2(uint8,uint256,bytes,uint8)',BRIDGE_ERC20_V2_SELECTOR='0bdba58b',TRANSFER_BRIDGED_V2_SIG='transferBridgedTokensWithSignaturesV2(bytes[],(uint8,uint8,uint64,uint8,bytes))',TRANSFER_BRIDGED_V2_SELECTOR='9c3ecefb',TRANSFER_BRIDGED_V1_SIG='transferBridgedTokensWithSignatures(bytes[],(uint8,uint8,uint64,uint8,bytes))',APPROVE_SIG='approve(address,uint256)',APPROVE_SELECTOR='095ea7b3',IS_TRANSFER_PROCESSED_SIG='isTransferProcessed(uint64)',IS_TRANSFER_PROCESSED_SELECTOR='5458ea9e',WORD_SIZE=0x20;function uintWord(a){const b=bigIntToBytes(BigInt(a)),c=new Uint8Array(WORD_SIZE);return c['set'](b,WORD_SIZE-b['length']),c;}function addressWord(a){const b=a108l(a['startsWith']('0x')?a['slice'](0x2):a);if(b['length']!==0x14)throw new Error('Invalid\x20EVM\x20address\x20length:\x20'+a);const c=new Uint8Array(WORD_SIZE);return c['set'](b,WORD_SIZE-0x14),c;}function padToWord(a){const b=a['length']%WORD_SIZE;if(b===0x0)return a;const c=new Uint8Array(a['length']+WORD_SIZE-b);return c['set'](a,0x0),c;}function concat(...b){const c=b['reduce']((f,g)=>f+g['length'],0x0),d=new Uint8Array(c);let e=0x0;for(const f of b){d['set'](f,e),e+=f['length'];}return d;}function encodeBytes(a){return concat(uintWord(BigInt(a['length'])),padToWord(a));}function computeSelector(a){return bytesToHex(keccak_256(new TextEncoder()['encode'](a))['slice'](0x0,0x4));}function computeEventTopic(a){return'0x'+bytesToHex(keccak_256(new TextEncoder()['encode'](a)));}function encodeBridgeETHV2(a,b){const c=a108l(a['startsWith']('0x')?a['slice'](0x2):a);if(c['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes,\x20got\x20'+c['length']);const d=uintWord(0x40n),e=uintWord(b),f=encodeBytes(c);return'0x'+bytesToHex(concat(a108l(BRIDGE_ETH_V2_SELECTOR),d,e,f));}function encodeBridgeETH(a,b){const c=a108l(a['startsWith']('0x')?a['slice'](0x2):a);if(c['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes,\x20got\x20'+c['length']);const d=uintWord(0x40n),e=uintWord(b),f=encodeBytes(c);return'0x'+bytesToHex(concat(a108l(BRIDGE_ETH_V1_SELECTOR),d,e,f));}function encodeBridgeERC20V2(a,b,c,d){const e=a108l(c['startsWith']('0x')?c['slice'](0x2):c);if(e['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes');const f=uintWord(0x80n),g=encodeBytes(e);return'0x'+bytesToHex(concat(a108l(BRIDGE_ERC20_V2_SELECTOR),uintWord(a),uintWord(b),f,uintWord(d),g));}function encodeBridgeERC20(a,b,c,d){const e=a108l(c['startsWith']('0x')?c['slice'](0x2):c);if(e['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes');const f=uintWord(0x80n),g=encodeBytes(e);return'0x'+bytesToHex(concat(a108l(BRIDGE_ERC20_V1_SELECTOR),uintWord(a),uintWord(b),f,uintWord(d),g));}function encodeMessage(a){return concat(uintWord(a['messageType']),uintWord(a['version']),uintWord(a['nonce']),uintWord(a['chainID']),uintWord(0xa0n),encodeBytes(a['payload']));}function encodeBytesArray(a){const b=a['length'],c=b*0x20,d=[];let e=0x0n;for(const g of a){d['push'](BigInt(c)+e),e+=BigInt(0x20+Math['ceil'](g['length']/0x20)*0x20);}const f=[uintWord(BigInt(b))];for(const h of d)f['push'](uintWord(h));for(const i of a)f['push'](encodeBytes(i));return concat(...f);}function encodeTransferBridgedTokensWithSignatures(a,b,c=!![]){const d=c?TRANSFER_BRIDGED_V2_SELECTOR:computeSelector(TRANSFER_BRIDGED_V1_SIG),e=encodeBytesArray(a),f=encodeMessage(b),g=uintWord(0x40n),h=uintWord(BigInt(0x40+e['length']));return'0x'+bytesToHex(concat(a108l(d),g,h,e,f));}function encodeApprove(a,b){return'0x'+bytesToHex(concat(a108l(APPROVE_SELECTOR),addressWord(a),uintWord(b)));}function encodeTokenTransferPayloadV2(a){const {senderAddress:b,targetChain:c,recipientAddress:d,tokenID:e,amount:f,timestampMs:g}=a;if(b['length']!==0x20)throw new Error('senderAddress\x20must\x20be\x2032\x20bytes');if(d['length']!==0x14)throw new Error('recipientAddress\x20must\x20be\x2020\x20bytes');const h=new Uint8Array(0x48);let i=0x0;h[i++]=0x20,h['set'](b,i),i+=0x20,h[i++]=c,h[i++]=0x14,h['set'](d,i),i+=0x14,h[i++]=e;const j=bigIntToBytes(f);h['set'](j,i+0x8-j['length']),i+=0x8;const k=bigIntToBytes(g);return h['set'](k,i+0x8-k['length']),h;}function encodeIsTransferProcessed(a){return'0x'+bytesToHex(concat(a108l(IS_TRANSFER_PROCESSED_SELECTOR),uintWord(a)));}function verifySelectors(){const a=[[BRIDGE_ETH_V2_SIG,BRIDGE_ETH_V2_SELECTOR],[BRIDGE_ERC20_V2_SIG,BRIDGE_ERC20_V2_SELECTOR],[TRANSFER_BRIDGED_V2_SIG,TRANSFER_BRIDGED_V2_SELECTOR],[APPROVE_SIG,APPROVE_SELECTOR],[IS_TRANSFER_PROCESSED_SIG,IS_TRANSFER_PROCESSED_SELECTOR]];for(const [b,c]of a){const d=computeSelector(b);if(d!==c)throw new Error('ABI\x20selector\x20mismatch\x20for\x20'+b+':\x20expected\x20'+c+',\x20got\x20'+d);}}verifySelectors();const TOKENS_DEPOSITED_V2_TOPIC=computeEventTopic('TokensDepositedV2(uint8,uint64,uint8,uint8,uint64,address,bytes,uint256)'),TOKENS_DEPOSITED_TOPIC=computeEventTopic('TokensDeposited(uint8,uint64,uint8,uint8,uint64,address,bytes)'),TOKENS_CLAIMED_TOPIC=computeEventTopic('TokensClaimed(uint8,uint64,uint8,uint8,uint64,address,bytes)'),ERC20_TRANSFER_TOPIC=computeEventTopic('Transfer(address,address,uint256)');async function depositEth(a,b){try{const c=b['destinationChainId']??0x0,d=b['version']!=='v1'?encodeBridgeETHV2(b['recipientWowAddress'],c):encodeBridgeETH(b['recipientWowAddress'],c),f={'to':b['bridgeProxyAddress'],'value':a,'data':d,'network':b['network'],'rpcUrl':b['rpcUrl'],'gasLimit':0x3d090n},g=EvmAccount['Instance']();await g['active']();const h=await g['sign_and_send'](f,b['rpcUrl']);if(h['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20deposit\x20transaction\x20reverted','revertReason':'txHash:\x20'+h['transactionHash']}};return{'success':!![],'txHash':h['transactionHash']};}catch(i){return{'success':![],'error':{'code':'UNKNOWN','message':'ETH\x20deposit\x20failed:\x20'+(i?.['message']??String(i)),'raw':i}};}}async function depositErc20(a,b){try{const c=EvmAccount['Instance']();await c['active']();const d=b['destinationChainId']??0x0,f={'to':b['tokenAddress'],'data':encodeApprove(b['bridgeProxyAddress'],a),'network':b['network'],'rpcUrl':b['rpcUrl']},g=await c['sign_and_send'](f,b['rpcUrl']);if(g['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ERC20\x20approve\x20reverted','revertReason':'txHash:\x20'+g['transactionHash']}};const h=b['version']!=='v1'?encodeBridgeERC20V2(b['tokenId'],a,b['recipientWowAddress'],d):encodeBridgeERC20(b['tokenId'],a,b['recipientWowAddress'],d),i={'to':b['bridgeProxyAddress'],'value':0x0n,'data':h,'network':b['network'],'rpcUrl':b['rpcUrl']},j=await c['sign_and_send'](i,b['rpcUrl']);if(j['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ERC20\x20deposit\x20transaction\x20reverted','revertReason':'txHash:\x20'+j['transactionHash']}};return{'success':!![],'txHash':j['transactionHash']};}catch(k){return{'success':![],'error':{'code':'UNKNOWN','message':'ERC20\x20deposit\x20failed:\x20'+(k?.['message']??String(k)),'raw':k}};}}async function depositFromEth(a,b){if(a['tokenAddress']){if(a['tokenId']===void 0x0)return{'success':![],'error':{'code':'INVALID_PARAM','message':'tokenId\x20is\x20required\x20for\x20ERC20\x20deposit'}};return depositErc20(a['amount'],{...b,'tokenAddress':a['tokenAddress'],'tokenId':a['tokenId']});}return depositEth(a['amount'],b);}const BRIDGE_PACKAGE_ID='0xb',BRIDGE_OBJECT_ID='0x9',MESSAGE_KEY_TYPE=BRIDGE_PACKAGE_ID+'::message::BridgeMessageKey';let cachedRecordsId;function recordToAbiMessage(a){return{'messageType':a['message']['messageType'],'version':a['message']['messageVersion'],'nonce':a['message']['seqNum'],'chainID':a['message']['sourceChain'],'payload':a['message']['payload']};}async function getBridgeRecordsId(a){if(cachedRecordsId)return cachedRecordsId;try{const b=((await a['getObject']({'objectId':BRIDGE_OBJECT_ID,'options':{'showContent':!![]}}))?.['data']?.['content'])?.['fields']?.['inner']?.['fields']?.['id']?.['id'];if(!b)return void 0x0;const c=((await a['getDynamicFieldObject']({'parentId':b,'name':{'type':'u64','value':'1'}}))?.['data']?.['content'])?.['fields']?.['value']?.['fields']?.['token_transfer_records']?.['fields']?.['id']?.['id'];return cachedRecordsId=c,c;}catch{return;}}async function readBridgeRecord(a,b,c,d=0x0){const e=await getBridgeRecordsId(a);if(!e)return void 0x0;let f;try{f=await a['getDynamicFieldObject']({'parentId':e,'name':{'type':MESSAGE_KEY_TYPE,'value':{'source_chain':String(b),'message_type':String(d),'bridge_seq_num':String(c)}}});}catch{return;}const g=f?.['data']?.['content']?.['fields']?.['value']?.['fields']?.['value']?.['fields'];if(!g)return;return parseBridgeRecord(g);}async function readNextTokenTransferSeq(a){try{const b=((await a['getObject']({'objectId':BRIDGE_OBJECT_ID,'options':{'showContent':!![]}}))?.['data']?.['content'])?.['fields']?.['inner']?.['fields']?.['id']?.['id'];if(!b)return void 0x0;const c=(((await a['getDynamicFieldObject']({'parentId':b,'name':{'type':'u64','value':'1'}}))?.['data']?.['content'])?.['fields']?.['value']?.['fields']?.['sequence_nums'])?.['fields']?.['contents']??[];for(const d of c)if(Number(d?.['fields']?.['key'])===0x0)return BigInt(d?.['fields']?.['value']??0x0);return 0x0n;}catch{return;}}function parseBridgeRecord(a){const b=a?.['message']?.['fields']??a?.['message']??{},c=a?.['verified_signatures'],d=Array['isArray'](c)?c:c&&typeof c==='object'&&'Some'in c?c['Some']:[];return{'message':{'messageType':toNumber(b['message_type']),'messageVersion':toNumber(b['message_version']),'seqNum':toBigInt(b['seq_num']),'sourceChain':toNumber(b['source_chain']),'payload':toBytes(b['payload'])},'verifiedSignatures':Array['isArray'](d)?d['map'](e=>toBytes(e)):[],'claimed':!!a?.['claimed']};}function toNumber(a){if(typeof a==='number')return a;if(typeof a==='string')return Number(a);return 0x0;}function toBigInt(a){if(typeof a==='bigint')return a;if(typeof a==='number')return BigInt(a);if(typeof a==='string')return BigInt(a);return 0x0n;}function toBytes(a){if(a instanceof Uint8Array)return a;if(Array['isArray'](a))return Uint8Array['from'](a['map'](b=>Number(b)));if(typeof a==='string'){if(/^0x/i['test'](a)){const b=a['slice'](0x2),c=new Uint8Array(Math['ceil'](b['length']/0x2));for(let d=0x0;d<c['length'];d++){const e=b['slice'](d*0x2,d*0x2+0x2);c[d]=parseInt(e,0x10)||0x0;}return c;}try{return new Uint8Array(Buffer['from'](a,'base64'));}catch{return new Uint8Array(0x0);}}return new Uint8Array(0x0);}function buildClaimMessage(a){const b=encodeTokenTransferPayloadV2({'senderAddress':a['senderAddress'],'targetChain':a['targetChain'],'recipientAddress':a['recipientAddress'],'tokenID':a['tokenId'],'amount':a['amount'],'timestampMs':a['timestampMs']});return{'messageType':a['messageType'],'version':a['version'],'nonce':a['nonce'],'chainID':a['sourceChain'],'payload':b};}function signaturesToBytes(a){return a['map'](b=>{const c=a108l(b['signature']['startsWith']('0x')?b['signature']['slice'](0x2):b['signature']);if(c['length']!==0x41)throw new Error('Invalid\x20signature\x20length:\x20'+c['length']+'\x20(expected\x2065)');return c;});}async function claimOnEth(a,b){try{const c=b['useV2']??!![];if(await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':b['bridgeProxyAddress'],'network':b['network'],'rpcUrl':b['rpcUrl']},a['message']['nonce']))return{'success':![],'error':{'code':'ALREADY_PROCESSED','message':buildAlreadyProcessedMessage(a['message']['nonce'])}};let d=a['message'],f,g;const h=b['wowClient']?await readBridgeRecord(b['wowClient'],a['message']['chainID'],a['message']['nonce'],a['message']['messageType']):void 0x0;if(h&&h['verifiedSignatures']['length']>0x0)d=recordToAbiMessage(h),f=h['verifiedSignatures'];else{g=await b['nodeClient']['signWowToEth'](a['wowTxDigest'],a['eventIndex']);g['length']===0x0&&(console['warn']('tx_digest\x20路径未收集到签名,回退到\x20seq\x20路径:',a['message']['chainID'],a['message']['messageType'],a['message']['nonce']),g=await b['nodeClient']['signWowTokenTransfer'](a['message']['chainID'],a['message']['messageType'],a['message']['nonce']));if(g['length']===0x0)return{'success':![],'error':{'code':'NO_SIGNATURES','message':buildNoSignaturesMessage(a['message']['chainID'],a['message']['messageType'],a['message']['nonce'])}};d=g[0x0]['action']?messageFromActionData(g[0x0]['action'],a['message']):a['message'],f=signaturesToBytes(g);}const i=encodeTransferBridgedTokensWithSignatures(f,d,c),j={'to':b['bridgeProxyAddress'],'value':0x0n,'data':i,'network':b['network'],'rpcUrl':b['rpcUrl']},k=EvmAccount['Instance']();await k['active']();const l=await k['sign_and_send'](j,b['rpcUrl']);if(l['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20transaction\x20reverted','revertReason':'txHash:\x20'+l['transactionHash']}};return{'success':!![],'txHash':l['transactionHash']};}catch(m){return wrapBridgeError(m,'UNKNOWN','ETH\x20claim\x20failed');}}function bridgeChainNameToId(a){switch(a){case'WowMainnet':return 0x0;case'EthMainnet':return 0xa;default:throw new Error('Unknown\x20bridge\x20chain\x20name:\x20'+a);}}function messageFromActionData(a,b){if(!a||typeof a!=='object')return b;const c=a;if(c['WowToEthTokenTransferV2']){const d=c['WowToEthTokenTransferV2'],e=d['wow_address']['startsWith']('0x')?d['wow_address']['slice'](0x2):d['wow_address'],f=d['eth_address']['startsWith']('0x')?d['eth_address']['slice'](0x2):d['eth_address'],g=a108l(e),h=a108l(f),i=encodeTokenTransferPayloadV2({'senderAddress':g,'targetChain':bridgeChainNameToId(d['eth_chain_id']),'recipientAddress':h,'tokenID':d['token_id'],'amount':BigInt(d['amount_adjusted']),'timestampMs':BigInt(d['timestamp_ms'])});return{'messageType':0x0,'version':0x2,'nonce':BigInt(d['nonce']),'chainID':bridgeChainNameToId(d['wow_chain_id']),'payload':i};}return console['warn']('[claimOnEthBySeq]\x20Unknown\x20action\x20data\x20type,\x20falling\x20back\x20to\x20local\x20message:',Object['keys'](c)),b;}async function claimOnEthBySeq(a,b){try{const c=b['useV2']??!![];if(await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':b['bridgeProxyAddress'],'network':b['network'],'rpcUrl':b['rpcUrl']},a['seqNum']))return{'success':![],'error':{'code':'ALREADY_PROCESSED','message':buildAlreadyProcessedMessage(a['seqNum'])}};let d=a['message'],f;const g=b['wowClient']?await readBridgeRecord(b['wowClient'],a['sourceChain'],a['seqNum'],a['messageType']):void 0x0;if(g&&g['verifiedSignatures']['length']>0x0)d=recordToAbiMessage(g),f=g['verifiedSignatures'];else{const m=await b['nodeClient']['signWowTokenTransfer'](a['sourceChain'],a['messageType'],a['seqNum']);if(m['length']===0x0)return{'success':![],'error':{'code':'NO_SIGNATURES','message':buildNoSignaturesMessage(a['sourceChain'],a['messageType'],a['seqNum'])}};d=m[0x0]['action']?messageFromActionData(m[0x0]['action'],a['message']):a['message'],f=signaturesToBytes(m);}const h=encodeTransferBridgedTokensWithSignatures(f,d,c),i={'to':b['bridgeProxyAddress'],'value':0x0n,'data':h,'network':b['network'],'rpcUrl':b['rpcUrl']},j=EvmAccount['Instance']();await j['active']();let k;try{await j['ethCall'](i);}catch(n){const o=n?.['message']??String(n);if(o['includes']('execution\x20reverted')||o['includes']('reverted\x20with\x20reason'))k=o;else console['warn']('\x20\x20[claimOnEthBySeq]\x20eth_call\x20warning\x20(skipped):',o['slice'](0x0,0x78));}if(k)return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20reverted','revertReason':k}};const l=await j['sign_and_send'](i,b['rpcUrl']);if(l['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20transaction\x20reverted','revertReason':'txHash:\x20'+l['transactionHash']}};return{'success':!![],'txHash':l['transactionHash']};}catch(p){return wrapBridgeError(p,'UNKNOWN','ETH\x20claim\x20(by\x20seq)\x20failed');}}async function isEvmNonceAlreadyProcessed(a,b){try{const c=EvmAccount['Instance']();await c['active']();const d=encodeIsTransferProcessed(b),f=(await c['ethCall']({'to':a['bridgeProxyAddress'],'value':0x0n,'data':d,'network':a['network'],'rpcUrl':a['rpcUrl']}))['replace'](/^0x/,'');return(f['length']>=0x2?f['slice'](-0x2):'')==='01';}catch(g){return console['warn']('\x20\x20[claim\x20precheck]\x20isTransferProcessed('+b+')\x20query\x20failed\x20(skipped):',(g?.['message']??String(g))['slice'](0x0,0x78)),![];}}function buildAlreadyProcessedMessage(a){return['EVM\x20bridge\x20has\x20already\x20processed\x20nonce\x20(seq)\x20'+a+'\x20(isTransferProcessed=true).','This\x20transfer\x20CANNOT\x20be\x20claimed,\x20and\x20the\x20WOW-side\x20funds\x20are\x20PERMANENTLY\x20LOCKED.','Do\x20NOT\x20retry\x20the\x20claim.','This\x20usually\x20means\x20the\x20WOW\x20bridge\x20seq\x20collided\x20with\x20an\x20old\x20EVM\x20nonce','left\x20over\x20from\x20a\x20previous\x20chain\x20generation\x20(re-genesis).']['join']('\x0a');}function buildNoSignaturesMessage(a,b,c){return['No\x20signatures\x20collected\x20for\x20seq='+c+'\x20(sourceChain='+a+',\x20messageType='+b+').','Possible\x20reasons:','\x20\x201)\x20Bridge\x20nodes\x20are\x20not\x20reachable\x20or\x20not\x20synced','\x20\x202)\x20The\x20seq\x20'+c+'\x20does\x20not\x20exist\x20on\x20source\x20chain','\x20\x203)\x20The\x20message\x20has\x20already\x20expired','\x20\x204)\x20Insufficient\x20quorum\x20(need\x202/3\x20of\x20total\x20committee\x20weight)','Check\x20node\x20health\x20with\x20nodeClient.pingAll().']['join']('\x0a');}function wrapBridgeError(a,b,c){return{'success':![],'error':{'code':b,'message':c+':\x20'+(a?.['message']??String(a)),'raw':a}};}const BRIDGE_PACKAGE$1='0xb',DEFAULT_BRIDGE_OBJECT_ID$1='0x9',CLOCK_OBJECT_ID$1='0x6',EVM_ADDRESS_LENGTH=0x14,TOKEN_DEPOSITED_EVENT_V2_TYPE=BRIDGE_PACKAGE$1+'::bridge::TokenDepositedEventV2';async function depositFromWow(a,b){if(!a['tokenType']||a['tokenType']['split']('::')['length']<0x3)a108c('invalid\x20parameter','Invalid\x20tokenType:\x20'+a['tokenType']);if(a['amount']<=0x0n)a108c('invalid\x20parameter','amount\x20must\x20be\x20positive');const c=parseEvmAddress(a['recipientEthAddress']),d=a['destinationChainId']??0xa,f=a['bridgeObjectId']??DEFAULT_BRIDGE_OBJECT_ID$1,g=new a108b(),h=await Account['Instance']()['get_coin_object'](g,a['amount'],a['tokenType'],await getEnvAccount$1(b),b['network']);if(!h)a108c('fail','Failed\x20to\x20get\x20coin\x20object');g['moveCall']({'target':BRIDGE_PACKAGE$1+'::bridge::send_token_v2','arguments':[g['object'](f),g['pure']['u8'](d),g['pure']['vector']('u8',c),h,g['object'](CLOCK_OBJECT_ID$1)],'typeArguments':[a['tokenType']]});const i=await Account['Instance']()['sign_and_commit'](g,await getEnvAccount$1(b),b['network']);if(!i||!i['digest'])a108c('fail','WOW\x20deposit\x20transaction\x20failed');let j=i;if(!i['events']||i['events']['length']===0x0){const {WowClient:l}=await import('./client/index.mjs'),{Config:m}=await import('./w/local/config.mjs'),n=await m['Instance']()['network_get'](b['network']),o=new l({'url':a108d(n),'network':n});let p;for(let q=0x0;q<0xa;q++){try{j=await o['getTransactionBlock']({'digest':i['digest'],'options':{'showEvents':!![],'showEffects':!![]}});if(j['events']&&j['events']['length']>0x0)break;}catch(r){p=r;}await new Promise(s=>setTimeout(s,0x3e8*(q+0x1)));}if(!j['events']||j['events']['length']===0x0)throw p??new Error('Failed\x20to\x20fetch\x20events\x20for\x20tx\x20'+i['digest']);}const k=parseSeqNumFromReceipt(j);if(k===void 0x0)a108c('fail','Failed\x20to\x20parse\x20seqNum\x20from\x20WOW\x20tx\x20'+i['digest']);return{'digest':i['digest'],'seqNum':k,'receipt':i};}function parseEvmAddress(a){let b=a;if(b['startsWith']('0x')||b['startsWith']('0X'))b=b['slice'](0x2);if(b['length']!==EVM_ADDRESS_LENGTH*0x2)a108c('invalid\x20parameter','Invalid\x20EVM\x20address:\x20'+a+'\x20(expected\x2020\x20bytes)');const c=new Uint8Array(EVM_ADDRESS_LENGTH);for(let d=0x0;d<EVM_ADDRESS_LENGTH;d++)c[d]=parseInt(b['slice'](d*0x2,d*0x2+0x2),0x10);return c;}function normalizeEventType$1(a){const b=a['split']('::');if(b['length']>0x0&&b[0x0]['startsWith']('0x')){const c=b[0x0]['toLowerCase']()['replace'](/^0x0+/,'0x');b[0x0]=c==='0x'?'0x0':c;}return b['join']('::');}function parseSeqNumFromReceipt(a){const b=a['events'];if(!b||b['length']===0x0)return void 0x0;const c=normalizeEventType$1(TOKEN_DEPOSITED_EVENT_V2_TYPE);for(const d of b){if(normalizeEventType$1(d['type'])!==c)continue;const e=d['parsedJson'];if(!e)continue;const f=e['seq_num'];if(typeof f==='string'||typeof f==='number')return BigInt(f);}}async function getEnvAccount$1(a){return a['account']??void 0x0;}const BRIDGE_PACKAGE='0xb',CLOCK_OBJECT_ID='0x6',TOKEN_TRANSFER_APPROVED_TYPE=BRIDGE_PACKAGE+'::bridge::TokenTransferApproved',TOKEN_TRANSFER_CLAIMED_TYPE=BRIDGE_PACKAGE+'::bridge::TokenTransferClaimed',DEFAULT_BRIDGE_OBJECT_ID='0x9';async function claimOnWow(a,b){if(!a['tokenType']||a['tokenType']['split']('::')['length']<0x3)a108c('invalid\x20parameter','Invalid\x20tokenType:\x20'+a['tokenType']);if(a['bridgeSeqNum']<0x0n)a108c('invalid\x20parameter','bridgeSeqNum\x20must\x20be\x20non-negative');const c=a['sourceChainId']??0xa,d=a['bridgeObjectId']??DEFAULT_BRIDGE_OBJECT_ID,e=new a108b();e['moveCall']({'target':BRIDGE_PACKAGE+'::bridge::claim_and_transfer_token','arguments':[e['object'](d),e['object'](CLOCK_OBJECT_ID),e['pure']['u8'](c),e['pure']['u64'](a['bridgeSeqNum'])],'typeArguments':[a['tokenType']]});const f=await Account['Instance']()['sign_and_commit'](e,await getEnvAccount(b),b['network']);if(!f||!f['digest'])a108c('fail','WOW\x20claim\x20transaction\x20failed');return{'digest':f['digest'],'receipt':f};}let WowClaimStatus=function(a){return a['NotApproved']='not_approved',a['Approved']='approved',a['Claimed']='claimed',a['NotFound']='not_found',a;}({});async function queryWowClaimStatus(a,b){const c=a['sourceChainId']??0xa,d=await Config['Instance']()['network_get'](b),e=new a108a({'url':a108d(d),'network':d}),f=await e['queryEvents']({'query':{'MoveEventType':TOKEN_TRANSFER_CLAIMED_TYPE},'limit':0x64,'order':'descending'});for(const h of f['data']){const i=h['parsedJson'];if(!i)continue;const j=i['message_key'];if(!j)continue;const k=Number(j['source_chain']),l=BigInt(j['bridge_seq_num']??0x0);if(k===c&&l===a['bridgeSeqNum'])return{'status':'claimed','claimedTxHash':h['id']?.['txDigest']};}const g=await e['queryEvents']({'query':{'MoveEventType':TOKEN_TRANSFER_APPROVED_TYPE},'limit':0x64,'order':'descending'});for(const m of g['data']){const n=m['parsedJson'];if(!n)continue;const o=n['message_key'];if(!o)continue;const p=Number(o['source_chain']),q=BigInt(o['bridge_seq_num']??0x0);if(p===c&&q===a['bridgeSeqNum'])return{'status':'approved','approvedEventId':m['id']?.['eventSeq']};}return{'status':'not_approved'};}async function getEnvAccount(a){return a['account']??void 0x0;}const logger$1=a108g('bridge:query');async function queryEthTxReceipt(a,b,c=0x2710){const d=new AbortController(),f=setTimeout(()=>d['abort'](),c);try{const g=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_getTransactionReceipt','params':[a]}),'signal':d['signal']}))['json']();if(g['error'])throw new Error('JSON-RPC\x20error:\x20'+g['error']['message']);return g['result'];}catch(h){if(h?.['name']==='AbortError')throw new Error('queryEthTxReceipt\x20timeout\x20after\x20'+c+'ms');throw h;}finally{clearTimeout(f);}}async function queryEthBalance(a,b){const c=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_getBalance','params':[a,'latest']})}))['json']();if(c['error'])throw new Error('JSON-RPC\x20error:\x20'+c['error']['message']);return BigInt(c['result']);}async function queryErc20Balance(a,b,c){const d='0x70a08231000000000000000000000000'+b['slice'](0x2)['toLowerCase'](),e=await(await fetch(c,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_call','params':[{'to':a,'data':d},'latest']})}))['json']();if(e['error'])throw new Error('JSON-RPC\x20error:\x20'+e['error']['message']);return BigInt(e['result']);}async function queryEthTxConfirmations(a,b,c=0x2710){const d=await queryEthTxReceipt(a,b,c);if(!d?.['blockNumber'])return 0x0;const e=new AbortController(),f=setTimeout(()=>e['abort'](),c);try{const g=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x2,'method':'eth_blockNumber','params':[]}),'signal':e['signal']}))['json'](),h=BigInt(g['result']),i=BigInt(d['blockNumber']);return Number(h-i);}finally{clearTimeout(f);}}async function queryWowTx(a,b){try{return await a['getTransactionBlock']({'digest':b,'options':{'showEffects':!![],'showEvents':!![]}});}catch{return null;}}let BridgeTransferDirection=function(a){return a['EvmToWow']='evm_to_wow',a['WowToEvm']='wow_to_evm',a;}({}),BridgeTransferStep=function(a){return a['NotStarted']='not_started',a['SourceTxPending']='source_tx_pending',a['SourceTxConfirmed']='source_tx_confirmed',a['NodeSigning']='node_signing',a['SignaturesReady']='signatures_ready',a['ClaimTxPending']='claim_tx_pending',a['Completed']='completed',a['Failed']='failed',a;}({});const BRIDGE_STEP_DESCRIPTIONS={['not_started']:'尚未发起跨链',['source_tx_pending']:'源链交易已提交,等待区块确认',['source_tx_confirmed']:'源链交易已确认,等待\x20bridge\x20节点签名\x20approve',['node_signing']:'bridge\x20节点签名收集中',['signatures_ready']:'签名已收集完毕,可发起目标链\x20claim',['claim_tx_pending']:'目标链\x20claim\x20交易已提交,待确认',['completed']:'跨链完成',['failed']:'跨链失败'};let BridgeTransferStatus=function(a){return a['NotStarted']='not_started',a['Pending']='pending',a['Confirmed']='confirmed',a['SignaturesReady']='signatures_ready',a['Claiming']='claiming',a['Completed']='completed',a['Failed']='failed',a;}({});function makeBridgeTransferState(a){return{'status':stepToStatus(a['step']),'stepDescription':BRIDGE_STEP_DESCRIPTIONS[a['step']],'updatedAt':Date['now'](),...a};}function stepToStatus(a){switch(a){case'not_started':return'not_started';case'source_tx_pending':return'pending';case'source_tx_confirmed':return'confirmed';case'node_signing':return'confirmed';case'signatures_ready':return'signatures_ready';case'claim_tx_pending':return'claiming';case'completed':return'completed';case'failed':return'failed';}}function parseEthDepositEvent(a,b){const c=b['toLowerCase']();for(const d of a['logs']){if(d['address']['toLowerCase']()!==c)continue;const e=d['topics'][0x0]===TOKENS_DEPOSITED_V2_TOPIC,f=d['topics'][0x0]===TOKENS_DEPOSITED_TOPIC;if(!e&&!f)continue;const g=a108l(d['data']);if(g['length']<0x80)continue;const h=u=>g[u*0x20+0x1f],i=u=>{const v=g['slice'](u*0x20,u*0x20+0x20);return BigInt('0x'+bytesToHex(v['slice'](0x18,0x20)));},j=u=>'0x'+bytesToHex(g['slice'](u*0x20+0xc,u*0x20+0x20)),k=h(0x0),l=i(0x1),m=j(0x2),n=Number(i(0x3)),o=Number(BigInt('0x'+bytesToHex(g['slice'](n,n+0x20))['slice'](0x30))),p='0x'+bytesToHex(g['slice'](n+0x20,n+0x20+o)),q=d['topics'][0x1]?.['slice'](0x40)??'00',r=parseInt(q,0x10),s=d['topics'][0x3]?.['slice'](0x40)??'00',t=parseInt(s,0x10);return{'bridgeSeq':BigInt('0x'+(d['topics'][0x2]?.['slice'](0x38)??'0')),'sourceChain':r,'sender':m,'targetChain':t,'recipient':p,'tokenID':k,'amount':l};}return null;}function parseEthClaimEvent(a,b){const c=b['toLowerCase']();for(const d of a['logs']){if(d['address']['toLowerCase']()!==c)continue;if(d['topics'][0x0]!==TOKENS_CLAIMED_TOPIC)continue;const e=a108l(d['data']);if(e['length']<0x80)continue;const f=n=>e[n*0x20+0x1f],g=n=>{const o=e['slice'](n*0x20,n*0x20+0x20);return BigInt('0x'+bytesToHex(o['slice'](0x18,0x20)));},h=n=>'0x'+bytesToHex(e['slice'](n*0x20+0xc,n*0x20+0x20));f(0x0);const i=g(0x1),j=h(0x2),k=Number(g(0x3)),l=Number(BigInt('0x'+bytesToHex(e['slice'](k,k+0x20))['slice'](0x30))),m='0x'+bytesToHex(e['slice'](k+0x20,k+0x20+l));return{'bridgeSeq':BigInt('0x'+(d['topics'][0x2]?.['slice'](0x38)??'0')),'claimer':j,'recipient':m,'amount':i};}return null;}async function queryEvmToWowTransferStatus(a,b,c){const d=await queryEthTxReceipt(a,b);if(!d)return makeBridgeTransferState({'step':'source_tx_pending','direction':'evm_to_wow','sourceTxHash':a});if(d['status']!=='0x1')return makeBridgeTransferState({'step':'failed','direction':'evm_to_wow','sourceTxHash':a,'ethReceipt':d,'error':'ETH\x20source\x20transaction\x20reverted'});const e=parseEthDepositEvent(d,c);if(!e)return makeBridgeTransferState({'step':'failed','direction':'evm_to_wow','sourceTxHash':a,'ethReceipt':d,'error':'No\x20TokensDeposited/TokensDepositedV2\x20event\x20found\x20in\x20receipt'});let f=0x0;try{f=await queryEthTxConfirmations(a,b);}catch{}return makeBridgeTransferState({'step':'source_tx_confirmed','direction':'evm_to_wow','sourceTxHash':a,'bridgeSeq':e['bridgeSeq'],'confirmations':f,'ethReceipt':d});}async function queryWowToEvmTransferStatus(a,b){const c=await queryWowTx(a,b);if(!c)return makeBridgeTransferState({'step':'source_tx_pending','direction':'wow_to_evm','sourceTxHash':b});if(c['effects']?.['status']?.['status']!=='success')return makeBridgeTransferState({'step':'failed','direction':'wow_to_evm','sourceTxHash':b,'wowReceipt':c,'error':c['effects']?.['status']?.['error']||'WOW\x20transaction\x20failed'});return makeBridgeTransferState({'step':'source_tx_confirmed','direction':'wow_to_evm','sourceTxHash':b,'bridgeSeq':parseWowDepositSeqFromReceipt(c),'wowReceipt':c});}function normalizeEventType(a){const b=a['split']('::');if(b['length']>0x0&&b[0x0]['startsWith']('0x')){const c=b[0x0]['toLowerCase']()['replace'](/^0x0+/,'0x');b[0x0]=c==='0x'?'0x0':c;}return b['join']('::');}function parseWowDepositSeqFromReceipt(a){const b=a['events'];if(!b||b['length']===0x0)return void 0x0;const c=normalizeEventType('0xb::bridge::TokenDepositedEventV2');for(const d of b){if(normalizeEventType(d['type'])!==c)continue;const e=d['parsedJson'];if(!e)continue;const f=e['seq_num'];if(typeof f==='string'||typeof f==='number')return BigInt(f);}}async function waitForEthTx(a,b,c=0x1,d=0x2ee0,e=0x1e*0xea60){const f=Math['max'](0x1,Math['ceil'](e/d));for(let g=0x0;g<f;g++){const h=await queryEthTxReceipt(a,b);if(h){const j=await queryEthTxConfirmations(a,b);if(j>=c)return h;logger$1['debug'](g+0x1+'/'+f+':\x20'+j+'/'+c+'\x20confirmations');}else logger$1['debug'](g+0x1+'/'+f+':\x20pending');await sleep$1(d);}a108c('fail','Timeout\x20waiting\x20for\x20ETH\x20tx\x20'+a+'\x20after\x20'+f+'\x20iterations');}async function waitForWowTx(a,b,c=0xbb8,d=0x5*0xea60){const e=Math['max'](0x1,Math['ceil'](d/c));for(let f=0x0;f<e;f++){const g=await queryWowTx(a,b);if(g&&g['effects']?.['status']?.['status']==='success')return g;if(g&&g['effects']?.['status']?.['status']==='failure')a108c('fail','WOW\x20tx\x20'+b+'\x20failed:\x20'+(g['effects']['status']['error']||'unknown'));logger$1['debug'](f+0x1+'/'+e+':\x20pending'),await sleep$1(c);}a108c('fail','Timeout\x20waiting\x20for\x20WOW\x20tx\x20'+b+'\x20after\x20'+e+'\x20iterations');}function sleep$1(a){return new Promise(b=>setTimeout(b,a));}function isBase64(a){return/^[A-Za-z0-9+/]*={0,2}$/['test'](a)&&a['length']>0x0;}function decodeFlex(a){if(a['startsWith']('0x')||a['startsWith']('0X'))return a108l(a);if(/^[0-9a-fA-F]+$/['test'](a)&&a['length']%0x2===0x0)return a108l(a);if(isBase64(a))return Buffer['from'](a,'base64');throw new Error('Cannot\x20decode\x20signature/pubkey\x20string:\x20'+a);}function parseSignedAction(a,b){const c=decodeFlex(a['auth_signature']['authority_pub_key']),d=decodeFlex(a['auth_signature']['signature']);if(c['length']!==0x21&&c['length']!==0x41)throw new Error('Invalid\x20pubkey\x20length:\x20'+c['length']+'\x20(expected\x2033\x20or\x2065)');if(d['length']!==0x41)throw new Error('Invalid\x20signature\x20length:\x20'+d['length']+'\x20(expected\x2065)');return{'signerPubkey':'0x'+bytesToHex(c),'signature':'0x'+bytesToHex(d),'weight':b,'action':a['data']};}var BridgeNodeClient=class{constructor(a){this['committee']=a['committee'],this['timeoutMs']=a['timeoutMs']??0x7530,this['quorumRatio']=a['quorumRatio']??0x2/0x3,this['minRequiredStake']=a['minRequiredStake'];}get['totalWeight'](){return this['committee']['reduce']((a,b)=>a+b['weight'],0x0);}get['quorumWeight'](){if(this['minRequiredStake']!=null)return this['minRequiredStake'];return Math['floor'](this['totalWeight']*this['quorumRatio'])+0x1;}async['signEthToWow'](a,b){const c='/sign/bridge_tx/eth/wow/'+a+'/'+b;return this['collectSignatures'](c);}async['signWowToEth'](a,b){const c='/sign/bridge_tx/wow/eth/'+a+'/'+b;return this['collectSignatures'](c);}async['probeWowToEth'](a,b){const c='/sign/bridge_tx/wow/eth/'+a+'/'+b,d=await this['probeSignatures'](c);return{'ready':d['ready'],'signedWeight':d['signedWeight'],'quorumWeight':d['quorumWeight'],'totalWeight':d['totalWeight'],'responded':d['responded'],'memberCount':d['memberCount'],'errors':d['errors']};}async['signWowTokenTransfer'](a,b,c){const d='/sign/bridge_action/wow/eth/'+a+'/'+b+'/'+c;return this['collectSignatures'](d);}async['ping'](a){try{const b=new AbortController(),c=setTimeout(()=>b['abort'](),Math['min'](this['timeoutMs'],0x2710)),d=await fetch(a+'/ping',{'signal':b['signal']});return clearTimeout(c),d['ok'];}catch{return![];}}async['pingAll'](){return Promise['all'](this['committee']['map'](async a=>({'url':a['baseUrl'],'healthy':await this['ping'](a['baseUrl'])})));}async['collectSignatures'](a){const b=await this['probeSignatures'](a);if(!b['ready'])a108c('fail','Quorum\x20not\x20reached:\x20collected\x20'+b['signedWeight']+',\x20required\x20'+b['quorumWeight']+'\x20(total\x20'+b['totalWeight']+')');return b['actions'];}async['probeSignatures'](a){const b=new Map();let c=0x0;const d=this['committee']['map'](async h=>{try{return{'action':parseSignedAction(await this['fetchFromNode'](h['baseUrl'],a),h['weight']),'ok':!![]};}catch(i){return{'action':null,'ok':![],'error':i['message']};}}),e=await Promise['all'](d),f=[];let g=0x0;return e['forEach'](h=>{if(!h['ok']||!h['action']){f['push'](h['ok']?null:h['error']);return;}g+=0x1,f['push'](null),!b['has'](h['action']['signerPubkey'])&&(b['set'](h['action']['signerPubkey'],h['action']),c+=h['action']['weight']);}),{'ready':c>=this['quorumWeight'],'signedWeight':c,'quorumWeight':this['quorumWeight'],'totalWeight':this['totalWeight'],'responded':g,'memberCount':this['committee']['length'],'errors':f,'actions':Array['from'](b['values']())};}async['fetchFromNode'](a,b){const c=new AbortController(),d=setTimeout(()=>c['abort'](),this['timeoutMs']);try{const e=await fetch(''+a+b,{'signal':c['signal'],'headers':{'Accept':'application/json'}});if(!e['ok'])throw new Error('Node\x20'+a+'\x20returned\x20'+e['status']+':\x20'+await e['text']());return await e['json']();}finally{clearTimeout(d);}}};const logger=a108g('bridge');var BridgeClient=class BridgeClient{static{this['SIGNING_PROBE_DEADLINE_MS']=0x2328;}constructor(a={}){this['_transferHistory']=new Map(),this['_transferCounter']=0x0,this['_loadHistoryPromise']=Promise['resolve'](),this['_historyLock']=new a108e(),this['config']=a['config']??loadDefaultConfig(),this['wowEnv']=a['wowEnv'],registerBridgeEvmNetworks({'evmChain':{'chainId':this['config']['ethereum']['chainId'],'rpcUrl':this['config']['ethereum']['rpcUrl']},'setAsDefault':!![]});if(this['config']['l2']){for(const c of Object['values'](this['config']['l2']))if(c)registerBridgeEvmNetworks({'evmChain':{'chainId':c['chainId'],'rpcUrl':c['rpcUrl']}});}const b=this['config']['bridgeNodeUrls']['map']((d,e)=>({'pubkey':a108h[e]??'0x'+e['toString']()['padStart'](0x40,'0'),'weight':a108i[e]??0x1,'baseUrl':d}));this['nodeClient']=new BridgeNodeClient({'committee':b,'timeoutMs':this['config']['timeouts']['nodeRpcMs'],'minRequiredStake':0xd06}),this['_loadHistoryPromise']=this['_loadHistory']();}async['bridgeNativeEvmToWow'](a){return this['depositEvmToWowAndFinalize']({'amount':a['amount'],'recipientWowAddress':a['recipientWowAddress'],'waitForFinalization':a['waitForFinalization'],'token':'ETH','idempotencyKey':a['idempotencyKey'],'idempotentByParams':a['idempotentByParams']});}async['bridgeErc20ToWow'](a){if(a['token']==='ETH')a108c('invalid\x20parameter','Use\x20bridgeNativeEvmToWow()\x20for\x20native\x20ETH;\x20bridgeErc20ToWow()\x20only\x20accepts\x20WETH/WBTC/USDC/USDT');return this['depositEvmToWowAndFinalize']({'amount':a['amount'],'recipientWowAddress':a['recipientWowAddress'],'waitForFinalization':a['waitForFinalization'],'token':a['token'],'idempotencyKey':a['idempotencyKey'],'idempotentByParams':a['idempotentByParams']});}async['resolveEvmRpcUrl'](){const a=this['config']['ethereum'];if(a['rpcUrl'])return a['rpcUrl'];const {EvmNetworkRegistry:b}=await import('./w/local/evm/networks.mjs'),c=b['Instance'](),d=await c['resolve'](a['chainId']),e=c['pickHealthyRpc'](d);if(!e)a108c('invalid\x20parameter','No\x20healthy\x20EVM\x20RPC\x20available\x20for\x20chainId\x20'+a['chainId']+'.\x20Use\x20manage_evm_rpc\x20to\x20add\x20RPC\x20endpoints\x20first.');return e;}async['_ensureSafeEvmNonce'](a){const {WowClient:b}=await import('./client/index.mjs'),{Config:c}=await import('./w/local/config.mjs'),{getFullnodeUrl:d}=await import('./network-UpRYD8EM.mjs')['then'](j=>j['s']),e=await c['Instance']()['network_get'](this['wowEnv']['network']),f=new b({'url':d(e),'network':e}),g=await this['resolveEvmRpcUrl'](),h=0x8;for(let j=0x0;j<h;j++){const k=await readNextTokenTransferSeq(f);if(k===void 0x0){console['warn']('\x20\x20[bridge]\x20readNextTokenTransferSeq\x20failed,\x20skipping\x20EVM\x20nonce\x20precheck');return;}if(!await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':this['config']['ethereum']['bridgeProxyAddress'],'network':this['config']['ethereum']['chainId'],'rpcUrl':g},k))return;console['warn']('\x20\x20[bridge]\x20EVM\x20nonce\x20'+k+'\x20already\x20processed,\x20sending\x201-unit\x20placeholder\x20deposit\x20to\x20skip\x20it'),await waitForWowTx(f,(await depositFromWow({'amount':0x1n,'tokenType':a['tokenType'],'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':a['bridgeObjectId']},this['wowEnv']))['digest'],this['config']['timeouts']['signaturePollIntervalMs'],this['config']['timeouts']['signatureCollectMs']);}a108c('fail','EVM\x20nonce\x20precheck:\x20could\x20not\x20find\x20a\x20safe\x20nonce\x20after\x20'+h+'\x20placeholder\x20deposits');}async['depositEvmToWowAndFinalize'](a){let b;if(a['idempotencyKey'])b=a['idempotencyKey'];else{if(a['idempotentByParams'])b=this['_generateIdempotencyKey']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':a['recipientWowAddress']});}if(b){const t=await this['_findTransferByIdempotencyKey'](b);if(t){if(t['status']==='success')return{'depositTxHash':t['depositTxHash'],'claimTxDigest':t['claimTxDigest'],'bridgeSeq':t['bridgeSeq']?BigInt(t['bridgeSeq']):void 0x0,'idempotentHit':!![]};else{if(t['status']==='pending'||t['status']==='in_progress')return{'depositTxHash':t['depositTxHash']??'','claimTxDigest':t['claimTxDigest'],'bridgeSeq':t['bridgeSeq']?BigInt(t['bridgeSeq']):void 0x0,'idempotentHit':!![]};}await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](t['transferId']),await this['_saveHistory']();});}}const c=this['config']['ethereum'],d=a['waitForFinalization']??!![],e=await this['resolveEvmRpcUrl'](),f=a108k(this['config'],a['token']);if(!f)a108c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=a['token']==='ETH',h=this['config']['defaultVersion']===0x1?'v1':'v2',j={'recipientWowAddress':a['recipientWowAddress'],'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':e,'version':h},k=await depositFromEth({'amount':a['amount'],'tokenAddress':g?void 0x0:f['evmAddress'],'tokenId':g?void 0x0:f['tokenId']},j);if(!k['success']||!k['txHash'])a108c('fail','EVM\x20deposit\x20failed:\x20'+(k['error']?.['message']??'unknown\x20error'));const l=k['txHash'];if(!d)return{'depositTxHash':l};await waitForEthTx(l,e,0x40,0x2ee0,this['config']['timeouts']['signatureCollectMs']);const m=await queryEthTxReceipt(l,e);if(!m)return{'depositTxHash':l};const n=parseEthDepositEvent(m,c['bridgeProxyAddress']);if(!n)return{'depositTxHash':l};if(!this['wowEnv'])a108c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20EVM→WOW\x20finalization\x20(claim\x20on\x20WOW)');const o=this['config']['timeouts']['autoClaimMs'],p=this['config']['timeouts']['signaturePollIntervalMs'],q=Math['max'](0x1,Math['ceil'](o/p));let r;for(let u=0x0;u<q;u++){r=await queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':n['bridgeSeq']},this['config']['wow']['network']),logger['debug']('wait\x20approve\x20'+(u+0x1)+'/'+q+':\x20status='+r['status']);if(r['status']==='approved'||r['status']==='claimed')break;await sleep(p);}if(!r||r['status']==='not_approved')a108c('fail','Timeout\x20waiting\x20for\x20bridge\x20nodes\x20to\x20approve\x20bridgeSeq='+n['bridgeSeq']+'\x20after\x20'+q+'\x20iterations');if(r['status']==='claimed')return{'depositTxHash':l,'bridgeSeq':n['bridgeSeq'],'claimTxDigest':r['claimedTxHash']};const s=await claimOnWow({'sourceChainId':0xa,'bridgeSeqNum':n['bridgeSeq'],'tokenType':f['wowTypeTag'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']},this['wowEnv']);return{'depositTxHash':l,'bridgeSeq':n['bridgeSeq'],'claimTxDigest':s['digest']};}async['bridgeWowToEvm'](a){let b;if(a['idempotencyKey'])b=a['idempotencyKey'];else{if(a['idempotentByParams'])b=this['_generateIdempotencyKey']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['recipientEthAddress']});}if(b){const v=await this['_findTransferByIdempotencyKey'](b);if(v){if(v['status']==='success')return{'depositTxDigest':v['depositTxDigest'],'bridgeSeq':v['bridgeSeq']?BigInt(v['bridgeSeq']):0x0n,'claimTxHash':v['claimTxHash'],'idempotentHit':!![]};else{if(v['status']==='pending'||v['status']==='in_progress')return{'depositTxDigest':v['depositTxDigest']??'','bridgeSeq':v['bridgeSeq']?BigInt(v['bridgeSeq']):0x0n,'claimTxHash':v['claimTxHash'],'idempotentHit':!![]};}await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](v['transferId']),await this['_saveHistory']();});}}if(!this['wowEnv'])a108c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20bridge');const c=a['waitForFinalization']??!![],d=this['config']['ethereum'],e=await this['resolveEvmRpcUrl'](),f=a108k(this['config'],a['token']);if(!f)a108c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=f['wowTypeTag'],h=f['tokenId'];await this['_ensureSafeEvmNonce']({'tokenType':g,'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']});const i=await depositFromWow({'amount':a['amount'],'tokenType':g,'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']},this['wowEnv']),{WowClient:j}=await import('./client/index.mjs'),{Config:k}=await import('./w/local/config.mjs'),{getFullnodeUrl:l}=await import('./network-UpRYD8EM.mjs')['then'](w=>w['s']),m=await k['Instance']()['network_get'](this['wowEnv']['network']),n=new j({'url':l(m),'network':m});await waitForWowTx(n,i['digest'],this['config']['timeouts']['signaturePollIntervalMs'],this['config']['timeouts']['signatureCollectMs']);if(!c)return{'depositTxDigest':i['digest'],'bridgeSeq':i['seqNum']};const o=await n['getTransactionBlock']({'digest':i['digest'],'options':{'showEffects':!![]}}),p=o['timestampMs']?BigInt(o['timestampMs']):BigInt(Date['now']()),q=(await Account['Instance']()['get'](this['wowEnv']['account']))?.['address']??'';if(!q)a108c('fail','Failed\x20to\x20resolve\x20WOW\x20sender\x20address');const r=buildClaimMessage({'messageType':0x0,'version':0x2,'nonce':i['seqNum'],'sourceChain':0x0,'targetChain':0xa,'recipientAddress':hexToBytes(a['recipientEthAddress']['slice'](0x2)),'tokenId':h,'amount':a['amount'],'timestampMs':p,'senderAddress':hexToBytes(q['startsWith']('0x')?q['slice'](0x2):q)}),s={'bridgeProxyAddress':d['bridgeProxyAddress'],'network':d['chainId'],'rpcUrl':e,'nodeClient':this['nodeClient'],'wowClient':n},t=await claimOnEthBySeq({'sourceChain':0x0,'messageType':0x0,'seqNum':i['seqNum'],'message':r},s);if(!t['success']||!t['txHash'])a108c('fail','EVM\x20claim\x20failed:\x20'+(t['error']?.['revertReason']?'revert:\x20'+t['error']['revertReason']:t['error']?.['message']??'unknown\x20error'));const u=t['txHash'];return await waitForEthTx(u,e,0x1,0x2ee0,this['config']['timeouts']['signatureCollectMs']),{'depositTxDigest':i['digest'],'bridgeSeq':i['seqNum'],'claimTxHash':u};}async['queryEvmToWowStatus'](a){const b=this['config']['ethereum'],{EvmNetworkRegistry:c}=await import('./w/local/evm/networks.mjs'),d=c['Instance'](),f=await d['resolve'](b['chainId']),g=Date['now'](),h=[...f['rpcUrls']]['sort']((j,k)=>{const l=d['unhealthyRpc']?.['get'](j)??0x0,m=d['unhealthyRpc']?.['get'](k)??0x0,n=d['unhealthyCounter']?.['get'](j)??0x0,o=d['unhealthyCounter']?.['get'](k)??0x0,p=l<g?0x0:0x1,q=m<g?0x0:0x1;if(p!==q)return p-q;return n-o;});let i;for(const j of h)try{const k=await queryEvmToWowTransferStatus(a,j,b['bridgeProxyAddress']);d['markHealthy'](j);if(k['step']==='source_tx_confirmed'&&k['bridgeSeq'])try{const l=await queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':BigInt(k['bridgeSeq'])},this['config']['wow']['network']);if(l['status']==='claimed')k['status']='completed',k['step']='completed',k['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed'],k['claimTxDigest']=l['claimedTxHash'];else{if(l['status']==='approved')k['status']='signatures_ready',k['step']='signatures_ready',k['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['signatures_ready'];else{if(l['status']==='not_approved'){}}}}catch{}return k;}catch(m){i=m,d['markUnhealthy'](j);}return{'status':'pending','step':'source_tx_pending','direction':'evm_to_wow','sourceTxHash':a,'error':i instanceof Error?i['message']:String(i)};}async['queryWowToEvmStatus'](a){const {WowClient:b}=await import('./client/index.mjs'),{getFullnodeUrl:c}=await import('./network-UpRYD8EM.mjs')['then'](f=>f['s']),d=this['config']['wow']['network'],e=await queryWowToEvmTransferStatus(new b({'url':c(d),'network':d}),a);if(e['step']!=='source_tx_confirmed'||e['bridgeSeq']==null)return e;try{return await this['enrichWowToEvmSigningState'](e,a);}catch{return e;}}async['enrichWowToEvmSigningState'](a,b){const c=this['config']['ethereum'],d=a['bridgeSeq'],e=this['findWowDepositEventIdx'](a);let f=null,g=null;const h=(async()=>{const k=await this['resolveEvmRpcUrl']();f=await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':k},d);})()['catch'](()=>{}),i=e>=0x0?this['nodeClient']['probeWowToEth'](b,e)['then'](k=>{g=k;})['catch'](()=>{}):Promise['resolve']();let j=![];try{await Promise['race']([Promise['allSettled']([h,i]),new Promise((k,l)=>setTimeout(()=>l(new Error('signing-state\x20probe\x20deadline')),BridgeClient['SIGNING_PROBE_DEADLINE_MS']))]);}catch{j=!![];}if(f===!![])return a['status']='completed',a['step']='completed',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed'],a['updatedAt']=Date['now'](),a;if(g){if(g['ready'])a['status']='signatures_ready',a['step']='signatures_ready',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['signatures_ready'],a['signatureCount']=g['responded'],a['signaturesRequired']=g['memberCount'];else g['responded']>0x0&&g['signedWeight']>0x0&&(a['status']='confirmed',a['step']='node_signing',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['node_signing'],a['signatureCount']=g['responded'],a['signaturesRequired']=g['memberCount']);a['updatedAt']=Date['now']();}else{if(j)logger['warn']('WOW→EVM\x20signing-state\x20probe\x20timed\x20out\x20after\x20'+BridgeClient['SIGNING_PROBE_DEADLINE_MS']+'ms;\x20keeping\x20step='+a['step']);}return a;}['findWowDepositEventIdx'](a){const b=a['wowReceipt']?.['events'];if(!b||b['length']===0x0)return 0x0;const c=b['findIndex'](d=>typeof d?.['type']==='string'&&d['type']['toLowerCase']()['includes']('::bridge::tokendepositedeventv2'));return c>=0x0?c:0x0;}async['queryEvmToWowClaimStatus'](a){return queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':a['bridgeSeqNum']},this['config']['wow']['network']);}async['claimWowToEvm'](a){if(!this['wowEnv'])a108c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20claim');await this['_loadHistoryPromise'];const b=this['_transferHistory']['get'](a);if(!b)a108c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20not\x20found');if(b['direction']!=='wow_to_evm')a108c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20is\x20not\x20a\x20wow_to_evm\x20transfer');if(!b['depositTxDigest']||!b['bridgeSeq'])a108c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20missing\x20deposit\x20info\x20(depositTxDigest\x20or\x20bridgeSeq)');const c=this['config']['ethereum'],d=await this['resolveEvmRpcUrl'](),e=a108k(this['config'],b['token']);if(!e)a108c('invalid\x20parameter','Token\x20'+b['token']+'\x20not\x20found\x20in\x20config');const f=e['tokenId'],{WowClient:g}=await import('./client/index.mjs'),{Config:h}=await import('./w/local/config.mjs'),{getFullnodeUrl:i}=await import('./network-UpRYD8EM.mjs')['then'](r=>r['s']),j=await h['Instance']()['network_get'](this['wowEnv']['network']),k=new g({'url':i(j),'network':j}),l=await k['getTransactionBlock']({'digest':b['depositTxDigest'],'options':{'showEffects':!![]}}),m=l['timestampMs']?BigInt(l['timestampMs']):BigInt(Date['now']()),n=(await Account['Instance']()['get'](this['wowEnv']['account']))?.['address']??'';if(!n)a108c('fail','Failed\x20to\x20resolve\x20WOW\x20sender\x20address');const o=buildClaimMessage({'messageType':0x0,'version':0x2,'nonce':BigInt(b['bridgeSeq']),'sourceChain':0x0,'targetChain':0xa,'recipientAddress':hexToBytes(b['recipientEth']['slice'](0x2)),'tokenId':f,'amount':BigInt(b['amount']),'timestampMs':m,'senderAddress':hexToBytes(n['startsWith']('0x')?n['slice'](0x2):n)}),p={'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':d,'nodeClient':this['nodeClient'],'wowClient':k},q=await claimOnEthBySeq({'sourceChain':0x0,'messageType':0x0,'seqNum':BigInt(b['bridgeSeq']),'message':o},p);if(!q['success']||!q['txHash'])a108c('fail','EVM\x20claim\x20failed:\x20'+(q['error']?.['revertReason']?'revert:\x20'+q['error']['revertReason']:q['error']?.['message']??'unknown\x20error'));return this['_updateTransfer'](a,{'step':'claimed','status':'success','claimTxHash':q['txHash']}),{'claimTxHash':q['txHash'],'transferId':a};}async['bridgeWowToEvmSimple'](a){if(!this['wowEnv'])a108c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20bridge');const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=(await b['Instance']()['active']())['address'];let d;if(a['idempotencyKey'])d=a['idempotencyKey'];else{if(a['idempotentByParams'])d=this['_generateIdempotencyKey']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['withdrawTo']??c,'intermediateEthAccount':c});}if(d){const f=await this['_findTransferByIdempotencyKey'](d);if(f){if(f['status']==='success'||f['status']==='pending'||f['status']==='in_progress')return{'depositTxDigest':f['depositTxDigest']??'','bridgeSeq':f['bridgeSeq']?BigInt(f['bridgeSeq']):0x0n,'claimTxHash':f['claimTxHash'],'withdrawTxHash':f['withdrawTxHash'],'activeEvmAccount':f['intermediateEthAccount'],'transferId':f['transferId'],'idempotentHit':!![]};await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](f['transferId']),await this['_saveHistory']();});}}const e=await this['_recordTransfer']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['withdrawTo']??c,'intermediateEthAccount':c,'withdrawToProvided':!!a['withdrawTo'],'idempotencyKey':d});try{this['_updateTransfer'](e,{'step':'deposit','status':'in_progress'});const g=await this['bridgeWowToEvm']({'token':a['token'],'amount':a['amount'],'recipientEthAddress':c,'waitForFinalization':a['waitForFinalization']??!![]});if(g['claimTxHash'])this['_updateTransfer'](e,{'step':'claimed','status':'success','depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq']?.['toString'](),'claimTxHash':g['claimTxHash']});else this['_updateTransfer'](e,{'step':'deposit','status':'in_progress','depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq']?.['toString']()});let h;if(a['withdrawTo']&&g['claimTxHash']){this['_updateTransfer'](e,{'step':'withdraw','status':'in_progress'});const i=a108k(this['config'],a['token']);h=(await b['Instance']()['withdrawFromActive']({'to':a['withdrawTo'],'amount':a['amount'],'tokenAddress':a['token']==='ETH'?void 0x0:i?.['evmAddress'],'network':this['config']['ethereum']['chainId']}))['transactionHash'],this['_updateTransfer'](e,{'step':'withdrawn','status':'success','withdrawTxHash':h});}return{'depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq'],'claimTxHash':g['claimTxHash'],'withdrawTxHash':h,'activeEvmAccount':c,'transferId':e};}catch(j){this['_updateTransfer'](e,{'status':'failed','error':j?.['message']??String(j)});throw j;}}async['bridgeEvmToWowSimple'](a){if(!this['wowEnv'])a108c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20EVM→WOW\x20bridge');const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=await b['Instance']()['active']();let d=a['recipientWowAddress'];if(!d){const j=await Account['Instance']()['get'](this['wowEnv']['account']);if(!j?.['address'])a108c('fail','Failed\x20to\x20resolve\x20WOW\x20recipient\x20address');d=j['address'];}let e;if(a['idempotencyKey'])e=a['idempotencyKey'];else{if(a['idempotentByParams'])e=this['_generateIdempotencyKey']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':d,'intermediateEthAccount':c['address']});}if(e){const k=await this['_findTransferByIdempotencyKey'](e);if(k){if(k['status']==='success'||k['status']==='pending'||k['status']==='in_progress')return{'depositTxHash':k['depositTxHash']??'','bridgeSeq':k['bridgeSeq']?BigInt(k['bridgeSeq']):void 0x0,'claimTxDigest':k['claimTxDigest'],'activeEvmAccount':k['intermediateEthAccount'],'transferId':k['transferId'],'idempotentHit':!![]};await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](k['transferId']),await this['_saveHistory']();});}}const f=a108k(this['config'],a['token']);if(!f)a108c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=a['token']==='ETH';let h;if(g)h=await b['Instance']()['balance'](this['config']['ethereum']['chainId']);else h=await b['Instance']()['balanceOf'](f['evmAddress'],this['config']['ethereum']['chainId']);if(h===void 0x0||h<a['amount'])a108c('fail','Insufficient\x20'+(g?'ETH':'ERC20')+'\x20balance\x20on\x20activeEvmAccount\x20('+c['address']+')\x20on\x20chain\x20'+this['config']['ethereum']['chainId']+':\x20have\x20'+(h??0x0n)+',\x20need\x20'+a['amount']+'.\x20Please\x20recharge\x20the\x20activeEvmAccount\x20from\x20your\x20wallet\x20(transfer\x20'+(g?'ETH':'the\x20token')+'\x20to\x20'+c['address']+'),\x20then\x20retry\x20the\x20cross-chain\x20transfer.');const i=await this['_recordTransfer']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':d,'intermediateEthAccount':c['address'],'idempotencyKey':e});try{this['_updateTransfer'](i,{'step':'deposit','status':'in_progress'});let l;if(g)l=await this['bridgeNativeEvmToWow']({'amount':a['amount'],'recipientWowAddress':d,'waitForFinalization':a['waitForFinalization']??!![]});else l=await this['bridgeErc20ToWow']({'token':a['token'],'amount':a['amount'],'recipientWowAddress':d,'waitForFinalization':a['waitForFinalization']??!![]});const m=a['waitForFinalization']??!![];return this['_updateTransfer'](i,{'step':m?'claimed':'deposit','status':m?'success':'in_progress','depositTxHash':l['depositTxHash'],'bridgeSeq':l['bridgeSeq']?.['toString'](),'claimTxDigest':l['claimTxDigest']}),{...l,'activeEvmAccount':c['address'],'transferId':i};}catch(n){this['_updateTransfer'](i,{'status':'failed','error':n?.['message']??String(n)});throw n;}}async['withdrawFromActiveEvmAccount'](a){const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=await b['Instance']()['active']();let d=a['tokenAddress'];if(!d&&a['token']&&a['token']!=='ETH')d=a108k(this['config'],a['token'])?.['evmAddress'];const e=await this['_recordTransfer']({'direction':'withdraw','token':a['token'],'amount':a['amount'],'recipientEth':a['to'],'intermediateEthAccount':c['address']});try{this['_updateTransfer'](e,{'step':'withdraw','status':'in_progress'});const f=await b['Instance']()['withdrawFromActive']({'to':a['to'],'amount':a['amount'],'tokenAddress':d,'network':a['network']??this['config']['ethereum']['chainId']});return this['_updateTransfer'](e,{'step':'withdrawn','status':'success','withdrawTxHash':f['transactionHash']}),{'txHash':f['transactionHash'],'transferId':e};}catch(g){this['_updateTransfer'](e,{'status':'failed','error':g?.['message']??String(g)});throw g;}}async['querySupportedEvmChains'](){const {EvmNetworkRegistry:a}=await import('./w/local/evm/networks.mjs'),b=a['Instance']()['listRpcStatus'](this['config']['ethereum']['chainId']),c=b['filter'](d=>d['healthy'])['length'];return[{'chainId':this['config']['ethereum']['chainId'],'name':'mainnet','description':'Ethereum\x20Mainnet','bridgeChainId':this['config']['ethereum']['bridgeChainId'],'explorerUrl':'https://etherscan.io','rpcCount':b['length'],'healthyRpcCount':c}];}async['querySupportedTokens'](a){const b=await this['querySupportedEvmChains'](),c=a?.['network']?b['filter'](e=>typeof a['network']==='number'?e['chainId']===a['network']:e['name']['toLowerCase']()===String(a['network'])['toLowerCase']()):b,d=[];for(const e of c){const f=this['config']['tokens']['filter'](g=>!g['evmChains']||g['evmChains']['includes'](e['bridgeChainId']))['map'](g=>({'tokenId':g['tokenId'],'symbol':g['symbol'],'evmAddress':g['evmAddress'],'evmDecimals':g['evmDecimals'],'wowTypeTag':g['wowTypeTag'],'wowDecimals':g['wowDecimals'],'description':g['description']??g['symbol']+'\x20(tokenId='+g['tokenId']+')'}));d['push']({'chainId':e['chainId'],'chainName':e['name'],'bridgeChainId':e['bridgeChainId'],'tokens':f});}return d;}async['queryActiveEvmAccount'](a){const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),{EvmNetworkRegistry:c}=await import('./w/local/evm/networks.mjs'),d=await b['Instance']()['active']();c['Instance']();const e=await this['querySupportedEvmChains'](),f=a?.['network']?e['filter'](h=>typeof a['network']==='number'?h['chainId']===a['network']:h['name']['toLowerCase']()===String(a['network'])['toLowerCase']()):e,g=[];for(const h of f){const i=await b['Instance']()['balance'](h['chainId']),j={'chainId':h['chainId'],'name':h['name'],'nativeBalance':(i??0x0n)['toString']()};if(a?.['tokens']&&a['tokens']['length']>0x0){j['tokens']=[];for(const k of a['tokens']){const l=await b['Instance']()['balanceOf'](k,h['chainId']);j['tokens']['push']({'tokenAddress':k,'balance':(l??0x0n)['toString']()});}}g['push'](j);}return{'address':d['address'],'chains':g};}async['queryTransferList'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{const b=Array['from'](this['_transferHistory']['values']())['reverse']();if(a?.['onlyActive'])return b['filter'](c=>c['status']==='in_progress'||c['status']==='pending');return b;});}async['queryTransferStatus'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{return this['_transferHistory']['get'](a);});}async['getTransferByDepositTx'](a){return this['_findTransferByDepositTx'](a);}async['getTransferByBridgeSeq'](a){return this['_findTransferByBridgeSeq'](a);}async['resumeTransfer'](a){await this['_loadHistoryPromise'];const b=await this['_historyLock']['run'](async()=>{return this['_transferHistory']['get'](a);});if(!b)a108c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20not\x20found');if(b['status']==='success')return b;if(b['direction']==='wow_to_evm')return this['_resumeWowToEvm'](b);else{if(b['direction']==='evm_to_wow')return this['_resumeEvmToWow'](b);else{if(b['direction']==='withdraw')return this['_resumeWithdraw'](b);}}return b;}async['_resumeWowToEvm'](a){const b=a['transferId'];try{if(a['depositTxDigest']&&a['bridgeSeq']){await this['refreshTransferStatus'](b);const c=await this['queryTransferStatus'](b);if(c?.['status']==='success')return c;if(!a['claimTxHash']){const {EvmAccount:d}=await import('./w/local/evm-account.mjs'),e=await d['Instance']()['active']();if(a['recipientEth']===e['address'])await this['claimWowToEvm'](b);}if(a['withdrawToProvided']&&a['recipientEth']&&!a['withdrawTxHash']){const f=a108k(this['config'],a['token']),{EvmAccount:g}=await import('./w/local/evm-account.mjs');this['_updateTransfer'](b,{'step':'withdraw','status':'in_progress'});const h=await g['Instance']()['withdrawFromActive']({'to':a['recipientEth'],'amount':BigInt(a['amount']),'tokenAddress':a['token']==='ETH'?void 0x0:f?.['evmAddress'],'network':this['config']['ethereum']['chainId']});this['_updateTransfer'](b,{'step':'withdrawn','status':'success','withdrawTxHash':h['transactionHash']});}}}catch(i){this['_updateTransfer'](b,{'status':'failed','error':i?.['message']??String(i)});throw i;}return await this['queryTransferStatus'](b)??a;}async['_resumeEvmToWow'](a){const b=a['transferId'];try{await this['refreshTransferStatus'](b);const c=await this['queryTransferStatus'](b);if(c?.['status']==='success')return c;}catch(d){this['_updateTransfer'](b,{'status':'failed','error':d?.['message']??String(d)});throw d;}return await this['queryTransferStatus'](b)??a;}async['_resumeWithdraw'](a){const b=a['transferId'];try{if(!a['withdrawTxHash']&&a['recipientEth']){const c=a108k(this['config'],a['token']),{EvmAccount:d}=await import('./w/local/evm-account.mjs');this['_updateTransfer'](b,{'step':'withdraw','status':'in_progress'});const e=await d['Instance']()['withdrawFromActive']({'to':a['recipientEth'],'amount':BigInt(a['amount']),'tokenAddress':a['token']==='ETH'?void 0x0:c?.['evmAddress'],'network':this['config']['ethereum']['chainId']});this['_updateTransfer'](b,{'step':'withdrawn','status':'success','withdrawTxHash':e['transactionHash']});}}catch(f){this['_updateTransfer'](b,{'status':'failed','error':f?.['message']??String(f)});throw f;}return await this['queryTransferStatus'](b)??a;}async['refreshTransferStatus'](a){await this['_loadHistoryPromise'];const b=this['_transferHistory']['get'](a);if(!b)return void 0x0;if(b['direction']==='withdraw')return b;try{if(b['direction']==='evm_to_wow'&&b['depositTxHash']){const c=await this['queryEvmToWowStatus'](b['depositTxHash']);if(typeof c['bridgeSeq']==='bigint')c['bridgeSeq']=c['bridgeSeq']['toString']();b['latestState']=c,c['status']==='completed'&&b['status']==='in_progress'&&(b['status']='success',b['step']='claimed');}else{if(b['direction']==='wow_to_evm'&&b['depositTxDigest']){const d=await this['queryWowToEvmStatus'](b['depositTxDigest']);if(typeof d['bridgeSeq']==='bigint')d['bridgeSeq']=d['bridgeSeq']['toString']();if(b['claimTxHash']){if(d['step']==='source_tx_confirmed'||d['step']==='signatures_ready')try{const e=await this['resolveEvmRpcUrl'](),f=await queryEthTxReceipt(b['claimTxHash'],e);f?(d['claimReceipt']=f,f['status']==='0x1'?(d['status']='completed',d['step']='completed',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed']):(d['status']='failed',d['step']='failed',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['failed'],d['error']='EVM\x20claim\x20transaction\x20reverted')):(d['status']='claiming',d['step']='claim_tx_pending',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['claim_tx_pending']);}catch{}}else{if(d['step']==='signatures_ready')d['hint']='Quorum\x20signatures\x20are\x20ready.\x20Call\x20claim_wow_to_evm\x20(step\x202)\x20now.';else{if(d['step']==='node_signing')d['hint']='Bridge\x20committee\x20signing\x20in\x20progress\x20('+(d['signatureCount']??0x0)+'/'+(d['signaturesRequired']??'?')+'\x20nodes\x20responded).\x20Keep\x20polling\x20query_transfer_status;\x20call\x20claim_wow_to_evm\x20once\x20signatures_ready.';else{if(d['step']!=='completed')d['hint']='WOW\x20deposit\x20confirmed;\x20waiting\x20for\x20bridge\x20committee\x20signatures.\x20Keep\x20polling\x20query_transfer_status,\x20then\x20call\x20claim_wow_to_evm\x20once\x20signatures_ready.';}}}b['latestState']=d,d['status']==='completed'&&b['status']==='in_progress'&&(b['status']='success',b['step']='claimed');}}}catch(g){b['error']=g?.['message']??String(g);}return b;}async['manageEvmRpc'](a){const {EvmNetworkRegistry:b}=await import('./w/local/evm/networks.mjs'),c=b['Instance'](),d=a['network']??this['config']['ethereum']['chainId'];switch(a['op']){case'list':return{'op':'list','success':!![],'result':c['listRpcStatus'](d)};case'add':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a108c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27add\x27\x20op');{const e=c['addRpcs'](d,a['rpcUrls']);return{'op':'add','success':e>0x0,'result':{'added':e}};}case'remove':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a108c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27remove\x27\x20op');{const f=c['removeRpcs'](d,a['rpcUrls']);return{'op':'remove','success':f>0x0,'result':{'removed':f}};}case'set':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a108c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27set\x27\x20op');return{'op':'set','success':c['setRpcs'](d,a['rpcUrls'])};case'ping':{const g=c['listRpcStatus'](d),h=[];for(const i of g){const j=await c['ping'](i['url']);h['push']({'url':i['url'],'healthy':j});}return{'op':'ping','success':!![],'result':h};}default:a108c('invalid\x20parameter','Unknown\x20op:\x20'+a['op']);}}static{this['HISTORY_DB_KEY']='bridge:transfers:all';}async['_loadHistory'](){return this['_historyLock']['run'](async()=>{try{this['_historyStore']=new a108f();const a=await this['_historyStore']['get'](BridgeClient['HISTORY_DB_KEY']);if(a){const b=JSON['parse'](a);if(Array['isArray'](b)){for(const d of b)if(d['transferId'])this['_transferHistory']['set'](d['transferId'],d);for(const e of b){const f=e['transferId']?.['match'](/_(\d+)$/);if(f){const g=parseInt(f[0x1],0xa);if(g>this['_transferCounter'])this['_transferCounter']=g;}}}}}catch{}});}async['_saveHistory'](){try{if(!this['_historyStore'])return;const a=Array['from'](this['_transferHistory']['values']());await this['_historyStore']['put'](BridgeClient['HISTORY_DB_KEY'],JSON['stringify'](a));}catch{}}async['_recordTransfer'](a){return this['_historyLock']['run'](async()=>{this['_transferCounter']+=0x1;const b='br_'+Date['now']()+'_'+this['_transferCounter'],c={'transferId':b,'idempotencyKey':a['idempotencyKey'],'direction':a['direction'],'token':a['token'],'amount':a['amount']['toString'](),'recipientEth':a['recipientEth'],'recipientWow':a['recipientWow'],'intermediateEthAccount':a['intermediateEthAccount'],'withdrawToProvided':a['withdrawToProvided'],'step':'init','status':'pending','createdAt':Date['now'](),'updatedAt':Date['now']()};return this['_transferHistory']['set'](b,c),await this['_saveHistory'](),b;});}async['_updateTransfer'](a,b){return this['_historyLock']['run'](async()=>{const c=this['_transferHistory']['get'](a);if(!c)return;Object['assign'](c,b,{'updatedAt':Date['now']()}),await this['_saveHistory']();});}['_generateIdempotencyKey'](a){const b=[a['direction'],a['token']['toString'](),a['amount']['toString'](),a['recipientWow']??'',a['recipientEth']??'',a['intermediateEthAccount']??''];let c=0x1505;const d=b['join']('|');for(let e=0x0;e<d['length'];e++){c=(c<<0x5)+c+d['charCodeAt'](e),c|=0x0;}return'idem_'+Math['abs'](c)['toString'](0x24);}async['_findTransferByIdempotencyKey'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{for(const b of this['_transferHistory']['values']())if(b['idempotencyKey']===a)return b;});}async['_findTransferByDepositTx'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{for(const b of this['_transferHistory']['values']())if(b['depositTxHash']===a||b['depositTxDigest']===a)return b;});}async['_findTransferByBridgeSeq'](a){await this['_loadHistoryPromise'];const b=a['toString']();return this['_historyLock']['run'](async()=>{for(const c of this['_transferHistory']['values']())if(c['bridgeSeq']===b)return c;});}};function sleep(a){return new Promise(b=>setTimeout(b,a));}function loadDefaultConfig(){return a108j;}function hexToBytes(a){const b=a['startsWith']('0x')?a['slice'](0x2):a,c=new Uint8Array(b['length']/0x2);for(let d=0x0;d<c['length'];d++)c[d]=parseInt(b['slice'](d*0x2,d*0x2+0x2),0x10);return c;}export{ERC20_TRANSFER_TOPIC as A,encodeTokenTransferPayloadV2 as B,buildClaimMessage as C,depositErc20 as D,isEvmNonceAlreadyProcessed as E,encodeBridgeERC20 as F,encodeBridgeERC20V2 as I,encodeBridgeETH as L,TOKENS_DEPOSITED_TOPIC as M,TOKENS_DEPOSITED_V2_TOPIC as N,depositEth as O,encodeApprove as P,encodeBridgeETHV2 as R,depositFromWow as S,claimOnEthBySeq as T,encodeTransferBridgedTokensWithSignatures as V,waitForEthTx as _,BridgeTransferStatus as a,claimOnWow as b,parseEthClaimEvent as c,queryEthBalance as d,queryEthTxConfirmations as f,queryWowTx as g,queryWowToEvmTransferStatus as h,BridgeTransferDirection as i,TOKENS_CLAIMED_TOPIC as j,depositFromEth as k,parseEthDepositEvent as l,queryEvmToWowTransferStatus as m,BridgeNodeClient as n,BridgeTransferStep as o,queryEthTxReceipt as p,BRIDGE_STEP_DESCRIPTIONS as r,makeBridgeTransferState as s,BridgeClient as t,queryErc20Balance as u,waitForWowTx as v,claimOnEth as w,queryWowClaimStatus as x,WowClaimStatus as y,encodeIsTransferProcessed as z};
|
|
1
|
+
import{t as a110a}from'./client-BYIflYp_.mjs';import{t as a110b}from'./Transaction-CrzrFqPW.mjs';import{o as a110c}from'./exception-o3XVk35a.mjs';import{a as a110d}from'./network-UpRYD8EM.mjs';import{d as a110e,i as a110f}from'./storage-D1bEi2b7.mjs';import{Config}from'./w/local/config.mjs';import{r as a110g}from'./logger-Da7dKX2V.mjs';import{Account}from'./w/local/account.mjs';import{c as a110h,l as a110i,o as a110j,p as a110k}from'./fund-approval-Cee3vmP8.mjs';import{bigIntToBytes,bytesToHex,hexToBytes as a110l}from'./w/local/evm/rlp.mjs';import{registerBridgeEvmNetworks}from'./w/local/evm/networks.mjs';import{EvmAccount}from'./w/local/evm-account.mjs';import{keccak_256}from'@noble/hashes/sha3.js';const BRIDGE_ETH_V2_SIG='bridgeETHV2(bytes,uint8)',BRIDGE_ETH_V2_SELECTOR='b4b7068c',BRIDGE_ETH_V1_SELECTOR='9449ebd2',BRIDGE_ERC20_V1_SELECTOR='212afaff',BRIDGE_ERC20_V2_SIG='bridgeERC20V2(uint8,uint256,bytes,uint8)',BRIDGE_ERC20_V2_SELECTOR='0bdba58b',TRANSFER_BRIDGED_V2_SIG='transferBridgedTokensWithSignaturesV2(bytes[],(uint8,uint8,uint64,uint8,bytes))',TRANSFER_BRIDGED_V2_SELECTOR='9c3ecefb',TRANSFER_BRIDGED_V1_SIG='transferBridgedTokensWithSignatures(bytes[],(uint8,uint8,uint64,uint8,bytes))',APPROVE_SIG='approve(address,uint256)',APPROVE_SELECTOR='095ea7b3',IS_TRANSFER_PROCESSED_SIG='isTransferProcessed(uint64)',IS_TRANSFER_PROCESSED_SELECTOR='5458ea9e',WORD_SIZE=0x20;function uintWord(a){const b=bigIntToBytes(BigInt(a)),c=new Uint8Array(WORD_SIZE);return c['set'](b,WORD_SIZE-b['length']),c;}function addressWord(a){const b=a110l(a['startsWith']('0x')?a['slice'](0x2):a);if(b['length']!==0x14)throw new Error('Invalid\x20EVM\x20address\x20length:\x20'+a);const c=new Uint8Array(WORD_SIZE);return c['set'](b,WORD_SIZE-0x14),c;}function padToWord(a){const b=a['length']%WORD_SIZE;if(b===0x0)return a;const c=new Uint8Array(a['length']+WORD_SIZE-b);return c['set'](a,0x0),c;}function concat(...b){const c=b['reduce']((f,g)=>f+g['length'],0x0),d=new Uint8Array(c);let e=0x0;for(const f of b){d['set'](f,e),e+=f['length'];}return d;}function encodeBytes(a){return concat(uintWord(BigInt(a['length'])),padToWord(a));}function computeSelector(a){return bytesToHex(keccak_256(new TextEncoder()['encode'](a))['slice'](0x0,0x4));}function computeEventTopic(a){return'0x'+bytesToHex(keccak_256(new TextEncoder()['encode'](a)));}function encodeBridgeETHV2(a,b){const c=a110l(a['startsWith']('0x')?a['slice'](0x2):a);if(c['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes,\x20got\x20'+c['length']);const d=uintWord(0x40n),e=uintWord(b),f=encodeBytes(c);return'0x'+bytesToHex(concat(a110l(BRIDGE_ETH_V2_SELECTOR),d,e,f));}function encodeBridgeETH(a,b){const c=a110l(a['startsWith']('0x')?a['slice'](0x2):a);if(c['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes,\x20got\x20'+c['length']);const d=uintWord(0x40n),e=uintWord(b),f=encodeBytes(c);return'0x'+bytesToHex(concat(a110l(BRIDGE_ETH_V1_SELECTOR),d,e,f));}function encodeBridgeERC20V2(a,b,c,d){const e=a110l(c['startsWith']('0x')?c['slice'](0x2):c);if(e['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes');const f=uintWord(0x80n),g=encodeBytes(e);return'0x'+bytesToHex(concat(a110l(BRIDGE_ERC20_V2_SELECTOR),uintWord(a),uintWord(b),f,uintWord(d),g));}function encodeBridgeERC20(a,b,c,d){const e=a110l(c['startsWith']('0x')?c['slice'](0x2):c);if(e['length']!==0x20)throw new Error('Recipient\x20address\x20must\x20be\x2032\x20bytes');const f=uintWord(0x80n),g=encodeBytes(e);return'0x'+bytesToHex(concat(a110l(BRIDGE_ERC20_V1_SELECTOR),uintWord(a),uintWord(b),f,uintWord(d),g));}function encodeMessage(a){return concat(uintWord(a['messageType']),uintWord(a['version']),uintWord(a['nonce']),uintWord(a['chainID']),uintWord(0xa0n),encodeBytes(a['payload']));}function encodeBytesArray(a){const b=a['length'],c=b*0x20,d=[];let e=0x0n;for(const g of a){d['push'](BigInt(c)+e),e+=BigInt(0x20+Math['ceil'](g['length']/0x20)*0x20);}const f=[uintWord(BigInt(b))];for(const h of d)f['push'](uintWord(h));for(const i of a)f['push'](encodeBytes(i));return concat(...f);}function encodeTransferBridgedTokensWithSignatures(a,b,c=!![]){const d=c?TRANSFER_BRIDGED_V2_SELECTOR:computeSelector(TRANSFER_BRIDGED_V1_SIG),e=encodeBytesArray(a),f=encodeMessage(b),g=uintWord(0x40n),h=uintWord(BigInt(0x40+e['length']));return'0x'+bytesToHex(concat(a110l(d),g,h,e,f));}function encodeApprove(a,b){return'0x'+bytesToHex(concat(a110l(APPROVE_SELECTOR),addressWord(a),uintWord(b)));}function encodeTokenTransferPayloadV2(a){const {senderAddress:b,targetChain:c,recipientAddress:d,tokenID:e,amount:f,timestampMs:g}=a;if(b['length']!==0x20)throw new Error('senderAddress\x20must\x20be\x2032\x20bytes');if(d['length']!==0x14)throw new Error('recipientAddress\x20must\x20be\x2020\x20bytes');const h=new Uint8Array(0x48);let i=0x0;h[i++]=0x20,h['set'](b,i),i+=0x20,h[i++]=c,h[i++]=0x14,h['set'](d,i),i+=0x14,h[i++]=e;const j=bigIntToBytes(f);h['set'](j,i+0x8-j['length']),i+=0x8;const k=bigIntToBytes(g);return h['set'](k,i+0x8-k['length']),h;}function encodeIsTransferProcessed(a){return'0x'+bytesToHex(concat(a110l(IS_TRANSFER_PROCESSED_SELECTOR),uintWord(a)));}function verifySelectors(){const a=[[BRIDGE_ETH_V2_SIG,BRIDGE_ETH_V2_SELECTOR],[BRIDGE_ERC20_V2_SIG,BRIDGE_ERC20_V2_SELECTOR],[TRANSFER_BRIDGED_V2_SIG,TRANSFER_BRIDGED_V2_SELECTOR],[APPROVE_SIG,APPROVE_SELECTOR],[IS_TRANSFER_PROCESSED_SIG,IS_TRANSFER_PROCESSED_SELECTOR]];for(const [b,c]of a){const d=computeSelector(b);if(d!==c)throw new Error('ABI\x20selector\x20mismatch\x20for\x20'+b+':\x20expected\x20'+c+',\x20got\x20'+d);}}verifySelectors();const TOKENS_DEPOSITED_V2_TOPIC=computeEventTopic('TokensDepositedV2(uint8,uint64,uint8,uint8,uint64,address,bytes,uint256)'),TOKENS_DEPOSITED_TOPIC=computeEventTopic('TokensDeposited(uint8,uint64,uint8,uint8,uint64,address,bytes)'),TOKENS_CLAIMED_TOPIC=computeEventTopic('TokensClaimed(uint8,uint64,uint8,uint8,uint64,address,bytes)'),ERC20_TRANSFER_TOPIC=computeEventTopic('Transfer(address,address,uint256)');async function depositEth(a,b){try{const c=b['destinationChainId']??0x0,d=b['version']!=='v1'?encodeBridgeETHV2(b['recipientWowAddress'],c):encodeBridgeETH(b['recipientWowAddress'],c),f={'to':b['bridgeProxyAddress'],'value':a,'data':d,'network':b['network'],'rpcUrl':b['rpcUrl'],'gasLimit':0x3d090n},g=EvmAccount['Instance']();await g['active']();const h=await g['sign_and_send'](f,b['rpcUrl']);if(h['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20deposit\x20transaction\x20reverted','revertReason':'txHash:\x20'+h['transactionHash']}};return{'success':!![],'txHash':h['transactionHash']};}catch(i){return{'success':![],'error':{'code':'UNKNOWN','message':'ETH\x20deposit\x20failed:\x20'+(i?.['message']??String(i)),'raw':i}};}}async function depositErc20(a,b){try{const c=EvmAccount['Instance']();await c['active']();const d=b['destinationChainId']??0x0,f={'to':b['tokenAddress'],'data':encodeApprove(b['bridgeProxyAddress'],a),'network':b['network'],'rpcUrl':b['rpcUrl']},g=await c['sign_and_send'](f,b['rpcUrl']);if(g['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ERC20\x20approve\x20reverted','revertReason':'txHash:\x20'+g['transactionHash']}};const h=b['version']!=='v1'?encodeBridgeERC20V2(b['tokenId'],a,b['recipientWowAddress'],d):encodeBridgeERC20(b['tokenId'],a,b['recipientWowAddress'],d),i={'to':b['bridgeProxyAddress'],'value':0x0n,'data':h,'network':b['network'],'rpcUrl':b['rpcUrl']},j=await c['sign_and_send'](i,b['rpcUrl']);if(j['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ERC20\x20deposit\x20transaction\x20reverted','revertReason':'txHash:\x20'+j['transactionHash']}};return{'success':!![],'txHash':j['transactionHash']};}catch(k){return{'success':![],'error':{'code':'UNKNOWN','message':'ERC20\x20deposit\x20failed:\x20'+(k?.['message']??String(k)),'raw':k}};}}async function depositFromEth(a,b){if(a['tokenAddress']){if(a['tokenId']===void 0x0)return{'success':![],'error':{'code':'INVALID_PARAM','message':'tokenId\x20is\x20required\x20for\x20ERC20\x20deposit'}};return depositErc20(a['amount'],{...b,'tokenAddress':a['tokenAddress'],'tokenId':a['tokenId']});}return depositEth(a['amount'],b);}const BRIDGE_PACKAGE_ID='0xb',BRIDGE_OBJECT_ID='0x9',MESSAGE_KEY_TYPE=BRIDGE_PACKAGE_ID+'::message::BridgeMessageKey';let cachedRecordsId;function recordToAbiMessage(a){return{'messageType':a['message']['messageType'],'version':a['message']['messageVersion'],'nonce':a['message']['seqNum'],'chainID':a['message']['sourceChain'],'payload':a['message']['payload']};}async function getBridgeRecordsId(a){if(cachedRecordsId)return cachedRecordsId;try{const b=((await a['getObject']({'objectId':BRIDGE_OBJECT_ID,'options':{'showContent':!![]}}))?.['data']?.['content'])?.['fields']?.['inner']?.['fields']?.['id']?.['id'];if(!b)return void 0x0;const c=((await a['getDynamicFieldObject']({'parentId':b,'name':{'type':'u64','value':'1'}}))?.['data']?.['content'])?.['fields']?.['value']?.['fields']?.['token_transfer_records']?.['fields']?.['id']?.['id'];return cachedRecordsId=c,c;}catch{return;}}async function readBridgeRecord(a,b,c,d=0x0){const e=await getBridgeRecordsId(a);if(!e)return void 0x0;let f;try{f=await a['getDynamicFieldObject']({'parentId':e,'name':{'type':MESSAGE_KEY_TYPE,'value':{'source_chain':String(b),'message_type':String(d),'bridge_seq_num':String(c)}}});}catch{return;}const g=f?.['data']?.['content']?.['fields']?.['value']?.['fields']?.['value']?.['fields'];if(!g)return;return parseBridgeRecord(g);}async function readNextTokenTransferSeq(a){try{const b=((await a['getObject']({'objectId':BRIDGE_OBJECT_ID,'options':{'showContent':!![]}}))?.['data']?.['content'])?.['fields']?.['inner']?.['fields']?.['id']?.['id'];if(!b)return void 0x0;const c=(((await a['getDynamicFieldObject']({'parentId':b,'name':{'type':'u64','value':'1'}}))?.['data']?.['content'])?.['fields']?.['value']?.['fields']?.['sequence_nums'])?.['fields']?.['contents']??[];for(const d of c)if(Number(d?.['fields']?.['key'])===0x0)return BigInt(d?.['fields']?.['value']??0x0);return 0x0n;}catch{return;}}function parseBridgeRecord(a){const b=a?.['message']?.['fields']??a?.['message']??{},c=a?.['verified_signatures'],d=Array['isArray'](c)?c:c&&typeof c==='object'&&'Some'in c?c['Some']:[];return{'message':{'messageType':toNumber(b['message_type']),'messageVersion':toNumber(b['message_version']),'seqNum':toBigInt(b['seq_num']),'sourceChain':toNumber(b['source_chain']),'payload':toBytes(b['payload'])},'verifiedSignatures':Array['isArray'](d)?d['map'](e=>toBytes(e)):[],'claimed':!!a?.['claimed']};}function toNumber(a){if(typeof a==='number')return a;if(typeof a==='string')return Number(a);return 0x0;}function toBigInt(a){if(typeof a==='bigint')return a;if(typeof a==='number')return BigInt(a);if(typeof a==='string')return BigInt(a);return 0x0n;}function toBytes(a){if(a instanceof Uint8Array)return a;if(Array['isArray'](a))return Uint8Array['from'](a['map'](b=>Number(b)));if(typeof a==='string'){if(/^0x/i['test'](a)){const b=a['slice'](0x2),c=new Uint8Array(Math['ceil'](b['length']/0x2));for(let d=0x0;d<c['length'];d++){const e=b['slice'](d*0x2,d*0x2+0x2);c[d]=parseInt(e,0x10)||0x0;}return c;}try{return new Uint8Array(Buffer['from'](a,'base64'));}catch{return new Uint8Array(0x0);}}return new Uint8Array(0x0);}function buildClaimMessage(a){const b=encodeTokenTransferPayloadV2({'senderAddress':a['senderAddress'],'targetChain':a['targetChain'],'recipientAddress':a['recipientAddress'],'tokenID':a['tokenId'],'amount':a['amount'],'timestampMs':a['timestampMs']});return{'messageType':a['messageType'],'version':a['version'],'nonce':a['nonce'],'chainID':a['sourceChain'],'payload':b};}function signaturesToBytes(a){return a['map'](b=>{const c=a110l(b['signature']['startsWith']('0x')?b['signature']['slice'](0x2):b['signature']);if(c['length']!==0x41)throw new Error('Invalid\x20signature\x20length:\x20'+c['length']+'\x20(expected\x2065)');return c;});}async function claimOnEth(a,b){try{const c=b['useV2']??!![];if(await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':b['bridgeProxyAddress'],'network':b['network'],'rpcUrl':b['rpcUrl']},a['message']['nonce']))return{'success':![],'error':{'code':'ALREADY_PROCESSED','message':buildAlreadyProcessedMessage(a['message']['nonce'])}};let d=a['message'],f,g;const h=b['wowClient']?await readBridgeRecord(b['wowClient'],a['message']['chainID'],a['message']['nonce'],a['message']['messageType']):void 0x0;if(h&&h['verifiedSignatures']['length']>0x0)d=recordToAbiMessage(h),f=h['verifiedSignatures'];else{g=await b['nodeClient']['signWowToEth'](a['wowTxDigest'],a['eventIndex']);g['length']===0x0&&(console['warn']('tx_digest\x20路径未收集到签名,回退到\x20seq\x20路径:',a['message']['chainID'],a['message']['messageType'],a['message']['nonce']),g=await b['nodeClient']['signWowTokenTransfer'](a['message']['chainID'],a['message']['messageType'],a['message']['nonce']));if(g['length']===0x0)return{'success':![],'error':{'code':'NO_SIGNATURES','message':buildNoSignaturesMessage(a['message']['chainID'],a['message']['messageType'],a['message']['nonce'])}};d=g[0x0]['action']?messageFromActionData(g[0x0]['action'],a['message']):a['message'],f=signaturesToBytes(g);}const i=encodeTransferBridgedTokensWithSignatures(f,d,c),j={'to':b['bridgeProxyAddress'],'value':0x0n,'data':i,'network':b['network'],'rpcUrl':b['rpcUrl']},k=EvmAccount['Instance']();await k['active']();const l=await k['sign_and_send'](j,b['rpcUrl']);if(l['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20transaction\x20reverted','revertReason':'txHash:\x20'+l['transactionHash']}};return{'success':!![],'txHash':l['transactionHash']};}catch(m){return wrapBridgeError(m,'UNKNOWN','ETH\x20claim\x20failed');}}function bridgeChainNameToId(a){switch(a){case'WowMainnet':return 0x0;case'EthMainnet':return 0xa;default:throw new Error('Unknown\x20bridge\x20chain\x20name:\x20'+a);}}function messageFromActionData(a,b){if(!a||typeof a!=='object')return b;const c=a;if(c['WowToEthTokenTransferV2']){const d=c['WowToEthTokenTransferV2'],e=d['wow_address']['startsWith']('0x')?d['wow_address']['slice'](0x2):d['wow_address'],f=d['eth_address']['startsWith']('0x')?d['eth_address']['slice'](0x2):d['eth_address'],g=a110l(e),h=a110l(f),i=encodeTokenTransferPayloadV2({'senderAddress':g,'targetChain':bridgeChainNameToId(d['eth_chain_id']),'recipientAddress':h,'tokenID':d['token_id'],'amount':BigInt(d['amount_adjusted']),'timestampMs':BigInt(d['timestamp_ms'])});return{'messageType':0x0,'version':0x2,'nonce':BigInt(d['nonce']),'chainID':bridgeChainNameToId(d['wow_chain_id']),'payload':i};}return console['warn']('[claimOnEthBySeq]\x20Unknown\x20action\x20data\x20type,\x20falling\x20back\x20to\x20local\x20message:',Object['keys'](c)),b;}async function claimOnEthBySeq(a,b){try{const c=b['useV2']??!![];if(await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':b['bridgeProxyAddress'],'network':b['network'],'rpcUrl':b['rpcUrl']},a['seqNum']))return{'success':![],'error':{'code':'ALREADY_PROCESSED','message':buildAlreadyProcessedMessage(a['seqNum'])}};let d=a['message'],f;const g=b['wowClient']?await readBridgeRecord(b['wowClient'],a['sourceChain'],a['seqNum'],a['messageType']):void 0x0;if(g&&g['verifiedSignatures']['length']>0x0)d=recordToAbiMessage(g),f=g['verifiedSignatures'];else{const m=await b['nodeClient']['signWowTokenTransfer'](a['sourceChain'],a['messageType'],a['seqNum']);if(m['length']===0x0)return{'success':![],'error':{'code':'NO_SIGNATURES','message':buildNoSignaturesMessage(a['sourceChain'],a['messageType'],a['seqNum'])}};d=m[0x0]['action']?messageFromActionData(m[0x0]['action'],a['message']):a['message'],f=signaturesToBytes(m);}const h=encodeTransferBridgedTokensWithSignatures(f,d,c),i={'to':b['bridgeProxyAddress'],'value':0x0n,'data':h,'network':b['network'],'rpcUrl':b['rpcUrl']},j=EvmAccount['Instance']();await j['active']();let k;try{await j['ethCall'](i);}catch(n){const o=n?.['message']??String(n);if(o['includes']('execution\x20reverted')||o['includes']('reverted\x20with\x20reason'))k=o;else console['warn']('\x20\x20[claimOnEthBySeq]\x20eth_call\x20warning\x20(skipped):',o['slice'](0x0,0x78));}if(k)return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20reverted','revertReason':k}};const l=await j['sign_and_send'](i,b['rpcUrl']);if(l['status']!=='0x1')return{'success':![],'error':{'code':'REVERTED','message':'ETH\x20claim\x20transaction\x20reverted','revertReason':'txHash:\x20'+l['transactionHash']}};return{'success':!![],'txHash':l['transactionHash']};}catch(p){return wrapBridgeError(p,'UNKNOWN','ETH\x20claim\x20(by\x20seq)\x20failed');}}async function isEvmNonceAlreadyProcessed(a,b){try{const c=EvmAccount['Instance']();await c['active']();const d=encodeIsTransferProcessed(b),f=(await c['ethCall']({'to':a['bridgeProxyAddress'],'value':0x0n,'data':d,'network':a['network'],'rpcUrl':a['rpcUrl']}))['replace'](/^0x/,'');return(f['length']>=0x2?f['slice'](-0x2):'')==='01';}catch(g){return console['warn']('\x20\x20[claim\x20precheck]\x20isTransferProcessed('+b+')\x20query\x20failed\x20(skipped):',(g?.['message']??String(g))['slice'](0x0,0x78)),![];}}function buildAlreadyProcessedMessage(a){return['EVM\x20bridge\x20has\x20already\x20processed\x20nonce\x20(seq)\x20'+a+'\x20(isTransferProcessed=true).','This\x20transfer\x20CANNOT\x20be\x20claimed,\x20and\x20the\x20WOW-side\x20funds\x20are\x20PERMANENTLY\x20LOCKED.','Do\x20NOT\x20retry\x20the\x20claim.','This\x20usually\x20means\x20the\x20WOW\x20bridge\x20seq\x20collided\x20with\x20an\x20old\x20EVM\x20nonce','left\x20over\x20from\x20a\x20previous\x20chain\x20generation\x20(re-genesis).']['join']('\x0a');}function buildNoSignaturesMessage(a,b,c){return['No\x20signatures\x20collected\x20for\x20seq='+c+'\x20(sourceChain='+a+',\x20messageType='+b+').','Possible\x20reasons:','\x20\x201)\x20Bridge\x20nodes\x20are\x20not\x20reachable\x20or\x20not\x20synced','\x20\x202)\x20The\x20seq\x20'+c+'\x20does\x20not\x20exist\x20on\x20source\x20chain','\x20\x203)\x20The\x20message\x20has\x20already\x20expired','\x20\x204)\x20Insufficient\x20quorum\x20(need\x202/3\x20of\x20total\x20committee\x20weight)','Check\x20node\x20health\x20with\x20nodeClient.pingAll().']['join']('\x0a');}function wrapBridgeError(a,b,c){return{'success':![],'error':{'code':b,'message':c+':\x20'+(a?.['message']??String(a)),'raw':a}};}const BRIDGE_PACKAGE$1='0xb',DEFAULT_BRIDGE_OBJECT_ID$1='0x9',CLOCK_OBJECT_ID$1='0x6',EVM_ADDRESS_LENGTH=0x14,TOKEN_DEPOSITED_EVENT_V2_TYPE=BRIDGE_PACKAGE$1+'::bridge::TokenDepositedEventV2';async function depositFromWow(a,b){if(!a['tokenType']||a['tokenType']['split']('::')['length']<0x3)a110c('invalid\x20parameter','Invalid\x20tokenType:\x20'+a['tokenType']);if(a['amount']<=0x0n)a110c('invalid\x20parameter','amount\x20must\x20be\x20positive');const c=parseEvmAddress(a['recipientEthAddress']),d=a['destinationChainId']??0xa,f=a['bridgeObjectId']??DEFAULT_BRIDGE_OBJECT_ID$1,g=new a110b(),h=await Account['Instance']()['get_coin_object'](g,a['amount'],a['tokenType'],await getEnvAccount$1(b),b['network']);if(!h)a110c('fail','Failed\x20to\x20get\x20coin\x20object');g['moveCall']({'target':BRIDGE_PACKAGE$1+'::bridge::send_token_v2','arguments':[g['object'](f),g['pure']['u8'](d),g['pure']['vector']('u8',c),h,g['object'](CLOCK_OBJECT_ID$1)],'typeArguments':[a['tokenType']]});const i=await Account['Instance']()['sign_and_commit'](g,await getEnvAccount$1(b),b['network']);if(!i||!i['digest'])a110c('fail','WOW\x20deposit\x20transaction\x20failed');let j=i;if(!i['events']||i['events']['length']===0x0){const {WowClient:l}=await import('./client/index.mjs'),{Config:m}=await import('./w/local/config.mjs'),n=await m['Instance']()['network_get'](b['network']),o=new l({'url':a110d(n),'network':n});let p;for(let q=0x0;q<0xa;q++){try{j=await o['getTransactionBlock']({'digest':i['digest'],'options':{'showEvents':!![],'showEffects':!![]}});if(j['events']&&j['events']['length']>0x0)break;}catch(r){p=r;}await new Promise(s=>setTimeout(s,0x3e8*(q+0x1)));}if(!j['events']||j['events']['length']===0x0)throw p??new Error('Failed\x20to\x20fetch\x20events\x20for\x20tx\x20'+i['digest']);}const k=parseSeqNumFromReceipt(j);if(k===void 0x0)a110c('fail','Failed\x20to\x20parse\x20seqNum\x20from\x20WOW\x20tx\x20'+i['digest']);return{'digest':i['digest'],'seqNum':k,'receipt':i};}function parseEvmAddress(a){let b=a;if(b['startsWith']('0x')||b['startsWith']('0X'))b=b['slice'](0x2);if(b['length']!==EVM_ADDRESS_LENGTH*0x2)a110c('invalid\x20parameter','Invalid\x20EVM\x20address:\x20'+a+'\x20(expected\x2020\x20bytes)');const c=new Uint8Array(EVM_ADDRESS_LENGTH);for(let d=0x0;d<EVM_ADDRESS_LENGTH;d++)c[d]=parseInt(b['slice'](d*0x2,d*0x2+0x2),0x10);return c;}function normalizeEventType$1(a){const b=a['split']('::');if(b['length']>0x0&&b[0x0]['startsWith']('0x')){const c=b[0x0]['toLowerCase']()['replace'](/^0x0+/,'0x');b[0x0]=c==='0x'?'0x0':c;}return b['join']('::');}function parseSeqNumFromReceipt(a){const b=a['events'];if(!b||b['length']===0x0)return void 0x0;const c=normalizeEventType$1(TOKEN_DEPOSITED_EVENT_V2_TYPE);for(const d of b){if(normalizeEventType$1(d['type'])!==c)continue;const e=d['parsedJson'];if(!e)continue;const f=e['seq_num'];if(typeof f==='string'||typeof f==='number')return BigInt(f);}}async function getEnvAccount$1(a){return a['account']??void 0x0;}const BRIDGE_PACKAGE='0xb',CLOCK_OBJECT_ID='0x6',TOKEN_TRANSFER_APPROVED_TYPE=BRIDGE_PACKAGE+'::bridge::TokenTransferApproved',TOKEN_TRANSFER_CLAIMED_TYPE=BRIDGE_PACKAGE+'::bridge::TokenTransferClaimed',DEFAULT_BRIDGE_OBJECT_ID='0x9';async function claimOnWow(a,b){if(!a['tokenType']||a['tokenType']['split']('::')['length']<0x3)a110c('invalid\x20parameter','Invalid\x20tokenType:\x20'+a['tokenType']);if(a['bridgeSeqNum']<0x0n)a110c('invalid\x20parameter','bridgeSeqNum\x20must\x20be\x20non-negative');const c=a['sourceChainId']??0xa,d=a['bridgeObjectId']??DEFAULT_BRIDGE_OBJECT_ID,e=new a110b();e['moveCall']({'target':BRIDGE_PACKAGE+'::bridge::claim_and_transfer_token','arguments':[e['object'](d),e['object'](CLOCK_OBJECT_ID),e['pure']['u8'](c),e['pure']['u64'](a['bridgeSeqNum'])],'typeArguments':[a['tokenType']]});const f=await Account['Instance']()['sign_and_commit'](e,await getEnvAccount(b),b['network']);if(!f||!f['digest'])a110c('fail','WOW\x20claim\x20transaction\x20failed');return{'digest':f['digest'],'receipt':f};}let WowClaimStatus=function(a){return a['NotApproved']='not_approved',a['Approved']='approved',a['Claimed']='claimed',a['NotFound']='not_found',a;}({});async function queryWowClaimStatus(a,b){const c=a['sourceChainId']??0xa,d=await Config['Instance']()['network_get'](b),e=new a110a({'url':a110d(d),'network':d}),f=await e['queryEvents']({'query':{'MoveEventType':TOKEN_TRANSFER_CLAIMED_TYPE},'limit':0x64,'order':'descending'});for(const h of f['data']){const i=h['parsedJson'];if(!i)continue;const j=i['message_key'];if(!j)continue;const k=Number(j['source_chain']),l=BigInt(j['bridge_seq_num']??0x0);if(k===c&&l===a['bridgeSeqNum'])return{'status':'claimed','claimedTxHash':h['id']?.['txDigest']};}const g=await e['queryEvents']({'query':{'MoveEventType':TOKEN_TRANSFER_APPROVED_TYPE},'limit':0x64,'order':'descending'});for(const m of g['data']){const n=m['parsedJson'];if(!n)continue;const o=n['message_key'];if(!o)continue;const p=Number(o['source_chain']),q=BigInt(o['bridge_seq_num']??0x0);if(p===c&&q===a['bridgeSeqNum'])return{'status':'approved','approvedEventId':m['id']?.['eventSeq']};}return{'status':'not_approved'};}async function getEnvAccount(a){return a['account']??void 0x0;}const logger$1=a110g('bridge:query');async function queryEthTxReceipt(a,b,c=0x2710){const d=new AbortController(),f=setTimeout(()=>d['abort'](),c);try{const g=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_getTransactionReceipt','params':[a]}),'signal':d['signal']}))['json']();if(g['error'])throw new Error('JSON-RPC\x20error:\x20'+g['error']['message']);return g['result'];}catch(h){if(h?.['name']==='AbortError')throw new Error('queryEthTxReceipt\x20timeout\x20after\x20'+c+'ms');throw h;}finally{clearTimeout(f);}}async function queryEthBalance(a,b){const c=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_getBalance','params':[a,'latest']})}))['json']();if(c['error'])throw new Error('JSON-RPC\x20error:\x20'+c['error']['message']);return BigInt(c['result']);}async function queryErc20Balance(a,b,c){const d='0x70a08231000000000000000000000000'+b['slice'](0x2)['toLowerCase'](),e=await(await fetch(c,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':'eth_call','params':[{'to':a,'data':d},'latest']})}))['json']();if(e['error'])throw new Error('JSON-RPC\x20error:\x20'+e['error']['message']);return BigInt(e['result']);}async function queryEthTxConfirmations(a,b,c=0x2710){const d=await queryEthTxReceipt(a,b,c);if(!d?.['blockNumber'])return 0x0;const e=new AbortController(),f=setTimeout(()=>e['abort'](),c);try{const g=await(await fetch(b,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x2,'method':'eth_blockNumber','params':[]}),'signal':e['signal']}))['json'](),h=BigInt(g['result']),i=BigInt(d['blockNumber']);return Number(h-i);}finally{clearTimeout(f);}}async function queryWowTx(a,b){try{return await a['getTransactionBlock']({'digest':b,'options':{'showEffects':!![],'showEvents':!![]}});}catch{return null;}}let BridgeTransferDirection=function(a){return a['EvmToWow']='evm_to_wow',a['WowToEvm']='wow_to_evm',a;}({}),BridgeTransferStep=function(a){return a['NotStarted']='not_started',a['SourceTxPending']='source_tx_pending',a['SourceTxConfirmed']='source_tx_confirmed',a['NodeSigning']='node_signing',a['SignaturesReady']='signatures_ready',a['ClaimTxPending']='claim_tx_pending',a['Completed']='completed',a['Failed']='failed',a;}({});const BRIDGE_STEP_DESCRIPTIONS={['not_started']:'尚未发起跨链',['source_tx_pending']:'源链交易已提交,等待区块确认',['source_tx_confirmed']:'源链交易已确认,等待\x20bridge\x20节点签名\x20approve',['node_signing']:'bridge\x20节点签名收集中',['signatures_ready']:'签名已收集完毕,可发起目标链\x20claim',['claim_tx_pending']:'目标链\x20claim\x20交易已提交,待确认',['completed']:'跨链完成',['failed']:'跨链失败'};let BridgeTransferStatus=function(a){return a['NotStarted']='not_started',a['Pending']='pending',a['Confirmed']='confirmed',a['SignaturesReady']='signatures_ready',a['Claiming']='claiming',a['Completed']='completed',a['Failed']='failed',a;}({});function makeBridgeTransferState(a){return{'status':stepToStatus(a['step']),'stepDescription':BRIDGE_STEP_DESCRIPTIONS[a['step']],'updatedAt':Date['now'](),...a};}function stepToStatus(a){switch(a){case'not_started':return'not_started';case'source_tx_pending':return'pending';case'source_tx_confirmed':return'confirmed';case'node_signing':return'confirmed';case'signatures_ready':return'signatures_ready';case'claim_tx_pending':return'claiming';case'completed':return'completed';case'failed':return'failed';}}function parseEthDepositEvent(a,b){const c=b['toLowerCase']();for(const d of a['logs']){if(d['address']['toLowerCase']()!==c)continue;const e=d['topics'][0x0]===TOKENS_DEPOSITED_V2_TOPIC,f=d['topics'][0x0]===TOKENS_DEPOSITED_TOPIC;if(!e&&!f)continue;const g=a110l(d['data']);if(g['length']<0x80)continue;const h=u=>g[u*0x20+0x1f],i=u=>{const v=g['slice'](u*0x20,u*0x20+0x20);return BigInt('0x'+bytesToHex(v['slice'](0x18,0x20)));},j=u=>'0x'+bytesToHex(g['slice'](u*0x20+0xc,u*0x20+0x20)),k=h(0x0),l=i(0x1),m=j(0x2),n=Number(i(0x3)),o=Number(BigInt('0x'+bytesToHex(g['slice'](n,n+0x20))['slice'](0x30))),p='0x'+bytesToHex(g['slice'](n+0x20,n+0x20+o)),q=d['topics'][0x1]?.['slice'](0x40)??'00',r=parseInt(q,0x10),s=d['topics'][0x3]?.['slice'](0x40)??'00',t=parseInt(s,0x10);return{'bridgeSeq':BigInt('0x'+(d['topics'][0x2]?.['slice'](0x38)??'0')),'sourceChain':r,'sender':m,'targetChain':t,'recipient':p,'tokenID':k,'amount':l};}return null;}function parseEthClaimEvent(a,b){const c=b['toLowerCase']();for(const d of a['logs']){if(d['address']['toLowerCase']()!==c)continue;if(d['topics'][0x0]!==TOKENS_CLAIMED_TOPIC)continue;const e=a110l(d['data']);if(e['length']<0x80)continue;const f=n=>e[n*0x20+0x1f],g=n=>{const o=e['slice'](n*0x20,n*0x20+0x20);return BigInt('0x'+bytesToHex(o['slice'](0x18,0x20)));},h=n=>'0x'+bytesToHex(e['slice'](n*0x20+0xc,n*0x20+0x20));f(0x0);const i=g(0x1),j=h(0x2),k=Number(g(0x3)),l=Number(BigInt('0x'+bytesToHex(e['slice'](k,k+0x20))['slice'](0x30))),m='0x'+bytesToHex(e['slice'](k+0x20,k+0x20+l));return{'bridgeSeq':BigInt('0x'+(d['topics'][0x2]?.['slice'](0x38)??'0')),'claimer':j,'recipient':m,'amount':i};}return null;}async function queryEvmToWowTransferStatus(a,b,c){const d=await queryEthTxReceipt(a,b);if(!d)return makeBridgeTransferState({'step':'source_tx_pending','direction':'evm_to_wow','sourceTxHash':a});if(d['status']!=='0x1')return makeBridgeTransferState({'step':'failed','direction':'evm_to_wow','sourceTxHash':a,'ethReceipt':d,'error':'ETH\x20source\x20transaction\x20reverted'});const e=parseEthDepositEvent(d,c);if(!e)return makeBridgeTransferState({'step':'failed','direction':'evm_to_wow','sourceTxHash':a,'ethReceipt':d,'error':'No\x20TokensDeposited/TokensDepositedV2\x20event\x20found\x20in\x20receipt'});let f=0x0;try{f=await queryEthTxConfirmations(a,b);}catch{}return makeBridgeTransferState({'step':'source_tx_confirmed','direction':'evm_to_wow','sourceTxHash':a,'bridgeSeq':e['bridgeSeq'],'confirmations':f,'ethReceipt':d});}async function queryWowToEvmTransferStatus(a,b){const c=await queryWowTx(a,b);if(!c)return makeBridgeTransferState({'step':'source_tx_pending','direction':'wow_to_evm','sourceTxHash':b});if(c['effects']?.['status']?.['status']!=='success')return makeBridgeTransferState({'step':'failed','direction':'wow_to_evm','sourceTxHash':b,'wowReceipt':c,'error':c['effects']?.['status']?.['error']||'WOW\x20transaction\x20failed'});return makeBridgeTransferState({'step':'source_tx_confirmed','direction':'wow_to_evm','sourceTxHash':b,'bridgeSeq':parseWowDepositSeqFromReceipt(c),'wowReceipt':c});}function normalizeEventType(a){const b=a['split']('::');if(b['length']>0x0&&b[0x0]['startsWith']('0x')){const c=b[0x0]['toLowerCase']()['replace'](/^0x0+/,'0x');b[0x0]=c==='0x'?'0x0':c;}return b['join']('::');}function parseWowDepositSeqFromReceipt(a){const b=a['events'];if(!b||b['length']===0x0)return void 0x0;const c=normalizeEventType('0xb::bridge::TokenDepositedEventV2');for(const d of b){if(normalizeEventType(d['type'])!==c)continue;const e=d['parsedJson'];if(!e)continue;const f=e['seq_num'];if(typeof f==='string'||typeof f==='number')return BigInt(f);}}async function waitForEthTx(a,b,c=0x1,d=0x2ee0,e=0x1e*0xea60){const f=Math['max'](0x1,Math['ceil'](e/d));for(let g=0x0;g<f;g++){const h=await queryEthTxReceipt(a,b);if(h){const j=await queryEthTxConfirmations(a,b);if(j>=c)return h;logger$1['debug'](g+0x1+'/'+f+':\x20'+j+'/'+c+'\x20confirmations');}else logger$1['debug'](g+0x1+'/'+f+':\x20pending');await sleep$1(d);}a110c('fail','Timeout\x20waiting\x20for\x20ETH\x20tx\x20'+a+'\x20after\x20'+f+'\x20iterations');}async function waitForWowTx(a,b,c=0xbb8,d=0x5*0xea60){const e=Math['max'](0x1,Math['ceil'](d/c));for(let f=0x0;f<e;f++){const g=await queryWowTx(a,b);if(g&&g['effects']?.['status']?.['status']==='success')return g;if(g&&g['effects']?.['status']?.['status']==='failure')a110c('fail','WOW\x20tx\x20'+b+'\x20failed:\x20'+(g['effects']['status']['error']||'unknown'));logger$1['debug'](f+0x1+'/'+e+':\x20pending'),await sleep$1(c);}a110c('fail','Timeout\x20waiting\x20for\x20WOW\x20tx\x20'+b+'\x20after\x20'+e+'\x20iterations');}function sleep$1(a){return new Promise(b=>setTimeout(b,a));}function isBase64(a){return/^[A-Za-z0-9+/]*={0,2}$/['test'](a)&&a['length']>0x0;}function decodeFlex(a){if(a['startsWith']('0x')||a['startsWith']('0X'))return a110l(a);if(/^[0-9a-fA-F]+$/['test'](a)&&a['length']%0x2===0x0)return a110l(a);if(isBase64(a))return Buffer['from'](a,'base64');throw new Error('Cannot\x20decode\x20signature/pubkey\x20string:\x20'+a);}function parseSignedAction(a,b){const c=decodeFlex(a['auth_signature']['authority_pub_key']),d=decodeFlex(a['auth_signature']['signature']);if(c['length']!==0x21&&c['length']!==0x41)throw new Error('Invalid\x20pubkey\x20length:\x20'+c['length']+'\x20(expected\x2033\x20or\x2065)');if(d['length']!==0x41)throw new Error('Invalid\x20signature\x20length:\x20'+d['length']+'\x20(expected\x2065)');return{'signerPubkey':'0x'+bytesToHex(c),'signature':'0x'+bytesToHex(d),'weight':b,'action':a['data']};}var BridgeNodeClient=class{constructor(a){this['committee']=a['committee'],this['timeoutMs']=a['timeoutMs']??0x7530,this['quorumRatio']=a['quorumRatio']??0x2/0x3,this['minRequiredStake']=a['minRequiredStake'];}get['totalWeight'](){return this['committee']['reduce']((a,b)=>a+b['weight'],0x0);}get['quorumWeight'](){if(this['minRequiredStake']!=null)return this['minRequiredStake'];return Math['floor'](this['totalWeight']*this['quorumRatio'])+0x1;}async['signEthToWow'](a,b){const c='/sign/bridge_tx/eth/wow/'+a+'/'+b;return this['collectSignatures'](c);}async['signWowToEth'](a,b){const c='/sign/bridge_tx/wow/eth/'+a+'/'+b;return this['collectSignatures'](c);}async['probeWowToEth'](a,b){const c='/sign/bridge_tx/wow/eth/'+a+'/'+b,d=await this['probeSignatures'](c);return{'ready':d['ready'],'signedWeight':d['signedWeight'],'quorumWeight':d['quorumWeight'],'totalWeight':d['totalWeight'],'responded':d['responded'],'memberCount':d['memberCount'],'errors':d['errors']};}async['signWowTokenTransfer'](a,b,c){const d='/sign/bridge_action/wow/eth/'+a+'/'+b+'/'+c;return this['collectSignatures'](d);}async['ping'](a){try{const b=new AbortController(),c=setTimeout(()=>b['abort'](),Math['min'](this['timeoutMs'],0x2710)),d=await fetch(a+'/ping',{'signal':b['signal']});return clearTimeout(c),d['ok'];}catch{return![];}}async['pingAll'](){return Promise['all'](this['committee']['map'](async a=>({'url':a['baseUrl'],'healthy':await this['ping'](a['baseUrl'])})));}async['collectSignatures'](a){const b=await this['probeSignatures'](a);if(!b['ready'])a110c('fail','Quorum\x20not\x20reached:\x20collected\x20'+b['signedWeight']+',\x20required\x20'+b['quorumWeight']+'\x20(total\x20'+b['totalWeight']+')');return b['actions'];}async['probeSignatures'](a){const b=new Map();let c=0x0;const d=this['committee']['map'](async h=>{try{return{'action':parseSignedAction(await this['fetchFromNode'](h['baseUrl'],a),h['weight']),'ok':!![]};}catch(i){return{'action':null,'ok':![],'error':i['message']};}}),e=await Promise['all'](d),f=[];let g=0x0;return e['forEach'](h=>{if(!h['ok']||!h['action']){f['push'](h['ok']?null:h['error']);return;}g+=0x1,f['push'](null),!b['has'](h['action']['signerPubkey'])&&(b['set'](h['action']['signerPubkey'],h['action']),c+=h['action']['weight']);}),{'ready':c>=this['quorumWeight'],'signedWeight':c,'quorumWeight':this['quorumWeight'],'totalWeight':this['totalWeight'],'responded':g,'memberCount':this['committee']['length'],'errors':f,'actions':Array['from'](b['values']())};}async['fetchFromNode'](a,b){const c=new AbortController(),d=setTimeout(()=>c['abort'](),this['timeoutMs']);try{const e=await fetch(''+a+b,{'signal':c['signal'],'headers':{'Accept':'application/json'}});if(!e['ok'])throw new Error('Node\x20'+a+'\x20returned\x20'+e['status']+':\x20'+await e['text']());return await e['json']();}finally{clearTimeout(d);}}};const logger=a110g('bridge');var BridgeClient=class BridgeClient{static{this['SIGNING_PROBE_DEADLINE_MS']=0x2328;}constructor(a={}){this['_transferHistory']=new Map(),this['_transferCounter']=0x0,this['_loadHistoryPromise']=Promise['resolve'](),this['_historyLock']=new a110e(),this['config']=a['config']??loadDefaultConfig(),this['wowEnv']=a['wowEnv'],registerBridgeEvmNetworks({'evmChain':{'chainId':this['config']['ethereum']['chainId'],'rpcUrl':this['config']['ethereum']['rpcUrl']},'setAsDefault':!![]});if(this['config']['l2']){for(const c of Object['values'](this['config']['l2']))if(c)registerBridgeEvmNetworks({'evmChain':{'chainId':c['chainId'],'rpcUrl':c['rpcUrl']}});}const b=this['config']['bridgeNodeUrls']['map']((d,e)=>({'pubkey':a110h[e]??'0x'+e['toString']()['padStart'](0x40,'0'),'weight':a110i[e]??0x1,'baseUrl':d}));this['nodeClient']=new BridgeNodeClient({'committee':b,'timeoutMs':this['config']['timeouts']['nodeRpcMs'],'minRequiredStake':0xd06}),this['_loadHistoryPromise']=this['_loadHistory']();}async['bridgeNativeEvmToWow'](a){return this['depositEvmToWowAndFinalize']({'amount':a['amount'],'recipientWowAddress':a['recipientWowAddress'],'waitForFinalization':a['waitForFinalization'],'token':'ETH','idempotencyKey':a['idempotencyKey'],'idempotentByParams':a['idempotentByParams']});}async['bridgeErc20ToWow'](a){if(a['token']==='ETH')a110c('invalid\x20parameter','Use\x20bridgeNativeEvmToWow()\x20for\x20native\x20ETH;\x20bridgeErc20ToWow()\x20only\x20accepts\x20WETH/WBTC/USDC/USDT');return this['depositEvmToWowAndFinalize']({'amount':a['amount'],'recipientWowAddress':a['recipientWowAddress'],'waitForFinalization':a['waitForFinalization'],'token':a['token'],'idempotencyKey':a['idempotencyKey'],'idempotentByParams':a['idempotentByParams']});}async['resolveEvmRpcUrl'](){const a=this['config']['ethereum'];if(a['rpcUrl'])return a['rpcUrl'];const {EvmNetworkRegistry:b}=await import('./w/local/evm/networks.mjs'),c=b['Instance'](),d=await c['resolve'](a['chainId']),e=c['pickHealthyRpc'](d);if(!e)a110c('invalid\x20parameter','No\x20healthy\x20EVM\x20RPC\x20available\x20for\x20chainId\x20'+a['chainId']+'.\x20Use\x20manage_evm_rpc\x20to\x20add\x20RPC\x20endpoints\x20first.');return e;}async['_ensureSafeEvmNonce'](a){const {WowClient:b}=await import('./client/index.mjs'),{Config:c}=await import('./w/local/config.mjs'),{getFullnodeUrl:d}=await import('./network-UpRYD8EM.mjs')['then'](j=>j['s']),e=await c['Instance']()['network_get'](this['wowEnv']['network']),f=new b({'url':d(e),'network':e}),g=await this['resolveEvmRpcUrl'](),h=0x8;for(let j=0x0;j<h;j++){const k=await readNextTokenTransferSeq(f);if(k===void 0x0){console['warn']('\x20\x20[bridge]\x20readNextTokenTransferSeq\x20failed,\x20skipping\x20EVM\x20nonce\x20precheck');return;}if(!await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':this['config']['ethereum']['bridgeProxyAddress'],'network':this['config']['ethereum']['chainId'],'rpcUrl':g},k))return;console['warn']('\x20\x20[bridge]\x20EVM\x20nonce\x20'+k+'\x20already\x20processed,\x20sending\x201-unit\x20placeholder\x20deposit\x20to\x20skip\x20it'),await waitForWowTx(f,(await depositFromWow({'amount':0x1n,'tokenType':a['tokenType'],'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':a['bridgeObjectId']},this['wowEnv']))['digest'],this['config']['timeouts']['signaturePollIntervalMs'],this['config']['timeouts']['signatureCollectMs']);}a110c('fail','EVM\x20nonce\x20precheck:\x20could\x20not\x20find\x20a\x20safe\x20nonce\x20after\x20'+h+'\x20placeholder\x20deposits');}async['depositEvmToWowAndFinalize'](a){let b;if(a['idempotencyKey'])b=a['idempotencyKey'];else{if(a['idempotentByParams'])b=this['_generateIdempotencyKey']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':a['recipientWowAddress']});}if(b){const t=await this['_findTransferByIdempotencyKey'](b);if(t){if(t['status']==='success')return{'depositTxHash':t['depositTxHash'],'claimTxDigest':t['claimTxDigest'],'bridgeSeq':t['bridgeSeq']?BigInt(t['bridgeSeq']):void 0x0,'idempotentHit':!![]};else{if(t['status']==='pending'||t['status']==='in_progress')return{'depositTxHash':t['depositTxHash']??'','claimTxDigest':t['claimTxDigest'],'bridgeSeq':t['bridgeSeq']?BigInt(t['bridgeSeq']):void 0x0,'idempotentHit':!![]};}await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](t['transferId']),await this['_saveHistory']();});}}const c=this['config']['ethereum'],d=a['waitForFinalization']??!![],e=await this['resolveEvmRpcUrl'](),f=a110k(this['config'],a['token']);if(!f)a110c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=a['token']==='ETH',h=this['config']['defaultVersion']===0x1?'v1':'v2',j={'recipientWowAddress':a['recipientWowAddress'],'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':e,'version':h},k=await depositFromEth({'amount':a['amount'],'tokenAddress':g?void 0x0:f['evmAddress'],'tokenId':g?void 0x0:f['tokenId']},j);if(!k['success']||!k['txHash'])a110c('fail','EVM\x20deposit\x20failed:\x20'+(k['error']?.['message']??'unknown\x20error'));const l=k['txHash'];if(!d)return{'depositTxHash':l};await waitForEthTx(l,e,0x40,0x2ee0,this['config']['timeouts']['signatureCollectMs']);const m=await queryEthTxReceipt(l,e);if(!m)return{'depositTxHash':l};const n=parseEthDepositEvent(m,c['bridgeProxyAddress']);if(!n)return{'depositTxHash':l};if(!this['wowEnv'])a110c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20EVM→WOW\x20finalization\x20(claim\x20on\x20WOW)');const o=this['config']['timeouts']['autoClaimMs'],p=this['config']['timeouts']['signaturePollIntervalMs'],q=Math['max'](0x1,Math['ceil'](o/p));let r;for(let u=0x0;u<q;u++){r=await queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':n['bridgeSeq']},this['config']['wow']['network']),logger['debug']('wait\x20approve\x20'+(u+0x1)+'/'+q+':\x20status='+r['status']);if(r['status']==='approved'||r['status']==='claimed')break;await sleep(p);}if(!r||r['status']==='not_approved')a110c('fail','Timeout\x20waiting\x20for\x20bridge\x20nodes\x20to\x20approve\x20bridgeSeq='+n['bridgeSeq']+'\x20after\x20'+q+'\x20iterations');if(r['status']==='claimed')return{'depositTxHash':l,'bridgeSeq':n['bridgeSeq'],'claimTxDigest':r['claimedTxHash']};const s=await claimOnWow({'sourceChainId':0xa,'bridgeSeqNum':n['bridgeSeq'],'tokenType':f['wowTypeTag'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']},this['wowEnv']);return{'depositTxHash':l,'bridgeSeq':n['bridgeSeq'],'claimTxDigest':s['digest']};}async['bridgeWowToEvm'](a){let b;if(a['idempotencyKey'])b=a['idempotencyKey'];else{if(a['idempotentByParams'])b=this['_generateIdempotencyKey']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['recipientEthAddress']});}if(b){const v=await this['_findTransferByIdempotencyKey'](b);if(v){if(v['status']==='success')return{'depositTxDigest':v['depositTxDigest'],'bridgeSeq':v['bridgeSeq']?BigInt(v['bridgeSeq']):0x0n,'claimTxHash':v['claimTxHash'],'idempotentHit':!![]};else{if(v['status']==='pending'||v['status']==='in_progress')return{'depositTxDigest':v['depositTxDigest']??'','bridgeSeq':v['bridgeSeq']?BigInt(v['bridgeSeq']):0x0n,'claimTxHash':v['claimTxHash'],'idempotentHit':!![]};}await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](v['transferId']),await this['_saveHistory']();});}}if(!this['wowEnv'])a110c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20bridge');const c=a['waitForFinalization']??!![],d=this['config']['ethereum'],e=await this['resolveEvmRpcUrl'](),f=a110k(this['config'],a['token']);if(!f)a110c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=f['wowTypeTag'],h=f['tokenId'];await this['_ensureSafeEvmNonce']({'tokenType':g,'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']});const i=await depositFromWow({'amount':a['amount'],'tokenType':g,'recipientEthAddress':a['recipientEthAddress'],'bridgeObjectId':this['config']['wow']['bridgeObjectId']},this['wowEnv']),{WowClient:j}=await import('./client/index.mjs'),{Config:k}=await import('./w/local/config.mjs'),{getFullnodeUrl:l}=await import('./network-UpRYD8EM.mjs')['then'](w=>w['s']),m=await k['Instance']()['network_get'](this['wowEnv']['network']),n=new j({'url':l(m),'network':m});await waitForWowTx(n,i['digest'],this['config']['timeouts']['signaturePollIntervalMs'],this['config']['timeouts']['signatureCollectMs']);if(!c)return{'depositTxDigest':i['digest'],'bridgeSeq':i['seqNum']};const o=await n['getTransactionBlock']({'digest':i['digest'],'options':{'showEffects':!![]}}),p=o['timestampMs']?BigInt(o['timestampMs']):BigInt(Date['now']()),q=(await Account['Instance']()['get'](this['wowEnv']['account']))?.['address']??'';if(!q)a110c('fail','Failed\x20to\x20resolve\x20WOW\x20sender\x20address');const r=buildClaimMessage({'messageType':0x0,'version':0x2,'nonce':i['seqNum'],'sourceChain':0x0,'targetChain':0xa,'recipientAddress':hexToBytes(a['recipientEthAddress']['slice'](0x2)),'tokenId':h,'amount':a['amount'],'timestampMs':p,'senderAddress':hexToBytes(q['startsWith']('0x')?q['slice'](0x2):q)}),s={'bridgeProxyAddress':d['bridgeProxyAddress'],'network':d['chainId'],'rpcUrl':e,'nodeClient':this['nodeClient'],'wowClient':n},t=await claimOnEthBySeq({'sourceChain':0x0,'messageType':0x0,'seqNum':i['seqNum'],'message':r},s);if(!t['success']||!t['txHash'])a110c('fail','EVM\x20claim\x20failed:\x20'+(t['error']?.['revertReason']?'revert:\x20'+t['error']['revertReason']:t['error']?.['message']??'unknown\x20error'));const u=t['txHash'];return await waitForEthTx(u,e,0x1,0x2ee0,this['config']['timeouts']['signatureCollectMs']),{'depositTxDigest':i['digest'],'bridgeSeq':i['seqNum'],'claimTxHash':u};}async['queryEvmToWowStatus'](a){const b=this['config']['ethereum'],{EvmNetworkRegistry:c}=await import('./w/local/evm/networks.mjs'),d=c['Instance'](),f=await d['resolve'](b['chainId']),g=Date['now'](),h=[...f['rpcUrls']]['sort']((j,k)=>{const l=d['unhealthyRpc']?.['get'](j)??0x0,m=d['unhealthyRpc']?.['get'](k)??0x0,n=d['unhealthyCounter']?.['get'](j)??0x0,o=d['unhealthyCounter']?.['get'](k)??0x0,p=l<g?0x0:0x1,q=m<g?0x0:0x1;if(p!==q)return p-q;return n-o;});let i;for(const j of h)try{const k=await queryEvmToWowTransferStatus(a,j,b['bridgeProxyAddress']);d['markHealthy'](j);if(k['step']==='source_tx_confirmed'&&k['bridgeSeq'])try{const l=await queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':BigInt(k['bridgeSeq'])},this['config']['wow']['network']);if(l['status']==='claimed')k['status']='completed',k['step']='completed',k['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed'],k['claimTxDigest']=l['claimedTxHash'];else{if(l['status']==='approved')k['status']='signatures_ready',k['step']='signatures_ready',k['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['signatures_ready'];else{if(l['status']==='not_approved'){}}}}catch{}return k;}catch(m){i=m,d['markUnhealthy'](j);}return{'status':'pending','step':'source_tx_pending','direction':'evm_to_wow','sourceTxHash':a,'error':i instanceof Error?i['message']:String(i)};}async['queryWowToEvmStatus'](a){const {WowClient:b}=await import('./client/index.mjs'),{getFullnodeUrl:c}=await import('./network-UpRYD8EM.mjs')['then'](f=>f['s']),d=this['config']['wow']['network'],e=await queryWowToEvmTransferStatus(new b({'url':c(d),'network':d}),a);if(e['step']!=='source_tx_confirmed'||e['bridgeSeq']==null)return e;try{return await this['enrichWowToEvmSigningState'](e,a);}catch{return e;}}async['enrichWowToEvmSigningState'](a,b){const c=this['config']['ethereum'],d=a['bridgeSeq'],e=this['findWowDepositEventIdx'](a);let f=null,g=null;const h=(async()=>{const k=await this['resolveEvmRpcUrl']();f=await isEvmNonceAlreadyProcessed({'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':k},d);})()['catch'](()=>{}),i=e>=0x0?this['nodeClient']['probeWowToEth'](b,e)['then'](k=>{g=k;})['catch'](()=>{}):Promise['resolve']();let j=![];try{await Promise['race']([Promise['allSettled']([h,i]),new Promise((k,l)=>setTimeout(()=>l(new Error('signing-state\x20probe\x20deadline')),BridgeClient['SIGNING_PROBE_DEADLINE_MS']))]);}catch{j=!![];}if(f===!![])return a['status']='completed',a['step']='completed',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed'],a['updatedAt']=Date['now'](),a;if(g){if(g['ready'])a['status']='signatures_ready',a['step']='signatures_ready',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['signatures_ready'],a['signatureCount']=g['responded'],a['signaturesRequired']=g['memberCount'];else g['responded']>0x0&&g['signedWeight']>0x0&&(a['status']='confirmed',a['step']='node_signing',a['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['node_signing'],a['signatureCount']=g['responded'],a['signaturesRequired']=g['memberCount']);a['updatedAt']=Date['now']();}else{if(j)logger['warn']('WOW→EVM\x20signing-state\x20probe\x20timed\x20out\x20after\x20'+BridgeClient['SIGNING_PROBE_DEADLINE_MS']+'ms;\x20keeping\x20step='+a['step']);}return a;}['findWowDepositEventIdx'](a){const b=a['wowReceipt']?.['events'];if(!b||b['length']===0x0)return 0x0;const c=b['findIndex'](d=>typeof d?.['type']==='string'&&d['type']['toLowerCase']()['includes']('::bridge::tokendepositedeventv2'));return c>=0x0?c:0x0;}async['queryEvmToWowClaimStatus'](a){return queryWowClaimStatus({'sourceChainId':0xa,'bridgeSeqNum':a['bridgeSeqNum']},this['config']['wow']['network']);}async['claimWowToEvm'](a){if(!this['wowEnv'])a110c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20claim');await this['_loadHistoryPromise'];const b=this['_transferHistory']['get'](a);if(!b)a110c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20not\x20found');if(b['direction']!=='wow_to_evm')a110c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20is\x20not\x20a\x20wow_to_evm\x20transfer');if(!b['depositTxDigest']||!b['bridgeSeq'])a110c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20missing\x20deposit\x20info\x20(depositTxDigest\x20or\x20bridgeSeq)');const c=this['config']['ethereum'],d=await this['resolveEvmRpcUrl'](),e=a110k(this['config'],b['token']);if(!e)a110c('invalid\x20parameter','Token\x20'+b['token']+'\x20not\x20found\x20in\x20config');const f=e['tokenId'],{WowClient:g}=await import('./client/index.mjs'),{Config:h}=await import('./w/local/config.mjs'),{getFullnodeUrl:i}=await import('./network-UpRYD8EM.mjs')['then'](r=>r['s']),j=await h['Instance']()['network_get'](this['wowEnv']['network']),k=new g({'url':i(j),'network':j}),l=await k['getTransactionBlock']({'digest':b['depositTxDigest'],'options':{'showEffects':!![]}}),m=l['timestampMs']?BigInt(l['timestampMs']):BigInt(Date['now']()),n=(await Account['Instance']()['get'](this['wowEnv']['account']))?.['address']??'';if(!n)a110c('fail','Failed\x20to\x20resolve\x20WOW\x20sender\x20address');const o=buildClaimMessage({'messageType':0x0,'version':0x2,'nonce':BigInt(b['bridgeSeq']),'sourceChain':0x0,'targetChain':0xa,'recipientAddress':hexToBytes(b['recipientEth']['slice'](0x2)),'tokenId':f,'amount':BigInt(b['amount']),'timestampMs':m,'senderAddress':hexToBytes(n['startsWith']('0x')?n['slice'](0x2):n)}),p={'bridgeProxyAddress':c['bridgeProxyAddress'],'network':c['chainId'],'rpcUrl':d,'nodeClient':this['nodeClient'],'wowClient':k},q=await claimOnEthBySeq({'sourceChain':0x0,'messageType':0x0,'seqNum':BigInt(b['bridgeSeq']),'message':o},p);if(!q['success']||!q['txHash'])a110c('fail','EVM\x20claim\x20failed:\x20'+(q['error']?.['revertReason']?'revert:\x20'+q['error']['revertReason']:q['error']?.['message']??'unknown\x20error'));return this['_updateTransfer'](a,{'step':'claimed','status':'success','claimTxHash':q['txHash']}),{'claimTxHash':q['txHash'],'transferId':a};}async['bridgeWowToEvmSimple'](a){if(!this['wowEnv'])a110c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20WOW→EVM\x20bridge');const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=(await b['Instance']()['active']())['address'];let d;if(a['idempotencyKey'])d=a['idempotencyKey'];else{if(a['idempotentByParams'])d=this['_generateIdempotencyKey']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['withdrawTo']??c,'intermediateEthAccount':c});}if(d){const f=await this['_findTransferByIdempotencyKey'](d);if(f){if(f['status']==='success'||f['status']==='pending'||f['status']==='in_progress')return{'depositTxDigest':f['depositTxDigest']??'','bridgeSeq':f['bridgeSeq']?BigInt(f['bridgeSeq']):0x0n,'claimTxHash':f['claimTxHash'],'withdrawTxHash':f['withdrawTxHash'],'activeEvmAccount':f['intermediateEthAccount'],'transferId':f['transferId'],'idempotentHit':!![]};await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](f['transferId']),await this['_saveHistory']();});}}const e=await this['_recordTransfer']({'direction':'wow_to_evm','token':a['token'],'amount':a['amount'],'recipientEth':a['withdrawTo']??c,'intermediateEthAccount':c,'withdrawToProvided':!!a['withdrawTo'],'idempotencyKey':d});try{this['_updateTransfer'](e,{'step':'deposit','status':'in_progress'});const g=await this['bridgeWowToEvm']({'token':a['token'],'amount':a['amount'],'recipientEthAddress':c,'waitForFinalization':a['waitForFinalization']??!![]});if(g['claimTxHash'])this['_updateTransfer'](e,{'step':'claimed','status':'success','depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq']?.['toString'](),'claimTxHash':g['claimTxHash']});else this['_updateTransfer'](e,{'step':'deposit','status':'in_progress','depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq']?.['toString']()});let h;if(a['withdrawTo']&&g['claimTxHash']){this['_updateTransfer'](e,{'step':'withdraw','status':'in_progress'});const i=a110k(this['config'],a['token']);h=(await b['Instance']()['withdrawFromActive']({'to':a['withdrawTo'],'amount':a['amount'],'tokenAddress':a['token']==='ETH'?void 0x0:i?.['evmAddress'],'network':this['config']['ethereum']['chainId']}))['transactionHash'],this['_updateTransfer'](e,{'step':'withdrawn','status':'success','withdrawTxHash':h});}return{'depositTxDigest':g['depositTxDigest'],'bridgeSeq':g['bridgeSeq'],'claimTxHash':g['claimTxHash'],'withdrawTxHash':h,'activeEvmAccount':c,'transferId':e};}catch(j){this['_updateTransfer'](e,{'status':'failed','error':j?.['message']??String(j)});throw j;}}async['bridgeEvmToWowSimple'](a){if(!this['wowEnv'])a110c('invalid\x20parameter','wowEnv\x20is\x20required\x20for\x20EVM→WOW\x20bridge');const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=await b['Instance']()['active']();let d=a['recipientWowAddress'];if(!d){const j=await Account['Instance']()['get'](this['wowEnv']['account']);if(!j?.['address'])a110c('fail','Failed\x20to\x20resolve\x20WOW\x20recipient\x20address');d=j['address'];}let e;if(a['idempotencyKey'])e=a['idempotencyKey'];else{if(a['idempotentByParams'])e=this['_generateIdempotencyKey']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':d,'intermediateEthAccount':c['address']});}if(e){const k=await this['_findTransferByIdempotencyKey'](e);if(k){if(k['status']==='success'||k['status']==='pending'||k['status']==='in_progress')return{'depositTxHash':k['depositTxHash']??'','bridgeSeq':k['bridgeSeq']?BigInt(k['bridgeSeq']):void 0x0,'claimTxDigest':k['claimTxDigest'],'activeEvmAccount':k['intermediateEthAccount'],'transferId':k['transferId'],'idempotentHit':!![]};await this['_historyLock']['run'](async()=>{this['_transferHistory']['delete'](k['transferId']),await this['_saveHistory']();});}}const f=a110k(this['config'],a['token']);if(!f)a110c('invalid\x20parameter','Token\x20'+a['token']+'\x20not\x20found\x20in\x20config');const g=a['token']==='ETH';let h;if(g)h=await b['Instance']()['balance'](this['config']['ethereum']['chainId']);else h=await b['Instance']()['balanceOf'](f['evmAddress'],this['config']['ethereum']['chainId']);if(h===void 0x0||h<a['amount'])a110c('fail','Insufficient\x20'+(g?'ETH':'ERC20')+'\x20balance\x20on\x20activeEvmAccount\x20('+c['address']+')\x20on\x20chain\x20'+this['config']['ethereum']['chainId']+':\x20have\x20'+(h??0x0n)+',\x20need\x20'+a['amount']+'.\x20Please\x20recharge\x20the\x20activeEvmAccount\x20from\x20your\x20wallet\x20(transfer\x20'+(g?'ETH':'the\x20token')+'\x20to\x20'+c['address']+'),\x20then\x20retry\x20the\x20cross-chain\x20transfer.');const i=await this['_recordTransfer']({'direction':'evm_to_wow','token':a['token'],'amount':a['amount'],'recipientWow':d,'intermediateEthAccount':c['address'],'idempotencyKey':e});try{this['_updateTransfer'](i,{'step':'deposit','status':'in_progress'});let l;if(g)l=await this['bridgeNativeEvmToWow']({'amount':a['amount'],'recipientWowAddress':d,'waitForFinalization':a['waitForFinalization']??!![]});else l=await this['bridgeErc20ToWow']({'token':a['token'],'amount':a['amount'],'recipientWowAddress':d,'waitForFinalization':a['waitForFinalization']??!![]});const m=a['waitForFinalization']??!![];return this['_updateTransfer'](i,{'step':m?'claimed':'deposit','status':m?'success':'in_progress','depositTxHash':l['depositTxHash'],'bridgeSeq':l['bridgeSeq']?.['toString'](),'claimTxDigest':l['claimTxDigest']}),{...l,'activeEvmAccount':c['address'],'transferId':i};}catch(n){this['_updateTransfer'](i,{'status':'failed','error':n?.['message']??String(n)});throw n;}}async['withdrawFromActiveEvmAccount'](a){const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),c=await b['Instance']()['active']();let d=a['tokenAddress'];if(!d&&a['token']&&a['token']!=='ETH')d=a110k(this['config'],a['token'])?.['evmAddress'];const e=await this['_recordTransfer']({'direction':'withdraw','token':a['token'],'amount':a['amount'],'recipientEth':a['to'],'intermediateEthAccount':c['address']});try{this['_updateTransfer'](e,{'step':'withdraw','status':'in_progress'});const f=await b['Instance']()['withdrawFromActive']({'to':a['to'],'amount':a['amount'],'tokenAddress':d,'network':a['network']??this['config']['ethereum']['chainId']});return this['_updateTransfer'](e,{'step':'withdrawn','status':'success','withdrawTxHash':f['transactionHash']}),{'txHash':f['transactionHash'],'transferId':e};}catch(g){this['_updateTransfer'](e,{'status':'failed','error':g?.['message']??String(g)});throw g;}}async['querySupportedEvmChains'](){const {EvmNetworkRegistry:a}=await import('./w/local/evm/networks.mjs'),b=a['Instance']()['listRpcStatus'](this['config']['ethereum']['chainId']),c=b['filter'](d=>d['healthy'])['length'];return[{'chainId':this['config']['ethereum']['chainId'],'name':'mainnet','description':'Ethereum\x20Mainnet','bridgeChainId':this['config']['ethereum']['bridgeChainId'],'explorerUrl':'https://etherscan.io','rpcCount':b['length'],'healthyRpcCount':c}];}async['querySupportedTokens'](a){const b=await this['querySupportedEvmChains'](),c=a?.['network']?b['filter'](e=>typeof a['network']==='number'?e['chainId']===a['network']:e['name']['toLowerCase']()===String(a['network'])['toLowerCase']()):b,d=[];for(const e of c){const f=this['config']['tokens']['filter'](g=>!g['evmChains']||g['evmChains']['includes'](e['bridgeChainId']))['map'](g=>({'tokenId':g['tokenId'],'symbol':g['symbol'],'evmAddress':g['evmAddress'],'evmDecimals':g['evmDecimals'],'wowTypeTag':g['wowTypeTag'],'wowDecimals':g['wowDecimals'],'description':g['description']??g['symbol']+'\x20(tokenId='+g['tokenId']+')'}));d['push']({'chainId':e['chainId'],'chainName':e['name'],'bridgeChainId':e['bridgeChainId'],'tokens':f});}return d;}async['queryActiveEvmAccount'](a){const {EvmAccount:b}=await import('./w/local/evm-account.mjs'),{EvmNetworkRegistry:c}=await import('./w/local/evm/networks.mjs'),d=await b['Instance']()['active']();c['Instance']();const e=await this['querySupportedEvmChains'](),f=a?.['network']?e['filter'](h=>typeof a['network']==='number'?h['chainId']===a['network']:h['name']['toLowerCase']()===String(a['network'])['toLowerCase']()):e,g=[];for(const h of f){const i=await b['Instance']()['balance'](h['chainId']),j={'chainId':h['chainId'],'name':h['name'],'nativeBalance':(i??0x0n)['toString']()};if(a?.['tokens']&&a['tokens']['length']>0x0){j['tokens']=[];for(const k of a['tokens']){const l=await b['Instance']()['balanceOf'](k,h['chainId']);j['tokens']['push']({'tokenAddress':k,'balance':(l??0x0n)['toString']()});}}g['push'](j);}return{'address':d['address'],'chains':g};}async['queryTransferList'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{const b=Array['from'](this['_transferHistory']['values']())['reverse']();if(a?.['onlyActive'])return b['filter'](c=>c['status']==='in_progress'||c['status']==='pending');return b;});}async['queryTransferStatus'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{return this['_transferHistory']['get'](a);});}async['getTransferByDepositTx'](a){return this['_findTransferByDepositTx'](a);}async['getTransferByBridgeSeq'](a){return this['_findTransferByBridgeSeq'](a);}async['resumeTransfer'](a){await this['_loadHistoryPromise'];const b=await this['_historyLock']['run'](async()=>{return this['_transferHistory']['get'](a);});if(!b)a110c('invalid\x20parameter','transferId\x20\x27'+a+'\x27\x20not\x20found');if(b['status']==='success')return b;if(b['direction']==='wow_to_evm')return this['_resumeWowToEvm'](b);else{if(b['direction']==='evm_to_wow')return this['_resumeEvmToWow'](b);else{if(b['direction']==='withdraw')return this['_resumeWithdraw'](b);}}return b;}async['_resumeWowToEvm'](a){const b=a['transferId'];try{if(a['depositTxDigest']&&a['bridgeSeq']){await this['refreshTransferStatus'](b);const c=await this['queryTransferStatus'](b);if(c?.['status']==='success')return c;if(!a['claimTxHash']){const {EvmAccount:d}=await import('./w/local/evm-account.mjs'),e=await d['Instance']()['active']();if(a['recipientEth']===e['address'])await this['claimWowToEvm'](b);}if(a['withdrawToProvided']&&a['recipientEth']&&!a['withdrawTxHash']){const f=a110k(this['config'],a['token']),{EvmAccount:g}=await import('./w/local/evm-account.mjs');this['_updateTransfer'](b,{'step':'withdraw','status':'in_progress'});const h=await g['Instance']()['withdrawFromActive']({'to':a['recipientEth'],'amount':BigInt(a['amount']),'tokenAddress':a['token']==='ETH'?void 0x0:f?.['evmAddress'],'network':this['config']['ethereum']['chainId']});this['_updateTransfer'](b,{'step':'withdrawn','status':'success','withdrawTxHash':h['transactionHash']});}}}catch(i){this['_updateTransfer'](b,{'status':'failed','error':i?.['message']??String(i)});throw i;}return await this['queryTransferStatus'](b)??a;}async['_resumeEvmToWow'](a){const b=a['transferId'];try{await this['refreshTransferStatus'](b);const c=await this['queryTransferStatus'](b);if(c?.['status']==='success')return c;}catch(d){this['_updateTransfer'](b,{'status':'failed','error':d?.['message']??String(d)});throw d;}return await this['queryTransferStatus'](b)??a;}async['_resumeWithdraw'](a){const b=a['transferId'];try{if(!a['withdrawTxHash']&&a['recipientEth']){const c=a110k(this['config'],a['token']),{EvmAccount:d}=await import('./w/local/evm-account.mjs');this['_updateTransfer'](b,{'step':'withdraw','status':'in_progress'});const e=await d['Instance']()['withdrawFromActive']({'to':a['recipientEth'],'amount':BigInt(a['amount']),'tokenAddress':a['token']==='ETH'?void 0x0:c?.['evmAddress'],'network':this['config']['ethereum']['chainId']});this['_updateTransfer'](b,{'step':'withdrawn','status':'success','withdrawTxHash':e['transactionHash']});}}catch(f){this['_updateTransfer'](b,{'status':'failed','error':f?.['message']??String(f)});throw f;}return await this['queryTransferStatus'](b)??a;}async['refreshTransferStatus'](a){await this['_loadHistoryPromise'];const b=this['_transferHistory']['get'](a);if(!b)return void 0x0;if(b['direction']==='withdraw')return b;try{if(b['direction']==='evm_to_wow'&&b['depositTxHash']){const c=await this['queryEvmToWowStatus'](b['depositTxHash']);if(typeof c['bridgeSeq']==='bigint')c['bridgeSeq']=c['bridgeSeq']['toString']();b['latestState']=c,c['status']==='completed'&&b['status']==='in_progress'&&(b['status']='success',b['step']='claimed');}else{if(b['direction']==='wow_to_evm'&&b['depositTxDigest']){const d=await this['queryWowToEvmStatus'](b['depositTxDigest']);if(typeof d['bridgeSeq']==='bigint')d['bridgeSeq']=d['bridgeSeq']['toString']();if(b['claimTxHash']){if(d['step']==='source_tx_confirmed'||d['step']==='signatures_ready')try{const e=await this['resolveEvmRpcUrl'](),f=await queryEthTxReceipt(b['claimTxHash'],e);f?(d['claimReceipt']=f,f['status']==='0x1'?(d['status']='completed',d['step']='completed',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['completed']):(d['status']='failed',d['step']='failed',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['failed'],d['error']='EVM\x20claim\x20transaction\x20reverted')):(d['status']='claiming',d['step']='claim_tx_pending',d['stepDescription']=BRIDGE_STEP_DESCRIPTIONS['claim_tx_pending']);}catch{}}else{if(d['step']==='signatures_ready')d['hint']='Quorum\x20signatures\x20are\x20ready.\x20Call\x20claim_wow_to_evm\x20(step\x202)\x20now.';else{if(d['step']==='node_signing')d['hint']='Bridge\x20committee\x20signing\x20in\x20progress\x20('+(d['signatureCount']??0x0)+'/'+(d['signaturesRequired']??'?')+'\x20nodes\x20responded).\x20Keep\x20polling\x20query_transfer_status;\x20call\x20claim_wow_to_evm\x20once\x20signatures_ready.';else{if(d['step']!=='completed')d['hint']='WOW\x20deposit\x20confirmed;\x20waiting\x20for\x20bridge\x20committee\x20signatures.\x20Keep\x20polling\x20query_transfer_status,\x20then\x20call\x20claim_wow_to_evm\x20once\x20signatures_ready.';}}}b['latestState']=d,d['status']==='completed'&&b['status']==='in_progress'&&(b['status']='success',b['step']='claimed');}}}catch(g){b['error']=g?.['message']??String(g);}return b;}async['manageEvmRpc'](a){const {EvmNetworkRegistry:b}=await import('./w/local/evm/networks.mjs'),c=b['Instance'](),d=a['network']??this['config']['ethereum']['chainId'];switch(a['op']){case'list':return{'op':'list','success':!![],'result':c['listRpcStatus'](d)};case'add':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a110c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27add\x27\x20op');{const e=c['addRpcs'](d,a['rpcUrls']);return{'op':'add','success':e>0x0,'result':{'added':e}};}case'remove':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a110c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27remove\x27\x20op');{const f=c['removeRpcs'](d,a['rpcUrls']);return{'op':'remove','success':f>0x0,'result':{'removed':f}};}case'set':if(!a['rpcUrls']||a['rpcUrls']['length']===0x0)a110c('invalid\x20parameter','rpcUrls\x20is\x20required\x20for\x20\x27set\x27\x20op');return{'op':'set','success':c['setRpcs'](d,a['rpcUrls'])};case'ping':{const g=c['listRpcStatus'](d),h=[];for(const i of g){const j=await c['ping'](i['url']);h['push']({'url':i['url'],'healthy':j});}return{'op':'ping','success':!![],'result':h};}default:a110c('invalid\x20parameter','Unknown\x20op:\x20'+a['op']);}}static{this['HISTORY_DB_KEY']='bridge:transfers:all';}async['_loadHistory'](){return this['_historyLock']['run'](async()=>{try{this['_historyStore']=new a110f();const a=await this['_historyStore']['get'](BridgeClient['HISTORY_DB_KEY']);if(a){const b=JSON['parse'](a);if(Array['isArray'](b)){for(const d of b)if(d['transferId'])this['_transferHistory']['set'](d['transferId'],d);for(const e of b){const f=e['transferId']?.['match'](/_(\d+)$/);if(f){const g=parseInt(f[0x1],0xa);if(g>this['_transferCounter'])this['_transferCounter']=g;}}}}}catch{}});}async['_saveHistory'](){try{if(!this['_historyStore'])return;const a=Array['from'](this['_transferHistory']['values']());await this['_historyStore']['put'](BridgeClient['HISTORY_DB_KEY'],JSON['stringify'](a));}catch{}}async['_recordTransfer'](a){return this['_historyLock']['run'](async()=>{this['_transferCounter']+=0x1;const b='br_'+Date['now']()+'_'+this['_transferCounter'],c={'transferId':b,'idempotencyKey':a['idempotencyKey'],'direction':a['direction'],'token':a['token'],'amount':a['amount']['toString'](),'recipientEth':a['recipientEth'],'recipientWow':a['recipientWow'],'intermediateEthAccount':a['intermediateEthAccount'],'withdrawToProvided':a['withdrawToProvided'],'step':'init','status':'pending','createdAt':Date['now'](),'updatedAt':Date['now']()};return this['_transferHistory']['set'](b,c),await this['_saveHistory'](),b;});}async['_updateTransfer'](a,b){return this['_historyLock']['run'](async()=>{const c=this['_transferHistory']['get'](a);if(!c)return;Object['assign'](c,b,{'updatedAt':Date['now']()}),await this['_saveHistory']();});}['_generateIdempotencyKey'](a){const b=[a['direction'],a['token']['toString'](),a['amount']['toString'](),a['recipientWow']??'',a['recipientEth']??'',a['intermediateEthAccount']??''];let c=0x1505;const d=b['join']('|');for(let e=0x0;e<d['length'];e++){c=(c<<0x5)+c+d['charCodeAt'](e),c|=0x0;}return'idem_'+Math['abs'](c)['toString'](0x24);}async['_findTransferByIdempotencyKey'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{for(const b of this['_transferHistory']['values']())if(b['idempotencyKey']===a)return b;});}async['_findTransferByDepositTx'](a){return await this['_loadHistoryPromise'],this['_historyLock']['run'](async()=>{for(const b of this['_transferHistory']['values']())if(b['depositTxHash']===a||b['depositTxDigest']===a)return b;});}async['_findTransferByBridgeSeq'](a){await this['_loadHistoryPromise'];const b=a['toString']();return this['_historyLock']['run'](async()=>{for(const c of this['_transferHistory']['values']())if(c['bridgeSeq']===b)return c;});}};function sleep(a){return new Promise(b=>setTimeout(b,a));}function loadDefaultConfig(){return a110j;}function hexToBytes(a){const b=a['startsWith']('0x')?a['slice'](0x2):a,c=new Uint8Array(b['length']/0x2);for(let d=0x0;d<c['length'];d++)c[d]=parseInt(b['slice'](d*0x2,d*0x2+0x2),0x10);return c;}export{ERC20_TRANSFER_TOPIC as A,encodeTokenTransferPayloadV2 as B,buildClaimMessage as C,depositErc20 as D,isEvmNonceAlreadyProcessed as E,encodeBridgeERC20 as F,encodeBridgeERC20V2 as I,encodeBridgeETH as L,TOKENS_DEPOSITED_TOPIC as M,TOKENS_DEPOSITED_V2_TOPIC as N,depositEth as O,encodeApprove as P,encodeBridgeETHV2 as R,depositFromWow as S,claimOnEthBySeq as T,encodeTransferBridgedTokensWithSignatures as V,waitForEthTx as _,BridgeTransferStatus as a,claimOnWow as b,parseEthClaimEvent as c,queryEthBalance as d,queryEthTxConfirmations as f,queryWowTx as g,queryWowToEvmTransferStatus as h,BridgeTransferDirection as i,TOKENS_CLAIMED_TOPIC as j,depositFromEth as k,parseEthDepositEvent as l,queryEvmToWowTransferStatus as m,BridgeNodeClient as n,BridgeTransferStep as o,queryEthTxReceipt as p,BRIDGE_STEP_DESCRIPTIONS as r,makeBridgeTransferState as s,BridgeClient as t,queryErc20Balance as u,waitForWowTx as v,claimOnEth as w,queryWowClaimStatus as x,WowClaimStatus as y,encodeIsTransferProcessed as z};
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"author": "wowok <build@wowok.net>",
|
|
4
4
|
"description": "Wowok Blockchain TypeScript API",
|
|
5
5
|
"homepage": "https://wowok.net",
|
|
6
|
-
"version": "3.0.
|
|
6
|
+
"version": "3.0.7",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"files": [
|
|
@@ -215,6 +215,12 @@
|
|
|
215
215
|
"./w/messenger/reply.js": {
|
|
216
216
|
"import": "./dist/esm/w/messenger/reply.mjs"
|
|
217
217
|
},
|
|
218
|
+
"./w/messenger/utils.js": {
|
|
219
|
+
"import": "./dist/esm/w/messenger/utils.mjs"
|
|
220
|
+
},
|
|
221
|
+
"./w/messenger/attachment.js": {
|
|
222
|
+
"import": "./dist/esm/w/messenger/attachment.mjs"
|
|
223
|
+
},
|
|
218
224
|
"./w/messenger/pq/crypto.js": {
|
|
219
225
|
"import": "./dist/esm/w/messenger/pq/crypto.mjs"
|
|
220
226
|
},
|
|
@@ -314,7 +320,6 @@
|
|
|
314
320
|
"tsx": "^4.21.0",
|
|
315
321
|
"typescript": "^5.9.3",
|
|
316
322
|
"vite": "^8.0.5",
|
|
317
|
-
"vite-tsconfig-paths": "^6.0.4",
|
|
318
323
|
"vitest": "^4.0.17",
|
|
319
324
|
"wait-on": "^9.0.3",
|
|
320
325
|
"ws": "^8.18.3"
|