punkkit-sdk 1.0.0

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 (94) hide show
  1. package/.env +47 -0
  2. package/.gitmodules +3 -0
  3. package/README.md +158 -0
  4. package/config/auction.config.ts +40 -0
  5. package/config/env.config.ts +204 -0
  6. package/config/uniswap.config.ts +107 -0
  7. package/config/voucher.config.ts +10 -0
  8. package/contracts/MutiVoucher.sol +78 -0
  9. package/contracts/auction/ChainXAuction.sol +177 -0
  10. package/contracts/auction/ChainXAuctionV2.sol +672 -0
  11. package/contracts/auction/ChainXWrappedETH.sol +80 -0
  12. package/contracts/auction/ChainYLiquidityManager.sol +57 -0
  13. package/contracts/auction/ChainYShadowETH.sol +148 -0
  14. package/contracts/auction/ChainYVault.sol +195 -0
  15. package/contracts/auction/ChainYVaultCoinbase.sol +276 -0
  16. package/contracts/auction/ChainYVaultV2.sol +318 -0
  17. package/contracts/auction/coinbase-and-stake/README.md +55 -0
  18. package/contracts/auction/coinbase-and-stake/coinbase.sol +142 -0
  19. package/contracts/auction/coinbase-and-stake/invokeCoinbase.sol +159 -0
  20. package/contracts/auction/coinbase-and-stake/invokeStake.sol +82 -0
  21. package/contracts/auction/coinbase-and-stake/stake.sol +92 -0
  22. package/contracts/auction/interfaces/IUniswapV2Factory.sol +15 -0
  23. package/contracts/auction/interfaces/IUniswapV2Pair.sol +53 -0
  24. package/contracts/auction/interfaces/IUniswapV2Router02.sol +25 -0
  25. package/contracts/auction/interfaces/IUnlockStrategy.sol +18 -0
  26. package/contracts/auction/libraries/EventParser.sol +32 -0
  27. package/contracts/auction/libraries/TransactionParser.sol +70 -0
  28. package/contracts/auction/strategies/MatchResultWithdrawnStrategy.sol +33 -0
  29. package/contracts/auction/utils/BytesLib.sol +180 -0
  30. package/contracts/auction/utils/RLPReader.sol +355 -0
  31. package/contracts/uniswap/Create2.sol +80 -0
  32. package/contracts/uniswap/DynamicFee.sol +100 -0
  33. package/contracts/uniswap/Example.sol +35 -0
  34. package/contracts/uniswap/HookMiner.sol +52 -0
  35. package/contracts/uniswap/LimitOrder.sol +486 -0
  36. package/contracts/uniswap/LiquidPool.sol +179 -0
  37. package/contracts/uniswap/MockERC20.sol +20 -0
  38. package/hardhat.config.ts +35 -0
  39. package/ignition/modules/LimitOrder.ts +33 -0
  40. package/package.json +32 -0
  41. package/scripts/auction/deploy.ts +23 -0
  42. package/scripts/auction/deployCoinbase.ts +21 -0
  43. package/scripts/auction/deployXAuction.ts +23 -0
  44. package/scripts/auction/deployYVault.ts +22 -0
  45. package/scripts/deploy_voucher.ts +20 -0
  46. package/scripts/uniswap/deploy/deploy.ts +65 -0
  47. package/scripts/uniswap/deploy/deploy_create2.ts +11 -0
  48. package/scripts/uniswap/deploy/deploy_example.ts +35 -0
  49. package/scripts/uniswap/deploy/deploy_hooks.ts +74 -0
  50. package/scripts/uniswap/deploy/deploy_mockERC20.ts +42 -0
  51. package/scripts/uniswap/deploy/help.ts +96 -0
  52. package/scripts/uniswap/deploy/init.ts +70 -0
  53. package/src/auction/chainXAuction.ts +209 -0
  54. package/src/auction/chainYVault.ts +153 -0
  55. package/src/auction/event.ts +19 -0
  56. package/src/auction/serialize.ts +162 -0
  57. package/src/auction/type.ts +71 -0
  58. package/src/lib/signer.ts +20 -0
  59. package/src/lib/unlock.ts +14 -0
  60. package/src/uniswap/1-marketprice/addLiquidity.ts +80 -0
  61. package/src/uniswap/1-marketprice/removeLiquidity.ts +63 -0
  62. package/src/uniswap/1-marketprice/swap.ts +100 -0
  63. package/src/uniswap/2-limitorder/kill.ts +70 -0
  64. package/src/uniswap/2-limitorder/place.ts +93 -0
  65. package/src/uniswap/2-limitorder/withdraw.ts +78 -0
  66. package/src/uniswap/3-dynamicfee/dynamicfee.ts +321 -0
  67. package/src/uniswap/lib/ERC20.ts +49 -0
  68. package/src/uniswap/lib/contract.ts +18 -0
  69. package/src/uniswap/lib/limitOrder.ts +40 -0
  70. package/src/uniswap/lib/liqCalculation.ts +152 -0
  71. package/src/uniswap/lib/listen.ts +57 -0
  72. package/src/uniswap/lib/pool.ts +62 -0
  73. package/src/uniswap/lib/swap.ts +8 -0
  74. package/src/uniswap/lib/types.ts +21 -0
  75. package/src/uniswap/lib/utils.ts +26 -0
  76. package/src/uniswap/playgroud/abiencode.ts +21 -0
  77. package/src/uniswap/playgroud/amount0.ts +47 -0
  78. package/src/uniswap/playgroud/errordecode.ts +54 -0
  79. package/src/uniswap/playgroud/errorsigs.ts +86 -0
  80. package/src/voucher.ts +122 -0
  81. package/test/auction/ChainXAuctionV2.test.ts +265 -0
  82. package/test/auction/ChainYVaultV2.test.js +163 -0
  83. package/test/auction/ChainYVaultV2.test.ts +183 -0
  84. package/test/auction/auction.test.ts +106 -0
  85. package/test/connect_punk.test.ts +26 -0
  86. package/test/create2.test.ts +44 -0
  87. package/test/normal.ts +43 -0
  88. package/test/test-config.ts +18 -0
  89. package/test/uniswap/example.test.ts +62 -0
  90. package/test/uniswap/limitOrder.test.ts +184 -0
  91. package/test/uniswap/mockERC20.test.ts +142 -0
  92. package/test/voucher_hardhat.test.ts +120 -0
  93. package/test/voucher_punk.test.ts +83 -0
  94. package/tsconfig.json +11 -0
@@ -0,0 +1,177 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
5
+ import "./utils/RLPReader.sol";
6
+ import "./utils/BytesLib.sol";
7
+
8
+ contract ChainXAuction is ReentrancyGuard {
9
+ using RLPReader for bytes;
10
+ using RLPReader for RLPReader.RLPItem;
11
+ using BytesLib for bytes;
12
+
13
+ struct Auction {
14
+ uint256 amount;
15
+ address seller;
16
+ uint256 highestBid;
17
+ address highestBidder;
18
+ bytes32 secretHash;
19
+ uint256 secretValue;
20
+ uint256 endTime;
21
+ bool isActive;
22
+ bool isClaimed;
23
+ }
24
+
25
+ mapping(bytes32 => Auction) public auctions;
26
+
27
+ event AuctionCreated(bytes32 indexed auctionId, uint256 endTime);
28
+ event NewBid(bytes32 indexed auctionId, address bidder, uint256 amount);
29
+ event AuctionFinalized(bytes32 indexed auctionId, address winner, uint256 amount);
30
+ event AuctionCancelled(bytes32 indexed auctionId);
31
+
32
+ struct CrossChainData {
33
+ uint256 sourceChainId;
34
+ bytes rawTransaction;
35
+ }
36
+
37
+ // 可更新的 ABI
38
+ bytes public lockTokenABI;
39
+ address public admin;
40
+
41
+ constructor() {
42
+ admin = msg.sender;
43
+ // 初始化 lockToken 函数的 ABI
44
+ lockTokenABI = abi.encodeWithSignature("lockTokens(bytes32,uint256)");
45
+ }
46
+
47
+ function updateLockTokenABI(bytes memory newABI) external {
48
+ require(msg.sender == admin, "Only admin can update ABI");
49
+ lockTokenABI = newABI;
50
+ }
51
+
52
+ struct RawTransaction {
53
+ uint256 nonce;
54
+ uint256 gasPrice;
55
+ uint256 gasLimit;
56
+ address to;
57
+ uint256 value;
58
+ bytes data;
59
+ uint8 v;
60
+ bytes32 r;
61
+ bytes32 s;
62
+ }
63
+
64
+ function createAuction(bytes memory crossChainMessage) external {
65
+ CrossChainData memory ccData = abi.decode(crossChainMessage, (CrossChainData));
66
+
67
+ // 解析原始交易
68
+ RawTransaction memory rawTx = parseRawTransaction(ccData.rawTransaction);
69
+
70
+ // 解析 lockToken 调用数据
71
+ require(rawTx.data.length >= 4, "Invalid function selector");
72
+ bytes4 selector = bytes4(rawTx.data.slice(0, 4));
73
+ require(bytes4(lockTokenABI.slice(0, 4)) == selector, "Invalid function");
74
+
75
+ (bytes32 secretHash, uint256 expiration) = abi.decode(
76
+ rawTx.data.slice(4, rawTx.data.length - 4),
77
+ (bytes32, uint256)
78
+ );
79
+
80
+ address sender = ecrecover(
81
+ keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(ccData.rawTransaction))),
82
+ rawTx.v,
83
+ rawTx.r,
84
+ rawTx.s
85
+ );
86
+
87
+ // bytes32 auctionId = keccak256(ccData.rawTransaction);
88
+ bytes32 auctionId = keccak256(abi.encodePacked(
89
+ sender,
90
+ secretHash,
91
+ expiration
92
+ ));
93
+
94
+ require(!auctions[auctionId].isActive, "Auction already exists");
95
+ require(rawTx.value > 0, "Amount must be greater than 0");
96
+
97
+ auctions[auctionId] = Auction({
98
+ amount: rawTx.value,
99
+ seller: sender,
100
+ highestBid: 0,
101
+ highestBidder: address(0),
102
+ secretHash: secretHash,
103
+ secretValue: 0,
104
+ endTime: expiration,
105
+ isActive: true,
106
+ isClaimed: false
107
+ });
108
+
109
+ emit AuctionCreated(auctionId, expiration);
110
+ }
111
+
112
+ function parseRawTransaction(bytes memory rawTx) internal pure returns (RawTransaction memory) {
113
+ RLPReader.RLPItem[] memory items = rawTx.toRlpItem().toList();
114
+ require(items.length == 9, "Invalid transaction format");
115
+
116
+ return RawTransaction({
117
+ nonce: items[0].toUint(),
118
+ gasPrice: items[1].toUint(),
119
+ gasLimit: items[2].toUint(),
120
+ to: address(uint160(items[3].toUint())),
121
+ value: items[4].toUint(),
122
+ data: items[5].toBytes(),
123
+ v: uint8(items[6].toUint()),
124
+ r: bytes32(items[7].toUint()),
125
+ s: bytes32(items[8].toUint())
126
+ });
127
+ }
128
+
129
+ function placeBid(bytes32 auctionId) external payable nonReentrant {
130
+ Auction storage auction = auctions[auctionId];
131
+ require(auction.isActive, "Auction not active");
132
+ require(block.timestamp < auction.endTime, "Auction ended");
133
+ require(msg.value > auction.highestBid, "Bid too low");
134
+
135
+ // 退还之前的最高出价
136
+ if (auction.highestBidder != address(0)) {
137
+ payable(auction.highestBidder).transfer(auction.highestBid);
138
+ }
139
+
140
+ auction.highestBid = msg.value;
141
+ auction.highestBidder = msg.sender;
142
+
143
+ emit NewBid(auctionId, msg.sender, msg.value);
144
+ }
145
+
146
+ function finalizeAuction(bytes32 auctionId, bytes32 secret) external nonReentrant {
147
+ Auction storage auction = auctions[auctionId];
148
+ require(auction.isActive, "Auction not active");
149
+ require(!auction.isClaimed, "Auction already claimed");
150
+
151
+ // 验证密钥
152
+ if (keccak256(abi.encodePacked(secret)) == auction.secretHash) {
153
+ // x 公开,直接完成拍卖
154
+ auction.secretValue = uint256(secret);
155
+ auction.isActive = false;
156
+ auction.isClaimed = true;
157
+
158
+ // 转账给卖家
159
+ payable(auction.seller).transfer(auction.highestBid);
160
+
161
+ emit AuctionFinalized(auctionId, auction.highestBidder, auction.highestBid);
162
+ } else {
163
+ // x 未公开且超时,退回竞拍金额
164
+ require(block.timestamp > auction.endTime, "Auction not ended");
165
+
166
+ auction.isActive = false;
167
+ auction.isClaimed = true;
168
+
169
+ // 退还最高出价
170
+ if (auction.highestBidder != address(0)) {
171
+ payable(auction.highestBidder).transfer(auction.highestBid);
172
+ }
173
+
174
+ emit AuctionCancelled(auctionId);
175
+ }
176
+ }
177
+ }