@gurge/sdk 0.3.26 → 0.3.27
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/common/src/crypto/rnUtxoCrypto.cjs +1 -1
- package/common/src/crypto/rnUtxoCrypto.d.ts +11 -0
- package/common/src/crypto/rnUtxoCrypto.mjs +46 -12
- package/common/src/data-structures/Hinkal/handleAutoDepositBack.cjs +1 -1
- package/common/src/data-structures/Hinkal/handleAutoDepositBack.mjs +9 -9
- package/common/src/data-structures/Hinkal/hinkalClaimUtxo.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalClaimUtxo.mjs +6 -6
- package/common/src/data-structures/Hinkal/hinkalDepositAndBridge.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalDepositAndBridge.mjs +18 -18
- package/common/src/data-structures/Hinkal/hinkalDepositAndWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalDepositAndWithdraw.mjs +17 -17
- package/common/src/data-structures/Hinkal/hinkalPrivateWallet.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalPrivateWallet.mjs +13 -13
- package/common/src/data-structures/Hinkal/hinkalSolanaClaimUtxo.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaClaimUtxo.mjs +11 -11
- package/common/src/data-structures/Hinkal/hinkalSolanaDeposit.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaDeposit.mjs +14 -14
- package/common/src/data-structures/Hinkal/hinkalSolanaDepositAndWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaDepositAndWithdraw.mjs +51 -51
- package/common/src/data-structures/Hinkal/hinkalSolanaSwap.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaSwap.mjs +51 -51
- package/common/src/data-structures/Hinkal/hinkalSolanaTransfer.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaTransfer.mjs +20 -20
- package/common/src/data-structures/Hinkal/hinkalSolanaWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalSolanaWithdraw.mjs +19 -19
- package/common/src/data-structures/Hinkal/hinkalTransfer.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalTransfer.mjs +9 -9
- package/common/src/data-structures/Hinkal/hinkalWithdraw.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalWithdraw.mjs +12 -12
- package/common/src/data-structures/Hinkal/hinkalWithdrawStuckUtxos.cjs +1 -1
- package/common/src/data-structures/Hinkal/hinkalWithdrawStuckUtxos.mjs +33 -33
- package/common/src/data-structures/crypto-keys/decodeUTXO.cjs +1 -1
- package/common/src/data-structures/crypto-keys/decodeUTXO.mjs +7 -7
- package/common/src/data-structures/crypto-keys/encryptDecryptUtxo.cjs +1 -1
- package/common/src/data-structures/crypto-keys/encryptDecryptUtxo.mjs +1 -1
- package/common/src/functions/index.cjs +1 -1
- package/common/src/functions/index.mjs +3 -3
- package/common/src/functions/pre-transaction/buildCommitmentValidationData.cjs +1 -1
- package/common/src/functions/pre-transaction/buildCommitmentValidationData.mjs +13 -13
- package/common/src/functions/private-wallet/emporium.swap.helpers.cjs +1 -1
- package/common/src/functions/private-wallet/emporium.swap.helpers.mjs +14 -14
- package/common/src/functions/snarkjs/common.snarkjs.cjs +1 -1
- package/common/src/functions/snarkjs/common.snarkjs.mjs +7 -7
- package/common/src/functions/snarkjs/constructGeneralZkProof.cjs +1 -1
- package/common/src/functions/snarkjs/constructGeneralZkProof.mjs +77 -76
- package/common/src/functions/snarkjs/constructSolanaZkProof.cjs +1 -1
- package/common/src/functions/snarkjs/constructSolanaZkProof.mjs +60 -60
- package/common/src/functions/snarkjs/verifyCommitmentValidationData.cjs +1 -1
- package/common/src/functions/snarkjs/verifyCommitmentValidationData.mjs +1 -1
- package/common/src/functions/utils/buildClaimableDepositPlan.cjs +1 -1
- package/common/src/functions/utils/buildClaimableDepositPlan.mjs +1 -1
- package/common/src/functions/utils/getUtxosFromReceipt.utils.cjs +1 -1
- package/common/src/functions/utils/getUtxosFromReceipt.utils.mjs +1 -1
- package/common/src/functions/utils/getUtxosFromReceiptSolana.cjs +1 -1
- package/common/src/functions/utils/getUtxosFromReceiptSolana.mjs +4 -4
- package/common/src/functions/utils/index.cjs +1 -1
- package/common/src/functions/utils/index.mjs +2 -2
- package/common/src/functions/web3/events/getInputUtxoAndBalance.cjs +1 -1
- package/common/src/functions/web3/events/getInputUtxoAndBalance.mjs +81 -80
- package/common/src/functions/web3/functionCalls/transactCallRelayer.cjs +1 -1
- package/common/src/functions/web3/functionCalls/transactCallRelayer.mjs +42 -42
- package/common/src/types/index.cjs +1 -1
- package/common/src/types/index.mjs +1 -1
- package/common/src/webworker/cryptoWorker/cryptoWorker.types.cjs +1 -1
- package/common/src/webworker/cryptoWorker/cryptoWorker.types.d.ts +3 -1
- package/common/src/webworker/cryptoWorker/cryptoWorker.types.mjs +1 -1
- package/common/src/webworker/logError-Dy_GXEF5.js +2 -0
- package/common/src/webworker/package.json +1 -1
- 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 +4 -4
- package/common/src/webworker/viteWorkerURL.constant.mjs +4 -4
- 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/sdk/package.json.cjs +1 -1
- package/sdk/package.json.mjs +1 -1
- package/common/src/webworker/logError-DFS-H2t0.js +0 -2
|
@@ -3,19 +3,19 @@ import { HINKAL_PRIVATE_SEND_VARIABLE_RATE as t, solanaNativeAddress as n } from
|
|
|
3
3
|
import { transactionErrorCodes as r } from "../../error-handling/error-codes.constants.mjs";
|
|
4
4
|
import { randomBigInt as i } from "../../functions/web3/etherFunctions.mjs";
|
|
5
5
|
import { UserKeys as a } from "../crypto-keys/keys.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { ExternalActionId as o } from "../../types/external-action.types.mjs";
|
|
7
|
+
import { calcEncryptedOutputs as s } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
8
|
+
import { getCurrentTimeInSeconds as c } from "../../functions/utils/time.utils.mjs";
|
|
9
|
+
import { Utxo as l } from "../utxo/Utxo.mjs";
|
|
9
10
|
import "../../types/index.mjs";
|
|
10
|
-
import { validateAndGetChainId as
|
|
11
|
-
import { calcEncryptedOutputs as u } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
11
|
+
import { validateAndGetChainId as u } from "../../functions/utils/token-check.utils.mjs";
|
|
12
12
|
import { getFeeStructure as d } from "../../functions/pre-transaction/getFeeStructure.mjs";
|
|
13
13
|
import { constructSolanaZkProof as f } from "../../functions/snarkjs/constructSolanaZkProof.mjs";
|
|
14
14
|
import { solanaTransactCallRelayer as p } from "../../functions/web3/functionCalls/transactCallRelayer.mjs";
|
|
15
15
|
import { ethers as m } from "ethers";
|
|
16
16
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalSolanaClaimUtxo.ts
|
|
17
17
|
var h = async (h, g, _, v, y) => {
|
|
18
|
-
let b =
|
|
18
|
+
let b = u([g]), x = g.erc20TokenAddress;
|
|
19
19
|
if (_.getTokenAddress(b) !== x) throw Error("Off-chain UTXO token mismatch");
|
|
20
20
|
let S = y ? new a(y) : new a(_.nullifyingKey, _.nullifyingKey);
|
|
21
21
|
if (!_.nullifyingKey && !y) throw Error("Claimable UTXO nullifyingKey is missing");
|
|
@@ -23,7 +23,7 @@ var h = async (h, g, _, v, y) => {
|
|
|
23
23
|
if (_.nullifyingKey && _.nullifyingKey !== C) throw Error("Claimable UTXO key mismatch");
|
|
24
24
|
let { originalDeployer: w } = e[b].contractData;
|
|
25
25
|
if (!w) throw Error("missing data");
|
|
26
|
-
let T =
|
|
26
|
+
let T = l.createFrom(_, { nullifyingKey: C }), E = v ?? await d(b, x, [x], o.Transact, void 0, void 0, {
|
|
27
27
|
mintTo: x,
|
|
28
28
|
nullifierCount: 1
|
|
29
29
|
});
|
|
@@ -34,7 +34,7 @@ var h = async (h, g, _, v, y) => {
|
|
|
34
34
|
if (A <= 0n) throw Error(r.RECIPIENT_AMOUNT_INVALID);
|
|
35
35
|
let j = E.flatFee + k, [M, N, P, , F] = h.getRecipientInfo().split(",");
|
|
36
36
|
if (!N || !P || !M || !F) throw Error("Invalid recipient info");
|
|
37
|
-
let I =
|
|
37
|
+
let I = c().toString(), L = new l({
|
|
38
38
|
amount: 0n,
|
|
39
39
|
erc20TokenAddress: T.erc20TokenAddress,
|
|
40
40
|
mintAddress: T.mintAddress,
|
|
@@ -43,7 +43,7 @@ var h = async (h, g, _, v, y) => {
|
|
|
43
43
|
spendingPublicKey: S.getSpendingKeyPair().pubSpendingBJJPoint,
|
|
44
44
|
isNewStyle: !0
|
|
45
45
|
} : { isNewStyle: !1 }
|
|
46
|
-
}), R = new
|
|
46
|
+
}), R = new l({
|
|
47
47
|
amount: 0n,
|
|
48
48
|
erc20TokenAddress: T.erc20TokenAddress,
|
|
49
49
|
mintAddress: T.mintAddress,
|
|
@@ -51,7 +51,7 @@ var h = async (h, g, _, v, y) => {
|
|
|
51
51
|
timeStamp: I,
|
|
52
52
|
spendingPublicKey: S.getSpendingKeyPair().pubSpendingBJJPoint,
|
|
53
53
|
isNewStyle: !0
|
|
54
|
-
}), z = new
|
|
54
|
+
}), z = new l({
|
|
55
55
|
amount: A,
|
|
56
56
|
erc20TokenAddress: T.erc20TokenAddress,
|
|
57
57
|
mintAddress: T.mintAddress,
|
|
@@ -66,7 +66,7 @@ var h = async (h, g, _, v, y) => {
|
|
|
66
66
|
tokenNumber: 1,
|
|
67
67
|
nullifierAmount: B.length,
|
|
68
68
|
outputAmount: V.length
|
|
69
|
-
}, G =
|
|
69
|
+
}, G = s([V])[0].map((e) => Array.from(m.getBytes(e))), { proofAArr: K, proofBArr: q, proofCArr: J, publicInputsArr: Y, commitmentValidationData: X } = await f(h.generateProofRemotely, h.merkleTreeHinkalByChain[b], S, [x], [B], [V], U, j, 0n, n, H, W, G, b), Z = {
|
|
70
70
|
recipient: H,
|
|
71
71
|
mint: x === "11111111111111111111111111111111" ? void 0 : x
|
|
72
72
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../functions/
|
|
1
|
+
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../functions/snarkjs/common.snarkjs.cjs`),o=require(`../../functions/utils/solanaMint.utils.cjs`),s=require(`../../functions/utils/addresses.cjs`),c=require(`../../functions/utils/token-check.utils.cjs`),l=require(`../../functions/pre-transaction/solana.cjs`),u=require(`../../functions/pre-transaction/constructAdminData.cjs`),d=require(`../../error-handling/retrySolanaError.cjs`),f=require(`../../API/admin-calls.cjs`),p=require(`../../functions/pre-transaction/solanaTransfer.utils.cjs`),m=require(`./hinkalProoflessDeposit.utils.cjs`);let h=require(`@solana/web3.js`),g=require(`@coral-xyz/anchor`);var _=(n,r)=>{let i=c.validateAndGetChainId([r]),a=r.erc20TokenAddress,{hinkalIdl:s,hinkalAddress:u,originalDeployer:d}=e.networkRegistry[i].contractData;if(!s)throw Error(`No IDL configured for Solana program on this network`);if(!d)throw Error(`missing original deployer`);let f=n.getSolanaProgram(s),p=n.getSolanaPublicKey(),{connection:m,wallet:g}=f.provider;if(!g)throw Error(`missing solana wallet`);let _=new h.PublicKey(d),v=new h.PublicKey(u),{mintPublicKey:y}=o.formatMintAddress(a),b=y.toString()===t.solanaNativeAddress;return{chainId:i,mintAddress:a,program:f,publicKey:p,connection:m,wallet:g,originalDeployer:_,mintPublicKey:y,mint:b?null:y,atasValue:b?null:void 0,storageAccount:l.getStorageAccountPublicKey(v,_),storageVault:l.getStorageVaultPublicKey(v,_),merkleAccount:l.getMerkleAccountPublicKey(v,_)}},v=(e,t,n)=>{let r=n.map(e=>l.buildAnchorStealthAddressStructure(e));return e.program.methods.multiPaymentDeposit(t.map(e=>new g.BN(e.toString())),r,!1).accounts({mint:e.mint,signer:e.publicKey,signerAta:e.atasValue,originalDeployer:e.originalDeployer,storageAccount:e.storageAccount,storageVault:e.storageVault,merkleAccount:e.merkleAccount,storageVaultAta:e.atasValue}).instruction()},y=async(e,t,n,r)=>{for(let i=0;i<10;i+=1){let a=i===9;try{let{blockhash:i,lastValidBlockHeight:a}=await e.getLatestBlockhash(),o=new h.VersionedTransaction(new h.TransactionMessage({payerKey:n,recentBlockhash:i,instructions:r}).compileToV0Message()),s=await t.signTransaction(o),c=await e.sendTransaction(s);return await e.confirmTransaction({signature:c,blockhash:i,lastValidBlockHeight:a},`confirmed`),c}catch(e){if(d.shouldRetryForSolanaError(e)&&!a)continue;throw e}}return``},b=(e,t)=>{if(e.length===0)throw Error(`amounts must not be empty`);if(e.length!==t.length)throw Error(`amounts and stealthAddressStructures length mismatch`);if(e.some(e=>e<=0n))throw Error(`all amounts must be positive`);m.assertNoDuplicateStealthAddressStructures(t)},x=async(e,t,n,r,i,a=!1)=>{b(n,r);let o=_(e,t),s=u.constructAdminData(i,o.chainId,Array(n.length).fill(o.mintAddress),n,await e.getEthereumAddress()),c=await v(o,n,r);if(a){let{blockhash:e}=await o.connection.getLatestBlockhash(),t=new h.Transaction().add(c);return t.recentBlockhash=e,t.feePayer=o.publicKey,Buffer.from(t.serialize({requireAllSignatures:!1})).toString(`base64`)}let l=await y(o.connection,o.wallet,o.publicKey,[c]);return await f.emitTxPublicData(s),l},S=async(e,t,n,r,i,a)=>{b(n,r);let o=_(e,t),s=await e.getRandomRelay(o.chainId,!1);if(!s)throw Error(`No relay available for chainId ${o.chainId}`);let{instructions:c}=await p.buildSolanaTransferInstructions(o.connection,o.publicKey,new h.PublicKey(s),t,i),l=await v(o,n,r),d=u.constructAdminData(a,o.chainId,Array(n.length).fill(o.mintAddress),n,await e.getEthereumAddress()),m=await y(o.connection,o.wallet,o.publicKey,[...c,l]);return await f.emitTxPublicData(d),m},C=async(e,t,n,o=!1)=>{let s=e.userKeys.getShieldedPrivateKey(),c=a.calcStealthAddressStructure(i.UserKeys.findCorrectRandomization(r.randomBigInt(31),s),s,e.userKeys.getSpendingKeyPair().pubSpendingBJJPoint);return x(e,n,[t],[c],void 0,o)},w=async(e,t,r,i,a=!1,o)=>{if(!s.isValidPrivateAddress(i))throw Error(n.transactionErrorCodes.RECIPIENT_FORMAT_INCORRECT);let c=s.constructStealthAddressStructure(i);return x(e,r,[t],[c],o,a)};exports.hinkalSolanaDeposit=C,exports.hinkalSolanaDepositForOther=w,exports.hinkalSolanaProoflessDepositWithPublicFee=S,exports.submitSolanaProoflessDeposit=x;
|
|
@@ -3,10 +3,10 @@ import { solanaNativeAddress as t } from "../../constants/protocol.constants.mjs
|
|
|
3
3
|
import { transactionErrorCodes as n } from "../../error-handling/error-codes.constants.mjs";
|
|
4
4
|
import { randomBigInt as r } from "../../functions/web3/etherFunctions.mjs";
|
|
5
5
|
import { UserKeys as i } from "../crypto-keys/keys.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { calcStealthAddressStructure as a } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
7
|
+
import { formatMintAddress as o } from "../../functions/utils/solanaMint.utils.mjs";
|
|
8
|
+
import { constructStealthAddressStructure as s, isValidPrivateAddress as c } from "../../functions/utils/addresses.mjs";
|
|
9
|
+
import { validateAndGetChainId as l } from "../../functions/utils/token-check.utils.mjs";
|
|
10
10
|
import { buildAnchorStealthAddressStructure as u, getMerkleAccountPublicKey as d, getStorageAccountPublicKey as f, getStorageVaultPublicKey as p } from "../../functions/pre-transaction/solana.mjs";
|
|
11
11
|
import { constructAdminData as m } from "../../functions/pre-transaction/constructAdminData.mjs";
|
|
12
12
|
import { shouldRetryForSolanaError as h } from "../../error-handling/retrySolanaError.mjs";
|
|
@@ -17,15 +17,15 @@ import { PublicKey as y, Transaction as b, TransactionMessage as x, VersionedTra
|
|
|
17
17
|
import { BN as C } from "@coral-xyz/anchor";
|
|
18
18
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalSolanaDeposit.ts
|
|
19
19
|
var w = (n, r) => {
|
|
20
|
-
let i =
|
|
20
|
+
let i = l([r]), a = r.erc20TokenAddress, { hinkalIdl: s, hinkalAddress: c, originalDeployer: u } = e[i].contractData;
|
|
21
21
|
if (!s) throw Error("No IDL configured for Solana program on this network");
|
|
22
22
|
if (!u) throw Error("missing original deployer");
|
|
23
23
|
let m = n.getSolanaProgram(s), h = n.getSolanaPublicKey(), { connection: g, wallet: _ } = m.provider;
|
|
24
24
|
if (!_) throw Error("missing solana wallet");
|
|
25
|
-
let v = new y(u), b = new y(
|
|
25
|
+
let v = new y(u), b = new y(c), { mintPublicKey: x } = o(a), S = x.toString() === t;
|
|
26
26
|
return {
|
|
27
27
|
chainId: i,
|
|
28
|
-
mintAddress:
|
|
28
|
+
mintAddress: a,
|
|
29
29
|
program: m,
|
|
30
30
|
publicKey: h,
|
|
31
31
|
connection: g,
|
|
@@ -90,13 +90,13 @@ var w = (n, r) => {
|
|
|
90
90
|
if (!s) throw Error(`No relay available for chainId ${o.chainId}`);
|
|
91
91
|
let { instructions: c } = await _(o.connection, o.publicKey, new y(s), t, i), l = await T(o, n, r), u = m(a, o.chainId, Array(n.length).fill(o.mintAddress), n, await e.getEthereumAddress()), d = await E(o.connection, o.wallet, o.publicKey, [...c, l]);
|
|
92
92
|
return await g(u), d;
|
|
93
|
-
}, A = async (e, t, n,
|
|
94
|
-
let
|
|
95
|
-
return O(e, n, [t], [
|
|
96
|
-
}, j = async (e, t, r, i, a = !1,
|
|
97
|
-
if (!
|
|
98
|
-
let l =
|
|
99
|
-
return O(e, r, [t], [l],
|
|
93
|
+
}, A = async (e, t, n, o = !1) => {
|
|
94
|
+
let s = e.userKeys.getShieldedPrivateKey(), c = a(i.findCorrectRandomization(r(31), s), s, e.userKeys.getSpendingKeyPair().pubSpendingBJJPoint);
|
|
95
|
+
return O(e, n, [t], [c], void 0, o);
|
|
96
|
+
}, j = async (e, t, r, i, a = !1, o) => {
|
|
97
|
+
if (!c(i)) throw Error(n.RECIPIENT_FORMAT_INCORRECT);
|
|
98
|
+
let l = s(i);
|
|
99
|
+
return O(e, r, [t], [l], o, a);
|
|
100
100
|
};
|
|
101
101
|
//#endregion
|
|
102
102
|
export { A as hinkalSolanaDeposit, j as hinkalSolanaDepositForOther, k as hinkalSolanaProoflessDepositWithPublicFee, O as submitSolanaProoflessDeposit };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../
|
|
1
|
+
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../types/external-action.types.cjs`),o=require(`../../functions/snarkjs/common.snarkjs.cjs`),s=require(`../../functions/utils/time.utils.cjs`),c=require(`../utxo/Utxo.cjs`),l=require(`../../types/scheduled-transactions.types.cjs`);require(`../../types/index.cjs`);const u=require(`../../functions/utils/solanaMint.utils.cjs`),d=require(`../../functions/utils/addresses.cjs`),f=require(`../../functions/utils/token-check.utils.cjs`),p=require(`../../functions/pre-transaction/solana.cjs`),m=require(`../../functions/pre-transaction/constructAdminData.cjs`),h=require(`../../functions/pre-transaction/sendV0Transaction.cjs`),g=require(`../../functions/pre-transaction/getFeeStructure.cjs`),_=require(`../../functions/pre-transaction/waitForDepositedUtxosInMerkleTree.cjs`);require(`../../functions/pre-transaction/index.cjs`);const v=require(`../../functions/utils/getUtxosFromReceiptSolana.cjs`),y=require(`../../functions/utils/fees.utils.cjs`);require(`../../functions/web3/index.cjs`);const b=require(`../../functions/snarkjs/constructSolanaZkProof.cjs`),x=require(`../../functions/web3/functionCalls/transactCallRelayer.cjs`),S=require(`../../API/deposit-and-withdraw-status-calls.cjs`);require(`../../functions/index.cjs`);let C=require(`ethers`),w=require(`@solana/web3.js`),T=require(`@coral-xyz/anchor`);var E=(n,a,s,c)=>{let{hinkalIdl:l,hinkalAddress:d,originalDeployer:f}=e.networkRegistry[a].contractData;if(!l)throw Error(`No IDL configured for Solana program on this network`);if(!f)throw Error(`missing original deployer`);let m=n.userKeys.getShieldedPrivateKey(),h=n.getSolanaProgram(l),g=n.getSolanaPublicKey(),_=new w.PublicKey(f),v=new w.PublicKey(d),{mintPublicKey:y}=u.formatMintAddress(s.erc20TokenAddress),b=y.toString(),x=p.getStorageAccountPublicKey(v,_),S=p.getStorageVaultPublicKey(v,_),C=p.getMerkleAccountPublicKey(v,_),T=c.map(()=>p.buildAnchorStealthAddressStructure(o.calcStealthAddressStructure(i.UserKeys.findCorrectRandomization(r.randomBigInt(31),m),m,n.userKeys.getSpendingKeyPair().pubSpendingBJJPoint))),E=b===t.solanaNativeAddress;return{program:h,publicKey:g,originalDeployer:_,mint:E?null:y,atasValue:E?null:void 0,storageAccount:x,storageVault:S,merkleAccount:C,amounts:c,anchorStealthStructures:T}},D=e=>e.program.methods.multiPaymentDeposit(e.amounts.map(e=>new T.BN(e.toString())),e.anchorStealthStructures,!0).accounts({mint:e.mint,signer:e.publicKey,signerAta:e.atasValue,originalDeployer:e.originalDeployer,storageAccount:e.storageAccount,storageVault:e.storageVault,merkleAccount:e.merkleAccount,storageVaultAta:e.atasValue}),O=async(e,t,n,r,i,a,o)=>{let s=r.map(e=>e+y.calculateTotalFee(e,a)),c=E(e,t,n,s),d=(await S.updateDepositAndWithdrawStatus({chainId:t,hashedEthereumAddress:o,phase:l.DepositAndWithdrawPhase.BEFORE_DEPOSIT})).id??void 0,f=await D(c).rpc(),p=await c.program.provider.connection.getLatestBlockhash();await c.program.provider.connection.confirmTransaction({blockhash:p.blockhash,lastValidBlockHeight:p.lastValidBlockHeight,signature:f},`finalized`);let m=await h.fetchSolanaTransaction(c.program.provider.connection,f,`finalized`);if(!m)throw Error(`Transaction missing`);await S.safeUpdateDepositAndWithdrawStatus({id:d,chainId:t,hashedEthereumAddress:o,phase:l.DepositAndWithdrawPhase.AFTER_DEPOSIT,depositTxHash:f});let{compressedAddress:g}=u.formatMintAddress(n.erc20TokenAddress),_=v.getOnChainUtxosFromReceiptSolana(m,c.program,e.userKeys,g),b=[],x=[..._];return i.forEach((e,t)=>{let n=s[t],r=x.find(e=>e.amount===n);if(!r)throw Error(`Could not find newly created UTXO with amount ${n} for recipient ${e}.`);b.push({recipientAddress:e,utxo:r}),x.splice(x.indexOf(r),1)}),{userDepositedUtxos:b,depositTxHash:f,statusId:d}},k=async(a,d,f,p,h,g,_,v,w,T,E,D,O)=>{let k=f.erc20TokenAddress;if(p.length===0)throw Error(`userDepositedUtxos must not be empty`);let{originalDeployer:A}=e.networkRegistry[d].contractData;if(!A)throw Error(`missing data`);let j=await a.getRandomRelay(d,!0);if(!j)throw Error(n.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let M=s.getCurrentTimeInSeconds().toString(),N=a.generateProofRemotely?5:1,P=[];for(let e=0;e<p.length;e+=N){let n=p.slice(e,e+N),s=await Promise.all(n.map(async({recipientAddress:e,utxo:n},s)=>{let{compressedAddress:l}=u.formatMintAddress(t.solanaNativeAddress),p=new c.Utxo({amount:0n,mintAddress:k,erc20TokenAddress:l,nullifyingKey:a.userKeys.getShieldedPrivateKey(),timeStamp:M,...n.isNewStyle?{spendingPublicKey:a.userKeys.getSpendingKeyPair().pubSpendingBJJPoint,isNewStyle:!0}:{isNewStyle:!1}}),g=[n,p],v=[p],x=i.UserKeys.findCorrectRandomization(r.randomBigInt(31),a.userKeys.getShieldedPrivateKey()),S={tokenNumber:1,nullifierAmount:g.length,outputAmount:v.length},w=o.calcEncryptedOutputs([v])[0][0],T=Array.from(C.ethers.getBytes(w)),D=await y.calculateModifiedFeeStructure(d,f,_[s],h),A=m.constructAdminData(E,d,[k],[_[s]],await a.getEthereumAddress()),{proofAArr:N,proofBArr:P,proofCArr:F,publicInputsArr:I,commitmentValidationData:L}=await b.constructSolanaZkProof(a.generateProofRemotely,a.merkleTreeHinkalByChain[d],a.userKeys,[k],[g],[v],x,D.flatFee,D.variableRate,e,j,S,[T],d),R={recipient:e,mint:k===`11111111111111111111111111111111`?void 0:k};return{relayAddress:j,functionName:`transact`,chainId:d,recipientAmount:_[s].toString(),args:{proofAArr:N,proofBArr:P,proofCArr:F,publicInputsArr:I,encryptedOutputs:[T],relayerFee:D.flatFee.toString(),dimensions:S},accounts:R,adminData:A,commitmentValidationData:L,displayRecipient:O?.[s]}}));P.push(...s)}await S.safeUpdateDepositAndWithdrawStatus({id:v,chainId:d,hashedEthereumAddress:g,phase:l.DepositAndWithdrawPhase.BEFORE_SCHEDULE_WITHDRAW});let F=await x.solanaTransactCallRelayerBatch(d,P,g,w,T,D);return await S.safeUpdateDepositAndWithdrawStatus({id:v,chainId:d,hashedEthereumAddress:g,phase:l.DepositAndWithdrawPhase.AFTER_SCHEDULE_WITHDRAW,scheduleId:F}),F},A=async(e,t,n,r,i,o,s,c,l,u)=>{let p=f.validateAndGetChainId([t]),m=t.erc20TokenAddress,h=d.hashEthereumAddress(await e.getEthereumAddressByChain(p)),v=l?d.hashString(l):void 0,y=o??await g.getFeeStructure(p,m,[m],a.ExternalActionId.Transact,[],5n),{userDepositedUtxos:b,depositTxHash:x,statusId:S}=await O(e,p,t,n,r,y,h);return await _.waitForDepositedUtxosInMerkleTree(e,p,b),{depositTxHash:x,scheduleId:await k(e,p,t,b,y,h,n,S,i,s,c,v,u)}};exports.hinkalSolanaDepositAndWithdraw=A;
|
|
@@ -3,15 +3,15 @@ import { solanaNativeAddress as t } from "../../constants/protocol.constants.mjs
|
|
|
3
3
|
import { transactionErrorCodes as n } from "../../error-handling/error-codes.constants.mjs";
|
|
4
4
|
import { randomBigInt as r } from "../../functions/web3/etherFunctions.mjs";
|
|
5
5
|
import { UserKeys as i } from "../crypto-keys/keys.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import { ExternalActionId as a } from "../../types/external-action.types.mjs";
|
|
7
|
+
import { calcEncryptedOutputs as o, calcStealthAddressStructure as s } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
8
|
+
import { getCurrentTimeInSeconds as c } from "../../functions/utils/time.utils.mjs";
|
|
9
|
+
import { Utxo as l } from "../utxo/Utxo.mjs";
|
|
10
|
+
import { DepositAndWithdrawPhase as u } from "../../types/scheduled-transactions.types.mjs";
|
|
10
11
|
import "../../types/index.mjs";
|
|
11
|
-
import { formatMintAddress as
|
|
12
|
-
import { hashEthereumAddress as
|
|
13
|
-
import { validateAndGetChainId as
|
|
14
|
-
import { calcEncryptedOutputs as p, calcStealthAddressStructure as m } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
12
|
+
import { formatMintAddress as d } from "../../functions/utils/solanaMint.utils.mjs";
|
|
13
|
+
import { hashEthereumAddress as f, hashString as p } from "../../functions/utils/addresses.mjs";
|
|
14
|
+
import { validateAndGetChainId as m } from "../../functions/utils/token-check.utils.mjs";
|
|
15
15
|
import { buildAnchorStealthAddressStructure as h, getMerkleAccountPublicKey as g, getStorageAccountPublicKey as _, getStorageVaultPublicKey as v } from "../../functions/pre-transaction/solana.mjs";
|
|
16
16
|
import { constructAdminData as y } from "../../functions/pre-transaction/constructAdminData.mjs";
|
|
17
17
|
import { fetchSolanaTransaction as b } from "../../functions/pre-transaction/sendV0Transaction.mjs";
|
|
@@ -29,13 +29,13 @@ import { ethers as A } from "ethers";
|
|
|
29
29
|
import { PublicKey as j } from "@solana/web3.js";
|
|
30
30
|
import { BN as M } from "@coral-xyz/anchor";
|
|
31
31
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalSolanaDepositAndWithdraw.ts
|
|
32
|
-
var N = (n, a, o,
|
|
33
|
-
let { hinkalIdl:
|
|
34
|
-
if (!
|
|
35
|
-
if (!
|
|
36
|
-
let
|
|
32
|
+
var N = (n, a, o, c) => {
|
|
33
|
+
let { hinkalIdl: l, hinkalAddress: u, originalDeployer: f } = e[a].contractData;
|
|
34
|
+
if (!l) throw Error("No IDL configured for Solana program on this network");
|
|
35
|
+
if (!f) throw Error("missing original deployer");
|
|
36
|
+
let p = n.userKeys.getShieldedPrivateKey(), m = n.getSolanaProgram(l), y = n.getSolanaPublicKey(), b = new j(f), x = new j(u), { mintPublicKey: S } = d(o.erc20TokenAddress), C = S.toString(), w = _(x, b), T = v(x, b), E = g(x, b), D = c.map(() => h(s(i.findCorrectRandomization(r(31), p), p, n.userKeys.getSpendingKeyPair().pubSpendingBJJPoint))), O = C === t;
|
|
37
37
|
return {
|
|
38
|
-
program:
|
|
38
|
+
program: m,
|
|
39
39
|
publicKey: y,
|
|
40
40
|
originalDeployer: b,
|
|
41
41
|
mint: O ? null : S,
|
|
@@ -43,7 +43,7 @@ var N = (n, a, o, s) => {
|
|
|
43
43
|
storageAccount: w,
|
|
44
44
|
storageVault: T,
|
|
45
45
|
merkleAccount: E,
|
|
46
|
-
amounts:
|
|
46
|
+
amounts: c,
|
|
47
47
|
anchorStealthStructures: D
|
|
48
48
|
};
|
|
49
49
|
}, P = (e) => e.program.methods.multiPaymentDeposit(e.amounts.map((e) => new M(e.toString())), e.anchorStealthStructures, !0).accounts({
|
|
@@ -56,26 +56,26 @@ var N = (n, a, o, s) => {
|
|
|
56
56
|
merkleAccount: e.merkleAccount,
|
|
57
57
|
storageVaultAta: e.atasValue
|
|
58
58
|
}), F = async (e, t, n, r, i, a, o) => {
|
|
59
|
-
let s = r.map((e) => e + T(e, a)),
|
|
59
|
+
let s = r.map((e) => e + T(e, a)), c = N(e, t, n, s), l = (await k({
|
|
60
60
|
chainId: t,
|
|
61
61
|
hashedEthereumAddress: o,
|
|
62
|
-
phase:
|
|
63
|
-
})).id ?? void 0, f = await P(
|
|
64
|
-
await
|
|
62
|
+
phase: u.BEFORE_DEPOSIT
|
|
63
|
+
})).id ?? void 0, f = await P(c).rpc(), p = await c.program.provider.connection.getLatestBlockhash();
|
|
64
|
+
await c.program.provider.connection.confirmTransaction({
|
|
65
65
|
blockhash: p.blockhash,
|
|
66
66
|
lastValidBlockHeight: p.lastValidBlockHeight,
|
|
67
67
|
signature: f
|
|
68
68
|
}, "finalized");
|
|
69
|
-
let m = await b(
|
|
69
|
+
let m = await b(c.program.provider.connection, f, "finalized");
|
|
70
70
|
if (!m) throw Error("Transaction missing");
|
|
71
71
|
await O({
|
|
72
|
-
id:
|
|
72
|
+
id: l,
|
|
73
73
|
chainId: t,
|
|
74
74
|
hashedEthereumAddress: o,
|
|
75
|
-
phase:
|
|
75
|
+
phase: u.AFTER_DEPOSIT,
|
|
76
76
|
depositTxHash: f
|
|
77
77
|
});
|
|
78
|
-
let { compressedAddress: h } =
|
|
78
|
+
let { compressedAddress: h } = d(n.erc20TokenAddress), g = C(m, c.program, e.userKeys, h), _ = [], v = [...g];
|
|
79
79
|
return i.forEach((e, t) => {
|
|
80
80
|
let n = s[t], r = v.find((e) => e.amount === n);
|
|
81
81
|
if (!r) throw Error(`Could not find newly created UTXO with amount ${n} for recipient ${e}.`);
|
|
@@ -86,41 +86,41 @@ var N = (n, a, o, s) => {
|
|
|
86
86
|
}), {
|
|
87
87
|
userDepositedUtxos: _,
|
|
88
88
|
depositTxHash: f,
|
|
89
|
-
statusId:
|
|
89
|
+
statusId: l
|
|
90
90
|
};
|
|
91
|
-
}, I = async (
|
|
92
|
-
let T =
|
|
93
|
-
if (
|
|
94
|
-
let { originalDeployer: k } = e[
|
|
91
|
+
}, I = async (a, s, f, p, m, h, g, _, v, b, x, S, C) => {
|
|
92
|
+
let T = f.erc20TokenAddress;
|
|
93
|
+
if (p.length === 0) throw Error("userDepositedUtxos must not be empty");
|
|
94
|
+
let { originalDeployer: k } = e[s].contractData;
|
|
95
95
|
if (!k) throw Error("missing data");
|
|
96
|
-
let j = await
|
|
96
|
+
let j = await a.getRandomRelay(s, !0);
|
|
97
97
|
if (!j) throw Error(n.RELAYER_NOT_AVAILABLE);
|
|
98
|
-
let M =
|
|
99
|
-
for (let e = 0; e <
|
|
100
|
-
let n =
|
|
101
|
-
let { compressedAddress:
|
|
98
|
+
let M = c().toString(), N = a.generateProofRemotely ? 5 : 1, P = [];
|
|
99
|
+
for (let e = 0; e < p.length; e += N) {
|
|
100
|
+
let n = p.slice(e, e + N), c = await Promise.all(n.map(async ({ recipientAddress: e, utxo: n }, c) => {
|
|
101
|
+
let { compressedAddress: u } = d(t), p = new l({
|
|
102
102
|
amount: 0n,
|
|
103
103
|
mintAddress: T,
|
|
104
|
-
erc20TokenAddress:
|
|
105
|
-
nullifyingKey:
|
|
104
|
+
erc20TokenAddress: u,
|
|
105
|
+
nullifyingKey: a.userKeys.getShieldedPrivateKey(),
|
|
106
106
|
timeStamp: M,
|
|
107
107
|
...n.isNewStyle ? {
|
|
108
|
-
spendingPublicKey:
|
|
108
|
+
spendingPublicKey: a.userKeys.getSpendingKeyPair().pubSpendingBJJPoint,
|
|
109
109
|
isNewStyle: !0
|
|
110
110
|
} : { isNewStyle: !1 }
|
|
111
|
-
}), h = [n,
|
|
111
|
+
}), h = [n, p], _ = [p], v = i.findCorrectRandomization(r(31), a.userKeys.getShieldedPrivateKey()), b = {
|
|
112
112
|
tokenNumber: 1,
|
|
113
113
|
nullifierAmount: h.length,
|
|
114
114
|
outputAmount: _.length
|
|
115
|
-
}, S =
|
|
115
|
+
}, S = o([_])[0][0], D = Array.from(A.getBytes(S)), O = await w(s, f, g[c], m), k = y(x, s, [T], [g[c]], await a.getEthereumAddress()), { proofAArr: N, proofBArr: P, proofCArr: F, publicInputsArr: I, commitmentValidationData: L } = await E(a.generateProofRemotely, a.merkleTreeHinkalByChain[s], a.userKeys, [T], [h], [_], v, O.flatFee, O.variableRate, e, j, b, [D], s), R = {
|
|
116
116
|
recipient: e,
|
|
117
117
|
mint: T === "11111111111111111111111111111111" ? void 0 : T
|
|
118
118
|
};
|
|
119
119
|
return {
|
|
120
120
|
relayAddress: j,
|
|
121
121
|
functionName: "transact",
|
|
122
|
-
chainId:
|
|
123
|
-
recipientAmount: g[
|
|
122
|
+
chainId: s,
|
|
123
|
+
recipientAmount: g[c].toString(),
|
|
124
124
|
args: {
|
|
125
125
|
proofAArr: N,
|
|
126
126
|
proofBArr: P,
|
|
@@ -133,30 +133,30 @@ var N = (n, a, o, s) => {
|
|
|
133
133
|
accounts: R,
|
|
134
134
|
adminData: k,
|
|
135
135
|
commitmentValidationData: L,
|
|
136
|
-
displayRecipient: C?.[
|
|
136
|
+
displayRecipient: C?.[c]
|
|
137
137
|
};
|
|
138
138
|
}));
|
|
139
|
-
P.push(...
|
|
139
|
+
P.push(...c);
|
|
140
140
|
}
|
|
141
141
|
await O({
|
|
142
142
|
id: _,
|
|
143
|
-
chainId:
|
|
143
|
+
chainId: s,
|
|
144
144
|
hashedEthereumAddress: h,
|
|
145
|
-
phase:
|
|
145
|
+
phase: u.BEFORE_SCHEDULE_WITHDRAW
|
|
146
146
|
});
|
|
147
|
-
let F = await D(
|
|
147
|
+
let F = await D(s, P, h, v, b, S);
|
|
148
148
|
return await O({
|
|
149
149
|
id: _,
|
|
150
|
-
chainId:
|
|
150
|
+
chainId: s,
|
|
151
151
|
hashedEthereumAddress: h,
|
|
152
|
-
phase:
|
|
152
|
+
phase: u.AFTER_SCHEDULE_WITHDRAW,
|
|
153
153
|
scheduleId: F
|
|
154
154
|
}), F;
|
|
155
|
-
}, L = async (e, t, n, r, i,
|
|
156
|
-
let
|
|
157
|
-
return await S(e,
|
|
155
|
+
}, L = async (e, t, n, r, i, o, s, c, l, u) => {
|
|
156
|
+
let d = m([t]), h = t.erc20TokenAddress, g = f(await e.getEthereumAddressByChain(d)), _ = l ? p(l) : void 0, v = o ?? await x(d, h, [h], a.Transact, [], 5n), { userDepositedUtxos: y, depositTxHash: b, statusId: C } = await F(e, d, t, n, r, v, g);
|
|
157
|
+
return await S(e, d, y), {
|
|
158
158
|
depositTxHash: b,
|
|
159
|
-
scheduleId: await I(e,
|
|
159
|
+
scheduleId: await I(e, d, t, y, v, g, n, C, i, s, c, _, u)
|
|
160
160
|
};
|
|
161
161
|
};
|
|
162
162
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../
|
|
1
|
+
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../types/external-action.types.cjs`),o=require(`../../functions/snarkjs/common.snarkjs.cjs`),s=require(`../../functions/utils/time.utils.cjs`),c=require(`../../types/cache.types.cjs`);require(`../../types/index.cjs`);const l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../../functions/web3/events/getShieldedBalance.cjs`),d=require(`../../functions/pre-transaction/outputUtxoProcessing.cjs`),f=require(`../../functions/pre-transaction/solana.cjs`),p=require(`../../functions/pre-transaction/constructAdminData.cjs`),ee=require(`../../functions/pre-transaction/convert-okx-instructions.cjs`),m=require(`../../functions/pre-transaction/ensureAmountChanges.cjs`),h=require(`../../functions/pre-transaction/getFeeStructure.cjs`),g=require(`../../functions/snarkjs/constructSolanaZkProof.cjs`),_=require(`../../functions/web3/functionCalls/transactCallRelayer.cjs`);let v=require(`ethers`),y=require(`@solana/web3.js`);var b=async(e,t,n,r)=>{let i=[...await u.addPaddingToUtxos(e,t,n,r,6)],a=s.getCurrentTimeInSeconds().toString(),o=[];for(let t=0;t<n.length;t+=1){let{outputUtxos:n}=await d.outputUtxoProcessing(e.userKeys,i[t],r[t],a);o.push([n[0]])}return{inputUtxosArray:i,outputUtxosArray:o}},x=async(s,u,d,x,te,S,C,w,T)=>{let E=l.validateAndGetChainId(u),D=new y.PublicKey(t.solanaNativeAddress),{hinkalAddress:ne,originalDeployer:O}=e.networkRegistry[E].contractData;if(!O)throw Error(`No IDL configured for Solana program on this network`);let k=new y.PublicKey(O),A=new y.PublicKey(ne),j=u.map(e=>e.erc20TokenAddress),{userKeys:M,merkleTreeHinkalByChain:N}=s,P=w??await h.getFeeStructure(E,C,j,a.ExternalActionId.Transact),F=d[1],I=Number(s.cacheDevice.get(c.StorageKeys.SLIPPAGE_PERCENTAGE)??0),L=u[1],R=r.getAmountInToken(L,F),z=Number(R)*I/100;d[1]-=r.getAmountInWei(L,z.toFixed(L.decimals));let B=F*BigInt(P.variableRate??0)/10000n+P.flatFee;if(d[1]-=B,d[1]<0)throw Error(n.transactionErrorCodes.LOW_OUTPUT_AMOUNT);let V=P.variableRate.toString(),[H,U,{inputUtxosArray:W,outputUtxosArray:G}]=await Promise.all([s.getRandomRelay(E,!0),s.getEthereumAddressByChain(E),b(s,E,j,d)]);if(!H)throw Error(n.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let K=s.userKeys.getShieldedPrivateKey(),q=i.UserKeys.findCorrectRandomization(r.randomBigInt(31),K),J={tokenNumber:2,nullifierAmount:W[0].length,outputAmount:1},Y=o.calcEncryptedOutputs(G).map(e=>[...v.ethers.getBytes(e[0])]),X=f.getSwapperAccountPublicKeyFromSalt(A,k,x),{remainingAccounts:Z,hinkalInstructions:Q}=ee.convertOKXToHinkalInstructions(te,X);m.ensureAmountChanges(W,G,d);let{proofAArr:re,proofBArr:ie,proofCArr:ae,publicInputsArr:oe,commitmentValidationData:$}=await g.constructSolanaZkProof(s.generateProofRemotely,N[E],M,j,W,G,q,P.flatFee,P.variableRate,D.toString(),H,J,Y,E,Q,Z,x),se=f.getStorageAccountPublicKey(A,k),ce=f.getStorageVaultPublicKey(A,k),le=u[0].erc20TokenAddress===`11111111111111111111111111111111`?null:new y.PublicKey(u[0].erc20TokenAddress),ue=u[1].erc20TokenAddress===`11111111111111111111111111111111`?null:new y.PublicKey(u[1].erc20TokenAddress),de={recipient:D.toString(),storageAccount:se.toString(),storageVault:ce.toString(),swapperAccount:X.toString(),mintFrom:le?.toString()??null,mintTo:ue?.toString()??null,remainingAccounts:Z.map(e=>({pubkey:e.pubkey.toString(),isSigner:e.isSigner,isWritable:e.isWritable})),addressLookupTableAccount:S};return _.solanaTransactCallRelayer({chainId:E,relayAddress:H,functionName:`swap`,args:{encryptedOutputs:Y,proofAArr:re,proofBArr:ie,proofCArr:ae,publicInputsArr:oe,relayerFee:P.flatFee.toString(),variableRate:V,dimensions:J,hinkalInstructions:Q.map(e=>({accountIndexes:[...e.accountIndexes],data:[...e.data],programIndex:e.programIndex}))},accounts:de,commitmentValidationData:$,adminData:p.constructAdminData(T,E,j,d,U,u)})};exports.hinkalSolanaSwap=x;
|
|
@@ -3,81 +3,81 @@ import { solanaNativeAddress as t } from "../../constants/protocol.constants.mjs
|
|
|
3
3
|
import { transactionErrorCodes as n } from "../../error-handling/error-codes.constants.mjs";
|
|
4
4
|
import { getAmountInToken as r, getAmountInWei as i, randomBigInt as a } from "../../functions/web3/etherFunctions.mjs";
|
|
5
5
|
import { UserKeys as o } from "../crypto-keys/keys.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { ExternalActionId as s } from "../../types/external-action.types.mjs";
|
|
7
|
+
import { calcEncryptedOutputs as c } from "../../functions/snarkjs/common.snarkjs.mjs";
|
|
8
|
+
import { getCurrentTimeInSeconds as l } from "../../functions/utils/time.utils.mjs";
|
|
9
|
+
import { StorageKeys as u } from "../../types/cache.types.mjs";
|
|
9
10
|
import "../../types/index.mjs";
|
|
10
|
-
import { validateAndGetChainId as
|
|
11
|
-
import { addPaddingToUtxos as
|
|
12
|
-
import { outputUtxoProcessing as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import { PublicKey as S } from "@solana/web3.js";
|
|
11
|
+
import { validateAndGetChainId as d } from "../../functions/utils/token-check.utils.mjs";
|
|
12
|
+
import { addPaddingToUtxos as f } from "../../functions/web3/events/getShieldedBalance.mjs";
|
|
13
|
+
import { outputUtxoProcessing as p } from "../../functions/pre-transaction/outputUtxoProcessing.mjs";
|
|
14
|
+
import { getStorageAccountPublicKey as ee, getStorageVaultPublicKey as m, getSwapperAccountPublicKeyFromSalt as h } from "../../functions/pre-transaction/solana.mjs";
|
|
15
|
+
import { constructAdminData as g } from "../../functions/pre-transaction/constructAdminData.mjs";
|
|
16
|
+
import { convertOKXToHinkalInstructions as _ } from "../../functions/pre-transaction/convert-okx-instructions.mjs";
|
|
17
|
+
import { ensureAmountChanges as v } from "../../functions/pre-transaction/ensureAmountChanges.mjs";
|
|
18
|
+
import { getFeeStructure as y } from "../../functions/pre-transaction/getFeeStructure.mjs";
|
|
19
|
+
import { constructSolanaZkProof as b } from "../../functions/snarkjs/constructSolanaZkProof.mjs";
|
|
20
|
+
import { solanaTransactCallRelayer as x } from "../../functions/web3/functionCalls/transactCallRelayer.mjs";
|
|
21
|
+
import { ethers as S } from "ethers";
|
|
22
|
+
import { PublicKey as C } from "@solana/web3.js";
|
|
23
23
|
//#region libs/shared/common/src/data-structures/Hinkal/hinkalSolanaSwap.ts
|
|
24
|
-
var
|
|
25
|
-
let i = [...await
|
|
24
|
+
var te = async (e, t, n, r) => {
|
|
25
|
+
let i = [...await f(e, t, n, r, 6)], a = l().toString(), o = [];
|
|
26
26
|
for (let t = 0; t < n.length; t += 1) {
|
|
27
|
-
let { outputUtxos: n } = await
|
|
27
|
+
let { outputUtxos: n } = await p(e.userKeys, i[t], r[t], a);
|
|
28
28
|
o.push([n[0]]);
|
|
29
29
|
}
|
|
30
30
|
return {
|
|
31
31
|
inputUtxosArray: i,
|
|
32
32
|
outputUtxosArray: o
|
|
33
33
|
};
|
|
34
|
-
},
|
|
35
|
-
let
|
|
36
|
-
if (!
|
|
37
|
-
let
|
|
38
|
-
|
|
39
|
-
let
|
|
40
|
-
if (
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
}, w = async (l, f, p, w, ne, re, ie, T, E) => {
|
|
35
|
+
let D = d(f), O = new C(t), { hinkalAddress: k, originalDeployer: A } = e[D].contractData;
|
|
36
|
+
if (!A) throw Error("No IDL configured for Solana program on this network");
|
|
37
|
+
let j = new C(A), M = new C(k), N = f.map((e) => e.erc20TokenAddress), { userKeys: P, merkleTreeHinkalByChain: F } = l, I = T ?? await y(D, ie, N, s.Transact), L = p[1], R = Number(l.cacheDevice.get(u.SLIPPAGE_PERCENTAGE) ?? 0), z = f[1], B = r(z, L), V = Number(B) * R / 100;
|
|
38
|
+
p[1] -= i(z, V.toFixed(z.decimals));
|
|
39
|
+
let H = L * BigInt(I.variableRate ?? 0) / 10000n + I.flatFee;
|
|
40
|
+
if (p[1] -= H, p[1] < 0) throw Error(n.LOW_OUTPUT_AMOUNT);
|
|
41
|
+
let U = I.variableRate.toString(), [W, ae, { inputUtxosArray: G, outputUtxosArray: K }] = await Promise.all([
|
|
42
|
+
l.getRandomRelay(D, !0),
|
|
43
|
+
l.getEthereumAddressByChain(D),
|
|
44
|
+
te(l, D, N, p)
|
|
45
45
|
]);
|
|
46
|
-
if (!
|
|
47
|
-
let
|
|
46
|
+
if (!W) throw Error(n.RELAYER_NOT_AVAILABLE);
|
|
47
|
+
let q = l.userKeys.getShieldedPrivateKey(), J = o.findCorrectRandomization(a(31), q), Y = {
|
|
48
48
|
tokenNumber: 2,
|
|
49
|
-
nullifierAmount:
|
|
49
|
+
nullifierAmount: G[0].length,
|
|
50
50
|
outputAmount: 1
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
let { proofAArr:
|
|
54
|
-
recipient:
|
|
51
|
+
}, X = c(K).map((e) => [...S.getBytes(e[0])]), Z = h(M, j, w), { remainingAccounts: Q, hinkalInstructions: $ } = _(ne, Z);
|
|
52
|
+
v(G, K, p);
|
|
53
|
+
let { proofAArr: oe, proofBArr: se, proofCArr: ce, publicInputsArr: le, commitmentValidationData: ue } = await b(l.generateProofRemotely, F[D], P, N, G, K, J, I.flatFee, I.variableRate, O.toString(), W, Y, X, D, $, Q, w), de = ee(M, j), fe = m(M, j), pe = f[0].erc20TokenAddress === "11111111111111111111111111111111" ? null : new C(f[0].erc20TokenAddress), me = f[1].erc20TokenAddress === "11111111111111111111111111111111" ? null : new C(f[1].erc20TokenAddress), he = {
|
|
54
|
+
recipient: O.toString(),
|
|
55
55
|
storageAccount: de.toString(),
|
|
56
56
|
storageVault: fe.toString(),
|
|
57
|
-
swapperAccount:
|
|
57
|
+
swapperAccount: Z.toString(),
|
|
58
58
|
mintFrom: pe?.toString() ?? null,
|
|
59
59
|
mintTo: me?.toString() ?? null,
|
|
60
|
-
remainingAccounts:
|
|
60
|
+
remainingAccounts: Q.map((e) => ({
|
|
61
61
|
pubkey: e.pubkey.toString(),
|
|
62
62
|
isSigner: e.isSigner,
|
|
63
63
|
isWritable: e.isWritable
|
|
64
64
|
})),
|
|
65
|
-
addressLookupTableAccount:
|
|
65
|
+
addressLookupTableAccount: re
|
|
66
66
|
};
|
|
67
|
-
return
|
|
68
|
-
chainId:
|
|
69
|
-
relayAddress:
|
|
67
|
+
return x({
|
|
68
|
+
chainId: D,
|
|
69
|
+
relayAddress: W,
|
|
70
70
|
functionName: "swap",
|
|
71
71
|
args: {
|
|
72
|
-
encryptedOutputs:
|
|
73
|
-
proofAArr:
|
|
72
|
+
encryptedOutputs: X,
|
|
73
|
+
proofAArr: oe,
|
|
74
74
|
proofBArr: se,
|
|
75
75
|
proofCArr: ce,
|
|
76
76
|
publicInputsArr: le,
|
|
77
|
-
relayerFee:
|
|
78
|
-
variableRate:
|
|
79
|
-
dimensions:
|
|
80
|
-
hinkalInstructions:
|
|
77
|
+
relayerFee: I.flatFee.toString(),
|
|
78
|
+
variableRate: U,
|
|
79
|
+
dimensions: Y,
|
|
80
|
+
hinkalInstructions: $.map((e) => ({
|
|
81
81
|
accountIndexes: [...e.accountIndexes],
|
|
82
82
|
data: [...e.data],
|
|
83
83
|
programIndex: e.programIndex
|
|
@@ -85,8 +85,8 @@ var ne = async (e, t, n, r) => {
|
|
|
85
85
|
},
|
|
86
86
|
accounts: he,
|
|
87
87
|
commitmentValidationData: ue,
|
|
88
|
-
adminData:
|
|
88
|
+
adminData: g(E, D, N, p, ae, f)
|
|
89
89
|
});
|
|
90
90
|
};
|
|
91
91
|
//#endregion
|
|
92
|
-
export {
|
|
92
|
+
export { w as hinkalSolanaSwap };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../functions/
|
|
1
|
+
require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants/chains.constants.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../error-handling/error-codes.constants.cjs`),r=require(`../../functions/web3/etherFunctions.cjs`),i=require(`../crypto-keys/keys.cjs`),a=require(`../../types/external-action.types.cjs`),o=require(`../../functions/snarkjs/common.snarkjs.cjs`),s=require(`../../functions/utils/time.utils.cjs`);require(`../../types/index.cjs`);const c=require(`../../functions/utils/addresses.cjs`),l=require(`../../functions/utils/token-check.utils.cjs`),u=require(`../../functions/web3/events/getShieldedBalance.cjs`),d=require(`../../functions/pre-transaction/outputUtxoProcessing.cjs`),f=require(`../../functions/pre-transaction/constructAdminData.cjs`),p=require(`../../functions/pre-transaction/ensureAmountChanges.cjs`),m=require(`../../functions/pre-transaction/getFeeStructure.cjs`);require(`../../functions/pre-transaction/index.cjs`);const h=require(`../../functions/utils/fees.utils.cjs`),g=require(`../../functions/snarkjs/constructSolanaZkProof.cjs`),_=require(`../../functions/web3/functionCalls/transactCallRelayer.cjs`);let v=require(`ethers`);var y=async(e,t,n,r,i,a)=>{let o=(await u.addPaddingToUtxos(e,t,n,r,6))[0],c=s.getCurrentTimeInSeconds().toString(),{outputUtxos:l}=await d.outputUtxoProcessing(e.userKeys,o,r[0],c,!0,i,a);return{inputUtxos:o,senderUtxo:l[0],recipientUtxo:l[1]}},b=async(s,u,d,_,b,x,S)=>{if(!c.isValidPrivateAddress(_))throw Error(n.transactionErrorCodes.RECIPIENT_FORMAT_INCORRECT);let C=l.validateAndGetChainId(u),w=[...d],{originalDeployer:T}=e.networkRegistry[C].contractData;if(!T)throw Error(`missing data`);let{userKeys:E,merkleTreeHinkalByChain:D}=s,O=u.map(e=>e.erc20TokenAddress);if(O.length>1)throw Error(`Solana Transfer: Only one mint address is supported`);let k=x??await m.getFeeStructure(C,b,O,a.ExternalActionId.Transact,[],5n);k.variableRate||=t.HINKAL_PRIVATE_SEND_VARIABLE_RATE;let A=h.calculateTotalFee(-w[0],k),j=-w[0];w[0]-=A;let[M,N,{inputUtxos:P,senderUtxo:F,recipientUtxo:I}]=await Promise.all([s.getRandomRelay(C,!0),s.getEthereumAddressByChain(C),y(s,C,O,w,_,j)]);if(!M)throw Error(n.transactionErrorCodes.RELAYER_NOT_AVAILABLE);let L=i.UserKeys.findCorrectRandomization(r.randomBigInt(31),s.userKeys.getShieldedPrivateKey()),R={tokenNumber:O.length,nullifierAmount:P.length,outputAmount:2},z=o.calcEncryptedOutputs([[F,I]])[0].map(e=>Array.from(v.ethers.getBytes(e)));p.ensureAmountChanges([P],[[F]],w);let{proofAArr:B,proofBArr:V,proofCArr:H,publicInputsArr:U,commitmentValidationData:W}=await g.constructSolanaZkProof(s.generateProofRemotely,D[C],E,[O[0]],[P],[[F,I]],L,A,0n,t.solanaNativeAddress,M,R,z,C),G={recipient:M,mint:O[0]===`11111111111111111111111111111111`?void 0:O[0]};return{chainId:C,relay:M,args:{proofAArr:B,proofBArr:V,proofCArr:H,publicInputsArr:U,encryptedOutputs:z,relayerFee:A.toString(),dimensions:R},accounts:G,adminData:f.constructAdminData(S,C,O,w,N),commitmentValidationData:W,recipientUtxo:I}},x=async(e,t,n,r,i,a,o,s=!1)=>{if(s)throw Error(`onlyGasEstimate is not supported for Solana transfer`);let c=await b(e,t,n,r,i,a,o);return _.solanaTransactCallRelayer({chainId:c.chainId,relayAddress:c.relay,functionName:`transfer`,args:c.args,accounts:c.accounts,adminData:c.adminData,commitmentValidationData:c.commitmentValidationData})};exports.hinkalSolanaTransfer=x;
|