@hinkal/common 0.3.10 → 0.3.11
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 +24 -2
- package/common/src/API/callRelayer.d.ts +1 -0
- package/common/src/constants/protocol.constants.cjs +1 -1
- package/common/src/constants/protocol.constants.d.ts +10 -5
- package/common/src/constants/protocol.constants.mjs +1 -1
- package/common/src/data-structures/Hinkal/Hinkal.cjs +1 -1
- package/common/src/data-structures/Hinkal/Hinkal.d.ts +2 -1
- package/common/src/data-structures/Hinkal/Hinkal.mjs +5 -2
- package/common/src/data-structures/Hinkal/IHinkal.d.ts +2 -1
- package/common/src/data-structures/Hinkal/hinkalActionReceive.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalActionReceive.mjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalBridgePrivateToPrivate.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalBridgePrivateToPrivate.mjs +57 -57
- package/common/src/data-structures/Hinkal/hinkalDepositAndWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalDepositAndWithdraw.mjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalProxySwap.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalProxySwap.d.ts +1 -1
- package/common/src/data-structures/Hinkal/hinkalProxySwap.mjs +13 -12
- package/common/src/data-structures/Hinkal/hinkalProxyToPrivate.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalProxyToPrivate.mjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaDepositAndWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaDepositAndWithdraw.mjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaProxySwap.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaProxySwap.d.ts +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaProxySwap.mjs +9 -9
- package/common/src/data-structures/Hinkal/hinkalSolanaSponsoredShield.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaSponsoredShield.d.ts +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaSponsoredShield.mjs +15 -14
- package/common/src/data-structures/Hinkal/hinkalSolanaTransfer.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaTransfer.mjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalTransfer.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalTransfer.mjs +1 -1
- package/common/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.cjs +1 -1
- package/common/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.d.ts +1 -0
- package/common/src/data-structures/MultiThreadedUtxoUtils/MultiThreadedUtxoUtils.mjs +6 -3
- package/common/src/data-structures/crypto-keys/keys.cjs +1 -1
- package/common/src/data-structures/crypto-keys/keys.d.ts +1 -0
- package/common/src/data-structures/crypto-keys/keys.mjs +3 -0
- package/common/src/data-structures/token-price-fetcher/TokenChecker.cjs +1 -1
- package/common/src/data-structures/token-price-fetcher/TokenChecker.d.ts +1 -0
- package/common/src/data-structures/token-price-fetcher/TokenChecker.mjs +1 -0
- package/common/src/functions/pre-transaction/getVolatileTransferAmount.cjs +1 -1
- package/common/src/functions/pre-transaction/getVolatileTransferAmount.mjs +1 -1
- package/common/src/functions/utils/bridge-claimable-utxo.utils.cjs +1 -1
- package/common/src/functions/utils/bridge-claimable-utxo.utils.d.ts +1 -1
- package/common/src/functions/utils/bridge-claimable-utxo.utils.mjs +4 -4
- package/common/src/functions/utils/fees.utils.cjs +1 -1
- package/common/src/functions/utils/fees.utils.mjs +4 -4
- package/common/src/functions/utils/nearIntents.utils.cjs +1 -1
- package/common/src/functions/utils/nearIntents.utils.mjs +1 -1
- package/common/src/functions/utils/publicBalance.utils.cjs +1 -1
- package/common/src/functions/utils/publicBalance.utils.mjs +1 -0
- package/common/src/functions/web3/events/getShieldedBalance.cjs +1 -1
- package/common/src/functions/web3/events/getShieldedBalance.mjs +17 -16
- package/common/src/webworker/{logError-CIIt1CO3.js → logError-cvFNxc-0.js} +1 -1
- package/common/src/webworker/package.json +1 -1
- package/common/src/webworker/utxoWorker/utxoWorker.types.d.ts +4 -2
- package/common/src/webworker/utxoWorker/utxoWorkerLauncher.ts?worker&url.cjs +1 -1
- package/common/src/webworker/utxoWorker/utxoWorkerLauncher.ts?worker&url.mjs +1 -1
- package/common/src/webworker/utxoWorkerNode.cjs +1 -1
- package/common/src/webworker/viteWorkerURL.constant.cjs +3 -3
- package/common/src/webworker/viteWorkerURL.constant.mjs +3 -3
- package/common/src/webworker/zkProofWorker/zkProofWorkerLauncher.ts?worker&url.cjs +1 -1
- package/common/src/webworker/zkProofWorker/zkProofWorkerLauncher.ts?worker&url.mjs +1 -1
- package/common/src/webworker/zkProofWorkerNode.cjs +1 -1
- package/package.json +1 -1
- package/providers/prepareEthersHinkal.cjs +1 -1
- package/providers/prepareEthersHinkal.d.ts +1 -0
- package/providers/prepareEthersHinkal.mjs +2 -2
- package/providers/prepareSolanaHinkal.cjs +1 -1
- package/providers/prepareSolanaHinkal.d.ts +1 -0
- package/providers/prepareSolanaHinkal.mjs +2 -2
- package/providers/prepareTronHinkal.cjs +1 -1
- package/providers/prepareTronHinkal.d.ts +1 -0
- package/providers/prepareTronHinkal.mjs +2 -2
- package/providers/prepareWagmiHinkal.cjs +1 -1
- package/providers/prepareWagmiHinkal.d.ts +1 -0
- package/providers/prepareWagmiHinkal.mjs +2 -2
- package/services/Hinkal.cjs +1 -1
- package/services/Hinkal.d.ts +2 -0
- package/services/Hinkal.mjs +6 -0
- package/types/IHinkal.d.ts +2 -0
package/README.md
CHANGED
|
@@ -43,11 +43,12 @@ Initializing the SDK creates a `Hinkal` object that encapsulates:
|
|
|
43
43
|
- Actions the user can perform, such as shielding (depositing), transfers, and swapping
|
|
44
44
|
- Cryptographic keys for privacy-preserving operations
|
|
45
45
|
|
|
46
|
-
Each provider exposes
|
|
46
|
+
Each provider exposes four prepare helpers:
|
|
47
47
|
|
|
48
48
|
- `prepare*Hinkal` — signs the Hinkal login message and initializes user keys (deterministic signers)
|
|
49
49
|
- `prepare*HinkalWithEnclaveSignIn` — signs in through the secure enclave and stabilizes identity for non-deterministic signers (smart contract wallets, some hardware wallets)
|
|
50
50
|
- `prepare*HinkalFromSignature` — initializes user keys from a previously stored signature
|
|
51
|
+
- `prepare*HinkalFromNullifyingKey` — initializes a read-only session from an exported nullifying key (balance viewing only, no signing capability)
|
|
51
52
|
|
|
52
53
|
**ethers.js:**
|
|
53
54
|
|
|
@@ -83,7 +84,7 @@ import { prepareTronHinkal } from '@hinkal/common/providers/prepareTronHinkal';
|
|
|
83
84
|
const hinkal = await prepareTronHinkal(connector, hinkalConfig);
|
|
84
85
|
```
|
|
85
86
|
|
|
86
|
-
The same `WithEnclaveSignIn` and `
|
|
87
|
+
The same `WithEnclaveSignIn`, `FromSignature`, and `FromNullifyingKey` variants are available for each provider (for example, `prepareWagmiHinkalWithEnclaveSignIn`, `prepareSolanaHinkalFromSignature`, `prepareEthersHinkalFromNullifyingKey`).
|
|
87
88
|
|
|
88
89
|
The `hinkalConfig` is defined as follows:
|
|
89
90
|
|
|
@@ -155,6 +156,27 @@ At rest, only the encrypted signature and encrypted key are stored in the databa
|
|
|
155
156
|
|
|
156
157
|
Requests that fail this check are rejected. The first signature stored for a given address is never replaced. Later logins only use a fresh signature to authenticate retrieval of the original.
|
|
157
158
|
|
|
159
|
+
### Read-only sessions (view keys)
|
|
160
|
+
|
|
161
|
+
A signed-in session can export a nullifying key: a value derived from the login signature that resolves to the same shielded account but cannot authorize spends. Use it to view balances on another device, in a backend job, or anywhere handing out the wallet's signing capability is not acceptable.
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// on a fully signed-in session
|
|
165
|
+
const nullifyingKey = hinkal.getNullifyingKey();
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Initialize a separate, read-only session from that key alone, either through a provider helper or directly on an existing `Hinkal` instance:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const readOnlyHinkal = await prepareWagmiHinkalFromNullifyingKey(connector, wagmiConfig, nullifyingKey, hinkalConfig);
|
|
172
|
+
// or:
|
|
173
|
+
readOnlyHinkal.initUserKeysWithNullifyingKey(nullifyingKey);
|
|
174
|
+
```
|
|
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.
|
|
177
|
+
|
|
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
|
+
|
|
158
180
|
### Shielded balance
|
|
159
181
|
|
|
160
182
|
Shielded balances are encrypted token holdings stored within the Hinkal protocol. Unlike regular blockchain balances that are publicly visible, shielded balances are hidden from external observers.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=`0x${`00`.repeat(20)}`,t=`11111111111111111111111111111111`,n=1e9,r=`0x566de53cee38c8e4e87636e137b206b4799ae79b87d563f416008946bdf14427`,i=`0x655C3Aa937530E06A336458D1CF168d297B597A2`,a=21888242871839275222246405745257275088548364400416034343698204186575808495617n,o=a/2n,s=2n**250n,c=200n,l=function(e){return e.ERC20=`ERC20`,e.ERC721=`ERC721`,e.ERC1155=`ERC1155`,e.MetaplexNFT=`Metaplex NFT`,e.Token2022NFT=`Token-2022 NFT`,e.CompressedNFT=`Compressed NFT`,e}({}),u=35n,d=
|
|
1
|
+
var e=`0x${`00`.repeat(20)}`,t=`11111111111111111111111111111111`,n=1e9,r=`0x566de53cee38c8e4e87636e137b206b4799ae79b87d563f416008946bdf14427`,i=`0x655C3Aa937530E06A336458D1CF168d297B597A2`,a=21888242871839275222246405745257275088548364400416034343698204186575808495617n,o=a/2n,s=2n**250n,c=200n,l=function(e){return e.ERC20=`ERC20`,e.ERC721=`ERC721`,e.ERC1155=`ERC1155`,e.MetaplexNFT=`Metaplex NFT`,e.Token2022NFT=`Token-2022 NFT`,e.CompressedNFT=`Compressed NFT`,e}({}),u=35n,d=25n,f=25n,p=25n,m=15e5,h=14e5,g=256*1024,_=2e5,v=.2,y=`v1x1`,b=`BjNVy3aJw55TpQApJZ2v9pxkmeXr5KcwzEvcJ1e1E8hY`,x=394466828,S=`Sign to deterministically derive your Hinkal shielded account keys.
|
|
2
2
|
WARNING: Only sign this on official Hinkal domains. Signing it anywhere else can expose your funds to theft.`,C=`Sign to deterministically derive your Hinkal shielded account keys.`;exports.CIRCOM_P=a,exports.CIRCOM_P_HALF=o,exports.COMPUTE_UNIT_PADDING_PERCENTAGE=v,exports.DAPP_SIGNING_MESSAGE=S,exports.DETERMINISTIC_SOLANA_LEDGER_BLOCKHASH=b,exports.DETERMINISTIC_SOLANA_LEDGER_LAST_VALID_BLOCK_HEIGHT=x,exports.ENCLAVE_PUBKEY=r,exports.ENCLAVE_SIGNER_ADDRESS=i,exports.HINKAL_PRIVATE_SEND_VARIABLE_RATE=d,exports.HINKAL_SHIELD_VARIABLE_RATE=f,exports.HINKAL_SWAP_VARIABLE_RATE=u,exports.MAX_COMPUTE_UNIT_LIMIT=h,exports.MAX_MICRO_LAMPORTS_PER_CU=m,exports.MAX_SOLANA_HEAP_FRAME_BYTES=g,exports.MERKLE_LEVELS=c,exports.MIN_COMPUTE_UNIT_LIMIT=_,exports.NULLIFYING_PRIVATE_KEY_MOD=s,exports.PAY_SEND_VARIABLE_RATE=p,exports.SDK_SIGNING_MESSAGE=C,exports.SIGNATURE_FROM_MNEMONIC_VERSION=y,exports.TRON_DEFAULT_FEE_LIMIT_SUN=n,exports.TokenType=l,exports.solanaNativeAddress=t,exports.zeroAddress=e;
|
|
@@ -41,11 +41,16 @@ export declare enum TokenType {
|
|
|
41
41
|
}
|
|
42
42
|
export declare const ARC_TESTNET_USDC_ADDRESS = "0x3600000000000000000000000000000000000000";
|
|
43
43
|
export declare const HINKAL_SWAP_VARIABLE_RATE = 35n;
|
|
44
|
-
export declare const HINKAL_PRIVATE_SEND_VARIABLE_RATE =
|
|
45
|
-
export declare const HINKAL_SHIELD_VARIABLE_RATE =
|
|
46
|
-
export declare const HINKAL_UNSHIELD_VARIABLE_RATE =
|
|
47
|
-
export declare const
|
|
48
|
-
export declare const
|
|
44
|
+
export declare const HINKAL_PRIVATE_SEND_VARIABLE_RATE = 25n;
|
|
45
|
+
export declare const HINKAL_SHIELD_VARIABLE_RATE = 25n;
|
|
46
|
+
export declare const HINKAL_UNSHIELD_VARIABLE_RATE = 25n;
|
|
47
|
+
export declare const HINKAL_PUBLIC_SEND_BRIDGE_VARIABLE_RATE = 35n;
|
|
48
|
+
export declare const PAY_SEND_VARIABLE_RATE = 25n;
|
|
49
|
+
export declare const DASHBOARD_BATCH_VARIABLE_RATE = 25n;
|
|
50
|
+
export declare const ENCLAVE_UNSHIELD_VARIABLE_RATE = 10n;
|
|
51
|
+
export declare const ENCLAVE_PRIVATE_SEND_VARIABLE_RATE = 5n;
|
|
52
|
+
export declare const ENCLAVE_SWAP_VARIABLE_RATE = 35n;
|
|
53
|
+
export declare const ENCLAVE_PUBLIC_SEND_VARIABLE_RATE = 10n;
|
|
49
54
|
export declare const PROOFLESS_DEPOSIT_FEE_RECIPIENT_INFO = "0x06658083baccdac9d3e6111bc269dd575cb56e81db0a5f2caa3f0eb1f88c6fe2,8354314446524355096481459216655298105054350800091638464256976305784245419446,722490175517350908286713598102996640499832681284017078999463654992377573936,16306595091285215578120164221849406306419004894577000059366293659280820760235,6147914159463087164835352251164665501684446307306788960888807068717120491375,0xcc0ea5b6fcfdf7a48ee5b4410d43509159c6c7939517d99a620d7ab5abdb8779";
|
|
50
55
|
export declare const SOLANA_PUBLIC_INPUT_PART_ONE_LENGTH = 15;
|
|
51
56
|
export declare const MAX_WITHDRAW_TOKEN_COUNT_EVM = 5;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region libs/shared/common/src/constants/protocol.constants.ts
|
|
2
2
|
var e = `0x${"00".repeat(20)}`, t = "11111111111111111111111111111111", n = 1e9, r = "0x566de53cee38c8e4e87636e137b206b4799ae79b87d563f416008946bdf14427", i = "0x655C3Aa937530E06A336458D1CF168d297B597A2", a = 21888242871839275222246405745257275088548364400416034343698204186575808495617n, o = a / 2n, s = 2n ** 250n, c = 200n, l = /* @__PURE__ */ function(e) {
|
|
3
3
|
return e.ERC20 = "ERC20", e.ERC721 = "ERC721", e.ERC1155 = "ERC1155", e.MetaplexNFT = "Metaplex NFT", e.Token2022NFT = "Token-2022 NFT", e.CompressedNFT = "Compressed NFT", e;
|
|
4
|
-
}({}), u = 35n, d =
|
|
4
|
+
}({}), u = 35n, d = 25n, f = 25n, p = 25n, m = 15e5, h = 14e5, g = 256 * 1024, _ = 2e5, v = .2, y = "v1x1", b = "BjNVy3aJw55TpQApJZ2v9pxkmeXr5KcwzEvcJ1e1E8hY", x = 394466828, S = "Sign to deterministically derive your Hinkal shielded account keys. \nWARNING: Only sign this on official Hinkal domains. Signing it anywhere else can expose your funds to theft.", C = "Sign to deterministically derive your Hinkal shielded account keys.";
|
|
5
5
|
//#endregion
|
|
6
6
|
export { a as CIRCOM_P, o as CIRCOM_P_HALF, v as COMPUTE_UNIT_PADDING_PERCENTAGE, S as DAPP_SIGNING_MESSAGE, b as DETERMINISTIC_SOLANA_LEDGER_BLOCKHASH, x as DETERMINISTIC_SOLANA_LEDGER_LAST_VALID_BLOCK_HEIGHT, r as ENCLAVE_PUBKEY, i as ENCLAVE_SIGNER_ADDRESS, d as HINKAL_PRIVATE_SEND_VARIABLE_RATE, f as HINKAL_SHIELD_VARIABLE_RATE, u as HINKAL_SWAP_VARIABLE_RATE, h as MAX_COMPUTE_UNIT_LIMIT, m as MAX_MICRO_LAMPORTS_PER_CU, g as MAX_SOLANA_HEAP_FRAME_BYTES, c as MERKLE_LEVELS, _ as MIN_COMPUTE_UNIT_LIMIT, s as NULLIFYING_PRIVATE_KEY_MOD, p as PAY_SEND_VARIABLE_RATE, C as SDK_SIGNING_MESSAGE, y as SIGNATURE_FROM_MNEMONIC_VERSION, n as TRON_DEFAULT_FEE_LIMIT_SUN, l as TokenType, t as solanaNativeAddress, e as zeroAddress };
|
|
@@ -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)}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){return t.isSolanaLike(l.validateAndGetChainId(e))?R.hinkalSolanaProxySwap(this,e,n,i,o,r,s,c,f):A.hinkalProxySwap(this,e,n,r,i,a,o,s,c,u,d,f)}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):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;
|
|
@@ -53,6 +53,7 @@ export declare class Hinkal<ConnectorType> implements IHinkal {
|
|
|
53
53
|
signSolanaLedgerMessage(): Promise<string>;
|
|
54
54
|
initUserKeys(mode?: LoginMessageMode): Promise<void>;
|
|
55
55
|
initUserKeysWithSignature(signature: string): void;
|
|
56
|
+
initUserKeysWithNullifyingKey(nullifyingKey: string): void;
|
|
56
57
|
initUserKeysFromSeedPhrases(seedPhrases: string[]): Promise<void>;
|
|
57
58
|
initUserKeysWithEnclaveSignature(signInMode?: LoginMessageMode): Promise<void>;
|
|
58
59
|
storeAndGetInitialSignature(authSignature: string): Promise<string>;
|
|
@@ -111,7 +112,7 @@ export declare class Hinkal<ConnectorType> implements IHinkal {
|
|
|
111
112
|
swapSolana(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], swapData: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
|
|
112
113
|
actionReceive(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], feeToken?: string, feeStructureOverride?: FeeStructure, subAccount?: SubAccount, action?: AdminTransactionType): Promise<string>;
|
|
113
114
|
actionPrivateWallet(chainId: number, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], onChainCreation: boolean[], ops: string[], emporiumTokenChanges: TokenChanges<bigint>[], subAccount?: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, relayOverride?: string, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType, privateRecipientInfo?: PrivateRecipientInfo): Promise<string>;
|
|
114
|
-
proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType): Promise<string>;
|
|
115
|
+
proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, bridgedToken?: ERC20Token, bridgedTokenAmount?: bigint, action?: AdminTransactionType): Promise<string>;
|
|
115
116
|
proxyToPrivate(erc20Tokens: ERC20Token[], deltaAmountsBase: bigint[], subAccount: SubAccount, recipientInfo: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
|
|
116
117
|
proxySend(erc20Tokens: ERC20Token[], amounts: bigint[], subAccount: SubAccount, recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
|
|
117
118
|
areMerkleTreeUpdatesDisabled(): boolean;
|
|
@@ -123,6 +123,9 @@ var fe = class {
|
|
|
123
123
|
initUserKeysWithSignature(e) {
|
|
124
124
|
this.userKeys = new v(e);
|
|
125
125
|
}
|
|
126
|
+
initUserKeysWithNullifyingKey(e) {
|
|
127
|
+
this.userKeys = new v(void 0, e);
|
|
128
|
+
}
|
|
126
129
|
async initUserKeysFromSeedPhrases(e) {
|
|
127
130
|
let t = A(e);
|
|
128
131
|
this.userKeys = new v(t);
|
|
@@ -393,8 +396,8 @@ var fe = class {
|
|
|
393
396
|
p
|
|
394
397
|
]), ne(this, e, t, n, r, i, a, o, s, c, l, u, d, f, p);
|
|
395
398
|
}
|
|
396
|
-
async proxySwap(e, t, n, r, i, a, o, c, l = !1, u, d) {
|
|
397
|
-
return s(x(e)) ? Z(this, e, t, r, a, n, o, c,
|
|
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);
|
|
398
401
|
}
|
|
399
402
|
async proxyToPrivate(e, t, n, r, i, a, o) {
|
|
400
403
|
return s(x(e)) ? (this.enforceRateLimit(this.proxyToPrivate.name, [
|
|
@@ -77,6 +77,7 @@ export interface IHinkal<ConnectorType = unknown> {
|
|
|
77
77
|
signSolanaLedgerMessage(): Promise<string>;
|
|
78
78
|
initUserKeys(mode?: LoginMessageMode): Promise<void>;
|
|
79
79
|
initUserKeysWithSignature(signature: string): void;
|
|
80
|
+
initUserKeysWithNullifyingKey(nullifyingKey: string): void;
|
|
80
81
|
initUserKeysFromSeedPhrases(seedPhrases: string[]): Promise<void>;
|
|
81
82
|
initUserKeysWithEnclaveSignature(signInMode?: LoginMessageMode): Promise<void>;
|
|
82
83
|
storeAndGetInitialSignature(authSignature: string): Promise<string>;
|
|
@@ -97,7 +98,7 @@ export interface IHinkal<ConnectorType = unknown> {
|
|
|
97
98
|
signWithSubAccount(chainId: number, messageToSign: string | undefined, typedData: TypedData | undefined, subAccount: SubAccount): Promise<string>;
|
|
98
99
|
actionPrivateWallet(chainId: number, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], onChainCreation: boolean[], ops: string[], emporiumTokenChanges: TokenChanges<bigint>[], subAccount?: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, relayOverride?: string, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType, privateRecipientInfo?: PrivateRecipientInfo): Promise<string>;
|
|
99
100
|
actionReceive(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], feeTokens?: string, feeStructureOverride?: FeeStructure, subAccount?: SubAccount, action?: AdminTransactionType): Promise<string>;
|
|
100
|
-
proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType): Promise<string>;
|
|
101
|
+
proxySwap(erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, swapData: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, bridgedToken?: ERC20Token, bridgedTokenAmount?: bigint, action?: AdminTransactionType): Promise<string>;
|
|
101
102
|
proxyToPrivate(erc20Tokens: ERC20Token[], deltaAmountsBase: bigint[], subAccount: SubAccount, recipientInfo: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
|
|
102
103
|
proxySend(erc20Tokens: ERC20Token[], amounts: bigint[], subAccount: SubAccount, recipientAddress: string, feeToken?: string, feeStructureOverride?: FeeStructure, action?: AdminTransactionType): Promise<string>;
|
|
103
104
|
areMerkleTreeUpdatesDisabled(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../constants/protocol.constants.cjs`);const e=require(`../../types/external-action.types.cjs`),t=require(`../../functions/utils/token-check.utils.cjs`),n=require(`../../functions/pre-transaction/getVolatileTransferAmount.cjs`),r=require(`../AccountActions/AccountActions.cjs`),i=require(`../../functions/pre-transaction/getFeeStructure.cjs`),a=require(`../../functions/private-wallet/emporium.helpers.cjs`),o=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),s=require(`../../functions/utils/fees.utils.cjs`);var c=async(c,l,u,d,f,p,m)=>{if(!p)throw Error(`hinkalActionReceive: subAccount should be provided`);if(!d)throw Error(`Fee token is required in hinkalActionReceive`);let h=t.validateAndGetChainId(l),g=r.AccountActions.getAddressFromSubAccount(h,p);if(!g)throw Error(`Public account address is not available`);let _=l.map(e=>e.erc20TokenAddress),v=await n.modifyVolatileTokenAmountChanges(h,l,u,g),y=a.createTransaferEmporiumOpsBatch(c,h,_,v),b=await s.calculateModifiedFeeStructureForTokens(h,l,v,f??await i.getFeeStructure(h,d,_,e.ExternalActionId.Emporium,y.map(e=>o.convertEmporiumOpToCallInfo(e,g,h)),
|
|
1
|
+
require(`../../constants/protocol.constants.cjs`);const e=require(`../../types/external-action.types.cjs`),t=require(`../../functions/utils/token-check.utils.cjs`),n=require(`../../functions/pre-transaction/getVolatileTransferAmount.cjs`),r=require(`../AccountActions/AccountActions.cjs`),i=require(`../../functions/pre-transaction/getFeeStructure.cjs`),a=require(`../../functions/private-wallet/emporium.helpers.cjs`),o=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),s=require(`../../functions/utils/fees.utils.cjs`);var c=async(c,l,u,d,f,p,m)=>{if(!p)throw Error(`hinkalActionReceive: subAccount should be provided`);if(!d)throw Error(`Fee token is required in hinkalActionReceive`);let h=t.validateAndGetChainId(l),g=r.AccountActions.getAddressFromSubAccount(h,p);if(!g)throw Error(`Public account address is not available`);let _=l.map(e=>e.erc20TokenAddress),v=await n.modifyVolatileTokenAmountChanges(h,l,u,g),y=a.createTransaferEmporiumOpsBatch(c,h,_,v),b=await s.calculateModifiedFeeStructureForTokens(h,l,v,f??await i.getFeeStructure(h,d,_,e.ExternalActionId.Emporium,y.map(e=>o.convertEmporiumOpToCallInfo(e,g,h)),25n)),x=l.map((e,t)=>({token:e,amount:-1n*v[t]}));return c.actionPrivateWallet(h,l,v,v.map(()=>!1),y,x,p,d,b,void 0,void 0,void 0,m,void 0)};exports.hinkalActionReceive=c;
|
|
@@ -13,7 +13,7 @@ var c = async (c, l, u, d, f, p, m) => {
|
|
|
13
13
|
if (!d) throw Error("Fee token is required in hinkalActionReceive");
|
|
14
14
|
let h = t(l), g = r.getAddressFromSubAccount(h, p);
|
|
15
15
|
if (!g) throw Error("Public account address is not available");
|
|
16
|
-
let _ = l.map((e) => e.erc20TokenAddress), v = await n(h, l, u, g), y = a(c, h, _, v), b = await s(h, l, v, f ?? await i(h, d, _, e.Emporium, y.map((e) => o(e, g, h)),
|
|
16
|
+
let _ = l.map((e) => e.erc20TokenAddress), v = await n(h, l, u, g), y = a(c, h, _, v), b = await s(h, l, v, f ?? await i(h, d, _, e.Emporium, y.map((e) => o(e, g, h)), 25n)), x = l.map((e, t) => ({
|
|
17
17
|
token: e,
|
|
18
18
|
amount: -1n * v[t]
|
|
19
19
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../functions/utils/caseInsensitive.utils.cjs`),r=require(`../../error-handling/error-codes.constants.cjs`),i=require(`../../functions/web3/etherFunctions.cjs`),a=require(`../../functions/utils/addresses.cjs`),o=require(`../../types/external-action.types.cjs`),s=require(`../../types/token.types.cjs`),c=require(`../../API/API.cjs`),l=require(`../../functions/utils/erc20tokenFunctions.cjs`),u=require(`../AccountActions/AccountActions.cjs`),d=require(`../../functions/pre-transaction/getFeeStructure.cjs`),f=require(`../../functions/private-wallet/emporium.helpers.cjs`),p=require(`../../constants/addresses.constants.cjs`),m=require(`../../constants/bridging.constants.cjs`),h=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),g=require(`../../functions/utils/fees.utils.cjs`),_=require(`../../functions/utils/enclave-utxo-storage.cjs`),v=require(`../../functions/utils/bridge-arrival.utils.cjs`),y=require(`../../functions/utils/temp-wallet.utils.cjs`),b=require(`../../API/callNearIntentsAPI.cjs`),x=require(`../../functions/utils/nearIntents.utils.cjs`),S=require(`../../functions/web3/lifiAPI.cjs`),C=require(`../../functions/utils/bridge-claimable-utxo.utils.cjs`);var w=async(e,r,d,m,h,g,_,v)=>{let{chainId:b}=r,x=d.chainId,C=r.erc20TokenAddress,w=p.SWAP_ROUTER_ADDRESSES[o.ExternalActionId.Lifi][b];if(!w)throw Error(`LIFI not configured for chain ${b}`);let T=i.randomBigInt(6),{sourceSubAccount:E,destinationSubAccount:D}=y.deriveBridgeTempWallets(e,b,x,T),O=u.AccountActions.getAddressFromSubAccount(b,E),k=u.AccountActions.getAddressFromSubAccount(x,D);if(!O||!k)throw Error(`Missing temp wallet address for LIFI bridge`);let{lifiDataValue:A,outSwapAmountValue:j,extraNativeTokenFee:M}=await S.getLifiPrice(r,d,m,h,O,k),N={calldata:A,expectedAmount:j,nativeFee:M},P=i.getAmountInWei(r,m),F=Array.from(new Set([b,x])),I=a.hashEthereumAddress(await e.getEthereumAddress());await Promise.all(F.map(e=>c.API.addTemporaryWalletNonce(e,I,Number(T),s.TemporaryWalletRecoveryDestination.Confidential)));let L=n.caseInsensitiveEqual(C,t.zeroAddress),R=N.nativeFee>0n&&!L,z=L?P+N.nativeFee:P,B=[r],V=[-z];if(R){let e=await l.getErc20TokenFromAPI(b,t.zeroAddress);if(!e)throw Error(`Native token not found for bridge fee`);B.push(e),V.push(-N.nativeFee)}let H=f.createLifiBridgeOps(e,b,O,w,C,z,P,N),U=B.map((e,t)=>({token:e,amount:V[t]}));return{tempSubAccount:D,sourceTxHash:await e.actionPrivateWallet(b,B,V,V.map(()=>!1),H,U,E,g??C,_,void 0,!1,void 0,v,void 0),expectedAmount:N.expectedAmount}},T=async(e,t,n,r,o,l,d,f)=>{let p=n.chainId,h=i.randomBigInt(6),g=y.buildTempSubAccountForChain(e,p,h),_=u.AccountActions.getAddressFromSubAccount(p,g);if(!_)throw Error(`Missing temp wallet address for NEAR bridge`);let v=a.hashEthereumAddress(await e.getEthereumAddress());await c.API.addTemporaryWalletNonce(p,v,Number(h),s.TemporaryWalletRecoveryDestination.Confidential);let[S,C]=await Promise.all([x.resolveNearAssetId(t.chainId,t.erc20TokenAddress),x.resolveNearAssetId(p,n.erc20TokenAddress)]),w=i.getAmountInWei(t,r),T=new Date(Date.now()+m.NEAR_BRIDGE_QUOTE_DEADLINE_BUFFER_MS).toISOString(),{quote:E}=await b.getNearIntentsQuote({dry:!1,swapType:`EXACT_INPUT`,slippageTolerance:Math.round(o*1e4)||100,originAsset:S,depositType:`ORIGIN_CHAIN`,destinationAsset:C,amount:w.toString(),recipient:_,recipientType:`DESTINATION_CHAIN`,refundTo:e.userKeys.getNearIntentsAccountId(),refundType:`INTENTS`,deadline:T});if(!E.depositAddress)throw Error(`NEAR Intents quote returned no deposit address`);let D=await e.withdraw([t],[-w],E.depositAddress,!1,l??t.erc20TokenAddress,d,void 0,f);return{tempSubAccount:g,sourceTxHash:typeof D==`string`?D:D.hash,expectedAmount:BigInt(E.amountOut)}},E=async(n,i,a,s,c)=>{let l=i.chainId,p=i.erc20TokenAddress,m=u.AccountActions.getAddressFromSubAccount(l,a);if(!m)throw Error(`Missing temp wallet address for bridge shield`);let{recipientInfo:v,claimable:y}=C.resolveBridgeRecipient(n,c);if(y&&await _.storeClaimableKeyInEnclave(await n.getEthereumAddressByChain(l),y.ethAddress,y.keys.getShieldedPrivateKey(),l,y.signature,n.userKeys.getSignature()),e.isSolanaLike(l))return C.hinkalSolanaShieldBridged(n,i,a,s,v);let b=f.createTransaferEmporiumOpsBatch(n,l,[p],[s]),x=await g.calculateModifiedFeeStructure(l,i,s,await d.getFeeStructure(l,p,[p],o.ExternalActionId.Emporium,b.map(e=>h.convertEmporiumOpToCallInfo(e,m,l)),t.
|
|
1
|
+
const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../functions/utils/caseInsensitive.utils.cjs`),r=require(`../../error-handling/error-codes.constants.cjs`),i=require(`../../functions/web3/etherFunctions.cjs`),a=require(`../../functions/utils/addresses.cjs`),o=require(`../../types/external-action.types.cjs`),s=require(`../../types/token.types.cjs`),c=require(`../../API/API.cjs`),l=require(`../../functions/utils/erc20tokenFunctions.cjs`),u=require(`../AccountActions/AccountActions.cjs`),d=require(`../../functions/pre-transaction/getFeeStructure.cjs`),f=require(`../../functions/private-wallet/emporium.helpers.cjs`),p=require(`../../constants/addresses.constants.cjs`),m=require(`../../constants/bridging.constants.cjs`),h=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),g=require(`../../functions/utils/fees.utils.cjs`),_=require(`../../functions/utils/enclave-utxo-storage.cjs`),v=require(`../../functions/utils/bridge-arrival.utils.cjs`),y=require(`../../functions/utils/temp-wallet.utils.cjs`),b=require(`../../API/callNearIntentsAPI.cjs`),x=require(`../../functions/utils/nearIntents.utils.cjs`),S=require(`../../functions/web3/lifiAPI.cjs`),C=require(`../../functions/utils/bridge-claimable-utxo.utils.cjs`);var w=async(e,r,d,m,h,g,_,v)=>{let{chainId:b}=r,x=d.chainId,C=r.erc20TokenAddress,w=p.SWAP_ROUTER_ADDRESSES[o.ExternalActionId.Lifi][b];if(!w)throw Error(`LIFI not configured for chain ${b}`);let T=i.randomBigInt(6),{sourceSubAccount:E,destinationSubAccount:D}=y.deriveBridgeTempWallets(e,b,x,T),O=u.AccountActions.getAddressFromSubAccount(b,E),k=u.AccountActions.getAddressFromSubAccount(x,D);if(!O||!k)throw Error(`Missing temp wallet address for LIFI bridge`);let{lifiDataValue:A,outSwapAmountValue:j,extraNativeTokenFee:M}=await S.getLifiPrice(r,d,m,h,O,k),N={calldata:A,expectedAmount:j,nativeFee:M},P=i.getAmountInWei(r,m),F=Array.from(new Set([b,x])),I=a.hashEthereumAddress(await e.getEthereumAddress());await Promise.all(F.map(e=>c.API.addTemporaryWalletNonce(e,I,Number(T),s.TemporaryWalletRecoveryDestination.Confidential)));let L=n.caseInsensitiveEqual(C,t.zeroAddress),R=N.nativeFee>0n&&!L,z=L?P+N.nativeFee:P,B=[r],V=[-z];if(R){let e=await l.getErc20TokenFromAPI(b,t.zeroAddress);if(!e)throw Error(`Native token not found for bridge fee`);B.push(e),V.push(-N.nativeFee)}let H=f.createLifiBridgeOps(e,b,O,w,C,z,P,N),U=B.map((e,t)=>({token:e,amount:V[t]}));return{tempSubAccount:D,sourceTxHash:await e.actionPrivateWallet(b,B,V,V.map(()=>!1),H,U,E,g??C,_,void 0,!1,void 0,v,void 0),expectedAmount:N.expectedAmount}},T=async(e,t,n,r,o,l,d,f)=>{let p=n.chainId,h=i.randomBigInt(6),g=y.buildTempSubAccountForChain(e,p,h),_=u.AccountActions.getAddressFromSubAccount(p,g);if(!_)throw Error(`Missing temp wallet address for NEAR bridge`);let v=a.hashEthereumAddress(await e.getEthereumAddress());await c.API.addTemporaryWalletNonce(p,v,Number(h),s.TemporaryWalletRecoveryDestination.Confidential);let[S,C]=await Promise.all([x.resolveNearAssetId(t.chainId,t.erc20TokenAddress),x.resolveNearAssetId(p,n.erc20TokenAddress)]),w=i.getAmountInWei(t,r),T=new Date(Date.now()+m.NEAR_BRIDGE_QUOTE_DEADLINE_BUFFER_MS).toISOString(),{quote:E}=await b.getNearIntentsQuote({dry:!1,swapType:`EXACT_INPUT`,slippageTolerance:Math.round(o*1e4)||100,originAsset:S,depositType:`ORIGIN_CHAIN`,destinationAsset:C,amount:w.toString(),recipient:_,recipientType:`DESTINATION_CHAIN`,refundTo:e.userKeys.getNearIntentsAccountId(),refundType:`INTENTS`,deadline:T});if(!E.depositAddress)throw Error(`NEAR Intents quote returned no deposit address`);let D=await e.withdraw([t],[-w],E.depositAddress,!1,l??t.erc20TokenAddress,d,void 0,f);return{tempSubAccount:g,sourceTxHash:typeof D==`string`?D:D.hash,expectedAmount:BigInt(E.amountOut)}},E=async(n,i,a,s,c)=>{let l=i.chainId,p=i.erc20TokenAddress,m=u.AccountActions.getAddressFromSubAccount(l,a);if(!m)throw Error(`Missing temp wallet address for bridge shield`);let{recipientInfo:v,claimable:y}=C.resolveBridgeRecipient(n,c);if(y&&await _.storeClaimableKeyInEnclave(await n.getEthereumAddressByChain(l),y.ethAddress,y.keys.getShieldedPrivateKey(),l,y.signature,n.userKeys.getSignature()),e.isSolanaLike(l))return C.hinkalSolanaShieldBridged(n,i,a,s,v,t.HINKAL_SHIELD_VARIABLE_RATE);let b=f.createTransaferEmporiumOpsBatch(n,l,[p],[s]),x=await g.calculateModifiedFeeStructure(l,i,s,await d.getFeeStructure(l,p,[p],o.ExternalActionId.Emporium,b.map(e=>h.convertEmporiumOpToCallInfo(e,m,l)),t.HINKAL_PRIVATE_SEND_VARIABLE_RATE)),S=s-g.calculateTotalFee(s,x);if(S<=0n)throw Error(r.transactionErrorCodes.INSUFFICIENT_FUNDS_TO_TRANSACT);return{destTxHash:await n.proxyToPrivate([i],[S],a,v,x.feeToken,x),shieldedAmount:S}},D=async(t,n,r,i,a,o=m.DEFAULT_BRIDGING_SLIPPAGE_DECIMAL,s,c,l)=>{let{tempSubAccount:d,sourceTxHash:f,expectedAmount:p}=e.isNearIntentsBridgeSource(n.chainId)?await T(t,n,r,i,o,s,c,l):await w(t,n,r,i,o,s,c,l),h=u.AccountActions.getAddressFromSubAccount(r.chainId,d);if(!h)throw Error(`Missing temp wallet address for bridge`);let{destTxHash:g,shieldedAmount:_}=await E(t,r,d,await v.waitForBridgeArrival(r.chainId,h,r.erc20TokenAddress,p,o),a);return{sourceTxHash:f,destTxHash:g,destinationTokenAmount:_.toString()}};exports.hinkalBridgePrivateToPrivate=D;
|
|
@@ -1,64 +1,64 @@
|
|
|
1
1
|
import { isNearIntentsBridgeSource as e, isSolanaLike as t } from "../../constants/chains.constants.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { caseInsensitiveEqual as
|
|
4
|
-
import { transactionErrorCodes as
|
|
5
|
-
import { getAmountInWei as
|
|
6
|
-
import { hashEthereumAddress as
|
|
7
|
-
import { ExternalActionId as
|
|
8
|
-
import { TemporaryWalletRecoveryDestination as
|
|
9
|
-
import { API as
|
|
10
|
-
import { getErc20TokenFromAPI as
|
|
11
|
-
import { AccountActions as
|
|
12
|
-
import { getFeeStructure as
|
|
13
|
-
import { createLifiBridgeOps as
|
|
14
|
-
import { SWAP_ROUTER_ADDRESSES as
|
|
15
|
-
import { DEFAULT_BRIDGING_SLIPPAGE_DECIMAL as
|
|
16
|
-
import { convertEmporiumOpToCallInfo as
|
|
17
|
-
import { calculateModifiedFeeStructure as
|
|
18
|
-
import { storeClaimableKeyInEnclave as
|
|
19
|
-
import { waitForBridgeArrival as
|
|
20
|
-
import { buildTempSubAccountForChain as
|
|
21
|
-
import { getNearIntentsQuote as
|
|
22
|
-
import { resolveNearAssetId as
|
|
23
|
-
import { getLifiPrice as
|
|
24
|
-
import { hinkalSolanaShieldBridged as
|
|
2
|
+
import { HINKAL_PRIVATE_SEND_VARIABLE_RATE as n, HINKAL_SHIELD_VARIABLE_RATE as r, zeroAddress as i } from "../../constants/protocol.constants.mjs";
|
|
3
|
+
import { caseInsensitiveEqual as a } from "../../functions/utils/caseInsensitive.utils.mjs";
|
|
4
|
+
import { transactionErrorCodes as o } from "../../error-handling/error-codes.constants.mjs";
|
|
5
|
+
import { getAmountInWei as s, randomBigInt as c } from "../../functions/web3/etherFunctions.mjs";
|
|
6
|
+
import { hashEthereumAddress as l } from "../../functions/utils/addresses.mjs";
|
|
7
|
+
import { ExternalActionId as u } from "../../types/external-action.types.mjs";
|
|
8
|
+
import { TemporaryWalletRecoveryDestination as d } from "../../types/token.types.mjs";
|
|
9
|
+
import { API as f } from "../../API/API.mjs";
|
|
10
|
+
import { getErc20TokenFromAPI as p } from "../../functions/utils/erc20tokenFunctions.mjs";
|
|
11
|
+
import { AccountActions as m } from "../AccountActions/AccountActions.mjs";
|
|
12
|
+
import { getFeeStructure as h } from "../../functions/pre-transaction/getFeeStructure.mjs";
|
|
13
|
+
import { createLifiBridgeOps as g, createTransaferEmporiumOpsBatch as _ } from "../../functions/private-wallet/emporium.helpers.mjs";
|
|
14
|
+
import { SWAP_ROUTER_ADDRESSES as v } from "../../constants/addresses.constants.mjs";
|
|
15
|
+
import { DEFAULT_BRIDGING_SLIPPAGE_DECIMAL as y, NEAR_BRIDGE_QUOTE_DEADLINE_BUFFER_MS as b } from "../../constants/bridging.constants.mjs";
|
|
16
|
+
import { convertEmporiumOpToCallInfo as x } from "../../functions/utils/convertEmporiumOpToCallInfo.mjs";
|
|
17
|
+
import { calculateModifiedFeeStructure as S, calculateTotalFee as C } from "../../functions/utils/fees.utils.mjs";
|
|
18
|
+
import { storeClaimableKeyInEnclave as w } from "../../functions/utils/enclave-utxo-storage.mjs";
|
|
19
|
+
import { waitForBridgeArrival as T } from "../../functions/utils/bridge-arrival.utils.mjs";
|
|
20
|
+
import { buildTempSubAccountForChain as E, deriveBridgeTempWallets as D } from "../../functions/utils/temp-wallet.utils.mjs";
|
|
21
|
+
import { getNearIntentsQuote as O } from "../../API/callNearIntentsAPI.mjs";
|
|
22
|
+
import { resolveNearAssetId as k } from "../../functions/utils/nearIntents.utils.mjs";
|
|
23
|
+
import { getLifiPrice as A } from "../../functions/web3/lifiAPI.mjs";
|
|
24
|
+
import { hinkalSolanaShieldBridged as j, resolveBridgeRecipient as M } from "../../functions/utils/bridge-claimable-utxo.utils.mjs";
|
|
25
25
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalBridgePrivateToPrivate.ts
|
|
26
|
-
var
|
|
27
|
-
let { chainId: b } = t, x = n.chainId, S = t.erc20TokenAddress, C =
|
|
26
|
+
var N = async (e, t, n, r, o, h, _, y) => {
|
|
27
|
+
let { chainId: b } = t, x = n.chainId, S = t.erc20TokenAddress, C = v[u.Lifi][b];
|
|
28
28
|
if (!C) throw Error(`LIFI not configured for chain ${b}`);
|
|
29
|
-
let w =
|
|
30
|
-
if (!O || !
|
|
31
|
-
let { lifiDataValue: j, outSwapAmountValue: M, extraNativeTokenFee: N } = await
|
|
29
|
+
let w = c(6), { sourceSubAccount: T, destinationSubAccount: E } = D(e, b, x, w), O = m.getAddressFromSubAccount(b, T), k = m.getAddressFromSubAccount(x, E);
|
|
30
|
+
if (!O || !k) throw Error("Missing temp wallet address for LIFI bridge");
|
|
31
|
+
let { lifiDataValue: j, outSwapAmountValue: M, extraNativeTokenFee: N } = await A(t, n, r, o, O, k), P = {
|
|
32
32
|
calldata: j,
|
|
33
33
|
expectedAmount: M,
|
|
34
34
|
nativeFee: N
|
|
35
|
-
}, F =
|
|
36
|
-
await Promise.all(I.map((e) =>
|
|
37
|
-
let R =
|
|
35
|
+
}, F = s(t, r), I = Array.from(new Set([b, x])), L = l(await e.getEthereumAddress());
|
|
36
|
+
await Promise.all(I.map((e) => f.addTemporaryWalletNonce(e, L, Number(w), d.Confidential)));
|
|
37
|
+
let R = a(S, i), z = P.nativeFee > 0n && !R, B = R ? F + P.nativeFee : F, V = [t], H = [-B];
|
|
38
38
|
if (z) {
|
|
39
|
-
let e = await
|
|
39
|
+
let e = await p(b, i);
|
|
40
40
|
if (!e) throw Error("Native token not found for bridge fee");
|
|
41
41
|
V.push(e), H.push(-P.nativeFee);
|
|
42
42
|
}
|
|
43
|
-
let U =
|
|
43
|
+
let U = g(e, b, O, C, S, B, F, P), W = V.map((e, t) => ({
|
|
44
44
|
token: e,
|
|
45
45
|
amount: H[t]
|
|
46
46
|
}));
|
|
47
47
|
return {
|
|
48
|
-
tempSubAccount:
|
|
49
|
-
sourceTxHash: await e.actionPrivateWallet(b, V, H, H.map(() => !1), U, W, T,
|
|
48
|
+
tempSubAccount: E,
|
|
49
|
+
sourceTxHash: await e.actionPrivateWallet(b, V, H, H.map(() => !1), U, W, T, h ?? S, _, void 0, !1, void 0, y, void 0),
|
|
50
50
|
expectedAmount: P.expectedAmount
|
|
51
51
|
};
|
|
52
|
-
},
|
|
53
|
-
let
|
|
52
|
+
}, P = async (e, t, n, r, i, a, o, u) => {
|
|
53
|
+
let p = n.chainId, h = c(6), g = E(e, p, h), _ = m.getAddressFromSubAccount(p, g);
|
|
54
54
|
if (!_) throw Error("Missing temp wallet address for NEAR bridge");
|
|
55
|
-
let v =
|
|
56
|
-
await
|
|
57
|
-
let [
|
|
55
|
+
let v = l(await e.getEthereumAddress());
|
|
56
|
+
await f.addTemporaryWalletNonce(p, v, Number(h), d.Confidential);
|
|
57
|
+
let [y, x] = await Promise.all([k(t.chainId, t.erc20TokenAddress), k(p, n.erc20TokenAddress)]), S = s(t, r), C = new Date(Date.now() + b).toISOString(), { quote: w } = await O({
|
|
58
58
|
dry: !1,
|
|
59
59
|
swapType: "EXACT_INPUT",
|
|
60
60
|
slippageTolerance: Math.round(i * 1e4) || 100,
|
|
61
|
-
originAsset:
|
|
61
|
+
originAsset: y,
|
|
62
62
|
depositType: "ORIGIN_CHAIN",
|
|
63
63
|
destinationAsset: x,
|
|
64
64
|
amount: S.toString(),
|
|
@@ -69,27 +69,27 @@ var M = async (e, t, n, a, m, g, v, y) => {
|
|
|
69
69
|
deadline: C
|
|
70
70
|
});
|
|
71
71
|
if (!w.depositAddress) throw Error("NEAR Intents quote returned no deposit address");
|
|
72
|
-
let
|
|
72
|
+
let T = await e.withdraw([t], [-S], w.depositAddress, !1, a ?? t.erc20TokenAddress, o, void 0, u);
|
|
73
73
|
return {
|
|
74
74
|
tempSubAccount: g,
|
|
75
|
-
sourceTxHash: typeof
|
|
75
|
+
sourceTxHash: typeof T == "string" ? T : T.hash,
|
|
76
76
|
expectedAmount: BigInt(w.amountOut)
|
|
77
77
|
};
|
|
78
|
-
},
|
|
79
|
-
let
|
|
80
|
-
if (!
|
|
81
|
-
let { recipientInfo:
|
|
82
|
-
if (
|
|
83
|
-
let
|
|
84
|
-
if (
|
|
78
|
+
}, F = async (e, i, a, s, c) => {
|
|
79
|
+
let l = i.chainId, d = i.erc20TokenAddress, f = m.getAddressFromSubAccount(l, a);
|
|
80
|
+
if (!f) throw Error("Missing temp wallet address for bridge shield");
|
|
81
|
+
let { recipientInfo: p, claimable: g } = M(e, c);
|
|
82
|
+
if (g && await w(await e.getEthereumAddressByChain(l), g.ethAddress, g.keys.getShieldedPrivateKey(), l, g.signature, e.userKeys.getSignature()), t(l)) return j(e, i, a, s, p, r);
|
|
83
|
+
let v = _(e, l, [d], [s]), y = await S(l, i, s, await h(l, d, [d], u.Emporium, v.map((e) => x(e, f, l)), n)), b = s - C(s, y);
|
|
84
|
+
if (b <= 0n) throw Error(o.INSUFFICIENT_FUNDS_TO_TRANSACT);
|
|
85
85
|
return {
|
|
86
|
-
destTxHash: await e.proxyToPrivate([
|
|
87
|
-
shieldedAmount:
|
|
86
|
+
destTxHash: await e.proxyToPrivate([i], [b], a, p, y.feeToken, y),
|
|
87
|
+
shieldedAmount: b
|
|
88
88
|
};
|
|
89
|
-
},
|
|
90
|
-
let { tempSubAccount: u, sourceTxHash: d, expectedAmount: f } = e(n.chainId) ? await
|
|
91
|
-
if (!
|
|
92
|
-
let { destTxHash: h, shieldedAmount: g } = await
|
|
89
|
+
}, I = async (t, n, r, i, a, o = y, s, c, l) => {
|
|
90
|
+
let { tempSubAccount: u, sourceTxHash: d, expectedAmount: f } = e(n.chainId) ? await P(t, n, r, i, o, s, c, l) : await N(t, n, r, i, o, s, c, l), p = m.getAddressFromSubAccount(r.chainId, u);
|
|
91
|
+
if (!p) throw Error("Missing temp wallet address for bridge");
|
|
92
|
+
let { destTxHash: h, shieldedAmount: g } = await F(t, r, u, await T(r.chainId, p, r.erc20TokenAddress, f, o), a);
|
|
93
93
|
return {
|
|
94
94
|
sourceTxHash: d,
|
|
95
95
|
destTxHash: h,
|
|
@@ -97,4 +97,4 @@ var M = async (e, t, n, a, m, g, v, y) => {
|
|
|
97
97
|
};
|
|
98
98
|
};
|
|
99
99
|
//#endregion
|
|
100
|
-
export {
|
|
100
|
+
export { I as hinkalBridgePrivateToPrivate };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../functions/utils/caseInsensitive.utils.cjs`),r=require(`../../error-handling/error-codes.constants.cjs`),i=require(`../utxo/Utxo.cjs`),a=require(`../../functions/utils/tron.utils.cjs`),o=require(`../../functions/utils/addresses.cjs`),s=require(`../../types/external-action.types.cjs`),c=require(`../../types/transact.types.cjs`),l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../crypto-keys/encryptDecryptUtxo.cjs`),d=require(`../../functions/pre-transaction/constructAdminData.cjs`),f=require(`../../functions/pre-transaction/getFeeStructure.cjs`),p=require(`../../functions/pre-transaction/speculativeUtxo.cjs`),m=require(`../../functions/web3/functionCalls/transactCallDirectTron.cjs`),h=require(`../../functions/web3/functionCalls/transactCallRelayer.cjs`),g=require(`./hinkalTransact.cjs`);require(`../../functions/index.cjs`);const _=require(`./hinkalDepositOnChainUtxos.cjs`);let v=require(`ethers`);var y=async(e,o,s,l,u,f,m,h)=>{if(l.length===0)throw Error(`userDepositedUtxos must not be empty`);let _=s.erc20TokenAddress,[v,y]=await Promise.all([e.getRandomRelay(o),e.getEthereumAddressByChain(o)]);if(!v)throw Error(r.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let b=e.generateProofRemotely?5:1,x=[],S=a.addressToHexFormat(y);for(let r=0;r<l.length;r+=b){let s=l.slice(r,r+b),y=await Promise.all(s.map(async({recipientAddress:s,utxo:l},y)=>{let b=r+y,x=a.addressToHexFormat(s),C=n.caseInsensitiveEqual(l.erc20TokenAddress,_)?l:i.Utxo.createFrom(l,{erc20TokenAddress:_}),w=d.constructAdminData(f,o,[_],[-l.amount],S),{zkCallData:T,circomData:E,dimData:D,commitmentValidationData:O,tronProofSignature:k}=await g.hinkalTransact(e,{chainId:o,erc20Addresses:[_],amountChanges:[-l.amount],externalAddress:x,feeStructure:u,relay:v??t.zeroAddress,inputUtxos:[[C]],useBlockedUtxos:!0,speculative:h&&{pendingLeaves:h,inputUtxos:[[p.toSpeculativeUtxo(C)]]},submit:{mode:c.SubmitMode.ProofOnly},skipLock:!0});return{zkCallData:T,dimData:D,circomData:E,commitmentValidationData:O,adminData:w,recipientAddress:s,tronProofSignature:k,destinationChainId:m?.chainId,destinationTokenAddress:m?.tokenAddress,destinationTokenAmount:m?.tokenAmounts?.[b]}}));x.push(...y)}return x},b=async(e,t,n,r,i)=>{let{chainId:a,hashedEthereumAddress:o,feeStructure:s,action:c,destination:l}=i,{txCompletionTime:u,ref:d,hashedDashboardAccountId:f,preEstimateGas:p}=i,m=n.map(e=>e+s.flatFee),g=await _.prepareDepositOnChainUtxos(e,a,[t],[m]),{depositedUtxos:v,pendingLeaves:b}=g,x=v[0].map((e,t)=>({recipientAddress:r[t],utxo:e})),[S,C]=await Promise.all([_.submitDepositOnChainUtxos(e,g,p),y(e,a,t,x,s,c,l,b)]);return{depositTxHash:S,scheduleId:await h.transactCallRelayerBatch(a,C,o,u,d,f,S)}},x=async(e,t,n,r,i)=>{let{chainId:o,ethereumAddress:s,hashedEthereumAddress:l,feeStructure:d,action:f,destination:p}=i,{txCompletionTime:_,ref:b,hashedDashboardAccountId:x,preEstimateGas:S}=i,C=n.map(e=>e+d.flatFee),w=C.reduce((e,t)=>e+t,0n),T=await g.hinkalTransact(e,{chainId:o,erc20Addresses:[t.erc20TokenAddress],amountChanges:[w],externalAddress:s,selfOutputAmounts:C,createBlockedUtxos:!0,forceEmptyUtxos:!0,submit:{mode:c.SubmitMode.ProofOnly}}),E=T.circomData.encryptedOutputs?.[0];if(!E||E.length!==C.length)throw Error(`Deposit proof is missing encryptedOutputs for the deposited UTXOs`);let D=E.map((t,n)=>({recipientAddress:r[n],utxo:u.decryptUtxo(v.ethers.getBytes(t),e.userKeys)})),O=T.circomData.outCommitments.flat().map(e=>BigInt(e)).filter(e=>e!==0n).map(e=>e.toString()),[k,A]=await Promise.all([(async()=>{a.swapTronBCoordinate(T.zkCallData);let n=await m.transactCallDirectTron(e,o,w,t,T.zkCallData,T.circomData,T.dimData,void 0,void 0,S,T.tronProofSignature);if(!n)throw Error(`Deposit transaction hash not found`);return n})(),y(e,o,t,D,d,f,p,O)]);return{depositTxHash:k,scheduleId:await h.transactCallRelayerBatch(o,A,l,_,b,x,k)}},S=async(t,n,r,i,c,u,d,p,m,h=!0,g)=>{let _=l.validateAndGetChainId([n]),v=n.erc20TokenAddress,y=a.addressToHexFormat(await t.getEthereumAddressByChain(_)),S={chainId:_,ethereumAddress:y,hashedEthereumAddress:o.hashEthereumAddress(y),feeStructure:u??await f.getFeeStructure(_,v,[v],s.ExternalActionId.Transact,[],
|
|
1
|
+
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../functions/utils/caseInsensitive.utils.cjs`),r=require(`../../error-handling/error-codes.constants.cjs`),i=require(`../utxo/Utxo.cjs`),a=require(`../../functions/utils/tron.utils.cjs`),o=require(`../../functions/utils/addresses.cjs`),s=require(`../../types/external-action.types.cjs`),c=require(`../../types/transact.types.cjs`),l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../crypto-keys/encryptDecryptUtxo.cjs`),d=require(`../../functions/pre-transaction/constructAdminData.cjs`),f=require(`../../functions/pre-transaction/getFeeStructure.cjs`),p=require(`../../functions/pre-transaction/speculativeUtxo.cjs`),m=require(`../../functions/web3/functionCalls/transactCallDirectTron.cjs`),h=require(`../../functions/web3/functionCalls/transactCallRelayer.cjs`),g=require(`./hinkalTransact.cjs`);require(`../../functions/index.cjs`);const _=require(`./hinkalDepositOnChainUtxos.cjs`);let v=require(`ethers`);var y=async(e,o,s,l,u,f,m,h)=>{if(l.length===0)throw Error(`userDepositedUtxos must not be empty`);let _=s.erc20TokenAddress,[v,y]=await Promise.all([e.getRandomRelay(o),e.getEthereumAddressByChain(o)]);if(!v)throw Error(r.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let b=e.generateProofRemotely?5:1,x=[],S=a.addressToHexFormat(y);for(let r=0;r<l.length;r+=b){let s=l.slice(r,r+b),y=await Promise.all(s.map(async({recipientAddress:s,utxo:l},y)=>{let b=r+y,x=a.addressToHexFormat(s),C=n.caseInsensitiveEqual(l.erc20TokenAddress,_)?l:i.Utxo.createFrom(l,{erc20TokenAddress:_}),w=d.constructAdminData(f,o,[_],[-l.amount],S),{zkCallData:T,circomData:E,dimData:D,commitmentValidationData:O,tronProofSignature:k}=await g.hinkalTransact(e,{chainId:o,erc20Addresses:[_],amountChanges:[-l.amount],externalAddress:x,feeStructure:u,relay:v??t.zeroAddress,inputUtxos:[[C]],useBlockedUtxos:!0,speculative:h&&{pendingLeaves:h,inputUtxos:[[p.toSpeculativeUtxo(C)]]},submit:{mode:c.SubmitMode.ProofOnly},skipLock:!0});return{zkCallData:T,dimData:D,circomData:E,commitmentValidationData:O,adminData:w,recipientAddress:s,tronProofSignature:k,destinationChainId:m?.chainId,destinationTokenAddress:m?.tokenAddress,destinationTokenAmount:m?.tokenAmounts?.[b]}}));x.push(...y)}return x},b=async(e,t,n,r,i)=>{let{chainId:a,hashedEthereumAddress:o,feeStructure:s,action:c,destination:l}=i,{txCompletionTime:u,ref:d,hashedDashboardAccountId:f,preEstimateGas:p}=i,m=n.map(e=>e+s.flatFee),g=await _.prepareDepositOnChainUtxos(e,a,[t],[m]),{depositedUtxos:v,pendingLeaves:b}=g,x=v[0].map((e,t)=>({recipientAddress:r[t],utxo:e})),[S,C]=await Promise.all([_.submitDepositOnChainUtxos(e,g,p),y(e,a,t,x,s,c,l,b)]);return{depositTxHash:S,scheduleId:await h.transactCallRelayerBatch(a,C,o,u,d,f,S)}},x=async(e,t,n,r,i)=>{let{chainId:o,ethereumAddress:s,hashedEthereumAddress:l,feeStructure:d,action:f,destination:p}=i,{txCompletionTime:_,ref:b,hashedDashboardAccountId:x,preEstimateGas:S}=i,C=n.map(e=>e+d.flatFee),w=C.reduce((e,t)=>e+t,0n),T=await g.hinkalTransact(e,{chainId:o,erc20Addresses:[t.erc20TokenAddress],amountChanges:[w],externalAddress:s,selfOutputAmounts:C,createBlockedUtxos:!0,forceEmptyUtxos:!0,submit:{mode:c.SubmitMode.ProofOnly}}),E=T.circomData.encryptedOutputs?.[0];if(!E||E.length!==C.length)throw Error(`Deposit proof is missing encryptedOutputs for the deposited UTXOs`);let D=E.map((t,n)=>({recipientAddress:r[n],utxo:u.decryptUtxo(v.ethers.getBytes(t),e.userKeys)})),O=T.circomData.outCommitments.flat().map(e=>BigInt(e)).filter(e=>e!==0n).map(e=>e.toString()),[k,A]=await Promise.all([(async()=>{a.swapTronBCoordinate(T.zkCallData);let n=await m.transactCallDirectTron(e,o,w,t,T.zkCallData,T.circomData,T.dimData,void 0,void 0,S,T.tronProofSignature);if(!n)throw Error(`Deposit transaction hash not found`);return n})(),y(e,o,t,D,d,f,p,O)]);return{depositTxHash:k,scheduleId:await h.transactCallRelayerBatch(o,A,l,_,b,x,k)}},S=async(t,n,r,i,c,u,d,p,m,h=!0,g)=>{let _=l.validateAndGetChainId([n]),v=n.erc20TokenAddress,y=a.addressToHexFormat(await t.getEthereumAddressByChain(_)),S={chainId:_,ethereumAddress:y,hashedEthereumAddress:o.hashEthereumAddress(y),feeStructure:u??await f.getFeeStructure(_,v,[v],s.ExternalActionId.Transact,[],25n),txCompletionTime:c,ref:d,action:p,hashedDashboardAccountId:m?o.hashString(m):void 0,preEstimateGas:h,destination:g};if(!e.isTronLike(_))return b(t,n,r,i,S);if(r.length>4)throw Error(`Tron supports at most 4 recipients per deposit - no circuit emits more outputs`);return x(t,n,r,i,S)};exports.hinkalDepositAndWithdraw=S;
|
|
@@ -97,7 +97,7 @@ var S = async (e, o, s, c, l, d, f, m) => {
|
|
|
97
97
|
chainId: v,
|
|
98
98
|
ethereumAddress: b,
|
|
99
99
|
hashedEthereumAddress: s(b),
|
|
100
|
-
feeStructure: u ?? await m(v, y, [y], l.Transact, [],
|
|
100
|
+
feeStructure: u ?? await m(v, y, [y], l.Transact, [], 25n),
|
|
101
101
|
txCompletionTime: o,
|
|
102
102
|
ref: f,
|
|
103
103
|
action: p,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../constants/protocol.constants.cjs`);const e=require(`../../error-handling/error-codes.constants.cjs`),t=require(`../../types/external-action.types.cjs`),n=require(`../../functions/utils/token-check.utils.cjs`),r=require(`../AccountActions/AccountActions.cjs`),i=require(`../../functions/pre-transaction/getFeeStructure.cjs`),a=require(`../../constants/addresses.constants.cjs`),o=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),s=require(`../../functions/private-wallet/emporium.swap.helpers.cjs`);var
|
|
1
|
+
require(`../../constants/protocol.constants.cjs`);const e=require(`../../error-handling/error-codes.constants.cjs`),t=require(`../../types/external-action.types.cjs`),n=require(`../../functions/utils/token-check.utils.cjs`),r=require(`../AccountActions/AccountActions.cjs`),i=require(`../../functions/pre-transaction/getFeeStructure.cjs`),a=require(`../../constants/addresses.constants.cjs`),o=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),s=require(`../../functions/utils/fees.utils.cjs`),c=require(`../../functions/private-wallet/emporium.swap.helpers.cjs`);var l=async(l,u,d,f,p,m,h,g,_,v=!1,y,b,x,S)=>{if(!g)throw Error(`Fee token is required in hinkalProxySwap`);let C=n.validateAndGetChainId(u),w=r.AccountActions.getAddressFromSubAccount(C,h);if(!w)throw Error(`Public account address is not available`);let T=u.map(e=>e.erc20TokenAddress),E=await l.getRandomRelay(C,!0);if(!E)throw Error(e.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let D=await c.createSwapToEmporiumOps(l,C,f,a.SWAP_ROUTER_ADDRESSES[f][C],p,T[0],d[0],d[1],T[1],m,w,E,!0),O=_??await i.getFeeStructure(C,g,T,t.ExternalActionId.Emporium,D.map(e=>o.convertEmporiumOpToCallInfo(e,w,C)),35n),k=u.map((e,t)=>({token:e,amount:d[t]})),A=x&&S!==void 0?await s.calculateModifiedFeeStructure(C,x,S,O):O;return l.actionPrivateWallet(C,[],[],[],D,k,h,g,A,E,v,y,b,void 0)};exports.hinkalProxySwap=l;
|
|
@@ -4,4 +4,4 @@ import { FeeStructure } from '../../types/hinkal.types';
|
|
|
4
4
|
import { IHinkal } from './IHinkal';
|
|
5
5
|
import { SubAccount } from '../../types/proxy.types';
|
|
6
6
|
import { AdminTransactionType } from '../../types/admin.types';
|
|
7
|
-
export declare const hinkalProxySwap: (hinkal: IHinkal, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, data: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType) => Promise<string>;
|
|
7
|
+
export declare const hinkalProxySwap: (hinkal: IHinkal, erc20Tokens: ERC20Token[], deltaAmounts: bigint[], externalActionId: ExternalActionId, data: string, isTheSameChainSwap: boolean, subAccount: SubAccount, feeToken?: string, feeStructureOverride?: FeeStructure, autoDepositBack?: boolean, maxGasInDollar?: string, action?: AdminTransactionType, bridgedToken?: ERC20Token, bridgedTokenAmount?: bigint) => Promise<string>;
|
|
@@ -6,19 +6,20 @@ import { AccountActions as r } from "../AccountActions/AccountActions.mjs";
|
|
|
6
6
|
import { getFeeStructure as i } from "../../functions/pre-transaction/getFeeStructure.mjs";
|
|
7
7
|
import { SWAP_ROUTER_ADDRESSES as a } from "../../constants/addresses.constants.mjs";
|
|
8
8
|
import { convertEmporiumOpToCallInfo as o } from "../../functions/utils/convertEmporiumOpToCallInfo.mjs";
|
|
9
|
-
import {
|
|
9
|
+
import { calculateModifiedFeeStructure as s } from "../../functions/utils/fees.utils.mjs";
|
|
10
|
+
import { createSwapToEmporiumOps as c } from "../../functions/private-wallet/emporium.swap.helpers.mjs";
|
|
10
11
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalProxySwap.ts
|
|
11
|
-
var
|
|
12
|
-
if (!
|
|
13
|
-
let
|
|
14
|
-
if (!
|
|
15
|
-
let
|
|
16
|
-
if (!
|
|
17
|
-
let
|
|
12
|
+
var l = async (l, u, d, f, p, m, h, g, _, v = !1, y, b, x, S) => {
|
|
13
|
+
if (!g) throw Error("Fee token is required in hinkalProxySwap");
|
|
14
|
+
let C = n(u), w = r.getAddressFromSubAccount(C, h);
|
|
15
|
+
if (!w) throw Error("Public account address is not available");
|
|
16
|
+
let T = u.map((e) => e.erc20TokenAddress), E = await l.getRandomRelay(C, !0);
|
|
17
|
+
if (!E) throw Error(e.RELAYER_NOT_AVAILABLE);
|
|
18
|
+
let D = await c(l, C, f, a[f][C], p, T[0], d[0], d[1], T[1], m, w, E, !0), O = _ ?? await i(C, g, T, t.Emporium, D.map((e) => o(e, w, C)), 35n), k = u.map((e, t) => ({
|
|
18
19
|
token: e,
|
|
19
|
-
amount:
|
|
20
|
-
}));
|
|
21
|
-
return
|
|
20
|
+
amount: d[t]
|
|
21
|
+
})), A = x && S !== void 0 ? await s(C, x, S, O) : O;
|
|
22
|
+
return l.actionPrivateWallet(C, [], [], [], D, k, h, g, A, E, v, y, b, void 0);
|
|
22
23
|
};
|
|
23
24
|
//#endregion
|
|
24
|
-
export {
|
|
25
|
+
export { l as hinkalProxySwap };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../constants/protocol.constants.cjs`);const e=require(`../../error-handling/error-codes.constants.cjs`),t=require(`../../functions/utils/addresses.cjs`),n=require(`../../types/external-action.types.cjs`),r=require(`../../functions/utils/token-check.utils.cjs`),i=require(`../../functions/pre-transaction/getVolatileTransferAmount.cjs`),a=require(`../AccountActions/AccountActions.cjs`),o=require(`../../functions/pre-transaction/getFeeStructure.cjs`),s=require(`../../functions/private-wallet/emporium.helpers.cjs`),c=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),l=require(`../../functions/utils/fees.utils.cjs`);var u=async(u,d,f,p,m,h,g,_)=>{if(!g)throw Error(`hinkalProxyToPrivate: subAccount should be provided`);if(!m)throw Error(`Fee token is required in hinkalProxyToPrivate`);if(!t.isValidPrivateAddress(p))throw Error(e.transactionErrorCodes.RECIPIENT_FORMAT_INCORRECT);let v=r.validateAndGetChainId(d),y=a.AccountActions.getAddressFromSubAccount(v,g);if(!y)throw Error(`Public account address is not available`);let b=d.map(e=>e.erc20TokenAddress),x=await i.modifyVolatileTokenAmountChanges(v,d,f,y),S=s.createTransaferEmporiumOpsBatch(u,v,b,x),C=await l.calculateModifiedFeeStructureForTokens(v,d,x,h??await o.getFeeStructure(v,m,b,n.ExternalActionId.Emporium,S.map(e=>c.convertEmporiumOpToCallInfo(e,y,v)),
|
|
1
|
+
require(`../../constants/protocol.constants.cjs`);const e=require(`../../error-handling/error-codes.constants.cjs`),t=require(`../../functions/utils/addresses.cjs`),n=require(`../../types/external-action.types.cjs`),r=require(`../../functions/utils/token-check.utils.cjs`),i=require(`../../functions/pre-transaction/getVolatileTransferAmount.cjs`),a=require(`../AccountActions/AccountActions.cjs`),o=require(`../../functions/pre-transaction/getFeeStructure.cjs`),s=require(`../../functions/private-wallet/emporium.helpers.cjs`),c=require(`../../functions/utils/convertEmporiumOpToCallInfo.cjs`),l=require(`../../functions/utils/fees.utils.cjs`);var u=async(u,d,f,p,m,h,g,_)=>{if(!g)throw Error(`hinkalProxyToPrivate: subAccount should be provided`);if(!m)throw Error(`Fee token is required in hinkalProxyToPrivate`);if(!t.isValidPrivateAddress(p))throw Error(e.transactionErrorCodes.RECIPIENT_FORMAT_INCORRECT);let v=r.validateAndGetChainId(d),y=a.AccountActions.getAddressFromSubAccount(v,g);if(!y)throw Error(`Public account address is not available`);let b=d.map(e=>e.erc20TokenAddress),x=await i.modifyVolatileTokenAmountChanges(v,d,f,y),S=s.createTransaferEmporiumOpsBatch(u,v,b,x),C=await l.calculateModifiedFeeStructureForTokens(v,d,x,h??await o.getFeeStructure(v,m,b,n.ExternalActionId.Emporium,S.map(e=>c.convertEmporiumOpToCallInfo(e,y,v)),25n)),w=d.map((e,t)=>({token:e,amount:-1n*x[t]}));return u.actionPrivateWallet(v,[d[0]],[0n],[!1],S,w,g,m,C,void 0,void 0,void 0,_,{recipientInfo:p,amount:x[0],token:d[0]})};exports.hinkalProxyToPrivate=u;
|
|
@@ -16,7 +16,7 @@ var u = async (u, d, f, p, m, h, g, _) => {
|
|
|
16
16
|
if (!t(p)) throw Error(e.RECIPIENT_FORMAT_INCORRECT);
|
|
17
17
|
let v = r(d), y = a.getAddressFromSubAccount(v, g);
|
|
18
18
|
if (!y) throw Error("Public account address is not available");
|
|
19
|
-
let b = d.map((e) => e.erc20TokenAddress), x = await i(v, d, f, y), S = s(u, v, b, x), C = await l(v, d, x, h ?? await o(v, m, b, n.Emporium, S.map((e) => c(e, y, v)),
|
|
19
|
+
let b = d.map((e) => e.erc20TokenAddress), x = await i(v, d, f, y), S = s(u, v, b, x), C = await l(v, d, x, h ?? await o(v, m, b, n.Emporium, S.map((e) => c(e, y, v)), 25n)), w = d.map((e, t) => ({
|
|
20
20
|
token: e,
|
|
21
21
|
amount: -1n * x[t]
|
|
22
22
|
}));
|