quantumswap 0.0.1 → 0.0.3

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.
Files changed (47) hide show
  1. package/README.md +73 -53
  2. package/examples/README.md +46 -0
  3. package/examples/deploy-IERC20.js +5 -3
  4. package/examples/deploy-QuantumSwapV2ERC20.js +5 -3
  5. package/examples/deploy-QuantumSwapV2Factory.js +5 -3
  6. package/examples/deploy-QuantumSwapV2Pair.js +5 -3
  7. package/examples/deploy-QuantumSwapV2Router02.js +5 -3
  8. package/examples/deploy-WQ.js +5 -3
  9. package/examples/events-IERC20.js +5 -3
  10. package/examples/events-QuantumSwapV2ERC20.js +5 -3
  11. package/examples/events-QuantumSwapV2Factory.js +5 -3
  12. package/examples/events-QuantumSwapV2Pair.js +5 -3
  13. package/examples/events-QuantumSwapV2Router02.js +5 -3
  14. package/examples/events-WQ.js +5 -3
  15. package/examples/offline-signing-IERC20.js +5 -3
  16. package/examples/offline-signing-QuantumSwapV2ERC20.js +5 -3
  17. package/examples/offline-signing-QuantumSwapV2Factory.js +5 -3
  18. package/examples/offline-signing-QuantumSwapV2Pair.js +5 -3
  19. package/examples/offline-signing-QuantumSwapV2Router02.js +5 -3
  20. package/examples/offline-signing-WQ.js +5 -3
  21. package/examples/package-lock.json +62 -0
  22. package/examples/package.json +14 -0
  23. package/examples/read-operations-IERC20.js +5 -3
  24. package/examples/read-operations-QuantumSwapV2ERC20.js +5 -3
  25. package/examples/read-operations-QuantumSwapV2Factory.js +5 -3
  26. package/examples/read-operations-QuantumSwapV2Pair.js +5 -3
  27. package/examples/read-operations-QuantumSwapV2Router02.js +5 -3
  28. package/examples/read-operations-WQ.js +5 -3
  29. package/examples/run-dex-flow-custom.js +493 -0
  30. package/examples/run-dex-flow-custom.ts +556 -0
  31. package/examples/write-operations-IERC20.js +5 -3
  32. package/examples/write-operations-QuantumSwapV2ERC20.js +5 -3
  33. package/examples/write-operations-QuantumSwapV2Factory.js +5 -3
  34. package/examples/write-operations-QuantumSwapV2Pair.js +5 -3
  35. package/examples/write-operations-QuantumSwapV2Router02.js +5 -3
  36. package/examples/write-operations-WQ.js +5 -3
  37. package/package.json +8 -9
  38. package/test/e2e/IERC20.e2e.test.js +2 -2
  39. package/test/e2e/QuantumSwapV2ERC20.e2e.test.js +2 -2
  40. package/test/e2e/QuantumSwapV2Factory.e2e.test.js +2 -2
  41. package/test/e2e/QuantumSwapV2Pair.e2e.test.js +2 -2
  42. package/test/e2e/QuantumSwapV2Router02.e2e.test.js +2 -2
  43. package/test/e2e/WQ.e2e.test.js +2 -2
  44. package/test/e2e/all-contracts.e2e.test.js +103 -72
  45. package/test/e2e/dex-full-flow.e2e.test.js +276 -47
  46. package/examples/walkthrough-dex-full-flow.js +0 -226
  47. package/examples/walkthrough-dex-full-flow.ts +0 -231
@@ -0,0 +1,556 @@
1
+ /**
2
+ * DEX full flow (same steps as test/e2e/dex-full-flow.e2e.test.js) — TypeScript.
3
+ * 1–3) WQ, Factory, Router — COMMENTED OUT; uses pre-deployed addresses below.
4
+ * 4) Deploy BigCat and SmallDog tokens (SimpleERC20)
5
+ * 5) Create pair; 6) Reserves; 7) Add liquidity; 8) Quote; 9) Swap; 10) Swap ETH; 11) Send to other wallet.
6
+ *
7
+ * Usage: npx ts-node run-dex-flow-custom.ts (from examples folder)
8
+ * Optional: QC_RPC_URL=... QC_CHAIN_ID=123123
9
+ */
10
+
11
+ import * as path from "node:path";
12
+ import { Initialize } from "quantumcoin/config";
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ const qc = require("quantumcoin") as any;
15
+ const {
16
+ getProvider,
17
+ Wallet,
18
+ Contract,
19
+ ContractFactory,
20
+ getCreateAddress,
21
+ getAddress,
22
+ parseUnits,
23
+ isAddress,
24
+ Interface,
25
+ } = qc;
26
+
27
+ const RPC_URL = process.env.QC_RPC_URL || "http://127.0.0.1:8545";
28
+ const CHAIN_ID = process.env.QC_CHAIN_ID ? Number(process.env.QC_CHAIN_ID) : 123123;
29
+ // Use chain block timestamp (UTC) + offset for deadline (same as dex-full-flow e2e test).
30
+ const DEADLINE_OFFSET = process.env.QC_DEADLINE_OFFSET ? Number(process.env.QC_DEADLINE_OFFSET) : 3600;
31
+ const DEPLOY_GAS_FALLBACK = 6_000_000n;
32
+ const TX_GAS_FALLBACK = 400_000n;
33
+ const GAS_BUFFER_PERCENT = 110n;
34
+
35
+ const WQ_ADDRESS = "0x0E49c26cd1ca19bF8ddA2C8985B96783288458754757F4C9E00a5439A7291628";
36
+ const FACTORY_ADDRESS = "0xbbF45a1B60044669793B444eD01Eb33e03Bb8cf3c5b6ae7887B218D05C5Cbf1d";
37
+ const ROUTER_ADDRESS = "0x41323EF72662185f44a03ea0ad8094a0C9e925aB1102679D8e957e838054aac5";
38
+
39
+ interface SimpleErc20Artifact {
40
+ abi: unknown[];
41
+ bin: string;
42
+ }
43
+
44
+ let SIMPLE_ERC20_ABI: unknown[] | null = null;
45
+ let SIMPLE_ERC20_BYTECODE: string | null = null;
46
+ try {
47
+ let artifact: SimpleErc20Artifact[] | SimpleErc20Artifact;
48
+ try {
49
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
50
+ artifact = require("quantumcoin/examples/sdk-generator-erc20.inline.json");
51
+ } catch {
52
+ const qcDir = path.dirname(require.resolve("quantumcoin"));
53
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
54
+ artifact = require(path.join(qcDir, "examples", "sdk-generator-erc20.inline.json"));
55
+ }
56
+ const simple = Array.isArray(artifact) ? artifact[0] : artifact;
57
+ SIMPLE_ERC20_ABI = simple.abi;
58
+ SIMPLE_ERC20_BYTECODE = simple.bin;
59
+ } catch {
60
+ SIMPLE_ERC20_ABI = null;
61
+ SIMPLE_ERC20_BYTECODE = null;
62
+ }
63
+
64
+ /** Returns deadline as UTC Unix timestamp: current chain block timestamp + DEADLINE_OFFSET. */
65
+ async function deadline(provider: any): Promise<bigint> {
66
+ const blockNumber = await provider.getBlockNumber();
67
+ const block = await provider.getBlock(blockNumber);
68
+ const blockTimestamp =
69
+ block && block.timestamp != null ? Number(block.timestamp) : Math.floor(Date.now() / 1000);
70
+ return BigInt(blockTimestamp + DEADLINE_OFFSET);
71
+ }
72
+
73
+ async function estimateGasLimit(
74
+ provider: any,
75
+ txRequest: { from?: string; data?: string },
76
+ fallback: bigint
77
+ ): Promise<bigint> {
78
+ try {
79
+ const est = await provider.estimateGas(txRequest);
80
+ const estBn = typeof est === "bigint" ? est : BigInt(est);
81
+ const withBuffer = (estBn * GAS_BUFFER_PERCENT) / 100n;
82
+ return withBuffer > 0n ? withBuffer : fallback;
83
+ } catch {
84
+ return fallback;
85
+ }
86
+ }
87
+
88
+ async function deployGasLimit(
89
+ provider: any,
90
+ from: string,
91
+ getDeployTx: () => { data?: string } | null,
92
+ fallback: bigint,
93
+ bytecodeFloor?: bigint
94
+ ): Promise<bigint> {
95
+ const txReq = getDeployTx();
96
+ if (!txReq || !txReq.data) return fallback;
97
+ let gas = await estimateGasLimit(provider, { from, data: txReq.data }, fallback);
98
+ if (bytecodeFloor && txReq.data && txReq.data.length > 40000 && gas < bytecodeFloor) {
99
+ gas = bytecodeFloor;
100
+ }
101
+ return gas;
102
+ }
103
+
104
+ // Contract with _deployTx for logging; IERC20 methods (approve, balanceOf, transfer) exist at runtime
105
+ interface ContractWithDeployTx {
106
+ target?: string;
107
+ _deployTx?: { hash: string };
108
+ populateTransaction?: any;
109
+ approve?(...args: any[]): Promise<any>;
110
+ balanceOf?(...args: any[]): Promise<any>;
111
+ transfer?(...args: any[]): Promise<any>;
112
+ }
113
+
114
+ async function main(): Promise<void> {
115
+ if (!SIMPLE_ERC20_ABI || !SIMPLE_ERC20_BYTECODE) {
116
+ console.error("SimpleERC20 artifact not found (quantumcoin examples/sdk-generator-erc20.inline.json).");
117
+ process.exit(1);
118
+ }
119
+
120
+ await Initialize(null);
121
+ // quantumswap (file:..) uses repo root's quantumcoin; initialize that instance too
122
+ try {
123
+ const qswapMain = require.resolve("quantumswap");
124
+ const repoRoot = path.join(path.dirname(qswapMain), "..");
125
+ const rootQcConfig = require(path.join(repoRoot, "node_modules", "quantumcoin", "config"));
126
+ if (rootQcConfig && typeof rootQcConfig.Initialize === "function") {
127
+ await rootQcConfig.Initialize(null);
128
+ }
129
+ } catch {
130
+ // ignore
131
+ }
132
+ const {
133
+ WQ,
134
+ WQ__factory,
135
+ QuantumSwapV2Factory,
136
+ QuantumSwapV2Factory__factory,
137
+ QuantumSwapV2Router02,
138
+ QuantumSwapV2Router02__factory,
139
+ QuantumSwapV2Pair,
140
+ } = await import("quantumswap");
141
+
142
+ const provider = getProvider(RPC_URL, CHAIN_ID);
143
+ const TEST_WALLET_ENCRYPTED_JSON =
144
+ '{"address":"1a846abe71c8b989e8337c55d608be81c28ab3b2e40c83eaa2a68d516049aec6","crypto":{"cipher":"aes-256-ctr","ciphertext":"ab7e620dd66cb55ac201b9c6796de92bbb06f3681b5932eabe099871f1f7d79acabe30921a39ad13bfe74f42c515734882b6723760142aa3e26e011df514a534ae47bd15d86badd9c6f17c48d4c892711d54d441ee3a0ee0e5b060f816e79c7badd13ff4c235934b1986774223ecf6e8761388969bb239c759b54c8c70e6a2e27c93a4b70129c8159f461d271ae8f3573414c78b88e4d0abfa6365ed45456636d4ed971c7a0c6b84e6f0c2621e819268b135e2bcc169a54d1847b39e6ba2ae8ec969b69f330b7db9e785ed02204d5a1185915ae5338b0f40ef2a7f4d5aaf7563d502135e57f4eb89d5ec1efa5c77e374969d6cd85be625a2ed1225d68ecdd84067bfc69adb83ecd5c6050472eca28a5a646fcdd28077165c629975bec8a79fe1457cb53389b788b25e1f8eff8b2ca326d7dfcaba3f8839225a08057c018a458891fd2caa0d2b27632cffd80f592147ccec9a10dc8a08a48fb55047bff5cf85cda39eb089096bef63842fc3686412f298a54a9e4b0bf4ad36907ba373cbd6d32e7ac494af371da5aa9d38a3463220865114c4adc5e4ac258ba9c6af9fa2ddfd1aec2e16887e4b3977c69561df8599ac9d411c9dd2a4d57f92ea4e5c02aae3f49fb3bc83e16673e6c2dbe96bb181c8dfd0f9757ade2e4ff27215a836058c5ffeab042f6f97c7c02339f76a6284680e01b4bb733690eb3347fbfcc26614b8bf755f9dfce3fea9d4e4d15b164983201732c2e87593a86bca6da6972e128490338f76ae68135888070f4e59e90db54d23834769bdbda9769213faf5357f9167a224523975a946367b68f0cec98658575609f58bfd329e420a921c06713326e4cb20a0df1d77f37e78a320a637a96c604ca3fa89e24beb42313751b8f09b14f9c14c77e4fd13fc6382505d27c771bca0d821ec7c3765acffa99d83c50140a56b0b28101c762bd682fe55cb6f23cbeb3f421d7b36021010e45ac27160dd7ead99c864a1b550c7edb1246950fe32dcc049799f9085287f0a747a6ef7a023df46a23a22f3e833bbf8d404f84344870492658256ee1dfc40fda33bb8d48fc72d4520ba9fc820c9123104a045206809037709f2a5f6723fa77d6bac5a573823d4ec3a7f1cb786a52ee2697e622e5d75962fa554d1024a6c355e21f33a63b2b72e6c4742a8b1c373aa532b40518c38c90b5373c2eb8c9d7be2a9e16047a3ee09dc9a6849deac5183ace6cfe91a9bef2ffc0a7df6ccebfd4c858c84b0e0355650d7466971e66f1e3883013e5ad1be33199b1d110b79070ac1b745ccb14cf63a08f8cca3a21c9525e626ff5f0c34746e10750fb742ad51f11f2acae3676c2111853d7250d01b77821a6ba9e04400ba2c543ca9f2d701ae6f47bfad14ffe3039ee9e71f7b2401359ade9938750ddb9c5a8b018a7929ed8d0e717ff1861446ce17535e9b17c187711190aae3388bd9490837a636c25ed4d42d7079ad1a51e13292c683d5d012abcf46965c534b83ab53f2c1f0cf5830ef7582e06863a33c19a70511df632885d63245965047ea96b56f1af5b3b94a54999f784fb9574fdfcd7c1230e07a2aaa04acd3097b2b9f8ddba05ae9734491deb5c1a513c76ed276cb78bbf4839dae3156d76af444a5805129d5df791167a9c8576a1d7f760b2d2797c4658669608706fbd0ace1be2346f74862dfc9ef518e55632e43c043186e5d070deb34d12fb9e5aba84e5cb50213dc88efd39cc35bf42455aa82d5e3b707b3140be3b8623b34fdd81d08615c188ae8438a13881fdf6bf32f2cb9ff5fa625561040c6b71d4b8eccc90bc3b99650d28dd1ee63773e49664e3d48c484996b290943635a6f2eb1ce9796d3fa144a3f00ef82faaa32d6a413668f7b521517cb68b2b017fcf56c79326fa5e4060e643631ca3f0a0dc0ed718798b6f46b130d437c33f64039e887324b6f5e604b1669d613923794edbf04b1b3caea54793b52b44b170173a4f25c7ecef3b71e2aad76e556b1cb9f1d637ec52ececfa950dd31dbb6a60828a3ad34c1beffe09eb4785786d63bad10a0b0f66ea88c57380f38ea85f018dbd7f538cf1ee7624095b9a01ec5edd528f281168af020609e651ff316aa1320a710134ddfca600cc72174dcdb846d2aa29916488aa1b537b66da92e61af526debef4eb38c984569eaf549ff2129449269b492d030cd74d885f6f5785881cc4804b4a8a09ba4ff7aefe9074ac7d0c4f05d51fe4cc0ff7388a772092b9d02d70e5433a5cf3e02f46a6bd6b818d59a07ce3b9fbbf8b5faba74563bcc5240930c2d406c9aaee3e3ce0429bf68ac2b0a57adb09414cff50817d2a48fb9fa624ab863cb0c31a8b8dc5eaf6fa68cc1d7c6c685c5a33edd5c8933b9e8ab628ee428d0743699b2ff17f25586c7ce959280bb0b8c5342251f0a30b53dbc7bf1ee426ac9619c3560f811f2268ee37f189794e2e4b3db3a2fb2e34b649e504fb467438abfd1082619cc4a0b30d66beb831077812e418d2e2148db10cf4d4a29101ca52ec445b8d83519dd7de85a98e0beae9ee537096d3f1a55a7a80cdfa93d25f07c9f98e8af18cde19ec1f99c5dd4588b717a5039ddb7f177717caf0d0fd45420a70dbd6d3146890d9e450d5224146db4c33b779e3c3a04b976c052bad042ac57dd38be45407808c0fb0d7e2a8819e6cd53c6739e6612996ddaa6f066552590aa0343bc1e62b298ff2514a0cef8be21956c2e942816f7a3a3a0935eaf9b37251409ce444c986c3817e82835555fe18239f3ae33469d7965c2bde9991fde556bd07af01df52bbde0c35bb4ef48e3b5d0db53f8ca4ed35b83f760f0a1bc4ed9f86e85d6039a17df373c85402ef956f01db00eb39c4b74bd0660d29ee746714d9780d738e05c6cca414ce3d7b40dda8036a9eea9ab1388805f913eb19bdd3f09d9e161eaa50231bd9caba61971f194332dd28c696a60458c1c6c2cc5da8b1192611c7c553e9e12fe48ce46bbb891be8bb118721c86222e671ddd1da8f0ccb2b68e02f2014b4925e904e88369aaf7466bd7033a60c265d45955944916ecbdb84bf1b522b01b0149c632e04c568a7eb627c5bb90ece052ebcf79166c28b30d23fe52da0a5ab5dea83ca479a3e3b7a9cfbbfea04dbe6137c19d067317c2ec427a8c75a6b06bec6dcd5d5c0edc9aa80b9003b8e17c088b2f3db327d3e42630d82d20120240c3ba56232280787da4aabbf5bc95a864029f00710e195f2a76460a0317d10b552fe1bea097e41d49756c680a41d6ac186e62169b6b6cd7776ea84618b5b752328a5bacaa10aa122ff9b2698b43efe73d852a899db644863c8c9bc8068ea86ea843fd6fe36272b91cdc5d5317083ef3fd1e5462a0b0d0604dc57b3bbfceb0fca4cd349625dd7b25166af30efe5ee6a0af953a74d65f4736c59918ee55a3b0d9d9d42e04c7f8a77e479109f740e20c464d5d7e3d16805f47b61f403ff7f408c9e850d9baacd8067e544536a4953480b0f9ee9cd45f41ebd67b51f78788a6470cb1e5ca72ca346ce8a50d0ca0c921d5576a4455a1afb6d0bc688004712ee122cacdb29c51e84893324c27fa4a3f1917edf5352272b4c97579a6152e4b77663d0ab532915f2eeb6a862de8b696452321b660c3f2449673d086e95a7af28845a5259b763e0fcd09f72acf7b6c811066263060e5aa5b24658e880a01fd56bda4dad5ab604e129290f7d5489728f2a40968c6168b21cebbbcd11727cc9e9160c4e92e04387d3b0d62aab06a61f26daedd9fed11816ef2180172a47f47184ac4032b88758c98a2e0fb200f70e93ba695f5ebb7a1029610ad360d3b7fa1b4640b9dc674d3625eef786da93dff19bc7991b5d6193a3896664763fde479b5dfc04812111a80782854f2cf68ca7d82765cc9eb40fba4b44640710ed6e653abf9f07b466333f4fd22784d53cf40e17120f42caa841eaa24056b237827b0f47f7257c103c35027e9f503e5acfd023e7357b600d3084d361d5ee65ba319b45c153212a54e6fed85af7e43e0a926ebcbc2edf8de7e2ec9528f00bec262ad04d5c9dafccaea06a24748d28bf1799bae0e895543084539c50b5aaa4fb50d7431d6f0c8cee2a54aaf7ee7919b55bf40adb688632e5dbe273cea09e97b19c3d8e1f4de000deb66fa1942ad03a62d3252f51992244366c156000b49c297167a6cbdedea7ebae139d295f0ad298e0864249b905b7eb812886ec70ecdb286702274b5b8574149bf3866f9e46b997ff5ed622b169a0eb071347f18d530db1663906a28f4544ee4e004ab87b65476af30ede118052ff052b8dc986ca2c93dd5d4943266a579c7698ea014f688b3e8063a107feb162d392e2177b01bff77fb5abe5feebd0607158049a5a093325b7c9ee6b4dfa7a9f65c7c2fb628920d3603a1c2dad979eaa047cd661a268af1078c9788d720e64e4ce9d12e68de1e417ef2f293323681e1071f9220e1ee43d2e29d111b870ce3439f5100ecd4551ab65ee74aa1667e564957e9bc0ae1ea193980da2a0ec2698073388c85bec25ef447f0d5e93a5203fa44dff268e5cb799ed3b66e63d5e07b487e7534f24934c73a62a243e0151843a0fd3807711a101eaa7fc71f0ba68aebb9534d57cba41b094eebfb4c31cca8eddfa426f676aa347be8a7023a4e91ddb154b35cd4d5f7dbc2e5db491de99f33fc2cff2d57029ac950e1ccd681980af6a4e8969dfe39b3c7bfcbcf8fac92f1e6ec9fe572bfa6a7d65860eab2ed10ac01a71290b52e3148e84b7376a8605cd2bb0e8681ffc54691ce087685e33921bd44d36c78291713dce17569570f62137e6904f0d68cf53aa2ec395c389a75141f08114fb293ea63950e4ffee55ec6fc83cf44876b8e7f25cdd393ff87b9eda6eb746085b61a6900de191f0ce2cb388d61ece52e78bc47368194e8e00277e0d1631e6b9d4626ef76f8522582ccd5a40be3febc699bb510acc6271d55ff0f4cf3bb7669855a72efd9ca3e1056a2fe592a5bc877cce2b1f63b58383971da87873d2d1349cf5881242cdce4e7e2c5c514755746a0e0a7c2a6d9701cde005ae3420beb17c379a3516662253554f51f0423bb1844b0b90c54ed8177ceb0e1036a6609d836e748ca06c40ca64befadc6443ec286a0ce464678e8d11eb455f7bb305acebf6cb1f50e394a9bfeb752df1687831bac9cdd811f4f112ef6658d0f8799a866374ff96c5e2b79f30e7a74f8a2bc9ed1f88f01f30e30cb78ffb2bff10108f35e910ee3be4463e9e6f0ed910e8d598326e71dfa2277ffe5579d7fe9b6018bfe295b25219eae07b3b0270665c3fa00c3e0d180812b5cd62925585de84a7c48a9a86dba96544a251654d1966e082432dc85b6149cf21e91a46020ec32b66d28ba3b6a90c0617bc6fdd55aea819af2bcf84864ad60c28fe3c9f8339d0aee68b39d97f63b6e082835d86119cf9b9fdc8b827c847ce40aa10e1577a710132316845e825345e95bdf94d0c66ec65a6c4319fce4792313663b5f7a651a6710783e6ab71608ac6cbbf3af6911adf596ccf7c172b9bd5bceb6db379967b32b143bdd11d2ee12ddf64ecef6391e0f8570e6cddd3db95204919362b89b739fa94e7c1bfde799fd5e22aa25ca6ca42e30c08e23aae2385d99ebab441072a880dcefdab74a4c9bd39d363f6d1933d59400fca161d432aa00f23b1b1c19a154be8989699d549b66d44e39896f5523443bc6ddf4a65e91f1f3fb7b52318869a05856a4fc92f3694c81ed833c972fb918f7e5","cipherparams":{"iv":"8c46d6162cd4c765759aedcbce2a5874"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"82fb6cdc6917609135277badacf15baa31899d08b71a5a0fa33167167c161537"},"mac":"9187b17f7eca48e6b8c586b0cd790dbe0feb876ac8385f93faa7d5e22a3c8fc7"},"id":"92caf6ee-2d43-48c0-859e-ffa1e0e23312","version":3}';
145
+ const TEST_WALLET_PASSPHRASE = "QuantumCoinExample123!";
146
+ const wallet = Wallet.fromEncryptedJsonSync(TEST_WALLET_ENCRYPTED_JSON, TEST_WALLET_PASSPHRASE, provider);
147
+ const walletAddr = getAddress(wallet.address);
148
+ console.log("RPC:", RPC_URL, "| ChainId:", CHAIN_ID, "| Owner:", walletAddr);
149
+ console.log("");
150
+
151
+ let wqAddressNorm = getAddress(WQ_ADDRESS);
152
+ let factoryAddressNorm = getAddress(FACTORY_ADDRESS);
153
+ let routerAddress = getAddress(ROUTER_ADDRESS);
154
+ let wq: any;
155
+ let factoryContract: any;
156
+ let routerContract: any;
157
+
158
+ wq = WQ.connect(wqAddressNorm, wallet);
159
+ factoryContract = QuantumSwapV2Factory.connect(factoryAddressNorm, wallet);
160
+ routerContract = QuantumSwapV2Router02.connect(routerAddress, wallet);
161
+ console.log("1–3) Using pre-deployed WQ, Factory, Router");
162
+ console.log(" WQ:", wqAddressNorm);
163
+ console.log(" Factory:", factoryAddressNorm);
164
+ console.log(" Router:", routerAddress);
165
+ console.log("");
166
+
167
+ const txHashes: string[] = [];
168
+
169
+ // --- 4) Deploy BigCat and SmallDog tokens ---
170
+ console.log("4) Deploying BigCat and SmallDog tokens...");
171
+ const initialSupply = parseUnits("1000000", 18);
172
+ const simpleErc20Factory = new ContractFactory(
173
+ SIMPLE_ERC20_ABI as unknown[],
174
+ SIMPLE_ERC20_BYTECODE as string,
175
+ wallet
176
+ );
177
+ const deploySimpleErc20 = async (name: string, symbol: string): Promise<ContractWithDeployTx> => {
178
+ const tx = simpleErc20Factory.getDeployTransaction(name, symbol, initialSupply);
179
+ const nonce = await provider.getTransactionCount(walletAddr, "pending");
180
+ const address = getCreateAddress({ from: walletAddr, nonce });
181
+ const gasLimit = await estimateGasLimit(provider, { from: walletAddr, data: tx.data as string }, DEPLOY_GAS_FALLBACK);
182
+ const resp = await wallet.sendTransaction({ ...tx, nonce, gasLimit });
183
+ await resp.wait(1, 600_000);
184
+ const contract = new Contract(address, SIMPLE_ERC20_ABI as unknown[], wallet) as ContractWithDeployTx;
185
+ contract._deployTx = resp;
186
+ return contract;
187
+ };
188
+ const bigCat = await deploySimpleErc20("BigCat", "BCAT");
189
+ const smallDog = await deploySimpleErc20("SmallDog", "SDOG");
190
+ txHashes.push(bigCat._deployTx!.hash);
191
+ txHashes.push(smallDog._deployTx!.hash);
192
+ const bigCatAddress = getAddress(bigCat.target as string);
193
+ const smallDogAddress = getAddress(smallDog.target as string);
194
+ console.log(" BigCat:", bigCatAddress);
195
+ console.log(" SmallDog:", smallDogAddress);
196
+ console.log("");
197
+
198
+ // --- 5) Create pair (BigCat, SmallDog) ---
199
+ console.log("5) Creating pair (BigCat, SmallDog)...");
200
+ const createPairTxReq = await factoryContract.populateTransaction.createPair(bigCatAddress, smallDogAddress);
201
+ const createPairGasLimit = await estimateGasLimit(
202
+ provider,
203
+ { from: walletAddr, ...createPairTxReq },
204
+ TX_GAS_FALLBACK
205
+ );
206
+ const createPairTx = await factoryContract.createPair(bigCatAddress, smallDogAddress, {
207
+ gasLimit: createPairGasLimit,
208
+ });
209
+ txHashes.push(createPairTx.hash);
210
+ const createPairReceipt = await createPairTx.wait(1, 600_000);
211
+ let pairAddressFromEvent: string | null = null;
212
+ try {
213
+ pairAddressFromEvent = getAddress(await factoryContract.getPair(bigCatAddress, smallDogAddress));
214
+ } catch {
215
+ pairAddressFromEvent = null;
216
+ }
217
+ const zeroAddress32 = "0x0000000000000000000000000000000000000000000000000000000000000000";
218
+ const pairCreated =
219
+ pairAddressFromEvent &&
220
+ isAddress(pairAddressFromEvent) &&
221
+ pairAddressFromEvent !== zeroAddress32 &&
222
+ pairAddressFromEvent !== "0x" + "0".repeat(64);
223
+ if (pairCreated) {
224
+ console.log(" Pair:", pairAddressFromEvent);
225
+ if (Array.isArray(createPairReceipt?.logs) && createPairReceipt.logs.length >= 1) {
226
+ const factoryIface = new Interface(QuantumSwapV2Factory.abi as unknown[]);
227
+ for (const log of createPairReceipt.logs) {
228
+ if (!log.topics || !log.data) continue;
229
+ try {
230
+ const parsed = factoryIface.parseLog({ topics: log.topics as string[], data: log.data });
231
+ if (parsed && parsed.name === "PairCreated") break;
232
+ } catch {
233
+ // not this contract's event
234
+ }
235
+ }
236
+ }
237
+ } else {
238
+ console.log(" Pair not created (getPair returned zero or invalid).");
239
+ }
240
+ console.log("");
241
+
242
+ // --- 6) Reserves (pair) ---
243
+ if (pairCreated && pairAddressFromEvent) {
244
+ const pairContract = QuantumSwapV2Pair.connect(pairAddressFromEvent, provider);
245
+ const reservesResult = await pairContract.getReserves();
246
+ const reserve0 = Array.isArray(reservesResult) ? reservesResult[0] : (reservesResult as bigint);
247
+ const reserve1 = Array.isArray(reservesResult) ? reservesResult[1] : 0n;
248
+ console.log(
249
+ "6) Pair reserves (before liquidity): reserve0=" + reserve0.toString() + ", reserve1=" + reserve1.toString()
250
+ );
251
+ console.log("");
252
+ }
253
+
254
+ // --- 7) Add liquidity (1000 BigCat, 1000 SmallDog) ---
255
+ if (pairCreated && pairAddressFromEvent) {
256
+ console.log("7) Adding liquidity (1000 BigCat, 1000 SmallDog)...");
257
+ const amountADesired = parseUnits("1000", 18);
258
+ const amountBDesired = parseUnits("1000", 18);
259
+ const approveAmount = amountADesired > amountBDesired ? amountADesired : amountBDesired;
260
+ const approveTxReqA = await (bigCat as any).populateTransaction.approve(routerAddress, approveAmount);
261
+ const approveGasA = await estimateGasLimit(provider, { from: walletAddr, ...approveTxReqA }, TX_GAS_FALLBACK);
262
+ const approveA = await (bigCat as any).approve(routerAddress, approveAmount, { gasLimit: approveGasA });
263
+ txHashes.push(approveA.hash);
264
+ await approveA.wait(1, 600_000);
265
+ const approveTxReqB = await (smallDog as any).populateTransaction.approve(routerAddress, approveAmount);
266
+ const approveGasB = await estimateGasLimit(provider, { from: walletAddr, ...approveTxReqB }, TX_GAS_FALLBACK);
267
+ const approveB = await (smallDog as any).approve(routerAddress, approveAmount, { gasLimit: approveGasB });
268
+ txHashes.push(approveB.hash);
269
+ await approveB.wait(1, 600_000);
270
+ const addLiqDeadline = await deadline(provider);
271
+ const addLiqTxReq = await routerContract.populateTransaction.addLiquidity(
272
+ bigCatAddress,
273
+ smallDogAddress,
274
+ amountADesired,
275
+ amountBDesired,
276
+ 0n,
277
+ 0n,
278
+ walletAddr,
279
+ addLiqDeadline
280
+ );
281
+ const addLiqGasLimit = await estimateGasLimit(provider, { from: walletAddr, ...addLiqTxReq }, TX_GAS_FALLBACK);
282
+ const addLiqTx = await routerContract.addLiquidity(
283
+ bigCatAddress,
284
+ smallDogAddress,
285
+ amountADesired,
286
+ amountBDesired,
287
+ 0n,
288
+ 0n,
289
+ walletAddr,
290
+ addLiqDeadline,
291
+ { gasLimit: addLiqGasLimit }
292
+ );
293
+ txHashes.push(addLiqTx.hash);
294
+ await addLiqTx.wait(1, 600_000);
295
+ const pairContract = QuantumSwapV2Pair.connect(pairAddressFromEvent, provider);
296
+ const reservesAfter = await pairContract.getReserves();
297
+ const res0 = Array.isArray(reservesAfter) ? reservesAfter[0] : (reservesAfter as bigint);
298
+ const res1 = Array.isArray(reservesAfter) ? reservesAfter[1] : 0n;
299
+ console.log(" Reserves after addLiquidity:", res0.toString(), res1.toString());
300
+ console.log("");
301
+ }
302
+
303
+ // --- 8) Quote (getAmountsOut / getAmountsIn) ---
304
+ const pathBigCatToSmallDog = [bigCatAddress, smallDogAddress];
305
+ const amountIn = parseUnits("1", 18);
306
+ let amountsOut: bigint[] = [];
307
+ try {
308
+ amountsOut = (await routerContract.getAmountsOut(amountIn, pathBigCatToSmallDog)) as bigint[];
309
+ } catch {
310
+ // may revert with no liquidity
311
+ }
312
+ if (Array.isArray(amountsOut) && amountsOut.length >= 2) {
313
+ console.log("8) Quote getAmountsOut(1 BigCat):", amountsOut[1].toString(), "SmallDog");
314
+ }
315
+ let amountsIn: bigint[] = [];
316
+ try {
317
+ amountsIn = (await routerContract.getAmountsIn(parseUnits("1", 18), pathBigCatToSmallDog)) as bigint[];
318
+ } catch {
319
+ // may revert with no liquidity
320
+ }
321
+ if (Array.isArray(amountsIn) && amountsIn.length >= 1) {
322
+ console.log(" getAmountsIn(1 SmallDog):", amountsIn[0].toString(), "BigCat");
323
+ }
324
+ console.log("");
325
+
326
+ // --- 9) Swap: 10 BigCat → SmallDog ---
327
+ if (pairCreated && pairAddressFromEvent) {
328
+ console.log("9) Swapping 10 BigCat for SmallDog...");
329
+ const swapAmountIn = parseUnits("10", 18);
330
+ const pathSwap = [bigCatAddress, smallDogAddress];
331
+ const approveSwapTxReq = await (bigCat as any).populateTransaction.approve(routerAddress, swapAmountIn);
332
+ const approveSwapGas = await estimateGasLimit(
333
+ provider,
334
+ { from: walletAddr, ...approveSwapTxReq },
335
+ TX_GAS_FALLBACK
336
+ );
337
+ const approveSwap = await (bigCat as any).approve(routerAddress, swapAmountIn, {
338
+ gasLimit: approveSwapGas,
339
+ });
340
+ txHashes.push(approveSwap.hash);
341
+ await approveSwap.wait(1, 600_000);
342
+ const swapDeadline = await deadline(provider);
343
+ const swapTxReq = await routerContract.populateTransaction.swapExactTokensForTokens(
344
+ swapAmountIn,
345
+ 0n,
346
+ pathSwap,
347
+ walletAddr,
348
+ swapDeadline
349
+ );
350
+ const swapGasLimit = await estimateGasLimit(provider, { from: walletAddr, ...swapTxReq }, TX_GAS_FALLBACK);
351
+ const swapTx = await routerContract.swapExactTokensForTokens(
352
+ swapAmountIn,
353
+ 0n,
354
+ pathSwap,
355
+ walletAddr,
356
+ swapDeadline,
357
+ { gasLimit: swapGasLimit }
358
+ );
359
+ txHashes.push(swapTx.hash);
360
+ await swapTx.wait(1, 600_000);
361
+ const smallDogBalanceRaw = await (smallDog as any).balanceOf(walletAddr);
362
+ const smallDogBalance =
363
+ typeof smallDogBalanceRaw === "bigint" ? smallDogBalanceRaw : BigInt(String(smallDogBalanceRaw));
364
+ console.log(" SmallDog balance after swap:", smallDogBalance.toString());
365
+ console.log("");
366
+ }
367
+
368
+ // --- 10) Swap ETH: WQ deposit, WQ/BigCat pair, addLiquidityETH, swapExactETHForTokens ---
369
+ if (pairCreated && pairAddressFromEvent) {
370
+ console.log("10) Swap ETH: wrap, add WQ/BigCat liquidity, swapExactETHForTokens...");
371
+ const ethToWrap = parseUnits("1", 18);
372
+ const depositTxReq = await wq.populateTransaction.deposit({ value: ethToWrap });
373
+ const depositGasLimit = await estimateGasLimit(
374
+ provider,
375
+ { from: walletAddr, ...depositTxReq },
376
+ TX_GAS_FALLBACK
377
+ );
378
+ const depositTx = await wq.deposit({ value: ethToWrap, gasLimit: depositGasLimit });
379
+ txHashes.push(depositTx.hash);
380
+ await depositTx.wait(1, 600_000);
381
+
382
+ let pairWqBigCatAddr: string | null = null;
383
+ try {
384
+ const raw = await factoryContract.getPair(wqAddressNorm, bigCatAddress);
385
+ pairWqBigCatAddr = getAddress(raw);
386
+ } catch {
387
+ pairWqBigCatAddr = null;
388
+ }
389
+ const zeroAddr = "0x0000000000000000000000000000000000000000000000000000000000000000";
390
+ const hasWqPair =
391
+ pairWqBigCatAddr &&
392
+ isAddress(pairWqBigCatAddr) &&
393
+ pairWqBigCatAddr !== zeroAddr &&
394
+ pairWqBigCatAddr !== "0x" + "0".repeat(64);
395
+ if (!hasWqPair) {
396
+ const createWqPairTxReq = await factoryContract.populateTransaction.createPair(wqAddressNorm, bigCatAddress);
397
+ const createWqPairGasLimit = await estimateGasLimit(
398
+ provider,
399
+ { from: walletAddr, ...createWqPairTxReq },
400
+ TX_GAS_FALLBACK
401
+ );
402
+ const createWqPairTx = await factoryContract.createPair(wqAddressNorm, bigCatAddress, {
403
+ gasLimit: createWqPairGasLimit,
404
+ });
405
+ txHashes.push(createWqPairTx.hash);
406
+ await createWqPairTx.wait(1, 600_000);
407
+ pairWqBigCatAddr = getAddress(await factoryContract.getPair(wqAddressNorm, bigCatAddress));
408
+ }
409
+
410
+ const tokenForEthLiq = parseUnits("500", 18);
411
+ const approveBigCatTxReq = await (bigCat as any).populateTransaction.approve(routerAddress, tokenForEthLiq);
412
+ const approveBigCatGas = await estimateGasLimit(
413
+ provider,
414
+ { from: walletAddr, ...approveBigCatTxReq },
415
+ TX_GAS_FALLBACK
416
+ );
417
+ const approveBigCat = await (bigCat as any).approve(routerAddress, tokenForEthLiq, {
418
+ gasLimit: approveBigCatGas,
419
+ });
420
+ txHashes.push(approveBigCat.hash);
421
+ await approveBigCat.wait(1, 600_000);
422
+ const addLiqEthDeadline = await deadline(provider);
423
+ const addLiqEthTxReq = await routerContract.populateTransaction.addLiquidityETH(
424
+ bigCatAddress,
425
+ tokenForEthLiq,
426
+ 0n,
427
+ 0n,
428
+ walletAddr,
429
+ addLiqEthDeadline,
430
+ { value: ethToWrap }
431
+ );
432
+ const addLiqEthGasLimit = await estimateGasLimit(
433
+ provider,
434
+ { from: walletAddr, ...addLiqEthTxReq },
435
+ TX_GAS_FALLBACK
436
+ );
437
+ const addLiqEthTx = await routerContract.addLiquidityETH(
438
+ bigCatAddress,
439
+ tokenForEthLiq,
440
+ 0n,
441
+ 0n,
442
+ walletAddr,
443
+ addLiqEthDeadline,
444
+ { value: ethToWrap, gasLimit: addLiqEthGasLimit }
445
+ );
446
+ txHashes.push(addLiqEthTx.hash);
447
+ await addLiqEthTx.wait(1, 600_000);
448
+
449
+ const ethSwapValue = parseUnits("0.1", 18);
450
+ const pathEthToToken = [wqAddressNorm, bigCatAddress];
451
+ const swapEthDeadline = await deadline(provider);
452
+ const swapEthTxReq = await routerContract.populateTransaction.swapExactETHForTokens(
453
+ 0n,
454
+ pathEthToToken,
455
+ walletAddr,
456
+ swapEthDeadline,
457
+ { value: ethSwapValue }
458
+ );
459
+ const swapEthGasLimit = await estimateGasLimit(
460
+ provider,
461
+ { from: walletAddr, ...swapEthTxReq },
462
+ TX_GAS_FALLBACK
463
+ );
464
+ const swapEthTx = await routerContract.swapExactETHForTokens(
465
+ 0n,
466
+ pathEthToToken,
467
+ walletAddr,
468
+ swapEthDeadline,
469
+ { value: ethSwapValue, gasLimit: swapEthGasLimit }
470
+ );
471
+ txHashes.push(swapEthTx.hash);
472
+ await swapEthTx.wait(1, 600_000);
473
+ const bigCatBalanceRaw = await (bigCat as any).balanceOf(walletAddr);
474
+ console.log(
475
+ " BigCat balance after ETH swap:",
476
+ (
477
+ typeof bigCatBalanceRaw === "bigint"
478
+ ? bigCatBalanceRaw
479
+ : BigInt(String(bigCatBalanceRaw))
480
+ ).toString()
481
+ );
482
+ console.log("");
483
+ }
484
+
485
+ // --- 11) Send 100 BigCat and 100 SmallDog to another wallet ---
486
+ console.log("11) Sending 100 BigCat and 100 SmallDog to another wallet...");
487
+ const otherWallet = Wallet.createRandom().connect(provider);
488
+ const otherAddr = getAddress(otherWallet.address);
489
+ const transferAmount = parseUnits("100", 18);
490
+ const transferATxReq = await (bigCat as any).populateTransaction.transfer(otherAddr, transferAmount);
491
+ const transferAGasLimit = await estimateGasLimit(
492
+ provider,
493
+ { from: walletAddr, ...transferATxReq },
494
+ TX_GAS_FALLBACK
495
+ );
496
+ const transferATx = await (bigCat as any).transfer(otherAddr, transferAmount, {
497
+ gasLimit: transferAGasLimit,
498
+ });
499
+ txHashes.push(transferATx.hash);
500
+ await transferATx.wait(1, 600_000);
501
+ const transferBTxReq = await (smallDog as any).populateTransaction.transfer(otherAddr, transferAmount);
502
+ const transferBGasLimit = await estimateGasLimit(
503
+ provider,
504
+ { from: walletAddr, ...transferBTxReq },
505
+ TX_GAS_FALLBACK
506
+ );
507
+ const transferBTx = await (smallDog as any).transfer(otherAddr, transferAmount, {
508
+ gasLimit: transferBGasLimit,
509
+ });
510
+ txHashes.push(transferBTx.hash);
511
+ await transferBTx.wait(1, 600_000);
512
+ const otherBigCatRaw = await (bigCat as any).balanceOf(otherAddr);
513
+ const otherSmallDogRaw = await (smallDog as any).balanceOf(otherAddr);
514
+ console.log(
515
+ " Other wallet BigCat balance:",
516
+ (typeof otherBigCatRaw === "bigint" ? otherBigCatRaw : BigInt(String(otherBigCatRaw))).toString()
517
+ );
518
+ console.log(
519
+ " Other wallet SmallDog balance:",
520
+ (typeof otherSmallDogRaw === "bigint" ? otherSmallDogRaw : BigInt(String(otherSmallDogRaw))).toString()
521
+ );
522
+ console.log("");
523
+
524
+ // --- Summary ---
525
+ console.log("========== CONTRACT ADDRESSES ==========");
526
+ console.log(" wallet:", walletAddr);
527
+ console.log(" WQ:", wqAddressNorm);
528
+ console.log(" Factory:", factoryAddressNorm);
529
+ console.log(" Router:", routerAddress);
530
+ console.log(" BigCat:", bigCatAddress);
531
+ console.log(" SmallDog:", smallDogAddress);
532
+ console.log(" PairBigCatSmallDog:", pairCreated ? pairAddressFromEvent : "(not created)");
533
+ if (pairCreated) {
534
+ try {
535
+ const pairWq = await factoryContract.getPair(wqAddressNorm, bigCatAddress);
536
+ const pairWqAddr = getAddress(pairWq);
537
+ if (pairWqAddr && pairWqAddr !== zeroAddress32) console.log(" PairWqBigCat:", pairWqAddr);
538
+ } catch {
539
+ // ignore
540
+ }
541
+ }
542
+ console.log(" OtherWallet:", otherAddr);
543
+ console.log("========================================");
544
+ console.log("");
545
+ console.log("========== TRANSACTION HASHES ==========");
546
+ txHashes.forEach((hash, i) => {
547
+ console.log(" [" + (i + 1) + "] " + hash);
548
+ });
549
+ console.log("========================================");
550
+ console.log("Done.");
551
+ }
552
+
553
+ main().catch((err) => {
554
+ console.error(err);
555
+ process.exit(1);
556
+ });
@@ -1,7 +1,9 @@
1
+ const path = require("node:path");
1
2
  const { Initialize } = require("quantumcoin/config");
2
- const { JsonRpcProvider } = require("quantumcoin");
3
+ const { getProvider } = require("quantumcoin");
3
4
  const { createTestWallet } = require("./_test-wallet");
4
- const { IERC20 } = require("..");
5
+ const parentQswapPath = path.join(__dirname, "..");
6
+ const { IERC20 } = require(parentQswapPath);
5
7
 
6
8
  async function main() {
7
9
  const rpcUrl = process.env.QC_RPC_URL;
@@ -11,7 +13,7 @@ async function main() {
11
13
  if (!address) throw new Error("CONTRACT_ADDRESS is required");
12
14
  await Initialize(null);
13
15
 
14
- const provider = new JsonRpcProvider(rpcUrl, chainId);
16
+ const provider = getProvider(rpcUrl, chainId);
15
17
  const wallet = createTestWallet(provider);
16
18
  const contract = IERC20.connect(address, wallet);
17
19
 
@@ -1,7 +1,9 @@
1
+ const path = require("node:path");
1
2
  const { Initialize } = require("quantumcoin/config");
2
- const { JsonRpcProvider } = require("quantumcoin");
3
+ const { getProvider } = require("quantumcoin");
3
4
  const { createTestWallet } = require("./_test-wallet");
4
- const { QuantumSwapV2ERC20 } = require("..");
5
+ const parentQswapPath = path.join(__dirname, "..");
6
+ const { QuantumSwapV2ERC20 } = require(parentQswapPath);
5
7
 
6
8
  async function main() {
7
9
  const rpcUrl = process.env.QC_RPC_URL;
@@ -11,7 +13,7 @@ async function main() {
11
13
  if (!address) throw new Error("CONTRACT_ADDRESS is required");
12
14
  await Initialize(null);
13
15
 
14
- const provider = new JsonRpcProvider(rpcUrl, chainId);
16
+ const provider = getProvider(rpcUrl, chainId);
15
17
  const wallet = createTestWallet(provider);
16
18
  const contract = QuantumSwapV2ERC20.connect(address, wallet);
17
19
 
@@ -1,7 +1,9 @@
1
+ const path = require("node:path");
1
2
  const { Initialize } = require("quantumcoin/config");
2
- const { JsonRpcProvider } = require("quantumcoin");
3
+ const { getProvider } = require("quantumcoin");
3
4
  const { createTestWallet } = require("./_test-wallet");
4
- const { QuantumSwapV2Factory } = require("..");
5
+ const parentQswapPath = path.join(__dirname, "..");
6
+ const { QuantumSwapV2Factory } = require(parentQswapPath);
5
7
 
6
8
  async function main() {
7
9
  const rpcUrl = process.env.QC_RPC_URL;
@@ -11,7 +13,7 @@ async function main() {
11
13
  if (!address) throw new Error("CONTRACT_ADDRESS is required");
12
14
  await Initialize(null);
13
15
 
14
- const provider = new JsonRpcProvider(rpcUrl, chainId);
16
+ const provider = getProvider(rpcUrl, chainId);
15
17
  const wallet = createTestWallet(provider);
16
18
  const contract = QuantumSwapV2Factory.connect(address, wallet);
17
19
 
@@ -1,7 +1,9 @@
1
+ const path = require("node:path");
1
2
  const { Initialize } = require("quantumcoin/config");
2
- const { JsonRpcProvider } = require("quantumcoin");
3
+ const { getProvider } = require("quantumcoin");
3
4
  const { createTestWallet } = require("./_test-wallet");
4
- const { QuantumSwapV2Pair } = require("..");
5
+ const parentQswapPath = path.join(__dirname, "..");
6
+ const { QuantumSwapV2Pair } = require(parentQswapPath);
5
7
 
6
8
  async function main() {
7
9
  const rpcUrl = process.env.QC_RPC_URL;
@@ -11,7 +13,7 @@ async function main() {
11
13
  if (!address) throw new Error("CONTRACT_ADDRESS is required");
12
14
  await Initialize(null);
13
15
 
14
- const provider = new JsonRpcProvider(rpcUrl, chainId);
16
+ const provider = getProvider(rpcUrl, chainId);
15
17
  const wallet = createTestWallet(provider);
16
18
  const contract = QuantumSwapV2Pair.connect(address, wallet);
17
19
 
@@ -1,7 +1,9 @@
1
+ const path = require("node:path");
1
2
  const { Initialize } = require("quantumcoin/config");
2
- const { JsonRpcProvider } = require("quantumcoin");
3
+ const { getProvider } = require("quantumcoin");
3
4
  const { createTestWallet } = require("./_test-wallet");
4
- const { QuantumSwapV2Router02 } = require("..");
5
+ const parentQswapPath = path.join(__dirname, "..");
6
+ const { QuantumSwapV2Router02 } = require(parentQswapPath);
5
7
 
6
8
  async function main() {
7
9
  const rpcUrl = process.env.QC_RPC_URL;
@@ -11,7 +13,7 @@ async function main() {
11
13
  if (!address) throw new Error("CONTRACT_ADDRESS is required");
12
14
  await Initialize(null);
13
15
 
14
- const provider = new JsonRpcProvider(rpcUrl, chainId);
16
+ const provider = getProvider(rpcUrl, chainId);
15
17
  const wallet = createTestWallet(provider);
16
18
  const contract = QuantumSwapV2Router02.connect(address, wallet);
17
19