@smithii_io/mixoor 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.js +6 -26
- package/dist/src/index.js.map +1 -1
- package/dist/src/index.mjs +6 -26
- package/dist/src/index.mjs.map +1 -1
- package/dist/test/_setup.js +35 -20
- package/dist/test/_setup.js.map +1 -1
- package/dist/test/{transfer.test.js → _transferSol.test.js} +19 -15
- package/dist/test/_transferSol.test.js.map +1 -0
- package/dist/test/transferSpl.test.js +111 -0
- package/dist/test/transferSpl.test.js.map +1 -0
- package/dist/types/src/generated/instructions/transfer.d.ts.map +1 -1
- package/dist/types/test/_setup.d.ts +12 -4
- package/dist/types/test/_setup.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/test/transfer.test.js.map +0 -1
package/dist/test/_setup.js
CHANGED
|
@@ -7,6 +7,7 @@ var os = require('os');
|
|
|
7
7
|
var path = require('path');
|
|
8
8
|
var crypto = require('crypto');
|
|
9
9
|
var src = require('../src');
|
|
10
|
+
var token = require('@solana-program/token');
|
|
10
11
|
var _constants = require('./_constants');
|
|
11
12
|
|
|
12
13
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -84,12 +85,12 @@ async function loadRelayerKeypair() {
|
|
|
84
85
|
return await loadKeypairFromFile("~/.config/solana/relayer.json");
|
|
85
86
|
}
|
|
86
87
|
const getTokenBalance = async (client, tokenAccount) => (await client.rpc.getTokenAccountBalance(tokenAccount, { commitment: "confirmed" }).send()).value;
|
|
87
|
-
const
|
|
88
|
+
const createPoolForAuthority = async (client, mint, assetType) => {
|
|
88
89
|
const [authority] = await Promise.all([loadDefaultKeypair()]);
|
|
89
90
|
const createIx = await src.getInitializePoolInstructionAsync({
|
|
90
91
|
authority,
|
|
91
|
-
mint
|
|
92
|
-
assetType
|
|
92
|
+
mint,
|
|
93
|
+
assetType
|
|
93
94
|
});
|
|
94
95
|
await kit.pipe(
|
|
95
96
|
await createDefaultTransaction(client, authority),
|
|
@@ -98,11 +99,13 @@ const createSolPoolForAuthority = async (client) => {
|
|
|
98
99
|
);
|
|
99
100
|
return { authority: authority.address };
|
|
100
101
|
};
|
|
101
|
-
const
|
|
102
|
+
const depositForAuthority = async (client, ixArgs) => {
|
|
102
103
|
const [authority] = await Promise.all([loadDefaultKeypair()]);
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
const { merkleTree, amount, mint, vaultTokenAccount, pool } = ixArgs;
|
|
105
|
+
const [depositorTokenAccount] = await token.findAssociatedTokenPda({
|
|
106
|
+
owner: authority.address,
|
|
107
|
+
tokenProgram: token.TOKEN_PROGRAM_ADDRESS,
|
|
108
|
+
mint
|
|
106
109
|
});
|
|
107
110
|
const secret = crypto.randomBytes(32);
|
|
108
111
|
const nullifier = crypto.randomBytes(32);
|
|
@@ -115,7 +118,9 @@ const depositSolPoolForAuthority = async (client, amount, assetType, merkleTree)
|
|
|
115
118
|
amount,
|
|
116
119
|
commitment,
|
|
117
120
|
newRoot,
|
|
118
|
-
mint
|
|
121
|
+
mint,
|
|
122
|
+
depositorTokenAccount,
|
|
123
|
+
vaultTokenAccount
|
|
119
124
|
});
|
|
120
125
|
await kit.pipe(
|
|
121
126
|
await createDefaultTransaction(client, authority),
|
|
@@ -139,14 +144,21 @@ const transferForAuthority = async (client, ixArgs) => {
|
|
|
139
144
|
relayerFee,
|
|
140
145
|
recipientAmount,
|
|
141
146
|
nullifierHash,
|
|
142
|
-
|
|
147
|
+
pool,
|
|
143
148
|
mint,
|
|
144
149
|
publicInputs,
|
|
145
|
-
proofData: { proofA, proofB, proofC }
|
|
150
|
+
proofData: { proofA, proofB, proofC },
|
|
151
|
+
vaultTokenAccount
|
|
146
152
|
} = ixArgs;
|
|
147
|
-
const [
|
|
148
|
-
|
|
149
|
-
|
|
153
|
+
const [recipientTokenAccount] = await token.findAssociatedTokenPda({
|
|
154
|
+
owner: recipient.address,
|
|
155
|
+
tokenProgram: token.TOKEN_PROGRAM_ADDRESS,
|
|
156
|
+
mint
|
|
157
|
+
});
|
|
158
|
+
const [feeCollectorTokenAccount] = await token.findAssociatedTokenPda({
|
|
159
|
+
owner: _constants.FEE_COLLECTOR_ADDRESS,
|
|
160
|
+
tokenProgram: token.TOKEN_PROGRAM_ADDRESS,
|
|
161
|
+
mint
|
|
150
162
|
});
|
|
151
163
|
const transferIx = await src.getTransferInstructionAsync({
|
|
152
164
|
relayer,
|
|
@@ -159,26 +171,29 @@ const transferForAuthority = async (client, ixArgs) => {
|
|
|
159
171
|
publicInputs,
|
|
160
172
|
recipientAmount,
|
|
161
173
|
relayerFee,
|
|
162
|
-
mint
|
|
174
|
+
mint,
|
|
175
|
+
recipientTokenAccount,
|
|
176
|
+
feeCollectorTokenAccount,
|
|
177
|
+
vaultTokenAccount
|
|
163
178
|
});
|
|
164
179
|
await kit.pipe(
|
|
165
180
|
await createDefaultTransaction(client, relayer),
|
|
166
181
|
(tx) => kit.appendTransactionMessageInstruction(transferIx, tx),
|
|
167
182
|
(tx) => kit.appendTransactionMessageInstructions(
|
|
168
|
-
[computeBudget.getSetComputeUnitLimitInstruction({ units:
|
|
183
|
+
[computeBudget.getSetComputeUnitLimitInstruction({ units: 23e4 })],
|
|
169
184
|
tx
|
|
170
185
|
),
|
|
171
186
|
(tx) => signAndSendTransaction(client, tx)
|
|
172
187
|
);
|
|
173
188
|
return { relayer: relayer.address };
|
|
174
189
|
};
|
|
175
|
-
const updatePoolForRelayer = async (client, root, assetType) => {
|
|
190
|
+
const updatePoolForRelayer = async (client, root, assetType, mint) => {
|
|
176
191
|
const [relayer] = await Promise.all([loadDefaultKeypair()]);
|
|
177
192
|
const [pool] = await src.findPoolAddress({
|
|
178
|
-
mint
|
|
193
|
+
mint,
|
|
179
194
|
assetType
|
|
180
195
|
});
|
|
181
|
-
const updateRootIx =
|
|
196
|
+
const updateRootIx = src.getUpdateRootInstruction({
|
|
182
197
|
pool,
|
|
183
198
|
root
|
|
184
199
|
});
|
|
@@ -196,8 +211,8 @@ exports.airdropSolToAddress = airdropSolToAddress;
|
|
|
196
211
|
exports.createDefaultSolanaClient = createDefaultSolanaClient;
|
|
197
212
|
exports.createDefaultTransaction = createDefaultTransaction;
|
|
198
213
|
exports.createDevnetClient = createDevnetClient;
|
|
199
|
-
exports.
|
|
200
|
-
exports.
|
|
214
|
+
exports.createPoolForAuthority = createPoolForAuthority;
|
|
215
|
+
exports.depositForAuthority = depositForAuthority;
|
|
201
216
|
exports.generateKeyPairSignerWithSol = generateKeyPairSignerWithSol;
|
|
202
217
|
exports.getBalance = getBalance;
|
|
203
218
|
exports.getTokenBalance = getTokenBalance;
|
package/dist/test/_setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../test/_setup.ts"],"names":["createSolanaRpc","createSolanaRpcSubscriptions","generateKeyPairSigner","airdropFactory","lamports","path","os","fs","createKeyPairSignerFromBytes","pipe","createTransactionMessage","setTransactionMessageFeePayerSigner","setTransactionMessageLifetimeUsingBlockhash","signTransactionMessageWithSigners","assertIsSendableTransaction","getSignatureFromTransaction","assertIsTransactionWithBlockhashLifetime","sendAndConfirmTransactionFactory","getInitializePoolInstructionAsync","WRAPPED_SOL_MINT_TOKEN_PROGRAM","AssetType","appendTransactionMessageInstruction","findPoolAddress","randomBytes","generateCommitment","getDepositInstructionAsync","getTransferInstructionAsync","appendTransactionMessageInstructions","getSetComputeUnitLimitInstruction","getUpdateRootInstruction"],"mappings":"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","file":"_setup.js","sourcesContent":["import { getSetComputeUnitLimitInstruction } from '@solana-program/compute-budget';\nimport {\n Address,\n airdropFactory,\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n assertIsSendableTransaction,\n assertIsTransactionWithBlockhashLifetime,\n Commitment,\n createKeyPairSignerFromBytes,\n createSolanaRpc,\n createSolanaRpcSubscriptions,\n createTransactionMessage,\n generateKeyPairSigner,\n getSignatureFromTransaction,\n KeyPairSigner,\n lamports,\n pipe,\n Rpc,\n RpcSubscriptions,\n sendAndConfirmTransactionFactory,\n setTransactionMessageFeePayerSigner,\n setTransactionMessageLifetimeUsingBlockhash,\n signTransactionMessageWithSigners,\n SolanaRpcApi,\n SolanaRpcSubscriptionsApi,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionSigner,\n} from '@solana/kit';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { randomBytes } from 'crypto';\nimport {\n AssetType,\n findPoolAddress,\n generateCommitment,\n getDepositInstructionAsync,\n getInitializePoolInstructionAsync,\n getTransferInstructionAsync,\n getUpdateRootInstruction,\n MerkleTree,\n ProofData,\n} from '../src';\nimport { WRAPPED_SOL_MINT_TOKEN_PROGRAM } from './_constants';\n\nexport type Client = {\n rpc: Rpc<SolanaRpcApi>;\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n};\n\nexport const createDefaultSolanaClient = (): Client => {\n const rpc = createSolanaRpc('http://127.0.0.1:8899');\n const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n return { rpc, rpcSubscriptions };\n};\n\nexport const createDevnetClient = (): Client => {\n const rpc = createSolanaRpc('https://api.devnet.solana.com');\n const rpcSubscriptions = createSolanaRpcSubscriptions(\n 'wss://api.devnet.solana.com/'\n );\n\n return { rpc, rpcSubscriptions };\n};\n\nexport const generateKeyPairSignerWithSol = async (\n client: Client,\n putativeLamports: bigint = 1_000_000_000n\n) => {\n const signer = await generateKeyPairSigner();\n await airdropFactory(client)({\n recipientAddress: signer.address,\n lamports: lamports(putativeLamports),\n commitment: 'confirmed',\n });\n return signer;\n};\n\nexport const airdropSolToAddress = async (\n client: Client,\n receiver: Address, // 5 sol\n putativeLamports: bigint = 5_000_000_000n // 5 sol\n) => {\n await airdropFactory(client)({\n recipientAddress: receiver,\n lamports: lamports(putativeLamports),\n commitment: 'confirmed',\n });\n};\n\nexport async function loadKeypairFromFile(\n filePath: string\n): Promise<KeyPairSigner<string>> {\n // This is here so you can also load the default keypair from the file system.\n const resolvedPath = path.resolve(\n filePath.startsWith('~') ? filePath.replace('~', os.homedir()) : filePath\n );\n const loadedKeyBytes = Uint8Array.from(\n JSON.parse(fs.readFileSync(resolvedPath, 'utf8'))\n );\n // Here you can also set the second parameter to true in case you need to extract your private key.\n const keypairSigner = await createKeyPairSignerFromBytes(loadedKeyBytes);\n return keypairSigner;\n}\n\nexport const createDefaultTransaction = async (\n client: Client,\n feePayer: TransactionSigner\n) => {\n const { value: latestBlockhash } = await client.rpc\n .getLatestBlockhash()\n .send();\n return pipe(\n createTransactionMessage({ version: 0 }),\n (tx) => setTransactionMessageFeePayerSigner(feePayer, tx),\n (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx)\n );\n};\n\nexport const signAndSendTransaction = async (\n client: Client,\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n // & TransactionMessageWithLifetime,\n commitment: Commitment = 'finalized'\n) => {\n const signedTransaction =\n await signTransactionMessageWithSigners(transactionMessage);\n assertIsSendableTransaction(signedTransaction);\n\n const signature = getSignatureFromTransaction(signedTransaction);\n\n assertIsTransactionWithBlockhashLifetime(signedTransaction);\n await sendAndConfirmTransactionFactory(client)(signedTransaction, {\n commitment,\n skipPreflight: true,\n });\n\n console.log('[DEBUG;] le signature ->', signature, '\\n'); // ! debug\n return signature;\n};\n\nexport const getBalance = async (client: Client, address: Address) =>\n (await client.rpc.getBalance(address, { commitment: 'confirmed' }).send())\n .value;\n\nexport async function loadDefaultKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/id.json');\n}\n\nexport async function loadReceiverKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/id-new.json');\n}\n\nexport async function loadRelayerKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/relayer.json');\n}\n\nexport const getTokenBalance = async (client: Client, tokenAccount: Address) =>\n (\n await client.rpc\n .getTokenAccountBalance(tokenAccount, { commitment: 'confirmed' })\n .send()\n ).value;\n\n// -------------------------------------------------- instructions\n\nexport const createSolPoolForAuthority = async (\n client: Client\n // merkleTree?: Address\n): Promise<{ authority: Address }> => {\n const [authority] = await Promise.all([loadDefaultKeypair()]);\n\n const createIx = await getInitializePoolInstructionAsync({\n authority,\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n assetType: AssetType.Sol,\n });\n\n await pipe(\n await createDefaultTransaction(client, authority),\n (tx) => appendTransactionMessageInstruction(createIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return { authority: authority.address };\n};\n\nexport const depositSolPoolForAuthority = async (\n client: Client,\n amount: bigint,\n assetType: AssetType,\n merkleTree: MerkleTree\n): Promise<{\n depositor: Address;\n commitment: Uint8Array;\n secret: Uint8Array;\n nullifier: Uint8Array;\n}> => {\n const [authority] = await Promise.all([loadDefaultKeypair()]);\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n assetType,\n });\n\n // generate commitment\n const secret = randomBytes(32);\n const nullifier = randomBytes(32);\n const commitment = await generateCommitment(secret, nullifier, amount, pool);\n\n // Insert commitment into merkle tree and compute new root\n merkleTree.insert(commitment);\n const newRoot = merkleTree.root();\n\n // ! NOTE, DURING INITIALIZATION,\n const depositIx = await getDepositInstructionAsync({\n depositor: authority,\n pool,\n amount,\n commitment,\n newRoot,\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n });\n\n await pipe(\n await createDefaultTransaction(client, authority),\n (tx) => appendTransactionMessageInstruction(depositIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return {\n depositor: authority.address,\n commitment,\n secret,\n nullifier,\n };\n};\n\nexport const transferForAuthority = async (\n client: Client,\n ixArgs: {\n relayerFee: number;\n recipientAmount: bigint;\n nullifierHash: Uint8Array;\n proofData: ProofData;\n publicInputs: Uint8Array[];\n mint: Address;\n assetType: AssetType;\n }\n): Promise<{\n relayer: Address;\n}> => {\n const [relayer, recipient] = await Promise.all([\n loadRelayerKeypair(),\n loadReceiverKeypair(),\n ]);\n\n // airdrop relayer\n await airdropSolToAddress(client, relayer.address);\n\n const {\n relayerFee,\n recipientAmount,\n nullifierHash,\n assetType,\n mint,\n publicInputs,\n proofData: { proofA, proofB, proofC },\n } = ixArgs;\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint,\n assetType,\n });\n\n // TEMPORARY: The autogenerated client hasn't been regenerated yet\n // The Rust program expects: relayer_fee (6th), recipient_amount (7th)\n // But the old client has: amount (6th), fee (7th)\n // So we swap them here until the client is regenerated\n const transferIx = await getTransferInstructionAsync({\n relayer,\n pool,\n recipient: recipient.address,\n proofA,\n proofB,\n proofC,\n nullifierHash,\n publicInputs,\n recipientAmount: recipientAmount,\n relayerFee: relayerFee,\n mint,\n });\n\n await pipe(\n await createDefaultTransaction(client, relayer),\n (tx) => appendTransactionMessageInstruction(transferIx, tx),\n (tx) =>\n appendTransactionMessageInstructions(\n [getSetComputeUnitLimitInstruction({ units: 1_400_000 })],\n tx\n ),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n // todo: return the address of the pool\n // todo: what to return\n return { relayer: relayer.address };\n};\n\nexport const updatePoolForRelayer = async (\n client: Client,\n root: Uint8Array,\n assetType: AssetType\n): Promise<{\n relayer: Address;\n}> => {\n const [relayer] = await Promise.all([loadDefaultKeypair()]);\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n assetType,\n });\n\n const updateRootIx = await getUpdateRootInstruction({\n pool,\n root,\n });\n\n await pipe(\n await createDefaultTransaction(client, relayer),\n (tx) => appendTransactionMessageInstruction(updateRootIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return {\n relayer: relayer.address,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../test/_setup.ts"],"names":["createSolanaRpc","createSolanaRpcSubscriptions","generateKeyPairSigner","airdropFactory","lamports","path","os","fs","createKeyPairSignerFromBytes","pipe","createTransactionMessage","setTransactionMessageFeePayerSigner","setTransactionMessageLifetimeUsingBlockhash","signTransactionMessageWithSigners","assertIsSendableTransaction","getSignatureFromTransaction","assertIsTransactionWithBlockhashLifetime","sendAndConfirmTransactionFactory","getInitializePoolInstructionAsync","appendTransactionMessageInstruction","findAssociatedTokenPda","TOKEN_PROGRAM_ADDRESS","randomBytes","generateCommitment","getDepositInstructionAsync","FEE_COLLECTOR_ADDRESS","getTransferInstructionAsync","appendTransactionMessageInstructions","getSetComputeUnitLimitInstruction","findPoolAddress","getUpdateRootInstruction"],"mappings":"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","file":"_setup.js","sourcesContent":["import { getSetComputeUnitLimitInstruction } from '@solana-program/compute-budget';\nimport {\n Address,\n airdropFactory,\n appendTransactionMessageInstruction,\n appendTransactionMessageInstructions,\n assertIsSendableTransaction,\n assertIsTransactionWithBlockhashLifetime,\n Commitment,\n createKeyPairSignerFromBytes,\n createSolanaRpc,\n createSolanaRpcSubscriptions,\n createTransactionMessage,\n generateKeyPairSigner,\n getSignatureFromTransaction,\n KeyPairSigner,\n lamports,\n pipe,\n Rpc,\n RpcSubscriptions,\n sendAndConfirmTransactionFactory,\n setTransactionMessageFeePayerSigner,\n setTransactionMessageLifetimeUsingBlockhash,\n signTransactionMessageWithSigners,\n SolanaRpcApi,\n SolanaRpcSubscriptionsApi,\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionSigner,\n} from '@solana/kit';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { randomBytes } from 'crypto';\nimport {\n AssetType,\n findPoolAddress,\n generateCommitment,\n getDepositInstructionAsync,\n getInitializePoolInstructionAsync,\n getTransferInstructionAsync,\n getUpdateRootInstruction,\n MerkleTree,\n ProofData,\n} from '../src';\nimport {\n findAssociatedTokenPda,\n TOKEN_PROGRAM_ADDRESS,\n} from '@solana-program/token';\nimport { FEE_COLLECTOR_ADDRESS } from './_constants';\n\nexport type Client = {\n rpc: Rpc<SolanaRpcApi>;\n rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;\n};\n\nexport const createDefaultSolanaClient = (): Client => {\n const rpc = createSolanaRpc('http://127.0.0.1:8899');\n const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');\n return { rpc, rpcSubscriptions };\n};\n\nexport const createDevnetClient = (): Client => {\n const rpc = createSolanaRpc('https://api.devnet.solana.com');\n const rpcSubscriptions = createSolanaRpcSubscriptions(\n 'wss://api.devnet.solana.com/'\n );\n\n return { rpc, rpcSubscriptions };\n};\n\nexport const generateKeyPairSignerWithSol = async (\n client: Client,\n putativeLamports: bigint = 1_000_000_000n\n) => {\n const signer = await generateKeyPairSigner();\n await airdropFactory(client)({\n recipientAddress: signer.address,\n lamports: lamports(putativeLamports),\n commitment: 'confirmed',\n });\n return signer;\n};\n\nexport const airdropSolToAddress = async (\n client: Client,\n receiver: Address, // 5 sol\n putativeLamports: bigint = 5_000_000_000n // 5 sol\n) => {\n await airdropFactory(client)({\n recipientAddress: receiver,\n lamports: lamports(putativeLamports),\n commitment: 'confirmed',\n });\n};\n\nexport async function loadKeypairFromFile(\n filePath: string\n): Promise<KeyPairSigner<string>> {\n // This is here so you can also load the default keypair from the file system.\n const resolvedPath = path.resolve(\n filePath.startsWith('~') ? filePath.replace('~', os.homedir()) : filePath\n );\n const loadedKeyBytes = Uint8Array.from(\n JSON.parse(fs.readFileSync(resolvedPath, 'utf8'))\n );\n // Here you can also set the second parameter to true in case you need to extract your private key.\n const keypairSigner = await createKeyPairSignerFromBytes(loadedKeyBytes);\n return keypairSigner;\n}\n\nexport const createDefaultTransaction = async (\n client: Client,\n feePayer: TransactionSigner\n) => {\n const { value: latestBlockhash } = await client.rpc\n .getLatestBlockhash()\n .send();\n return pipe(\n createTransactionMessage({ version: 0 }),\n (tx) => setTransactionMessageFeePayerSigner(feePayer, tx),\n (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx)\n );\n};\n\nexport const signAndSendTransaction = async (\n client: Client,\n transactionMessage: TransactionMessage & TransactionMessageWithFeePayer,\n // & TransactionMessageWithLifetime,\n commitment: Commitment = 'finalized'\n) => {\n const signedTransaction =\n await signTransactionMessageWithSigners(transactionMessage);\n assertIsSendableTransaction(signedTransaction);\n\n const signature = getSignatureFromTransaction(signedTransaction);\n\n assertIsTransactionWithBlockhashLifetime(signedTransaction);\n await sendAndConfirmTransactionFactory(client)(signedTransaction, {\n commitment,\n skipPreflight: true,\n });\n\n console.log('[DEBUG;] le signature ->', signature, '\\n'); // ! debug\n return signature;\n};\n\nexport const getBalance = async (client: Client, address: Address) =>\n (await client.rpc.getBalance(address, { commitment: 'confirmed' }).send())\n .value;\n\nexport async function loadDefaultKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/id.json');\n}\n\nexport async function loadReceiverKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/id-new.json');\n}\n\nexport async function loadRelayerKeypair(): Promise<KeyPairSigner<string>> {\n return await loadKeypairFromFile('~/.config/solana/relayer.json');\n}\n\nexport const getTokenBalance = async (client: Client, tokenAccount: Address) =>\n (\n await client.rpc\n .getTokenAccountBalance(tokenAccount, { commitment: 'confirmed' })\n .send()\n ).value;\n\n// -------------------------------------------------- instructions\n\nexport const createPoolForAuthority = async (\n client: Client,\n mint: Address,\n assetType: AssetType\n): Promise<{ authority: Address }> => {\n const [authority] = await Promise.all([loadDefaultKeypair()]);\n\n const createIx = await getInitializePoolInstructionAsync({\n authority,\n mint,\n assetType,\n });\n\n await pipe(\n await createDefaultTransaction(client, authority),\n (tx) => appendTransactionMessageInstruction(createIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return { authority: authority.address };\n};\n\nexport const depositForAuthority = async (\n client: Client,\n ixArgs: {\n amount: bigint;\n merkleTree: MerkleTree;\n mint: Address;\n pool: Address;\n depositorTokenAccount?: Address;\n vaultTokenAccount?: Address;\n }\n): Promise<{\n depositor: Address;\n commitment: Uint8Array;\n secret: Uint8Array;\n nullifier: Uint8Array;\n}> => {\n const [authority] = await Promise.all([loadDefaultKeypair()]);\n\n const { merkleTree, amount, mint, vaultTokenAccount, pool } = ixArgs;\n\n const [depositorTokenAccount] = await findAssociatedTokenPda({\n owner: authority.address,\n tokenProgram: TOKEN_PROGRAM_ADDRESS,\n mint,\n });\n\n // generate commitment\n const secret = randomBytes(32);\n const nullifier = randomBytes(32);\n const commitment = await generateCommitment(secret, nullifier, amount, pool);\n\n // Insert commitment into merkle tree and compute new root\n merkleTree.insert(commitment);\n const newRoot = merkleTree.root();\n\n // ! NOTE, DURING INITIALIZATION,\n const depositIx = await getDepositInstructionAsync({\n depositor: authority,\n pool,\n amount,\n commitment,\n newRoot,\n mint,\n depositorTokenAccount,\n vaultTokenAccount,\n });\n\n await pipe(\n await createDefaultTransaction(client, authority),\n (tx) => appendTransactionMessageInstruction(depositIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return {\n depositor: authority.address,\n commitment,\n secret,\n nullifier,\n };\n};\n\nexport const transferForAuthority = async (\n client: Client,\n ixArgs: {\n relayerFee: number;\n recipientAmount: bigint;\n nullifierHash: Uint8Array;\n proofData: ProofData;\n publicInputs: Uint8Array[];\n vaultTokenAccount?: Address;\n mint: Address;\n pool: Address;\n }\n): Promise<{\n relayer: Address;\n}> => {\n const [relayer, recipient] = await Promise.all([\n loadRelayerKeypair(),\n loadReceiverKeypair(),\n ]);\n\n // airdrop relayer\n await airdropSolToAddress(client, relayer.address);\n\n const {\n relayerFee,\n recipientAmount,\n nullifierHash,\n pool,\n mint,\n publicInputs,\n proofData: { proofA, proofB, proofC },\n vaultTokenAccount,\n } = ixArgs;\n\n const [recipientTokenAccount] = await findAssociatedTokenPda({\n owner: recipient.address,\n tokenProgram: TOKEN_PROGRAM_ADDRESS,\n mint,\n });\n const [feeCollectorTokenAccount] = await findAssociatedTokenPda({\n owner: FEE_COLLECTOR_ADDRESS,\n tokenProgram: TOKEN_PROGRAM_ADDRESS,\n mint,\n });\n\n const transferIx = await getTransferInstructionAsync({\n relayer,\n pool,\n recipient: recipient.address,\n proofA,\n proofB,\n proofC,\n nullifierHash,\n publicInputs,\n recipientAmount,\n relayerFee,\n mint,\n recipientTokenAccount,\n feeCollectorTokenAccount,\n vaultTokenAccount,\n });\n\n await pipe(\n await createDefaultTransaction(client, relayer),\n (tx) => appendTransactionMessageInstruction(transferIx, tx),\n (tx) =>\n appendTransactionMessageInstructions(\n [getSetComputeUnitLimitInstruction({ units: 230_000 })],\n tx\n ),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n // todo: return the address of the pool\n // todo: what to return\n return { relayer: relayer.address };\n};\n\nexport const updatePoolForRelayer = async (\n client: Client,\n root: Uint8Array,\n assetType: AssetType,\n mint: Address\n): Promise<{\n relayer: Address;\n}> => {\n const [relayer] = await Promise.all([loadDefaultKeypair()]);\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint,\n assetType,\n });\n\n const updateRootIx = getUpdateRootInstruction({\n pool,\n root,\n });\n\n await pipe(\n await createDefaultTransaction(client, relayer),\n (tx) => appendTransactionMessageInstruction(updateRootIx, tx),\n (tx) => signAndSendTransaction(client, tx)\n );\n\n return {\n relayer: relayer.address,\n };\n};\n"]}
|
|
@@ -14,8 +14,8 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
|
14
14
|
var __commonJS = (cb, mod) => function __require() {
|
|
15
15
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
16
16
|
};
|
|
17
|
-
var
|
|
18
|
-
"test/
|
|
17
|
+
var require_transferSol_test = __commonJS({
|
|
18
|
+
"test/_transferSol.test.ts"() {
|
|
19
19
|
test__default.default("it transfers authority deposited SOL", async (t) => {
|
|
20
20
|
const client = _setup.createDefaultSolanaClient();
|
|
21
21
|
const relayer = await _setup.loadRelayerKeypair();
|
|
@@ -27,17 +27,21 @@ var require_transfer_test = __commonJS({
|
|
|
27
27
|
assetType: SOL_ASSET_TYPE
|
|
28
28
|
});
|
|
29
29
|
console.log("calling init pool");
|
|
30
|
-
await _setup.
|
|
30
|
+
await _setup.createPoolForAuthority(
|
|
31
|
+
client,
|
|
32
|
+
_constants.WRAPPED_SOL_MINT_TOKEN_PROGRAM,
|
|
33
|
+
SOL_ASSET_TYPE
|
|
34
|
+
);
|
|
31
35
|
const [vault] = await src.findVaultAddress({ pool });
|
|
32
36
|
console.log("calling deposit into pool");
|
|
33
|
-
const depositAmount = BigInt(
|
|
34
|
-
const { secret, nullifier } = await _setup.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
const depositAmount = BigInt(1) * _constants.LAMPORTS_PER_SOL;
|
|
38
|
+
const { secret, nullifier } = await _setup.depositForAuthority(client, {
|
|
39
|
+
amount: depositAmount,
|
|
40
|
+
pool,
|
|
41
|
+
mint: _constants.WRAPPED_SOL_MINT_TOKEN_PROGRAM,
|
|
38
42
|
merkleTree
|
|
39
43
|
// Pass the merkle tree to handle root computation
|
|
40
|
-
);
|
|
44
|
+
});
|
|
41
45
|
const localRoot = merkleTree.root();
|
|
42
46
|
const leafIndex = 0;
|
|
43
47
|
const { pathElements, pathIndices } = merkleTree.getProof(leafIndex);
|
|
@@ -75,8 +79,8 @@ var require_transfer_test = __commonJS({
|
|
|
75
79
|
nullifierHash,
|
|
76
80
|
publicInputs,
|
|
77
81
|
proofData,
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
mint: _constants.WRAPPED_SOL_MINT_TOKEN_PROGRAM,
|
|
83
|
+
pool
|
|
80
84
|
});
|
|
81
85
|
const balanceAfter = await _setup.getBalance(client, vault);
|
|
82
86
|
console.log("Vault balance after transfer:", balanceAfter);
|
|
@@ -93,8 +97,8 @@ var require_transfer_test = __commonJS({
|
|
|
93
97
|
});
|
|
94
98
|
}
|
|
95
99
|
});
|
|
96
|
-
var
|
|
100
|
+
var _transferSol_test = require_transferSol_test();
|
|
97
101
|
|
|
98
|
-
module.exports =
|
|
99
|
-
//# sourceMappingURL=
|
|
100
|
-
//# sourceMappingURL=
|
|
102
|
+
module.exports = _transferSol_test;
|
|
103
|
+
//# sourceMappingURL=_transferSol.test.js.map
|
|
104
|
+
//# sourceMappingURL=_transferSol.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../test/_transferSol.test.ts"],"names":["test","createDefaultSolanaClient","loadRelayerKeypair","MerkleTree","AssetType","findPoolAddress","WRAPPED_SOL_MINT_TOKEN_PROGRAM","createPoolForAuthority","findVaultAddress","LAMPORTS_PER_SOL","depositForAuthority","generateNullifier","loadReceiverKeypair","getAddressEncoder","generateProof","getBalance","transferForAuthority"],"mappings":"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","file":"_transferSol.test.js","sourcesContent":["import { getAddressEncoder } from '@solana/kit';\nimport test from 'ava';\nimport {\n AssetType,\n findPoolAddress,\n findVaultAddress,\n generateNullifier,\n generateProof,\n MerkleTree,\n} from '../src';\nimport { LAMPORTS_PER_SOL, WRAPPED_SOL_MINT_TOKEN_PROGRAM } from './_constants';\nimport {\n createDefaultSolanaClient,\n createPoolForAuthority,\n depositForAuthority,\n getBalance,\n loadReceiverKeypair,\n loadRelayerKeypair,\n transferForAuthority,\n} from './_setup';\n\ntest('it transfers authority deposited SOL', async (t) => {\n const client = createDefaultSolanaClient();\n const relayer = await loadRelayerKeypair();\n const merkleTree = new MerkleTree(20);\n await merkleTree.initialize();\n\n // _ since we are doing sol, we hardcode the assetType as such\n const SOL_ASSET_TYPE = AssetType.Sol;\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n assetType: SOL_ASSET_TYPE,\n });\n\n // create pool\n console.log('calling init pool');\n await createPoolForAuthority(\n client,\n WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n SOL_ASSET_TYPE\n );\n\n // find vault address\n const [vault] = await findVaultAddress({ pool });\n\n // deposit\n console.log('calling deposit into pool');\n const depositAmount = BigInt(1) * LAMPORTS_PER_SOL;\n const { secret, nullifier } = await depositForAuthority(client, {\n amount: depositAmount,\n pool,\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n merkleTree, // Pass the merkle tree to handle root computation\n });\n\n // Tree already updated inside depositSolPoolForAuthority\n const localRoot = merkleTree.root();\n\n // Get merkle proof for the commitment (leaf index 0 since it's the first deposit)\n const leafIndex = 0;\n const { pathElements, pathIndices } = merkleTree.getProof(leafIndex);\n\n // Use LOCAL root (tree is off-chain now)\n const root = localRoot;\n\n // Generate nullifier hash\n const nullifierHash = await generateNullifier(nullifier, pool);\n\n // Get recipient address\n const recipient = await loadReceiverKeypair();\n const recipientBytes = getAddressEncoder().encode(recipient.address);\n\n // For now, use authority as relayer (can be changed later)\n const relayerBytes = getAddressEncoder().encode(relayer.address);\n\n // Generate zero-knowledge proof\n // In the new design:\n // - relayer_fee: what the relayer gets (user chooses)\n // - recipient_amount: what goes to recipient BEFORE protocol fee (proven by circuit)\n // - circuit proves: depositAmount >= relayer_fee + recipient_amount\n const relayerFee = 0; // No relayer fee for this test\n const recipientAmount = depositAmount; // Withdraw full deposit amount\n\n console.log('Generating ZK proof...');\n const { proofData, publicInputs } = await generateProof({\n secret,\n nullifier,\n amount: depositAmount, // Private input - what was deposited\n pathElements,\n pathIndices,\n recipient: Uint8Array.from(recipientBytes),\n relayer: Uint8Array.from(relayerBytes),\n fee: relayerFee, // Public input - must match instruction parameter\n refund: recipientAmount, // Public input - must match instruction parameter\n root: Uint8Array.from(root),\n poolAddress: pool,\n });\n console.log('ZK proof generated successfully');\n\n // Check vault balance before transfer\n const balanceBefore = await getBalance(client, vault);\n console.log('Vault balance before transfer:', balanceBefore);\n\n // Perform the transfer (withdrawal)\n console.log('calling transfer tx');\n await transferForAuthority(client, {\n relayerFee,\n recipientAmount,\n nullifierHash,\n publicInputs,\n proofData,\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n pool,\n });\n\n // Check vault balance after transfer\n const balanceAfter = await getBalance(client, vault);\n console.log('Vault balance after transfer:', balanceAfter);\n\n // Calculate expected amounts\n // Protocol fee is 15bps of recipient_amount\n const protocolFee = (BigInt(recipientAmount) * 15n) / 10000n;\n const finalRecipientAmount = BigInt(recipientAmount) - protocolFee;\n const totalWithdrawn = BigInt(recipientAmount) + BigInt(relayerFee);\n\n console.log('Protocol fee:', protocolFee);\n console.log('Final recipient amount:', finalRecipientAmount);\n console.log('Total withdrawn from vault:', totalWithdrawn);\n\n // Verify vault balance decreased by the total withdrawn amount\n t.truthy(BigInt(balanceBefore) - BigInt(balanceAfter) >= totalWithdrawn);\n\n // Verify recipient received the funds (after protocol fee)\n const recipientBalance = await getBalance(client, recipient.address);\n console.log('Recipient balance:', recipientBalance);\n t.truthy(BigInt(recipientBalance) >= finalRecipientAmount);\n});\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var kit = require('@solana/kit');
|
|
4
|
+
var test = require('ava');
|
|
5
|
+
var src = require('../src');
|
|
6
|
+
var _constants = require('./_constants');
|
|
7
|
+
var _setup = require('./_setup');
|
|
8
|
+
var token = require('@solana-program/token');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var test__default = /*#__PURE__*/_interopDefault(test);
|
|
13
|
+
|
|
14
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
15
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
16
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
17
|
+
};
|
|
18
|
+
var require_transferSpl_test = __commonJS({
|
|
19
|
+
"test/transferSpl.test.ts"() {
|
|
20
|
+
test__default.default("it transfers custom SPL token privately", async (t) => {
|
|
21
|
+
const client = _setup.createDefaultSolanaClient();
|
|
22
|
+
const relayer = await _setup.loadRelayerKeypair();
|
|
23
|
+
const merkleTree = new src.MerkleTree(20);
|
|
24
|
+
await merkleTree.initialize();
|
|
25
|
+
const SPL_ASSET_TYPE = src.AssetType.SplToken;
|
|
26
|
+
const SPL_TOKEN_MINT = kit.address(
|
|
27
|
+
"7eV4tJbL9ffQWjyVLbCjieQ6nWPSMJvtBnHxvGnfKPkm"
|
|
28
|
+
);
|
|
29
|
+
const [pool] = await src.findPoolAddress({
|
|
30
|
+
mint: SPL_TOKEN_MINT,
|
|
31
|
+
assetType: SPL_ASSET_TYPE
|
|
32
|
+
});
|
|
33
|
+
console.log("calling init pool");
|
|
34
|
+
await _setup.createPoolForAuthority(client, SPL_TOKEN_MINT, SPL_ASSET_TYPE);
|
|
35
|
+
const [vault] = await src.findVaultAddress({ pool });
|
|
36
|
+
const [vaultTokenAccount] = await token.findAssociatedTokenPda({
|
|
37
|
+
owner: vault,
|
|
38
|
+
tokenProgram: token.TOKEN_PROGRAM_ADDRESS,
|
|
39
|
+
mint: SPL_TOKEN_MINT
|
|
40
|
+
});
|
|
41
|
+
console.log("calling deposit into pool");
|
|
42
|
+
const depositAmount = BigInt(1) * _constants.LAMPORTS_PER_SOL;
|
|
43
|
+
const { secret, nullifier } = await _setup.depositForAuthority(client, {
|
|
44
|
+
amount: depositAmount,
|
|
45
|
+
pool,
|
|
46
|
+
mint: SPL_TOKEN_MINT,
|
|
47
|
+
merkleTree,
|
|
48
|
+
// Pass the merkle tree to handle root computation
|
|
49
|
+
vaultTokenAccount
|
|
50
|
+
});
|
|
51
|
+
const localRoot = merkleTree.root();
|
|
52
|
+
const leafIndex = 0;
|
|
53
|
+
const { pathElements, pathIndices } = merkleTree.getProof(leafIndex);
|
|
54
|
+
const root = localRoot;
|
|
55
|
+
const nullifierHash = await src.generateNullifier(nullifier, pool);
|
|
56
|
+
const recipient = await _setup.loadReceiverKeypair();
|
|
57
|
+
const recipientBytes = kit.getAddressEncoder().encode(recipient.address);
|
|
58
|
+
const relayerBytes = kit.getAddressEncoder().encode(relayer.address);
|
|
59
|
+
const relayerFee = 0;
|
|
60
|
+
const recipientAmount = depositAmount;
|
|
61
|
+
console.log("Generating ZK proof...");
|
|
62
|
+
const { proofData, publicInputs } = await src.generateProof({
|
|
63
|
+
secret,
|
|
64
|
+
nullifier,
|
|
65
|
+
amount: depositAmount,
|
|
66
|
+
// Private input - what was deposited
|
|
67
|
+
pathElements,
|
|
68
|
+
pathIndices,
|
|
69
|
+
recipient: Uint8Array.from(recipientBytes),
|
|
70
|
+
relayer: Uint8Array.from(relayerBytes),
|
|
71
|
+
fee: relayerFee,
|
|
72
|
+
// Public input - must match instruction parameter
|
|
73
|
+
refund: recipientAmount,
|
|
74
|
+
// Public input - must match instruction parameter
|
|
75
|
+
root: Uint8Array.from(root),
|
|
76
|
+
poolAddress: pool
|
|
77
|
+
});
|
|
78
|
+
console.log("ZK proof generated successfully");
|
|
79
|
+
const balanceBefore = await _setup.getBalance(client, vault);
|
|
80
|
+
console.log("Vault balance before transfer:", balanceBefore);
|
|
81
|
+
console.log("calling transfer tx");
|
|
82
|
+
await _setup.transferForAuthority(client, {
|
|
83
|
+
relayerFee,
|
|
84
|
+
recipientAmount,
|
|
85
|
+
nullifierHash,
|
|
86
|
+
publicInputs,
|
|
87
|
+
proofData,
|
|
88
|
+
mint: SPL_TOKEN_MINT,
|
|
89
|
+
pool,
|
|
90
|
+
vaultTokenAccount
|
|
91
|
+
});
|
|
92
|
+
const balanceAfter = await _setup.getBalance(client, vault);
|
|
93
|
+
console.log("Vault balance after transfer:", balanceAfter);
|
|
94
|
+
const protocolFee = BigInt(recipientAmount) * 15n / 10000n;
|
|
95
|
+
const finalRecipientAmount = BigInt(recipientAmount) - protocolFee;
|
|
96
|
+
const totalWithdrawn = BigInt(recipientAmount) + BigInt(relayerFee);
|
|
97
|
+
console.log("Protocol fee:", protocolFee);
|
|
98
|
+
console.log("Final recipient amount:", finalRecipientAmount);
|
|
99
|
+
console.log("Total withdrawn from vault:", totalWithdrawn);
|
|
100
|
+
t.truthy(BigInt(balanceBefore) - BigInt(balanceAfter) >= totalWithdrawn);
|
|
101
|
+
const recipientBalance = await _setup.getBalance(client, recipient.address);
|
|
102
|
+
console.log("Recipient balance:", recipientBalance);
|
|
103
|
+
t.truthy(BigInt(recipientBalance) >= finalRecipientAmount);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
var transferSpl_test = require_transferSpl_test();
|
|
108
|
+
|
|
109
|
+
module.exports = transferSpl_test;
|
|
110
|
+
//# sourceMappingURL=transferSpl.test.js.map
|
|
111
|
+
//# sourceMappingURL=transferSpl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../test/transferSpl.test.ts"],"names":["test","createDefaultSolanaClient","loadRelayerKeypair","MerkleTree","AssetType","address","findPoolAddress","createPoolForAuthority","findVaultAddress","findAssociatedTokenPda","TOKEN_PROGRAM_ADDRESS","LAMPORTS_PER_SOL","depositForAuthority","generateNullifier","loadReceiverKeypair","getAddressEncoder","generateProof","getBalance","transferForAuthority"],"mappings":"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","file":"transferSpl.test.js","sourcesContent":["import { address, getAddressEncoder } from '@solana/kit';\nimport test from 'ava';\nimport {\n AssetType,\n findPoolAddress,\n findVaultAddress,\n generateNullifier,\n generateProof,\n MerkleTree,\n} from '../src';\nimport { LAMPORTS_PER_SOL } from './_constants';\nimport {\n createDefaultSolanaClient,\n createPoolForAuthority,\n depositForAuthority,\n getBalance,\n loadReceiverKeypair,\n loadRelayerKeypair,\n transferForAuthority,\n} from './_setup';\nimport {\n findAssociatedTokenPda,\n TOKEN_PROGRAM_ADDRESS,\n} from '@solana-program/token';\n\ntest('it transfers custom SPL token privately', async (t) => {\n const client = createDefaultSolanaClient();\n const relayer = await loadRelayerKeypair();\n const merkleTree = new MerkleTree(20);\n await merkleTree.initialize();\n\n // _ since we are doing sol, we hardcode the assetType as such\n const SPL_ASSET_TYPE = AssetType.SplToken;\n const SPL_TOKEN_MINT = address(\n '7eV4tJbL9ffQWjyVLbCjieQ6nWPSMJvtBnHxvGnfKPkm'\n ); // FIXME: UPDATE WITH YOUR SPL TOKEN\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint: SPL_TOKEN_MINT,\n assetType: SPL_ASSET_TYPE,\n });\n\n // create pool\n console.log('calling init pool');\n await createPoolForAuthority(client, SPL_TOKEN_MINT, SPL_ASSET_TYPE);\n\n // find vault address\n const [vault] = await findVaultAddress({ pool });\n const [vaultTokenAccount] = await findAssociatedTokenPda({\n owner: vault,\n tokenProgram: TOKEN_PROGRAM_ADDRESS,\n mint: SPL_TOKEN_MINT,\n });\n\n // deposit\n console.log('calling deposit into pool');\n const depositAmount = BigInt(1) * LAMPORTS_PER_SOL;\n const { secret, nullifier } = await depositForAuthority(client, {\n amount: depositAmount,\n pool,\n mint: SPL_TOKEN_MINT,\n merkleTree, // Pass the merkle tree to handle root computation\n vaultTokenAccount,\n });\n\n // Tree already updated inside depositSolPoolForAuthority\n const localRoot = merkleTree.root();\n\n // Get merkle proof for the commitment (leaf index 0 since it's the first deposit)\n const leafIndex = 0;\n const { pathElements, pathIndices } = merkleTree.getProof(leafIndex);\n\n // Use LOCAL root (tree is off-chain now)\n const root = localRoot;\n\n // Generate nullifier hash\n const nullifierHash = await generateNullifier(nullifier, pool);\n\n // Get recipient address\n const recipient = await loadReceiverKeypair();\n const recipientBytes = getAddressEncoder().encode(recipient.address);\n\n // For now, use authority as relayer (can be changed later)\n const relayerBytes = getAddressEncoder().encode(relayer.address);\n\n // Generate zero-knowledge proof\n // In the new design:\n // - relayer_fee: what the relayer gets (user chooses)\n // - recipient_amount: what goes to recipient BEFORE protocol fee (proven by circuit)\n // - circuit proves: depositAmount >= relayer_fee + recipient_amount\n const relayerFee = 0; // No relayer fee for this test\n const recipientAmount = depositAmount; // Withdraw full deposit amount\n\n console.log('Generating ZK proof...');\n const { proofData, publicInputs } = await generateProof({\n secret,\n nullifier,\n amount: depositAmount, // Private input - what was deposited\n pathElements,\n pathIndices,\n recipient: Uint8Array.from(recipientBytes),\n relayer: Uint8Array.from(relayerBytes),\n fee: relayerFee, // Public input - must match instruction parameter\n refund: recipientAmount, // Public input - must match instruction parameter\n root: Uint8Array.from(root),\n poolAddress: pool,\n });\n console.log('ZK proof generated successfully');\n\n // Check vault balance before transfer\n const balanceBefore = await getBalance(client, vault);\n console.log('Vault balance before transfer:', balanceBefore);\n\n // Perform the transfer (withdrawal)\n console.log('calling transfer tx');\n await transferForAuthority(client, {\n relayerFee,\n recipientAmount,\n nullifierHash,\n publicInputs,\n proofData,\n mint: SPL_TOKEN_MINT,\n pool,\n vaultTokenAccount,\n });\n\n // Check vault balance after transfer\n const balanceAfter = await getBalance(client, vault);\n console.log('Vault balance after transfer:', balanceAfter);\n\n // Calculate expected amounts\n // Protocol fee is 15bps of recipient_amount\n const protocolFee = (BigInt(recipientAmount) * 15n) / 10000n;\n const finalRecipientAmount = BigInt(recipientAmount) - protocolFee;\n const totalWithdrawn = BigInt(recipientAmount) + BigInt(relayerFee);\n\n console.log('Protocol fee:', protocolFee);\n console.log('Final recipient amount:', finalRecipientAmount);\n console.log('Total withdrawn from vault:', totalWithdrawn);\n\n // Verify vault balance decreased by the total withdrawn amount\n t.truthy(BigInt(balanceBefore) - BigInt(balanceAfter) >= totalWithdrawn);\n\n // Verify recipient received the funds (after protocol fee)\n const recipientBalance = await getBalance(client, recipient.address);\n console.log('Recipient balance:', recipientBalance);\n t.truthy(BigInt(recipientBalance) >= finalRecipientAmount);\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../../src/generated/instructions/transfer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../../../src/generated/instructions/transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,10 +27,17 @@ export declare const getTokenBalance: (client: Client, tokenAccount: Address) =>
|
|
|
27
27
|
uiAmount: number | null;
|
|
28
28
|
uiAmountString: import("@solana/kit").StringifiedNumber;
|
|
29
29
|
}>>;
|
|
30
|
-
export declare const
|
|
30
|
+
export declare const createPoolForAuthority: (client: Client, mint: Address, assetType: AssetType) => Promise<{
|
|
31
31
|
authority: Address;
|
|
32
32
|
}>;
|
|
33
|
-
export declare const
|
|
33
|
+
export declare const depositForAuthority: (client: Client, ixArgs: {
|
|
34
|
+
amount: bigint;
|
|
35
|
+
merkleTree: MerkleTree;
|
|
36
|
+
mint: Address;
|
|
37
|
+
pool: Address;
|
|
38
|
+
depositorTokenAccount?: Address;
|
|
39
|
+
vaultTokenAccount?: Address;
|
|
40
|
+
}) => Promise<{
|
|
34
41
|
depositor: Address;
|
|
35
42
|
commitment: Uint8Array;
|
|
36
43
|
secret: Uint8Array;
|
|
@@ -42,12 +49,13 @@ export declare const transferForAuthority: (client: Client, ixArgs: {
|
|
|
42
49
|
nullifierHash: Uint8Array;
|
|
43
50
|
proofData: ProofData;
|
|
44
51
|
publicInputs: Uint8Array[];
|
|
52
|
+
vaultTokenAccount?: Address;
|
|
45
53
|
mint: Address;
|
|
46
|
-
|
|
54
|
+
pool: Address;
|
|
47
55
|
}) => Promise<{
|
|
48
56
|
relayer: Address;
|
|
49
57
|
}>;
|
|
50
|
-
export declare const updatePoolForRelayer: (client: Client, root: Uint8Array, assetType: AssetType) => Promise<{
|
|
58
|
+
export declare const updatePoolForRelayer: (client: Client, root: Uint8Array, assetType: AssetType, mint: Address) => Promise<{
|
|
51
59
|
relayer: Address;
|
|
52
60
|
}>;
|
|
53
61
|
//# sourceMappingURL=_setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_setup.d.ts","sourceRoot":"","sources":["../../../test/_setup.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EAMP,UAAU,EAOV,aAAa,EAGb,GAAG,EACH,gBAAgB,EAKhB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,8BAA8B,EAC9B,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,SAAS,EAOT,UAAU,EACV,SAAS,EACV,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"_setup.d.ts","sourceRoot":"","sources":["../../../test/_setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../test/transfer.test.ts"],"names":["test","createDefaultSolanaClient","loadRelayerKeypair","MerkleTree","AssetType","findPoolAddress","WRAPPED_SOL_MINT_TOKEN_PROGRAM","createSolPoolForAuthority","findVaultAddress","LAMPORTS_PER_SOL","depositSolPoolForAuthority","generateNullifier","loadReceiverKeypair","getAddressEncoder","generateProof","getBalance","transferForAuthority"],"mappings":"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","file":"transfer.test.js","sourcesContent":["import { getAddressEncoder } from '@solana/kit';\nimport test from 'ava';\nimport {\n AssetType,\n findPoolAddress,\n findVaultAddress,\n generateNullifier,\n generateProof,\n MerkleTree,\n} from '../src';\nimport { LAMPORTS_PER_SOL, WRAPPED_SOL_MINT_TOKEN_PROGRAM } from './_constants';\nimport {\n createDefaultSolanaClient,\n createSolPoolForAuthority,\n depositSolPoolForAuthority,\n getBalance,\n loadReceiverKeypair,\n loadRelayerKeypair,\n transferForAuthority,\n} from './_setup';\n\ntest('it transfers authority deposited SOL', async (t) => {\n const client = createDefaultSolanaClient();\n const relayer = await loadRelayerKeypair();\n const merkleTree = new MerkleTree(20);\n await merkleTree.initialize();\n\n // _ since we are doing sol, we hardcode the assetType as such\n const SOL_ASSET_TYPE = AssetType.Sol;\n\n // find pool address\n const [pool] = await findPoolAddress({\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n assetType: SOL_ASSET_TYPE,\n });\n\n // create pool\n console.log('calling init pool');\n await createSolPoolForAuthority(client);\n\n // find vault address\n const [vault] = await findVaultAddress({ pool });\n\n // deposit\n console.log('calling deposit into pool');\n const depositAmount = BigInt(10) * LAMPORTS_PER_SOL;\n const { secret, nullifier } = await depositSolPoolForAuthority(\n client,\n depositAmount,\n SOL_ASSET_TYPE,\n merkleTree // Pass the merkle tree to handle root computation\n );\n\n // Tree already updated inside depositSolPoolForAuthority\n const localRoot = merkleTree.root();\n\n // Get merkle proof for the commitment (leaf index 0 since it's the first deposit)\n const leafIndex = 0;\n const { pathElements, pathIndices } = merkleTree.getProof(leafIndex);\n\n // Use LOCAL root (tree is off-chain now)\n const root = localRoot;\n\n // Generate nullifier hash\n const nullifierHash = await generateNullifier(nullifier, pool);\n\n // Get recipient address\n const recipient = await loadReceiverKeypair();\n const recipientBytes = getAddressEncoder().encode(recipient.address);\n\n // For now, use authority as relayer (can be changed later)\n const relayerBytes = getAddressEncoder().encode(relayer.address);\n\n // Generate zero-knowledge proof\n // In the new design:\n // - relayer_fee: what the relayer gets (user chooses)\n // - recipient_amount: what goes to recipient BEFORE protocol fee (proven by circuit)\n // - circuit proves: depositAmount >= relayer_fee + recipient_amount\n const relayerFee = 0; // No relayer fee for this test\n const recipientAmount = depositAmount; // Withdraw full deposit amount\n\n console.log('Generating ZK proof...');\n const { proofData, publicInputs } = await generateProof({\n secret,\n nullifier,\n amount: depositAmount, // Private input - what was deposited\n pathElements,\n pathIndices,\n recipient: Uint8Array.from(recipientBytes),\n relayer: Uint8Array.from(relayerBytes),\n fee: relayerFee, // Public input - must match instruction parameter\n refund: recipientAmount, // Public input - must match instruction parameter\n root: Uint8Array.from(root),\n poolAddress: pool,\n });\n console.log('ZK proof generated successfully');\n\n // Check vault balance before transfer\n const balanceBefore = await getBalance(client, vault);\n console.log('Vault balance before transfer:', balanceBefore);\n\n // Perform the transfer (withdrawal)\n console.log('calling transfer tx');\n await transferForAuthority(client, {\n relayerFee,\n recipientAmount,\n nullifierHash,\n publicInputs,\n proofData,\n assetType: SOL_ASSET_TYPE,\n mint: WRAPPED_SOL_MINT_TOKEN_PROGRAM,\n });\n\n // Check vault balance after transfer\n const balanceAfter = await getBalance(client, vault);\n console.log('Vault balance after transfer:', balanceAfter);\n\n // Calculate expected amounts\n // Protocol fee is 15bps of recipient_amount\n const protocolFee = (BigInt(recipientAmount) * 15n) / 10000n;\n const finalRecipientAmount = BigInt(recipientAmount) - protocolFee;\n const totalWithdrawn = BigInt(recipientAmount) + BigInt(relayerFee);\n\n console.log('Protocol fee:', protocolFee);\n console.log('Final recipient amount:', finalRecipientAmount);\n console.log('Total withdrawn from vault:', totalWithdrawn);\n\n // Verify vault balance decreased by the total withdrawn amount\n t.truthy(BigInt(balanceBefore) - BigInt(balanceAfter) >= totalWithdrawn);\n\n // Verify recipient received the funds (after protocol fee)\n const recipientBalance = await getBalance(client, recipient.address);\n console.log('Recipient balance:', recipientBalance);\n t.truthy(BigInt(recipientBalance) >= finalRecipientAmount);\n});\n"]}
|