@hinkal/common 0.3.11 → 0.3.12

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/README.md CHANGED
@@ -173,7 +173,7 @@ const readOnlyHinkal = await prepareWagmiHinkalFromNullifyingKey(connector, wagm
173
173
  readOnlyHinkal.initUserKeysWithNullifyingKey(nullifyingKey);
174
174
  ```
175
175
 
176
- A read-only session can fetch balances (`getTotalBalance`, `privateBalancesWithUSD`), decrypt incoming shielded outputs, and call `getRecipientInfo()` to receive funds — everything needed to view holdings. It cannot spend: `transfer`, `withdraw`, `swap`, `actionPrivateWallet`, and every other value-moving call throw, because they require the EdDSA spending key derived from the original wallet signature, which a nullifying key cannot reproduce.
176
+ A read-only session can fetch balances (`getTotalBalances`, `privateBalancesWithUSD`) and decrypt incoming shielded outputs. It cannot spend: `transfer`, `withdraw`, `swap`, `actionPrivateWallet`, and every other value-moving call throw, because they require the EdDSA spending key derived from the original wallet signature, which a nullifying key cannot reproduce.
177
177
 
178
178
  Treat an exported nullifying key as sensitive account-specific material, not a public value — hand it out only to contexts you trust with read access to the account's balances and incoming transfers.
179
179
 
@@ -551,18 +551,18 @@ In this example:
551
551
 
552
552
  Hinkal SDK is available on the following blockchain networks:
553
553
 
554
- | Chain | Chain ID | Status |
555
- | --------------- | ---------- | ------- |
556
- | Ethereum | 1 | ✅ Live |
557
- | Arbitrum | 42161 | ✅ Live |
558
- | Polygon | 137 | ✅ Live |
559
- | Base | 8453 | ✅ Live |
560
- | Tempo | 4217 | ✅ Live |
561
- | BNB | 56 | ✅ Live |
562
- | Solana | 501 | ✅ Live |
563
- | Tron | 728126428 | ✅ Live |
564
- | Arc Testnet | 5042002 | ✅ Live |
565
- | Tron Nile | 3448148188 | ✅ Live |
554
+ | Chain | Chain ID | Status |
555
+ | ----------- | ---------- | ------- |
556
+ | Ethereum | 1 | ✅ Live |
557
+ | Arbitrum | 42161 | ✅ Live |
558
+ | Polygon | 137 | ✅ Live |
559
+ | Base | 8453 | ✅ Live |
560
+ | Tempo | 4217 | ✅ Live |
561
+ | BNB | 56 | ✅ Live |
562
+ | Solana | 501 | ✅ Live |
563
+ | Tron | 728126428 | ✅ Live |
564
+ | Arc Testnet | 5042002 | ✅ Live |
565
+ | Tron Nile | 3448148188 | ✅ Live |
566
566
 
567
567
  Each chain supports the full suite of Hinkal privacy features including shielding, transfers, and confidential interactions with DeFi protocols.
568
568
 
@@ -1 +1 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../functions/utils/serialize.utils.cjs`),t=require(`../../constants/chains.constants.cjs`),n=require(`../../constants/protocol.constants.cjs`),r=require(`../../types/hinkal.types.cjs`),i=require(`../../crypto/poseidon.cjs`),a=require(`../../error-handling/error-codes.constants.cjs`),o=require(`../crypto-keys/keys.cjs`),s=require(`../../API/scheduled-transactions-calls.cjs`),c=require(`../../API/API.cjs`),l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../../functions/web3/events/getShieldedBalance.cjs`),d=require(`../../functions/web3/getContractMetadata.cjs`),f=require(`../../functions/snarkjs/fetchOnChainRootHashes.cjs`),p=require(`./hinkalDeposit.cjs`),m=require(`../../functions/utils/cacheDevice.utils.cjs`),h=require(`../../providers/SolanaProviderAdapter.cjs`),g=require(`../../functions/utils/enclave-signature-storage.cjs`),_=require(`../../functions/utils/mnemonics.cjs`),v=require(`./hinkalDepositAndWithdraw.cjs`),y=require(`./hinkalSolanaDeposit.cjs`),b=require(`./hinkalSwap.cjs`),x=require(`./hinkalWithdraw.cjs`),S=require(`../merkle-tree/MerkleTree.cjs`);require(`../merkle-tree/index.cjs`);const C=require(`./resetMerkleTrees.cjs`);require(`../../API/index.cjs`);const w=require(`../MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.cjs`),T=require(`./hinkalPrivateWallet.cjs`),E=require(`./hinkalGetRecipientInfo.cjs`),D=require(`./hinkalSignSubAccount.cjs`),O=require(`./hinkalActionReceive.cjs`),k=require(`./hinkalProoflessDeposit.cjs`),A=require(`./hinkalProxySwap.cjs`),j=require(`./hinkalTransfer.cjs`),M=require(`./hinkalProxyToPrivate.cjs`),N=require(`../../providers/TronProviderAdapter.cjs`),P=require(`./hinkalSolanaDepositAndWithdraw.cjs`),F=require(`./hinkalSolanaWithdraw.cjs`),I=require(`./hinkalSolanaTransfer.cjs`),L=require(`./hinkalSolanaSwap.cjs`),R=require(`./hinkalSolanaProxySwap.cjs`),z=require(`./hinkalSolanaProxyShield.cjs`),B=require(`./hinkalDepositAndBridge.cjs`),V=require(`./hinkalBridgePrivateToPrivate.cjs`),H=require(`./hinkalNearDepositAndBridge.cjs`),U=require(`./hinkalClaimUtxo.cjs`),W=require(`./hinkalSolanaProoflessDeposit.cjs`),G=require(`./hinkalSolanaClaimUtxo.cjs`),K=require(`./hinkalWithdrawStuckUtxos.cjs`),q=require(`../private-balances/HinkalPrivateBalanceController.cjs`);require(`../private-balances/index.cjs`);const J=require(`./hinkalProxySend.cjs`);let Y=require(`@solana/web3.js`);var X=class{ethereumProviderAdapter;solanaProviderAdapter;tronProviderAdapter;userKeys;legacySignature;merkleTreeHinkalByChain={};nullifiersByChain={};encryptedOutputsByChain={};commitmentsSnapshotServiceByChain={};nullifierSnapshotServiceByChain={};privateBalances=new q.HinkalPrivateBalanceController(this);utxoUtils;lastCallState=new Map;cacheDevice;balanceFetchingMutexByChain=new Map;generateProofRemotely;disableMerkleTreeUpdates;allowParallelBalanceLocalDecryption;constructor(e){this.userKeys=new o.UserKeys(void 0),e?.tronChainOverride&&t.setHinkalTronChainId(e.tronChainOverride),t.HINKAL_SUPPORTED_CHAINS.forEach(e=>{this.merkleTreeHinkalByChain[e]=S.MerkleTree.create(i.poseidonFunction,0n),this.nullifiersByChain[e]=new Set,this.encryptedOutputsByChain[e]=[]}),this.generateProofRemotely=e?.generateProofRemotely??!0,this.utxoUtils=new w.MultiThreadedUtxoUtils,this.cacheDevice=m.createCacheDevice(e),this.disableMerkleTreeUpdates=e?.disableMerkleTreeUpdates??!1,this.allowParallelBalanceLocalDecryption=e?.allowParallelBalanceLocalDecryption??!1}enforceRateLimit(t,n,r=1e3){let i=Date.now(),a=e.CustomJSONStringify(n),o=this.lastCallState.get(t);if(o&&o.argsKey===a&&i-o.timestamp<r)throw Error(`${t} was already called with the same arguments`);this.lastCallState.set(t,{timestamp:i,argsKey:a})}getProviderAdapter(e){let n=e;n||=this.ethereumProviderAdapter?t.chainIds.ethMainnet:this.solanaProviderAdapter?t.currentSolanaChainId:t.chainIds.tronMainnet;let r;if(r=t.isSolanaLike(n)?this.solanaProviderAdapter:t.isTronLike(n)?this.tronProviderAdapter:this.ethereumProviderAdapter,!r)throw Error(`ProviderAdapter is not initialized`);return r}async initProviderAdapter(e,n){let r=t.chainIds.ethMainnet;n instanceof h.SolanaProviderAdapter?r=t.currentSolanaChainId:n instanceof N.TronProviderAdapter&&(r=t.currentTronChainId),await this.updateProviderAdapter(r,n),n.initConnector(e);let i=await n.connectAndPatchProvider(e);await n.init(i),await this.setListeners()}getSigningMessage(e=r.LoginMessageMode.SDK){switch(e){case r.LoginMessageMode.SDK:return n.SDK_SIGNING_MESSAGE;case r.LoginMessageMode.HINKAL_DAPP:default:return n.DAPP_SIGNING_MESSAGE}}async signHinkalMessage(e=r.LoginMessageMode.SDK){let t=this.getSigningMessage(e);return this.getProviderAdapter().signMessage(t)}async signSolanaLedgerMessage(){let e=new Y.Transaction({blockhash:n.DETERMINISTIC_SOLANA_LEDGER_BLOCKHASH,lastValidBlockHeight:n.DETERMINISTIC_SOLANA_LEDGER_LAST_VALID_BLOCK_HEIGHT,feePayer:this.getSolanaPublicKey()}),t=await this.getProviderAdapter().signTransactionWithoutBroadcast?.(e);if(!t)throw Error(`Failed to sign transaction without broadcast`);return t}async initUserKeys(e=r.LoginMessageMode.SDK){this.userKeys=new o.UserKeys(await this.signHinkalMessage(e))}initUserKeysWithSignature(e){this.userKeys=new o.UserKeys(e)}initUserKeysWithNullifyingKey(e){this.userKeys=new o.UserKeys(void 0,e)}async initUserKeysFromSeedPhrases(e){let t=_.generateHashFromSeedPhrases(e);this.userKeys=new o.UserKeys(t)}async initUserKeysWithEnclaveSignature(e=r.LoginMessageMode.SDK){if(!await this.getEthereumAddress())throw Error(`Connected address not found`);let t=this.getProviderAdapter().isSolanaLedger?.()?await this.signSolanaLedgerMessage():await this.getProviderAdapter().signMessage(this.getSigningMessage(e)),n=await this.storeAndGetInitialSignature(t);this.initUserKeysWithSignature(n??t)}async storeAndGetInitialSignature(e){let t=await this.getEthereumAddress();if(!t)throw Error(`Connected address not found`);return g.storeAndGetSignatureFromEnclave(t,e)}async resetMerkle(e){this.disableMerkleTreeUpdates||(e?.every(e=>this.isSelectedNetworkSupported(e))??!0)&&await C.resetMerkleTrees(this,e)}getTronWeb(){let e=this.tronProviderAdapter;if(!e)throw Error(`Tron provider adapter not initialized`);if(!(e instanceof N.TronProviderAdapter))throw Error(`Tron provider adapter is not a TronProviderAdapter`);let t=e.getTronWeb();if(!t)throw Error(`TronWeb not available`);return t}getSupportedChains(){return this.ethereumProviderAdapter&&this.solanaProviderAdapter?t.WALLET_SUPPORTED_CHAINS:this.ethereumProviderAdapter?t.HINKAL_SUPPORTED_CHAINS.filter(e=>!t.isSolanaLike(e)&&!t.isTronLike(e)):this.solanaProviderAdapter?t.HINKAL_SUPPORTED_CHAINS.filter(e=>t.isSolanaLike(e)):this.tronProviderAdapter?[t.currentTronChainId]:[]}async waitForTransaction(e,t,n=1){return!!await this.getProviderAdapter(e).waitForTransaction(e,t,n)}getContract(e,t,n=void 0){return this.getProviderAdapter(e).getContract(e,t,n)}getContractWithFetcherByChainId(e,t,n=void 0){return d.getContractWithFetcherByChainId(e,t,n)}async signMessage(e){return await this.getProviderAdapter().signMessage(e)}async signTypedData(e,t,n){return await this.getProviderAdapter().signTypedData(e,t,n)}async signWithSubAccount(e,t,n,r){return D.hinkalSignSubAccount(e,t,n,r)}getContractWithSigner(e,t,n=``){return this.getProviderAdapter(e).getContractWithSigner(e,t,n)}getContractWithFetcher(e,t,n=``){return this.getProviderAdapter(e).getContractWithFetcher(e,t,n)}isSelectedNetworkSupported(e){return!!t.networkRegistry[e]}async switchNetwork(e){let n=this.getProviderAdapter(),r=n.getChainId(),i=r!==void 0&&t.isSameOnchainNetwork(e.chainId,r);if(!(e.chainId===r||i))try{await n.switchNetwork(e)}catch{throw Error(a.transactionErrorCodes.FAILED_TO_SWITCH_NETWORKS)}}async disconnectFromConnector(){await this.ethereumProviderAdapter?.disconnectFromConnector(),await this.solanaProviderAdapter?.disconnectFromConnector(),await this.tronProviderAdapter?.disconnectFromConnector()}async resetProviderAdapters(){this.ethereumProviderAdapter?.release(),this.solanaProviderAdapter?.release(),this.tronProviderAdapter?.release(),this.ethereumProviderAdapter=void 0,this.solanaProviderAdapter=void 0,this.tronProviderAdapter=void 0}async updateProviderAdapter(e,n){try{t.isSolanaLike(e)?(this.solanaProviderAdapter&&this.solanaProviderAdapter.release(),this.solanaProviderAdapter=n):t.isTronLike(e)?(this.tronProviderAdapter&&this.tronProviderAdapter.release(),this.tronProviderAdapter=n):(this.ethereumProviderAdapter&&this.ethereumProviderAdapter.release(),this.ethereumProviderAdapter=n)}catch(e){throw console.error(e),Error(`updateProviderAdapter failed, please try again.`)}}async setListeners(){this.ethereumProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}}),this.solanaProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}}),this.tronProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}})}async onAccountChanged(){await this.ethereumProviderAdapter?.onAccountChanged(),await this.solanaProviderAdapter?.onAccountChanged(),await this.tronProviderAdapter?.onAccountChanged();let e=r.EventType.AccountChanged;typeof document<`u`?document?.dispatchEvent(new Event(e)):process?.emit(`message`,e,void 0)}async onChainChanged(e){e?await this.getProviderAdapter(e).onChainChanged(e):await this.disconnectFromConnector()}async monitorConnectedAddress(e){await c.API.monitor(await this.getEthereumAddressByChain(e))}async getTotalBalances(e,t,n,r=!1,i,a=!1){let o=t??this.userKeys,s=new Map(await Promise.all(e.map(async e=>[e,n??await this.getEthereumAddressByChain(e)])));return u.getShieldedBalances(this,s,o.getShieldedPrivateKey(),o.getShieldedPublicKey(),r,i,a)}async getStuckShieldedBalances(e,t,n,r=!1,i=!1){let a=await this.getTotalBalances(e,t,n,r,i,!0);return new Map([...a].map(([e,t])=>[e,t.filter(e=>e.balance>0n)]))}get privateBalancesWithUSD(){return this.privateBalances.getSnapshot()}onPrivateBalancesWithUSDChange(e){return this.privateBalances.onPrivateBalancesWithUSDChange(e)}async getHinkalTreeRootHash(e){return(await f.fetchOnChainRootHashes(e)).hinkalRootHash}async resetMerkleTreesIfNecessary(e){let t=(await Promise.all((e??this.getSupportedChains()).map(async e=>{if(this.generateProofRemotely)return{chainId:e,needsReset:!1};let t=await this.getHinkalTreeRootHash(e);return{chainId:e,needsReset:BigInt(t)!==this.merkleTreeHinkalByChain[e].getRootHash()}}))).filter(e=>e.needsReset).map(e=>e.chainId);t.length>0&&(console.log(`resetting merkle tree in resetMerkleTreesIfNecessary for chains:`,t),await this.resetMerkle(t))}async getEthereumAddress(){let e=this.ethereumProviderAdapter??this.solanaProviderAdapter??this.tronProviderAdapter;if(!e)throw Error(`No provider adapter initialized`);return e.getAddress()}getEthereumAddressByChain(e){return this.getProviderAdapter(e).getAddress()}async getRandomRelay(e,t=!1){return(await c.API.getIdleRelay(e,t)).relay}getGasPrice(e){let t=this.getProviderAdapter(e);if(!t)throw Error(`Illegal State of providerAdapter in Hinkal: no providerAdapter initialized`);return t.getGasPrice(e)}getAPI(){return c.API}snapshotsClearInterval(){this.getSupportedChains().forEach(e=>{this.commitmentsSnapshotServiceByChain[e]?.intervalClear(),this.nullifierSnapshotServiceByChain[e]?.intervalClear()})}async destroy(){this.snapshotsClearInterval(),this.privateBalances.dispose(),await this.resetProviderAdapters()}getRecipientInfo(){return E.getRecipientInfo(this)}async deposit(e,t,n=!0,r=!1){return p.hinkalDeposit(this,e,t,n,r)}async depositSolana(e,t,n=!1){return y.hinkalSolanaDeposit(this,e,t,n)}async depositForOther(e,t,n,r=!0,i=!1,a){return this.enforceRateLimit(this.depositForOther.name,[e,t,n]),p.hinkalDepositForOther(this,e,t,n,r,i,a)}async depositSolanaForOther(e,t,n,r=!1,i){return this.enforceRateLimit(this.depositSolanaForOther.name,[e,t,n]),y.hinkalSolanaDepositForOther(this,e,t,n,r,i)}async depositAndWithdraw(e,n,r,i,a,o,s,c,u=!0){return t.isSolanaLike(l.validateAndGetChainId([e]))?P.hinkalSolanaDepositAndWithdraw(this,e,n,r,i,a,o,s,c):v.hinkalDepositAndWithdraw(this,e,n,r,i,a,o,s,c,u)}async claimUtxo(e,n,r,i){return t.isSolanaLike(l.validateAndGetChainId([e]))?G.hinkalSolanaClaimUtxo(this,e,n,r,i):U.hinkalClaimUtxo(this,e,n,r,i)}async depositAndBridge(e,t,n,r,i,a,o,s=!0){return B.hinkalDepositAndBridge(this,e,t,n,r,i,a,o,s)}async bridgePrivateToPrivate(e,t,n,r,i,a,o,s){return this.enforceRateLimit(this.bridgePrivateToPrivate.name,[e,t,n]),V.hinkalBridgePrivateToPrivate(this,e,t,n,r,i,a,o,s)}async checkSendTransactionStatus(e){return s.getScheduledTransactionById(e)}async nearDepositAndBridge(e,t,n,r,i,a,o,s,c){return this.enforceRateLimit(this.nearDepositAndBridge.name,[e,t,n,r]),H.hinkalNearDepositAndBridge(this,e,t,n,r,i,a,o,s,c)}async prooflessDeposit(e,n,i,a,o=!1,s=r.zeroProoflessFeeStructure,c=``,u,d=!1){return t.isSolanaLike(l.validateAndGetChainId(e))?W.hinkalSolanaProoflessDeposit(this,e,n,i,a,o,u,d):k.hinkalProoflessDeposit(this,e,n,i,a,o,s,c,u,d)}getSolanaProgram(e){if(!this.solanaProviderAdapter)throw Error(`No provider adapter initialized`);if(!(`getSolanaProgram`in this.solanaProviderAdapter))throw Error(`Current provider adapter is not a Solana provider adapter`);return this.solanaProviderAdapter.getSolanaProgram(e)}getSolanaPublicKey(){if(!this.solanaProviderAdapter)throw Error(`No provider adapter initialized`);if(!(`getSolanaPublicKey`in this.solanaProviderAdapter))throw Error(`Current provider adapter is not a Solana provider adapter`);return this.solanaProviderAdapter.getSolanaPublicKey()}async transfer(e,n,r,i,a,o){return this.enforceRateLimit(this.transfer.name,[e,n,r]),t.isSolanaLike(l.validateAndGetChainId(e))?I.hinkalSolanaTransfer(this,e,n,r,i,a,o):j.hinkalTransfer(this,e,n,r,i,a,o)}async withdraw(e,n,r,i,a,o,s,c){return t.isSolanaLike(l.validateAndGetChainId(e))?F.hinkalSolanaWithdraw(this,e,n,r,a,o,s,c):x.hinkalWithdraw(this,e,n,r,i,a,o,s,c)}async withdrawStuckUtxos(e,t){return K.hinkalWithdrawStuckUtxos(this,e,t)}async swap(e,n,r,i,a,o,s,c){return t.isSolanaLike(l.validateAndGetChainId(e))?this.swapSolana(e,n,i,a,o,c):b.hinkalSwap(this,e,n,r,i,a,o,s,c)}async swapSolana(e,t,n,r,i,a){let o=JSON.parse(n),s=BigInt(o.swapperAccountSalt),{instructionLists:c,addressLookupTableAccount:l}=o.data;return L.hinkalSolanaSwap(this,e,t,s,c,l,r,i,a)}async actionReceive(e,n,r,i,a,o){if(!a)throw Error(`subAccount is required`);return t.isSolanaLike(l.validateAndGetChainId(e))?z.hinkalSolanaProxyShield(this,e[0],n[0],a,void 0,!1,i?.variableRate,o):O.hinkalActionReceive(this,e,n,r,i,a,o)}async actionPrivateWallet(e,t,n,r,i,a,o,s,c,l,u=!1,d,f,p){return this.enforceRateLimit(this.actionPrivateWallet.name,[e,t,n,r,i,a,o,s,c,p]),T.hinkalPrivateWallet(this,e,t,n,r,i,a,o,s,c,l,u,d,f,p)}async proxySwap(e,n,r,i,a,o,s,c,u=!1,d,f,p,m){return t.isSolanaLike(l.validateAndGetChainId(e))?R.hinkalSolanaProxySwap(this,e,n,i,o,r,a,s,c,m):A.hinkalProxySwap(this,e,n,r,i,a,o,s,c,u,d,m,f,p)}async proxyToPrivate(e,n,r,i,a,o,s){return t.isSolanaLike(l.validateAndGetChainId(e))?(this.enforceRateLimit(this.proxyToPrivate.name,[e[0],n[0],r,i]),z.hinkalSolanaProxyShield(this,e[0],n[0],r,i,!1,o?.variableRate,s)):M.hinkalProxyToPrivate(this,e,n,i,a,o,r,s)}async proxySend(e,t,n,r,i,a,o){return J.hinkalProxySend(this,e,t,n,r,i,a,o)}areMerkleTreeUpdatesDisabled(){return this.disableMerkleTreeUpdates}updateMerkleTreeUpdates(e){this.disableMerkleTreeUpdates=e}};exports.Hinkal=X;
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../functions/utils/serialize.utils.cjs`),t=require(`../../constants/chains.constants.cjs`),n=require(`../../constants/protocol.constants.cjs`),r=require(`../../types/hinkal.types.cjs`),i=require(`../../crypto/poseidon.cjs`),a=require(`../../error-handling/error-codes.constants.cjs`),o=require(`../crypto-keys/keys.cjs`),s=require(`../../API/scheduled-transactions-calls.cjs`),c=require(`../../API/API.cjs`),l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../../functions/web3/events/getShieldedBalance.cjs`),d=require(`../../functions/web3/getContractMetadata.cjs`),f=require(`../../functions/snarkjs/fetchOnChainRootHashes.cjs`),p=require(`./hinkalDeposit.cjs`),m=require(`../../functions/utils/cacheDevice.utils.cjs`),h=require(`../../providers/SolanaProviderAdapter.cjs`),g=require(`../../functions/utils/enclave-signature-storage.cjs`),_=require(`../../functions/utils/mnemonics.cjs`),v=require(`./hinkalDepositAndWithdraw.cjs`),y=require(`./hinkalSolanaDeposit.cjs`),b=require(`./hinkalSwap.cjs`),x=require(`./hinkalWithdraw.cjs`),S=require(`../merkle-tree/MerkleTree.cjs`);require(`../merkle-tree/index.cjs`);const C=require(`./resetMerkleTrees.cjs`);require(`../../API/index.cjs`);const w=require(`../MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.cjs`),T=require(`./hinkalPrivateWallet.cjs`),E=require(`./hinkalGetRecipientInfo.cjs`),D=require(`./hinkalSignSubAccount.cjs`),O=require(`./hinkalActionReceive.cjs`),k=require(`./hinkalProoflessDeposit.cjs`),A=require(`./hinkalProxySwap.cjs`),j=require(`./hinkalTransfer.cjs`),M=require(`./hinkalProxyToPrivate.cjs`),N=require(`../../providers/TronProviderAdapter.cjs`),P=require(`./hinkalSolanaDepositAndWithdraw.cjs`),F=require(`./hinkalSolanaWithdraw.cjs`),I=require(`./hinkalSolanaTransfer.cjs`),L=require(`./hinkalSolanaSwap.cjs`),R=require(`./hinkalSolanaProxySwap.cjs`),z=require(`./hinkalSolanaProxyShield.cjs`),B=require(`./hinkalDepositAndBridge.cjs`),V=require(`./hinkalBridgePrivateToPrivate.cjs`),H=require(`./hinkalNearDepositAndBridge.cjs`),U=require(`./hinkalClaimUtxo.cjs`),W=require(`./hinkalSolanaProoflessDeposit.cjs`),G=require(`./hinkalSolanaClaimUtxo.cjs`),K=require(`./hinkalWithdrawStuckUtxos.cjs`),q=require(`../private-balances/HinkalPrivateBalanceController.cjs`);require(`../private-balances/index.cjs`);const J=require(`./hinkalProxySend.cjs`);let Y=require(`@solana/web3.js`);var X=class{ethereumProviderAdapter;solanaProviderAdapter;tronProviderAdapter;userKeys;legacySignature;merkleTreeHinkalByChain={};nullifiersByChain={};encryptedOutputsByChain={};commitmentsSnapshotServiceByChain={};nullifierSnapshotServiceByChain={};privateBalances=new q.HinkalPrivateBalanceController(this);utxoUtils;lastCallState=new Map;cacheDevice;balanceFetchingMutexByChain=new Map;generateProofRemotely;disableMerkleTreeUpdates;allowParallelBalanceLocalDecryption;constructor(e){this.userKeys=new o.UserKeys(void 0),e?.tronChainOverride&&t.setHinkalTronChainId(e.tronChainOverride),t.HINKAL_SUPPORTED_CHAINS.forEach(e=>{this.merkleTreeHinkalByChain[e]=S.MerkleTree.create(i.poseidonFunction,0n),this.nullifiersByChain[e]=new Set,this.encryptedOutputsByChain[e]=[]}),this.generateProofRemotely=e?.generateProofRemotely??!0,this.utxoUtils=new w.MultiThreadedUtxoUtils,this.cacheDevice=m.createCacheDevice(e),this.disableMerkleTreeUpdates=e?.disableMerkleTreeUpdates??!1,this.allowParallelBalanceLocalDecryption=e?.allowParallelBalanceLocalDecryption??!1}enforceRateLimit(t,n,r=1e3){let i=Date.now(),a=e.CustomJSONStringify(n),o=this.lastCallState.get(t);if(o&&o.argsKey===a&&i-o.timestamp<r)throw Error(`${t} was already called with the same arguments`);this.lastCallState.set(t,{timestamp:i,argsKey:a})}getProviderAdapter(e){let n=e;n||=this.ethereumProviderAdapter?t.chainIds.ethMainnet:this.solanaProviderAdapter?t.currentSolanaChainId:t.chainIds.tronMainnet;let r;if(r=t.isSolanaLike(n)?this.solanaProviderAdapter:t.isTronLike(n)?this.tronProviderAdapter:this.ethereumProviderAdapter,!r)throw Error(`ProviderAdapter is not initialized`);return r}async initProviderAdapter(e,n){let r=t.chainIds.ethMainnet;n instanceof h.SolanaProviderAdapter?r=t.currentSolanaChainId:n instanceof N.TronProviderAdapter&&(r=t.currentTronChainId),await this.updateProviderAdapter(r,n),n.initConnector(e);let i=await n.connectAndPatchProvider(e);await n.init(i),await this.setListeners()}getSigningMessage(e=r.LoginMessageMode.SDK){switch(e){case r.LoginMessageMode.SDK:return n.SDK_SIGNING_MESSAGE;case r.LoginMessageMode.HINKAL_DAPP:default:return n.DAPP_SIGNING_MESSAGE}}async signHinkalMessage(e=r.LoginMessageMode.SDK){let t=this.getSigningMessage(e);return this.getProviderAdapter().signMessage(t)}async signSolanaLedgerMessage(){let e=new Y.Transaction({blockhash:n.DETERMINISTIC_SOLANA_LEDGER_BLOCKHASH,lastValidBlockHeight:n.DETERMINISTIC_SOLANA_LEDGER_LAST_VALID_BLOCK_HEIGHT,feePayer:this.getSolanaPublicKey()}),t=await this.getProviderAdapter().signTransactionWithoutBroadcast?.(e);if(!t)throw Error(`Failed to sign transaction without broadcast`);return t}async initUserKeys(e=r.LoginMessageMode.SDK){this.userKeys=new o.UserKeys(await this.signHinkalMessage(e))}initUserKeysWithSignature(e){this.userKeys=new o.UserKeys(e)}initUserKeysWithNullifyingKey(e){this.userKeys=new o.UserKeys(void 0,e)}async initUserKeysFromSeedPhrases(e){let t=_.generateHashFromSeedPhrases(e);this.userKeys=new o.UserKeys(t)}async initUserKeysWithEnclaveSignature(e=r.LoginMessageMode.SDK){if(!await this.getEthereumAddress())throw Error(`Connected address not found`);let t=this.getProviderAdapter().isSolanaLedger?.()?await this.signSolanaLedgerMessage():await this.getProviderAdapter().signMessage(this.getSigningMessage(e)),n=await this.storeAndGetInitialSignature(t);this.initUserKeysWithSignature(n??t)}async storeAndGetInitialSignature(e){let t=await this.getEthereumAddress();if(!t)throw Error(`Connected address not found`);return g.storeAndGetSignatureFromEnclave(t,e)}async resetMerkle(e){this.disableMerkleTreeUpdates||(e?.every(e=>this.isSelectedNetworkSupported(e))??!0)&&await C.resetMerkleTrees(this,e)}getTronWeb(){let e=this.tronProviderAdapter;if(!e)throw Error(`Tron provider adapter not initialized`);if(!(e instanceof N.TronProviderAdapter))throw Error(`Tron provider adapter is not a TronProviderAdapter`);let t=e.getTronWeb();if(!t)throw Error(`TronWeb not available`);return t}getSupportedChains(){return this.ethereumProviderAdapter&&this.solanaProviderAdapter?t.WALLET_SUPPORTED_CHAINS:this.ethereumProviderAdapter?t.HINKAL_SUPPORTED_CHAINS.filter(e=>!t.isSolanaLike(e)&&!t.isTronLike(e)):this.solanaProviderAdapter?t.HINKAL_SUPPORTED_CHAINS.filter(e=>t.isSolanaLike(e)):this.tronProviderAdapter?[t.currentTronChainId]:[]}async waitForTransaction(e,t,n=1){return!!await this.getProviderAdapter(e).waitForTransaction(e,t,n)}getContract(e,t,n=void 0){return this.getProviderAdapter(e).getContract(e,t,n)}getContractWithFetcherByChainId(e,t,n=void 0){return d.getContractWithFetcherByChainId(e,t,n)}async signMessage(e){return await this.getProviderAdapter().signMessage(e)}async signTypedData(e,t,n){return await this.getProviderAdapter().signTypedData(e,t,n)}async signWithSubAccount(e,t,n,r){return D.hinkalSignSubAccount(e,t,n,r)}getContractWithSigner(e,t,n=``){return this.getProviderAdapter(e).getContractWithSigner(e,t,n)}getContractWithFetcher(e,t,n=``){return this.getProviderAdapter(e).getContractWithFetcher(e,t,n)}isSelectedNetworkSupported(e){return!!t.networkRegistry[e]}async switchNetwork(e){let n=this.getProviderAdapter(),r=n.getChainId(),i=r!==void 0&&t.isSameOnchainNetwork(e.chainId,r);if(!(e.chainId===r||i))try{await n.switchNetwork(e)}catch{throw Error(a.transactionErrorCodes.FAILED_TO_SWITCH_NETWORKS)}}async disconnectFromConnector(){await this.ethereumProviderAdapter?.disconnectFromConnector(),await this.solanaProviderAdapter?.disconnectFromConnector(),await this.tronProviderAdapter?.disconnectFromConnector()}async resetProviderAdapters(){this.ethereumProviderAdapter?.release(),this.solanaProviderAdapter?.release(),this.tronProviderAdapter?.release(),this.ethereumProviderAdapter=void 0,this.solanaProviderAdapter=void 0,this.tronProviderAdapter=void 0}async updateProviderAdapter(e,n){try{t.isSolanaLike(e)?(this.solanaProviderAdapter&&this.solanaProviderAdapter.release(),this.solanaProviderAdapter=n):t.isTronLike(e)?(this.tronProviderAdapter&&this.tronProviderAdapter.release(),this.tronProviderAdapter=n):(this.ethereumProviderAdapter&&this.ethereumProviderAdapter.release(),this.ethereumProviderAdapter=n)}catch(e){throw console.error(e),Error(`updateProviderAdapter failed, please try again.`)}}async setListeners(){this.ethereumProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}}),this.solanaProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}}),this.tronProviderAdapter?.setChainEventListener({onAccountChanged:()=>{this.onAccountChanged()},onChainChanged:e=>{this.onChainChanged(e)}})}async onAccountChanged(){await this.ethereumProviderAdapter?.onAccountChanged(),await this.solanaProviderAdapter?.onAccountChanged(),await this.tronProviderAdapter?.onAccountChanged();let e=r.EventType.AccountChanged;typeof document<`u`?document?.dispatchEvent(new Event(e)):process?.emit(`message`,e,void 0)}async onChainChanged(e){e?await this.getProviderAdapter(e).onChainChanged(e):await this.disconnectFromConnector()}async monitorConnectedAddress(e){await c.API.monitor(await this.getEthereumAddressByChain(e))}async getTotalBalances(e,t,n,r=!1,i,a=!1){let o=t??this.userKeys,s=new Map(await Promise.all(e.map(async e=>[e,n??await this.getEthereumAddressByChain(e)])));return u.getShieldedBalances(this,s,o.getShieldedPrivateKey(),o.getShieldedPublicKey(),r,i,a)}async getStuckShieldedBalances(e,t,n,r=!1,i=!1){let a=await this.getTotalBalances(e,t,n,r,i,!0);return new Map([...a].map(([e,t])=>[e,t.filter(e=>e.balance>0n)]))}get privateBalancesWithUSD(){return this.privateBalances.getSnapshot()}onPrivateBalancesWithUSDChange(e){return this.privateBalances.onPrivateBalancesWithUSDChange(e)}async getHinkalTreeRootHash(e){return(await f.fetchOnChainRootHashes(e)).hinkalRootHash}async resetMerkleTreesIfNecessary(e){let t=(await Promise.all((e??this.getSupportedChains()).map(async e=>{if(this.generateProofRemotely)return{chainId:e,needsReset:!1};let t=await this.getHinkalTreeRootHash(e);return{chainId:e,needsReset:BigInt(t)!==this.merkleTreeHinkalByChain[e].getRootHash()}}))).filter(e=>e.needsReset).map(e=>e.chainId);t.length>0&&(console.log(`resetting merkle tree in resetMerkleTreesIfNecessary for chains:`,t),await this.resetMerkle(t))}async getEthereumAddress(){let e=this.ethereumProviderAdapter??this.solanaProviderAdapter??this.tronProviderAdapter;if(!e)throw Error(`No provider adapter initialized`);return e.getAddress()}getEthereumAddressByChain(e){return this.getProviderAdapter(e).getAddress()}async getRandomRelay(e,t=!1){return(await c.API.getIdleRelay(e,t)).relay}getGasPrice(e){let t=this.getProviderAdapter(e);if(!t)throw Error(`Illegal State of providerAdapter in Hinkal: no providerAdapter initialized`);return t.getGasPrice(e)}getAPI(){return c.API}snapshotsClearInterval(){this.getSupportedChains().forEach(e=>{this.commitmentsSnapshotServiceByChain[e]?.intervalClear(),this.nullifierSnapshotServiceByChain[e]?.intervalClear()})}async destroy(){this.snapshotsClearInterval(),this.privateBalances.dispose(),await this.resetProviderAdapters()}getRecipientInfo(){return E.getRecipientInfo(this)}async deposit(e,t,n=!0,r=!1){return p.hinkalDeposit(this,e,t,n,r)}async depositSolana(e,t,n=!1){return y.hinkalSolanaDeposit(this,e,t,n)}async depositForOther(e,t,n,r=!0,i=!1,a){return this.enforceRateLimit(this.depositForOther.name,[e,t,n]),p.hinkalDepositForOther(this,e,t,n,r,i,a)}async depositSolanaForOther(e,t,n,r=!1,i){return this.enforceRateLimit(this.depositSolanaForOther.name,[e,t,n]),y.hinkalSolanaDepositForOther(this,e,t,n,r,i)}async depositAndWithdraw(e,n,r,i,a,o,s,c,u=!0){return t.isSolanaLike(l.validateAndGetChainId([e]))?P.hinkalSolanaDepositAndWithdraw(this,e,n,r,i,a,o,s,c):v.hinkalDepositAndWithdraw(this,e,n,r,i,a,o,s,c,u)}async claimUtxo(e,n,r,i){return t.isSolanaLike(l.validateAndGetChainId([e]))?G.hinkalSolanaClaimUtxo(this,e,n,r,i):U.hinkalClaimUtxo(this,e,n,r,i)}async depositAndBridge(e,t,n,r,i,a,o,s=!0){return B.hinkalDepositAndBridge(this,e,t,n,r,i,a,o,s)}async bridgePrivateToPrivate(e,t,n,r,i,a,o,s){return this.enforceRateLimit(this.bridgePrivateToPrivate.name,[e,t,n]),V.hinkalBridgePrivateToPrivate(this,e,t,n,r,i,a,o,s)}async checkSendTransactionStatus(e){return s.getScheduledTransactionById(e)}async nearDepositAndBridge(e,t,n,r,i,a,o,s,c){return this.enforceRateLimit(this.nearDepositAndBridge.name,[e,t,n,r]),H.hinkalNearDepositAndBridge(this,e,t,n,r,i,a,o,s,c)}async prooflessDeposit(e,n,i,a,o=!1,s=r.zeroProoflessFeeStructure,c=``,u,d=!1){return t.isSolanaLike(l.validateAndGetChainId(e))?W.hinkalSolanaProoflessDeposit(this,e,n,i,a,o,u,d):k.hinkalProoflessDeposit(this,e,n,i,a,o,s,c,u,d)}getSolanaProgram(e){if(!this.solanaProviderAdapter)throw Error(`No provider adapter initialized`);if(!(`getSolanaProgram`in this.solanaProviderAdapter))throw Error(`Current provider adapter is not a Solana provider adapter`);return this.solanaProviderAdapter.getSolanaProgram(e)}getSolanaPublicKey(){if(!this.solanaProviderAdapter)throw Error(`No provider adapter initialized`);if(!(`getSolanaPublicKey`in this.solanaProviderAdapter))throw Error(`Current provider adapter is not a Solana provider adapter`);return this.solanaProviderAdapter.getSolanaPublicKey()}async transfer(e,n,r,i,a,o){return this.enforceRateLimit(this.transfer.name,[e,n,r]),t.isSolanaLike(l.validateAndGetChainId(e))?I.hinkalSolanaTransfer(this,e,n,r,i,a,o):j.hinkalTransfer(this,e,n,r,i,a,o)}async withdraw(e,n,r,i,a,o,s,c){return t.isSolanaLike(l.validateAndGetChainId(e))?F.hinkalSolanaWithdraw(this,e,n,r,a,o,s,c):x.hinkalWithdraw(this,e,n,r,i,a,o,s,c)}async withdrawStuckUtxos(e,t){return K.hinkalWithdrawStuckUtxos(this,e,t)}async swap(e,n,r,i,a,o,s,c){return t.isSolanaLike(l.validateAndGetChainId(e))?this.swapSolana(e,n,i,a,o,c):b.hinkalSwap(this,e,n,r,i,a,o,s,c)}async swapSolana(e,t,n,r,i,a){let o=JSON.parse(n),s=BigInt(o.swapperAccountSalt),{instructionLists:c,addressLookupTableAccount:l}=o.data;return L.hinkalSolanaSwap(this,e,t,s,c,l,r,i,a)}async actionReceive(e,n,r,i,a,o){if(!a)throw Error(`subAccount is required`);return t.isSolanaLike(l.validateAndGetChainId(e))?z.hinkalSolanaProxyShield(this,e[0],n[0],a,void 0,!1,i?.variableRate,o):O.hinkalActionReceive(this,e,n,r,i,a,o)}async actionPrivateWallet(e,t,n,r,i,a,o,s,c,l,u=!1,d,f,p){return this.enforceRateLimit(this.actionPrivateWallet.name,[e,t,n,r,i,a,o,s,c,p]),T.hinkalPrivateWallet(this,e,t,n,r,i,a,o,s,c,l,u,d,f,p)}async proxySwap(e,n,r,i,a,o,s,c,u=!1,d,f,p,m){return t.isSolanaLike(l.validateAndGetChainId(e))?R.hinkalSolanaProxySwap(this,e,n,i,o,r,a,s,c,m,f,p):A.hinkalProxySwap(this,e,n,r,i,a,o,s,c,u,d,m,f,p)}async proxyToPrivate(e,n,r,i,a,o,s){return t.isSolanaLike(l.validateAndGetChainId(e))?(this.enforceRateLimit(this.proxyToPrivate.name,[e[0],n[0],r,i]),z.hinkalSolanaProxyShield(this,e[0],n[0],r,i,!1,o?.variableRate,s)):M.hinkalProxyToPrivate(this,e,n,i,a,o,r,s)}async proxySend(e,t,n,r,i,a,o){return J.hinkalProxySend(this,e,t,n,r,i,a,o)}areMerkleTreeUpdatesDisabled(){return this.disableMerkleTreeUpdates}updateMerkleTreeUpdates(e){this.disableMerkleTreeUpdates=e}};exports.Hinkal=X;
@@ -397,7 +397,7 @@ var fe = class {
397
397
  ]), ne(this, e, t, n, r, i, a, o, s, c, l, u, d, f, p);
398
398
  }
399
399
  async proxySwap(e, t, n, r, i, a, o, c, l = !1, u, d, f, p) {
400
- return s(x(e)) ? Z(this, e, t, r, a, n, i, o, c, p) : U(this, e, t, n, r, i, a, o, c, l, u, p, d, f);
400
+ return s(x(e)) ? Z(this, e, t, r, a, n, i, o, c, p, d, f) : U(this, e, t, n, r, i, a, o, c, l, u, p, d, f);
401
401
  }
402
402
  async proxyToPrivate(e, t, n, r, i, a, o) {
403
403
  return s(x(e)) ? (this.enforceRateLimit(this.proxyToPrivate.name, [
@@ -1 +1 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../error-handling/error-codes.constants.cjs`),n=require(`../../types/external-action.types.cjs`),r=require(`../../functions/utils/token-check.utils.cjs`),i=require(`../../functions/pre-transaction/constructAdminData.cjs`),a=require(`../../functions/utils/create-provider.cjs`),o=require(`../AccountActions/AccountActions.cjs`),s=require(`../../functions/pre-transaction/sendV0Transaction.cjs`),c=require(`../../functions/pre-transaction/getFeeStructure.cjs`),l=require(`../../API/admin-calls.cjs`);require(`../../constants/index.cjs`);const u=require(`../../functions/pre-transaction/solanaTransfer.utils.cjs`);require(`../AccountActions/index.cjs`);let d=require(`@solana/web3.js`);var f=async(e,t)=>{let{addressLookupTableAccount:n,instructionLists:r}=JSON.parse(t).data,i=await Promise.all(n.map(async t=>{let n=await e.getAddressLookupTable(new d.PublicKey(t));if(!n.value)throw Error(`Failed to fetch lookup table: ${t}`);return n.value}));if(r.length===0)throw Error(`No instructions found`);return{instructions:r.map(e=>new d.TransactionInstruction({keys:e.accounts.map(e=>({pubkey:new d.PublicKey(e.pubkey),isSigner:e.isSigner,isWritable:e.isWritable})),programId:new d.PublicKey(e.programId),data:Buffer.from(e.data,`base64`)})),lookupTableAccounts:i}},p=async(e,t)=>{let n=d.VersionedTransaction.deserialize(Buffer.from(t,`base64`)),r=await Promise.all(n.message.addressTableLookups.map(async({accountKey:t})=>{let n=await e.getAddressLookupTable(t);if(!n.value)throw Error(`Failed to fetch lookup table: ${t.toBase58()}`);return n.value})),{instructions:i}=d.TransactionMessage.decompile(n.message,{addressLookupTableAccounts:r});return{instructions:i,lookupTableAccounts:r}},m=async(t,r,i,s)=>{let c=o.AccountActions.getAddressFromSubAccount(t,i);if(!c)throw Error(`Public account address is not available`);let{rpcUrl:l}=e.networkRegistry[t],u=a.createCustomSolanaConnection(l),m=new d.PublicKey(c),{instructions:h,lookupTableAccounts:g}=s===n.ExternalActionId.Lifi?await p(u,r):await f(u,r);return{connection:u,walletPublicKey:m,instructions:h,lookupTableAccounts:g}},h=async(e,a,o,f,p,h,g,_,v,y)=>{let b=r.validateAndGetChainId(a),[{connection:x,walletPublicKey:S,instructions:C,lookupTableAccounts:w},T,E]=await Promise.all([m(b,f,p,h),g?e.getRandomRelay(b):Promise.resolve(null),e.getEthereumAddressByChain(b)]),D=C;if(g){if(!T)throw Error(t.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let e=a[1],r=o[1]*(v??await c.getFeeStructure(b,_,a.map(e=>e.erc20TokenAddress),n.ExternalActionId.Emporium)).variableRate/10000n,{instructions:i}=await u.buildSolanaTransferInstructions(x,S,new d.PublicKey(T),e,r);D=[...C,...i]}let O=await s.sendProxyV0Transaction({connection:x,chainId:b,subAccount:p,payerPublicKey:S,instructions:D,lookupTableAccounts:w});return l.emitTxPublicData(i.constructAdminData(y,b,a.map(e=>e.erc20TokenAddress),o,E,a)),O};exports.hinkalSolanaProxySwap=h;
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`);require(`../../constants/protocol.constants.cjs`);const t=require(`../../error-handling/error-codes.constants.cjs`),n=require(`../../types/external-action.types.cjs`),r=require(`../../functions/utils/token-check.utils.cjs`),i=require(`../../functions/utils/erc20tokenFunctions.cjs`),a=require(`../../functions/pre-transaction/constructAdminData.cjs`),o=require(`../../functions/utils/create-provider.cjs`),s=require(`../AccountActions/AccountActions.cjs`),c=require(`../../functions/pre-transaction/sendV0Transaction.cjs`),l=require(`../../functions/pre-transaction/getFeeStructure.cjs`),u=require(`../../API/admin-calls.cjs`);require(`../../constants/index.cjs`);const d=require(`../../functions/utils/fees.utils.cjs`),f=require(`../../functions/pre-transaction/solanaTransfer.utils.cjs`);require(`../AccountActions/index.cjs`);let p=require(`@solana/web3.js`);var m=async(e,t)=>{let{addressLookupTableAccount:n,instructionLists:r}=JSON.parse(t).data,i=await Promise.all(n.map(async t=>{let n=await e.getAddressLookupTable(new p.PublicKey(t));if(!n.value)throw Error(`Failed to fetch lookup table: ${t}`);return n.value}));if(r.length===0)throw Error(`No instructions found`);return{instructions:r.map(e=>new p.TransactionInstruction({keys:e.accounts.map(e=>({pubkey:new p.PublicKey(e.pubkey),isSigner:e.isSigner,isWritable:e.isWritable})),programId:new p.PublicKey(e.programId),data:Buffer.from(e.data,`base64`)})),lookupTableAccounts:i}},h=async(e,t)=>{let n=p.VersionedTransaction.deserialize(Buffer.from(t,`base64`)),r=await Promise.all(n.message.addressTableLookups.map(async({accountKey:t})=>{let n=await e.getAddressLookupTable(t);if(!n.value)throw Error(`Failed to fetch lookup table: ${t.toBase58()}`);return n.value})),{instructions:i}=p.TransactionMessage.decompile(n.message,{addressLookupTableAccounts:r});return{instructions:i,lookupTableAccounts:r}},g=async(t,r,i,a)=>{let c=s.AccountActions.getAddressFromSubAccount(t,i);if(!c)throw Error(`Public account address is not available`);let{rpcUrl:l}=e.networkRegistry[t],u=o.createCustomSolanaConnection(l),d=new p.PublicKey(c),{instructions:f,lookupTableAccounts:g}=a===n.ExternalActionId.Lifi?await h(u,r):await m(u,r);return{connection:u,walletPublicKey:d,instructions:f,lookupTableAccounts:g}},_=async(e,o,s,m,h,_,v,y,b,x,S,C)=>{let w=r.validateAndGetChainId(o),[{connection:T,walletPublicKey:E,instructions:D,lookupTableAccounts:O},k,A]=await Promise.all([g(w,m,h,_),e.getRandomRelay(w),e.getEthereumAddressByChain(w)]);if(!k)throw Error(t.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let j=D,M=b??await l.getFeeStructure(w,y,o.map(e=>e.erc20TokenAddress),n.ExternalActionId.Emporium,[],35n);if(v){let e=o[1],t=s[1]*M.variableRate/10000n,{instructions:n}=await f.buildSolanaTransferInstructions(T,E,new p.PublicKey(k),e,t);j=[...D,...n]}else{let e={...M,flatFee:0n},t=S&&C!==void 0?await d.calculateModifiedFeeStructure(w,S,C,e):e;if(t.flatFee>0n){let e=await i.getErc20TokenFromAPI(w,t.feeToken);if(!e)throw Error(`Failed to find fee token`);let{instructions:n}=await f.buildSolanaTransferInstructions(T,E,new p.PublicKey(k),e,t.flatFee);j=[...D,...n]}}let N=await c.sendProxyV0Transaction({connection:T,chainId:w,subAccount:h,payerPublicKey:E,instructions:j,lookupTableAccounts:O});return u.emitTxPublicData(a.constructAdminData(x,w,o.map(e=>e.erc20TokenAddress),s,A,o)),N};exports.hinkalSolanaProxySwap=_;
@@ -2,5 +2,5 @@ import { AdminTransactionType, ERC20Token, SubAccount } from '../../types';
2
2
  import { IHinkal } from './IHinkal';
3
3
  import { FeeStructure } from '../../types/hinkal.types';
4
4
  import { ExternalActionId } from '../../types/external-action.types';
5
- export declare const hinkalSolanaProxySwap: (hinkal: IHinkal, erc20Tokens: ERC20Token[], amountChanges: bigint[], data: string, subAccount: SubAccount, externalActionId: ExternalActionId, isTheSameChainSwap: boolean, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType) => Promise<string>;
5
+ export declare const hinkalSolanaProxySwap: (hinkal: IHinkal, erc20Tokens: ERC20Token[], amountChanges: bigint[], data: string, subAccount: SubAccount, externalActionId: ExternalActionId, isTheSameChainSwap: boolean, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType, bridgedToken?: ERC20Token, bridgedTokenAmount?: bigint) => Promise<string>;
6
6
  export declare const getSolanaProxySwapSerializedTransaction: (chainId: number, data: string, subAccount: SubAccount, externalActionId: ExternalActionId) => Promise<string>;
@@ -1,77 +1,92 @@
1
1
  import { networkRegistry as e } from "../../constants/chains.constants.mjs";
2
+ import "../../constants/protocol.constants.mjs";
2
3
  import { transactionErrorCodes as t } from "../../error-handling/error-codes.constants.mjs";
3
4
  import { ExternalActionId as n } from "../../types/external-action.types.mjs";
4
5
  import { validateAndGetChainId as r } from "../../functions/utils/token-check.utils.mjs";
5
- import { constructAdminData as i } from "../../functions/pre-transaction/constructAdminData.mjs";
6
- import { createCustomSolanaConnection as a } from "../../functions/utils/create-provider.mjs";
7
- import { AccountActions as o } from "../AccountActions/AccountActions.mjs";
8
- import { sendProxyV0Transaction as s } from "../../functions/pre-transaction/sendV0Transaction.mjs";
9
- import { getFeeStructure as c } from "../../functions/pre-transaction/getFeeStructure.mjs";
10
- import { emitTxPublicData as l } from "../../API/admin-calls.mjs";
6
+ import { getErc20TokenFromAPI as i } from "../../functions/utils/erc20tokenFunctions.mjs";
7
+ import { constructAdminData as a } from "../../functions/pre-transaction/constructAdminData.mjs";
8
+ import { createCustomSolanaConnection as o } from "../../functions/utils/create-provider.mjs";
9
+ import { AccountActions as s } from "../AccountActions/AccountActions.mjs";
10
+ import { sendProxyV0Transaction as c } from "../../functions/pre-transaction/sendV0Transaction.mjs";
11
+ import { getFeeStructure as l } from "../../functions/pre-transaction/getFeeStructure.mjs";
12
+ import { emitTxPublicData as u } from "../../API/admin-calls.mjs";
11
13
  import "../../constants/index.mjs";
12
- import { buildSolanaTransferInstructions as u } from "../../functions/pre-transaction/solanaTransfer.utils.mjs";
14
+ import { calculateModifiedFeeStructure as d } from "../../functions/utils/fees.utils.mjs";
15
+ import { buildSolanaTransferInstructions as f } from "../../functions/pre-transaction/solanaTransfer.utils.mjs";
13
16
  import "../AccountActions/index.mjs";
14
- import { PublicKey as d, TransactionInstruction as f, TransactionMessage as p, VersionedTransaction as m } from "@solana/web3.js";
17
+ import { PublicKey as p, TransactionInstruction as m, TransactionMessage as h, VersionedTransaction as g } from "@solana/web3.js";
15
18
  //#region libs/shared/common/src/data-structures/Hinkal/hinkalSolanaProxySwap.ts
16
- var h = async (e, t) => {
19
+ var _ = async (e, t) => {
17
20
  let { addressLookupTableAccount: n, instructionLists: r } = JSON.parse(t).data, i = await Promise.all(n.map(async (t) => {
18
- let n = await e.getAddressLookupTable(new d(t));
21
+ let n = await e.getAddressLookupTable(new p(t));
19
22
  if (!n.value) throw Error(`Failed to fetch lookup table: ${t}`);
20
23
  return n.value;
21
24
  }));
22
25
  if (r.length === 0) throw Error("No instructions found");
23
26
  return {
24
- instructions: r.map((e) => new f({
27
+ instructions: r.map((e) => new m({
25
28
  keys: e.accounts.map((e) => ({
26
- pubkey: new d(e.pubkey),
29
+ pubkey: new p(e.pubkey),
27
30
  isSigner: e.isSigner,
28
31
  isWritable: e.isWritable
29
32
  })),
30
- programId: new d(e.programId),
33
+ programId: new p(e.programId),
31
34
  data: Buffer.from(e.data, "base64")
32
35
  })),
33
36
  lookupTableAccounts: i
34
37
  };
35
- }, g = async (e, t) => {
36
- let n = m.deserialize(Buffer.from(t, "base64")), r = await Promise.all(n.message.addressTableLookups.map(async ({ accountKey: t }) => {
38
+ }, v = async (e, t) => {
39
+ let n = g.deserialize(Buffer.from(t, "base64")), r = await Promise.all(n.message.addressTableLookups.map(async ({ accountKey: t }) => {
37
40
  let n = await e.getAddressLookupTable(t);
38
41
  if (!n.value) throw Error(`Failed to fetch lookup table: ${t.toBase58()}`);
39
42
  return n.value;
40
- })), { instructions: i } = p.decompile(n.message, { addressLookupTableAccounts: r });
43
+ })), { instructions: i } = h.decompile(n.message, { addressLookupTableAccounts: r });
41
44
  return {
42
45
  instructions: i,
43
46
  lookupTableAccounts: r
44
47
  };
45
- }, _ = async (t, r, i, s) => {
46
- let c = o.getAddressFromSubAccount(t, i);
48
+ }, y = async (t, r, i, a) => {
49
+ let c = s.getAddressFromSubAccount(t, i);
47
50
  if (!c) throw Error("Public account address is not available");
48
- let { rpcUrl: l } = e[t], u = a(l), f = new d(c), { instructions: p, lookupTableAccounts: m } = s === n.Lifi ? await g(u, r) : await h(u, r);
51
+ let { rpcUrl: l } = e[t], u = o(l), d = new p(c), { instructions: f, lookupTableAccounts: m } = a === n.Lifi ? await v(u, r) : await _(u, r);
49
52
  return {
50
53
  connection: u,
51
- walletPublicKey: f,
52
- instructions: p,
54
+ walletPublicKey: d,
55
+ instructions: f,
53
56
  lookupTableAccounts: m
54
57
  };
55
- }, v = async (e, a, o, f, p, m, h, g, v, y) => {
56
- let b = r(a), [{ connection: x, walletPublicKey: S, instructions: C, lookupTableAccounts: w }, T, E] = await Promise.all([
57
- _(b, f, p, m),
58
- h ? e.getRandomRelay(b) : Promise.resolve(null),
59
- e.getEthereumAddressByChain(b)
60
- ]), D = C;
61
- if (h) {
62
- if (!T) throw Error(t.RELAYER_NOT_AVAILABLE);
63
- let e = a[1], r = o[1] * (v ?? await c(b, g, a.map((e) => e.erc20TokenAddress), n.Emporium)).variableRate / 10000n, { instructions: i } = await u(x, S, new d(T), e, r);
64
- D = [...C, ...i];
58
+ }, b = async (e, o, s, m, h, g, _, v, b, x, S, C) => {
59
+ let w = r(o), [{ connection: T, walletPublicKey: E, instructions: D, lookupTableAccounts: O }, k, A] = await Promise.all([
60
+ y(w, m, h, g),
61
+ e.getRandomRelay(w),
62
+ e.getEthereumAddressByChain(w)
63
+ ]);
64
+ if (!k) throw Error(t.RELAYER_NOT_AVAILABLE);
65
+ let j = D, M = b ?? await l(w, v, o.map((e) => e.erc20TokenAddress), n.Emporium, [], 35n);
66
+ if (_) {
67
+ let e = o[1], t = s[1] * M.variableRate / 10000n, { instructions: n } = await f(T, E, new p(k), e, t);
68
+ j = [...D, ...n];
69
+ } else {
70
+ let e = {
71
+ ...M,
72
+ flatFee: 0n
73
+ }, t = S && C !== void 0 ? await d(w, S, C, e) : e;
74
+ if (t.flatFee > 0n) {
75
+ let e = await i(w, t.feeToken);
76
+ if (!e) throw Error("Failed to find fee token");
77
+ let { instructions: n } = await f(T, E, new p(k), e, t.flatFee);
78
+ j = [...D, ...n];
79
+ }
65
80
  }
66
- let O = await s({
67
- connection: x,
68
- chainId: b,
69
- subAccount: p,
70
- payerPublicKey: S,
71
- instructions: D,
72
- lookupTableAccounts: w
81
+ let N = await c({
82
+ connection: T,
83
+ chainId: w,
84
+ subAccount: h,
85
+ payerPublicKey: E,
86
+ instructions: j,
87
+ lookupTableAccounts: O
73
88
  });
74
- return l(i(y, b, a.map((e) => e.erc20TokenAddress), o, E, a)), O;
89
+ return u(a(x, w, o.map((e) => e.erc20TokenAddress), s, A, o)), N;
75
90
  };
76
91
  //#endregion
77
- export { v as hinkalSolanaProxySwap };
92
+ export { b as hinkalSolanaProxySwap };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hinkal/common",
3
- "version": "0.3.11",
3
+ "version": "0.3.12",
4
4
  "homepage": "hinkal.io",
5
5
  "author": {
6
6
  "name": "Hinkal Protocol"
@@ -2,9 +2,9 @@
2
2
  const domain = 'https://wallet-prodv12.hinkal.io/workers';
3
3
 
4
4
  const WORKER_CDN_URLS = {
5
- ZKProof: domain + '/0.3.11/' + 'zkProofWorkerLauncher.js',
6
- SnarkJS: domain + '/0.3.11/' + 'snarkjsWorkerLauncher.js',
7
- UTXO: domain + '/0.3.11/' + 'utxoWorkerLauncher.js',
5
+ ZKProof: domain + '/0.3.12/' + 'zkProofWorkerLauncher.js',
6
+ SnarkJS: domain + '/0.3.12/' + 'snarkjsWorkerLauncher.js',
7
+ UTXO: domain + '/0.3.12/' + 'utxoWorkerLauncher.js',
8
8
  };
9
9
 
10
10
  // Returns a blob:// URL which points
@@ -2,9 +2,9 @@
2
2
  const domain = 'https://wallet-prodv12.hinkal.io/workers';
3
3
 
4
4
  const WORKER_CDN_URLS = {
5
- ZKProof: domain + '/0.3.11/' + 'zkProofWorkerLauncher.js',
6
- SnarkJS: domain + '/0.3.11/' + 'snarkjsWorkerLauncher.js',
7
- UTXO: domain + '/0.3.11/' + 'utxoWorkerLauncher.js',
5
+ ZKProof: domain + '/0.3.12/' + 'zkProofWorkerLauncher.js',
6
+ SnarkJS: domain + '/0.3.12/' + 'snarkjsWorkerLauncher.js',
7
+ UTXO: domain + '/0.3.12/' + 'utxoWorkerLauncher.js',
8
8
  };
9
9
 
10
10
  // Returns a blob:// URL which points
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hinkal/common",
3
- "version": "0.3.11",
3
+ "version": "0.3.12",
4
4
  "homepage": "hinkal.io",
5
5
  "author": {
6
6
  "name": "Hinkal Protocol"