levr-sdk 0.2.2 → 0.3.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 (131) hide show
  1. package/dist/esm/abis/ClankerAirdropV2.js +289 -0
  2. package/dist/esm/abis/ClankerVault.js +215 -0
  3. package/dist/esm/abis/LevrFactory_v1.js +23 -0
  4. package/dist/esm/abis/LevrFeeSplitterFactory_v1.js +197 -0
  5. package/dist/esm/abis/LevrFeeSplitter_v1.js +544 -0
  6. package/dist/esm/abis/LevrGovernor_v1.js +10 -0
  7. package/dist/esm/abis/index.js +4 -0
  8. package/dist/esm/airdrop.js +160 -0
  9. package/dist/esm/airdrop.js.map +1 -0
  10. package/dist/esm/build-calldatas-v4.js +3 -1
  11. package/dist/esm/build-calldatas-v4.js.map +1 -1
  12. package/dist/esm/build-clanker-v4.js +75 -25
  13. package/dist/esm/build-clanker-v4.js.map +1 -1
  14. package/dist/esm/client/hook/index.js +10 -0
  15. package/dist/esm/client/hook/index.js.map +1 -1
  16. package/dist/esm/client/hook/use-airdrop.js +8 -4
  17. package/dist/esm/client/hook/use-airdrop.js.map +1 -1
  18. package/dist/esm/client/hook/use-configure-splits.js +43 -0
  19. package/dist/esm/client/hook/use-configure-splits.js.map +1 -0
  20. package/dist/esm/client/hook/use-deploy.js +3 -3
  21. package/dist/esm/client/hook/use-deploy.js.map +1 -1
  22. package/dist/esm/client/hook/use-factory.js +33 -0
  23. package/dist/esm/client/hook/use-factory.js.map +1 -0
  24. package/dist/esm/client/hook/use-fee-receivers.js +3 -2
  25. package/dist/esm/client/hook/use-fee-receivers.js.map +1 -1
  26. package/dist/esm/client/hook/use-governance.js +18 -3
  27. package/dist/esm/client/hook/use-governance.js.map +1 -1
  28. package/dist/esm/client/hook/use-project.js +7 -3
  29. package/dist/esm/client/hook/use-project.js.map +1 -1
  30. package/dist/esm/client/hook/use-proposal.js +11 -5
  31. package/dist/esm/client/hook/use-proposal.js.map +1 -1
  32. package/dist/esm/client/hook/use-stake.js +1 -1
  33. package/dist/esm/client/hook/use-stake.js.map +1 -1
  34. package/dist/esm/client/hook/use-vault.js +67 -0
  35. package/dist/esm/client/hook/use-vault.js.map +1 -0
  36. package/dist/esm/client/levr-provider.js +18 -2
  37. package/dist/esm/client/levr-provider.js.map +1 -1
  38. package/dist/esm/client/query-keys.js +13 -1
  39. package/dist/esm/client/query-keys.js.map +1 -1
  40. package/dist/esm/constants.js +83 -6
  41. package/dist/esm/constants.js.map +1 -1
  42. package/dist/esm/deploy-v4.js +56 -3
  43. package/dist/esm/deploy-v4.js.map +1 -1
  44. package/dist/esm/factory.js +94 -0
  45. package/dist/esm/factory.js.map +1 -0
  46. package/dist/esm/fee-receivers.js +265 -4
  47. package/dist/esm/fee-receivers.js.map +1 -1
  48. package/dist/esm/fee-splitter.js +68 -0
  49. package/dist/esm/fee-splitter.js.map +1 -0
  50. package/dist/esm/governance.js +86 -9
  51. package/dist/esm/governance.js.map +1 -1
  52. package/dist/esm/index.js +5 -1
  53. package/dist/esm/index.js.map +1 -1
  54. package/dist/esm/ipfs-merkle-tree.js +130 -0
  55. package/dist/esm/ipfs-merkle-tree.js.map +1 -0
  56. package/dist/esm/project.js +114 -26
  57. package/dist/esm/project.js.map +1 -1
  58. package/dist/esm/schema/levr.schema.js +94 -33
  59. package/dist/esm/schema/levr.schema.js.map +1 -1
  60. package/dist/esm/stake.js +157 -19
  61. package/dist/esm/stake.js.map +1 -1
  62. package/dist/esm/vault.js +136 -0
  63. package/dist/esm/vault.js.map +1 -0
  64. package/dist/types/abis/ClankerAirdropV2.d.ts +573 -0
  65. package/dist/types/abis/ClankerVault.d.ts +407 -0
  66. package/dist/types/abis/LevrFactory_v1.d.ts +18 -0
  67. package/dist/types/abis/LevrFeeSplitterFactory_v1.d.ts +149 -0
  68. package/dist/types/abis/LevrFeeSplitter_v1.d.ts +422 -0
  69. package/dist/types/abis/LevrGovernor_v1.d.ts +8 -0
  70. package/dist/types/abis/index.d.ts +4 -0
  71. package/dist/types/airdrop.d.ts +18 -0
  72. package/dist/types/airdrop.d.ts.map +1 -0
  73. package/dist/types/build-calldatas-v4.d.ts +3 -0
  74. package/dist/types/build-calldatas-v4.d.ts.map +1 -1
  75. package/dist/types/build-clanker-v4.d.ts +6 -1
  76. package/dist/types/build-clanker-v4.d.ts.map +1 -1
  77. package/dist/types/client/hook/index.d.ts +10 -0
  78. package/dist/types/client/hook/index.d.ts.map +1 -1
  79. package/dist/types/client/hook/use-airdrop.d.ts +3 -1
  80. package/dist/types/client/hook/use-airdrop.d.ts.map +1 -1
  81. package/dist/types/client/hook/use-configure-splits.d.ts +17 -0
  82. package/dist/types/client/hook/use-configure-splits.d.ts.map +1 -0
  83. package/dist/types/client/hook/use-deploy.d.ts +21 -14
  84. package/dist/types/client/hook/use-deploy.d.ts.map +1 -1
  85. package/dist/types/client/hook/use-factory.d.ts +34 -0
  86. package/dist/types/client/hook/use-factory.d.ts.map +1 -0
  87. package/dist/types/client/hook/use-fee-receivers.d.ts +1 -1
  88. package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -1
  89. package/dist/types/client/hook/use-governance.d.ts +18 -2
  90. package/dist/types/client/hook/use-governance.d.ts.map +1 -1
  91. package/dist/types/client/hook/use-project.d.ts +169 -1
  92. package/dist/types/client/hook/use-project.d.ts.map +1 -1
  93. package/dist/types/client/hook/use-proposal.d.ts +3 -2
  94. package/dist/types/client/hook/use-proposal.d.ts.map +1 -1
  95. package/dist/types/client/hook/use-vault.d.ts +13 -0
  96. package/dist/types/client/hook/use-vault.d.ts.map +1 -0
  97. package/dist/types/client/levr-provider.d.ts +15 -1
  98. package/dist/types/client/levr-provider.d.ts.map +1 -1
  99. package/dist/types/client/query-keys.d.ts +13 -1
  100. package/dist/types/client/query-keys.d.ts.map +1 -1
  101. package/dist/types/constants.d.ts +59 -1
  102. package/dist/types/constants.d.ts.map +1 -1
  103. package/dist/types/deploy-v4.d.ts +3 -1
  104. package/dist/types/deploy-v4.d.ts.map +1 -1
  105. package/dist/types/factory.d.ts +21 -0
  106. package/dist/types/factory.d.ts.map +1 -0
  107. package/dist/types/fee-receivers.d.ts +1822 -1
  108. package/dist/types/fee-receivers.d.ts.map +1 -1
  109. package/dist/types/fee-splitter.d.ts +23 -0
  110. package/dist/types/fee-splitter.d.ts.map +1 -0
  111. package/dist/types/governance.d.ts +18 -2
  112. package/dist/types/governance.d.ts.map +1 -1
  113. package/dist/types/index.d.ts +5 -1
  114. package/dist/types/index.d.ts.map +1 -1
  115. package/dist/types/ipfs-merkle-tree.d.ts +72 -0
  116. package/dist/types/ipfs-merkle-tree.d.ts.map +1 -0
  117. package/dist/types/project.d.ts +10 -2
  118. package/dist/types/project.d.ts.map +1 -1
  119. package/dist/types/proposal.d.ts +16 -0
  120. package/dist/types/proposal.d.ts.map +1 -1
  121. package/dist/types/schema/levr.schema.d.ts +16 -4
  122. package/dist/types/schema/levr.schema.d.ts.map +1 -1
  123. package/dist/types/stake.d.ts +33 -2
  124. package/dist/types/stake.d.ts.map +1 -1
  125. package/dist/types/vault.d.ts +70 -0
  126. package/dist/types/vault.d.ts.map +1 -0
  127. package/package.json +1 -1
  128. package/dist/esm/treasury.js +0 -90
  129. package/dist/esm/treasury.js.map +0 -1
  130. package/dist/types/treasury.d.ts +0 -11
  131. package/dist/types/treasury.d.ts.map +0 -1
@@ -0,0 +1,160 @@
1
+ import { StandardMerkleTree } from "@openzeppelin/merkle-tree";
2
+ import ClankerAirdropV2 from "./abis/ClankerAirdropV2.js";
3
+ import { formatBalanceWithUsd } from "./balance.js";
4
+ import { GET_CLANKER_AIRDROP_ADDRESS } from "./constants.js";
5
+ import { retrieveMerkleTreeFromIPFS } from "./ipfs-merkle-tree.js";
6
+ export async function getAirdropStatus(publicClient, clankerToken, treasury, tokenDecimals, tokenUsdPrice, ipfsSearchUrl, // Full URL to /api/ipfs-search
7
+ ipfsJsonUrl // Full URL to /api/ipfs-json
8
+ ) {
9
+ const chainId = publicClient.chain?.id;
10
+ const airdropAddress = GET_CLANKER_AIRDROP_ADDRESS(chainId);
11
+ if (!airdropAddress) {
12
+ return null;
13
+ }
14
+ if (!ipfsSearchUrl || !ipfsJsonUrl) {
15
+ return null;
16
+ }
17
+ try {
18
+ // Fetch merkle tree from IPFS
19
+ const treeData = await retrieveMerkleTreeFromIPFS({
20
+ tokenAddress: clankerToken,
21
+ chainId,
22
+ ipfsSearchUrl,
23
+ ipfsJsonUrl,
24
+ });
25
+ if (!treeData) {
26
+ return null;
27
+ }
28
+ const treeWithMetadata = treeData;
29
+ const tree = StandardMerkleTree.load(treeWithMetadata);
30
+ // Get current block time for accurate comparison (always needed)
31
+ const currentBlock = await publicClient.getBlock();
32
+ const currentBlockTime = Number(currentBlock.timestamp) * 1000;
33
+ // Try to get metadata from IPFS first to avoid RPC calls
34
+ let lockupEndTime;
35
+ let lockupDuration;
36
+ if (treeWithMetadata.metadata?.lockupEndTime) {
37
+ // Use saved metadata from IPFS (fast path!)
38
+ lockupEndTime = treeWithMetadata.metadata.lockupEndTime;
39
+ lockupDuration = treeWithMetadata.metadata.lockupDuration;
40
+ }
41
+ else {
42
+ // Fallback: Query contract (slower)
43
+ const airdropInfo = await publicClient.readContract({
44
+ address: airdropAddress,
45
+ abi: ClankerAirdropV2,
46
+ functionName: "airdrops",
47
+ args: [clankerToken],
48
+ });
49
+ lockupEndTime = Number(airdropInfo[4]) * 1000;
50
+ lockupDuration = 86400; // 1 day in seconds
51
+ }
52
+ // Calculate derived values from saved metadata
53
+ const deploymentTimestamp = lockupEndTime - lockupDuration * 1000;
54
+ const lockupDurationHours = lockupDuration / 3600;
55
+ // Process ALL recipients in the merkle tree
56
+ const recipients = [];
57
+ // Collect all recipients first to batch the multicall
58
+ const recipientEntries = [];
59
+ for (const [i, value] of tree.entries()) {
60
+ const [address, amount] = value;
61
+ recipientEntries.push({
62
+ address: address,
63
+ allocatedAmount: BigInt(amount),
64
+ index: i,
65
+ });
66
+ }
67
+ // Get current block number for claim event search
68
+ const currentBlockNumber = await publicClient.getBlockNumber();
69
+ const blocksToSearch = 1000000n;
70
+ const fromBlock = currentBlockNumber > blocksToSearch ? currentBlockNumber - blocksToSearch : 0n;
71
+ // Get AirdropClaimed events to check who has actually claimed
72
+ const airdropClaimedEvent = ClankerAirdropV2.find((item) => item.type === "event" && item.name === "AirdropClaimed");
73
+ const claimLogs = airdropClaimedEvent
74
+ ? await publicClient.getLogs({
75
+ address: airdropAddress,
76
+ event: airdropClaimedEvent,
77
+ args: {
78
+ token: clankerToken,
79
+ },
80
+ fromBlock,
81
+ toBlock: "latest",
82
+ })
83
+ : [];
84
+ // Track which addresses have claimed
85
+ const claimedAddresses = new Set(claimLogs.map((log) => log.args.user.toLowerCase()));
86
+ // Batch check available amounts for all recipients
87
+ const availableAmounts = (await publicClient.multicall({
88
+ contracts: recipientEntries.map((entry) => ({
89
+ address: airdropAddress,
90
+ abi: ClankerAirdropV2,
91
+ functionName: "amountAvailableToClaim",
92
+ args: [clankerToken, entry.address, entry.allocatedAmount],
93
+ })),
94
+ allowFailure: true,
95
+ }));
96
+ // Process each recipient
97
+ for (let i = 0; i < recipientEntries.length; i++) {
98
+ const entry = recipientEntries[i];
99
+ const availableResult = availableAmounts[i];
100
+ const availableAmount = availableResult?.result ?? 0n;
101
+ const isTreasury = entry.address.toLowerCase() === treasury.toLowerCase();
102
+ const hasClaimed = claimedAddresses.has(entry.address.toLowerCase());
103
+ // Generate proof for this recipient
104
+ const proof = tree.getProof(entry.index);
105
+ // Log for debugging single recipient case
106
+ if (recipientEntries.length === 1) {
107
+ console.log("[AIRDROP] Single recipient detected:", {
108
+ address: entry.address,
109
+ proofLength: proof.length,
110
+ proof,
111
+ index: entry.index,
112
+ allocatedAmount: entry.allocatedAmount.toString(),
113
+ availableAmount: availableAmount.toString(),
114
+ });
115
+ }
116
+ // Determine status
117
+ let error;
118
+ let isAvailable = availableAmount > 0n;
119
+ if (availableAmount === 0n) {
120
+ if (hasClaimed) {
121
+ // Actually claimed
122
+ error = "Airdrop already claimed";
123
+ isAvailable = false;
124
+ }
125
+ else {
126
+ // Not claimed but 0 available = still locked
127
+ const isLocked = currentBlockTime < lockupEndTime;
128
+ if (isLocked) {
129
+ error = "Airdrop is still locked (lockup period not passed)";
130
+ isAvailable = false;
131
+ }
132
+ else {
133
+ // Unlocked but 0 available and not claimed - shouldn't happen
134
+ error = "No airdrop available";
135
+ isAvailable = false;
136
+ }
137
+ }
138
+ }
139
+ recipients.push({
140
+ address: entry.address,
141
+ allocatedAmount: formatBalanceWithUsd(entry.allocatedAmount, tokenDecimals, tokenUsdPrice),
142
+ availableAmount: formatBalanceWithUsd(availableAmount, tokenDecimals, tokenUsdPrice),
143
+ isAvailable,
144
+ proof,
145
+ isTreasury,
146
+ error,
147
+ });
148
+ }
149
+ return {
150
+ recipients,
151
+ deploymentTimestamp,
152
+ lockupDurationHours,
153
+ };
154
+ }
155
+ catch (error) {
156
+ console.error("[AIRDROP] Failed to fetch airdrop:", error);
157
+ return null;
158
+ }
159
+ }
160
+ //# sourceMappingURL=airdrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airdrop.js","sourceRoot":"","sources":["../../src/airdrop.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,7 @@ export const buildCalldatasV4 = async ({ c, clanker, publicClient, wallet, facto
37
37
  functionName: "prepareForDeployment",
38
38
  data: result.data,
39
39
  });
40
- const config = buildClankerV4({
40
+ const { config, merkleTree } = buildClankerV4({
41
41
  c,
42
42
  treasuryAddress: treasury,
43
43
  deployer,
@@ -93,6 +93,8 @@ export const buildCalldatasV4 = async ({ c, clanker, publicClient, wallet, facto
93
93
  callDatas,
94
94
  clankerTokenAddress: tokenAddress,
95
95
  totalValue: devBuyValue, // Total ETH to send with executeMulticall
96
+ merkleTree,
97
+ treasury,
96
98
  };
97
99
  };
98
100
  //# sourceMappingURL=build-calldatas-v4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-calldatas-v4.js","sourceRoot":"","sources":["../../src/build-calldatas-v4.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-calldatas-v4.js","sourceRoot":"","sources":["../../src/build-calldatas-v4.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,29 @@
1
1
  import { createMerkleTree, FEE_CONFIGS } from "clanker-sdk";
2
2
  import { omit } from "lodash";
3
- import { STAKING_REWARDS, STATIC_FEE_TIERS, TREASURY_AIRDROP_AMOUNTS } from "./constants.js";
3
+ import { LEVR_TEAM_LP_FEE_PERCENTAGE, LEVR_TEAM_WALLET, STAKING_REWARDS, STATIC_FEE_TIERS, TREASURY_AIRDROP_AMOUNTS, VAULT_LOCKUP_PERIODS, VAULT_VESTING_PERIODS, } from "./constants.js";
4
4
  export const buildClankerV4 = ({ c, treasuryAddress, deployer, staking, chainId, }) => {
5
- const airdrop = getAirdrop(c.airdrop, treasuryAddress, c.treasuryFunding);
5
+ const { airdrop, merkleTree } = getAirdrop(c.airdrop, treasuryAddress, c.treasuryFunding);
6
6
  const devBuy = getDevBuy(c.devBuy);
7
7
  const metadata = getMetadata(c.metadata);
8
8
  const fees = getFees(c.fees);
9
9
  const rewards = getRewards(deployer, staking, c.stakingReward, c.rewards);
10
+ const vault = getVault(c.vault);
10
11
  const config = {
11
12
  ...omit(c, "treasuryFunding", "stakingReward"),
12
13
  tokenAdmin: deployer,
13
14
  devBuy,
14
15
  airdrop,
16
+ vault,
15
17
  metadata,
16
18
  fees,
17
19
  rewards,
18
20
  chainId: chainId,
19
21
  vanity: true,
20
22
  };
21
- return config;
23
+ return {
24
+ config,
25
+ merkleTree,
26
+ };
22
27
  };
23
28
  /**
24
29
  * Builds the fees for the Clanker token using the Levr fees
@@ -38,25 +43,60 @@ const getFees = (fees) => {
38
43
  }
39
44
  return FEE_CONFIGS.Dynamic3;
40
45
  };
46
+ /**
47
+ * Builds the vault for the Clanker token using the Levr vault
48
+ * Converts day strings and percentage strings to numbers (seconds and percentages)
49
+ * @param vault - Levr vault configuration
50
+ * @returns Clanker vault with durations in seconds
51
+ */
52
+ const getVault = (vault) => {
53
+ if (!vault)
54
+ return undefined;
55
+ // Convert lockup period from days to seconds
56
+ const lockupDurationSeconds = VAULT_LOCKUP_PERIODS[vault.lockupPeriod] * 24 * 60 * 60;
57
+ // Convert vesting period from days to seconds (0 for instant means no vesting)
58
+ const vestingDurationSeconds = vault.vestingPeriod === "instant"
59
+ ? 0
60
+ : VAULT_VESTING_PERIODS[vault.vestingPeriod] * 24 * 60 * 60;
61
+ // Convert percentage from string (e.g., "5%") to number (5)
62
+ const percentageNumber = parseFloat(vault.percentage);
63
+ return {
64
+ percentage: percentageNumber,
65
+ lockupDuration: lockupDurationSeconds,
66
+ vestingDuration: vestingDurationSeconds,
67
+ };
68
+ };
41
69
  /**
42
70
  * Builds the rewards for the Clanker token using the Levr rewards
43
- * @param rewards - Levr rewards
44
- * @returns Clanker rewards
71
+ * @param admin - Admin address
72
+ * @param staking - Staking contract address
73
+ * @param stakingReward - Staking reward percentage key (user-facing, before team fee)
74
+ * @param rewards - Levr custom rewards
75
+ * @returns Clanker rewards with team LP fee automatically included
45
76
  */
46
- const getRewards = (admin, staking, stakingReward = "100%", rewards) => {
77
+ const getRewards = (admin, staking, stakingReward, rewards) => {
47
78
  const recipients = rewards
48
79
  ? rewards.map((r) => ({
49
80
  admin: r.admin,
50
81
  recipient: r.recipient,
51
- // Convert percentage to basis points
52
- bps: r.percentage * 100,
82
+ // Convert human percentage to basis points (e.g., 5 -> 500)
83
+ bps: Math.round(r.percentage * 100),
53
84
  token: r.token,
54
85
  }))
55
86
  : [];
87
+ // Add Levr team LP fee (always included for UI deployments)
88
+ recipients.push({
89
+ admin: LEVR_TEAM_WALLET,
90
+ recipient: LEVR_TEAM_WALLET,
91
+ bps: LEVR_TEAM_LP_FEE_PERCENTAGE * 100, // Convert percentage to basis points
92
+ token: "Both",
93
+ });
94
+ // Add staking rewards (subtract team fee from user-facing percentage)
95
+ const stakingBps = STAKING_REWARDS[stakingReward] - LEVR_TEAM_LP_FEE_PERCENTAGE * 100;
56
96
  recipients.push({
57
97
  admin,
58
98
  recipient: staking,
59
- bps: STAKING_REWARDS[stakingReward],
99
+ bps: stakingBps,
60
100
  token: "Both",
61
101
  });
62
102
  return { recipients };
@@ -64,25 +104,30 @@ const getRewards = (admin, staking, stakingReward = "100%", rewards) => {
64
104
  /**
65
105
  * Builds the metadata for the Clanker token using the Levr metadata
66
106
  * @param metadata - Levr metadata
67
- * @returns Clanker metadata
107
+ * @returns Clanker metadata with "Deployed on levr.world" appended to description
68
108
  */
69
109
  const getMetadata = (metadata) => {
70
- if (!metadata)
71
- return undefined;
72
- const { description, ...socials } = metadata;
110
+ const description = metadata?.description;
111
+ const socials = metadata ? omit(metadata, "description") : {};
73
112
  const platformMap = {
74
113
  telegramLink: "telegram",
75
114
  websiteLink: "website",
76
115
  xLink: "x",
77
116
  farcasterLink: "farcaster",
78
117
  };
79
- const socialMediaUrls = Object.entries(socials).map(([key, value]) => ({
118
+ const socialMediaUrls = Object.entries(socials)
119
+ .filter(([_, value]) => value !== undefined)
120
+ .map(([key, value]) => ({
80
121
  platform: platformMap[key],
81
122
  url: value,
82
123
  }));
124
+ // Append "Deployed on levr.world" to description
125
+ const enhancedDescription = description
126
+ ? `${description} Deployed on levr.world`
127
+ : "Deployed on levr.world";
83
128
  return {
84
- description,
85
- socialMediaUrls,
129
+ description: enhancedDescription,
130
+ socialMediaUrls: socialMediaUrls.length > 0 ? socialMediaUrls : undefined,
86
131
  };
87
132
  };
88
133
  /**
@@ -99,17 +144,19 @@ const getDevBuy = (devBuy) => {
99
144
  };
100
145
  /**
101
146
  * Builds the airdrop for the Clanker token using the Levr airdrop
102
- * @param airdrop - Levr airdrop
147
+ * @param airdrop - Levr airdrop (with percentages)
103
148
  * @param treasuryAddress - Treasury address
104
149
  * @param treasuryAirdropAmount - Treasury airdrop amount
105
- * @returns Clanker airdrop
150
+ * @returns Clanker airdrop config and merkle tree
106
151
  */
107
152
  const getAirdrop = (airdrop, treasuryAddress, treasuryAirdrop) => {
108
- // Always include treasury in airdrop, even if no other recipients specified
153
+ const TOTAL_SUPPLY = 100000000000; // 100B tokens
154
+ // Convert airdrop percentages to amounts
109
155
  const airdropData = airdrop
110
156
  ? airdrop.map((a) => ({
111
157
  account: a.account,
112
- amount: a.amount,
158
+ // Convert percentage (0-100) to actual amount (e.g., 5% of 100B = 5B)
159
+ amount: Math.round((a.percentage / 100) * TOTAL_SUPPLY),
113
160
  }))
114
161
  : [];
115
162
  // Always add treasury to airdrop
@@ -117,12 +164,15 @@ const getAirdrop = (airdrop, treasuryAddress, treasuryAirdrop) => {
117
164
  account: treasuryAddress,
118
165
  amount: TREASURY_AIRDROP_AMOUNTS[treasuryAirdrop],
119
166
  });
120
- const merkleTree = createMerkleTree(airdropData);
167
+ const merkleTreeResult = createMerkleTree(airdropData);
121
168
  return {
122
- amount: airdropData.reduce((acc, curr) => acc + curr.amount, 0),
123
- merkleRoot: merkleTree.root,
124
- lockupDuration: 86400, // 1 day minimum required by Clanker SDK
125
- vestingDuration: 0,
169
+ airdrop: {
170
+ amount: airdropData.reduce((acc, curr) => acc + curr.amount, 0),
171
+ merkleRoot: merkleTreeResult.root,
172
+ lockupDuration: 86400, // 1 day minimum required by Clanker SDK
173
+ vestingDuration: 0,
174
+ },
175
+ merkleTree: merkleTreeResult.tree,
126
176
  };
127
177
  };
128
178
  //# sourceMappingURL=build-clanker-v4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-clanker-v4.js","sourceRoot":"","sources":["../../src/build-clanker-v4.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-clanker-v4.js","sourceRoot":"","sources":["../../src/build-clanker-v4.ts"],"names":[],"mappings":"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"}
@@ -22,10 +22,18 @@ export const useProposals = () => useLevrContext().proposals;
22
22
  * Hook to access airdrop status from LevrProvider
23
23
  */
24
24
  export const useAirdropStatus = () => useLevrContext().airdropStatus;
25
+ /**
26
+ * Hook to access and manage governance cycle selection
27
+ */
28
+ export const useGovernanceCycle = () => {
29
+ const { selectedCycleId, setSelectedCycleId } = useLevrContext();
30
+ return { selectedCycleId, setSelectedCycleId };
31
+ };
25
32
  // ========================================
26
33
  // COMPLEX HOOKS (with mutations/callbacks)
27
34
  // ========================================
28
35
  export * from "./use-clanker.js";
36
+ export * from "./use-configure-splits.js";
29
37
  export * from "./use-fee-receivers.js";
30
38
  export * from "./use-governance.js";
31
39
  export * from "./use-stake.js";
@@ -35,9 +43,11 @@ export * from "./use-swap.js";
35
43
  // ========================================
36
44
  export * from "./use-airdrop.js";
37
45
  export * from "./use-deploy.js";
46
+ export * from "./use-factory.js";
38
47
  export * from "./use-pool.js";
39
48
  export * from "./use-prepare.js";
40
49
  export * from "./use-project.js";
41
50
  export * from "./use-proposal.js";
42
51
  export * from "./use-register.js";
52
+ export * from "./use-vault.js";
43
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/client/hook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,2CAA2C;AAC3C,+CAA+C;AAC/C,2CAA2C;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,CAAA;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,aAAa,CAAA;AAEpE,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAE3C,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,2CAA2C;AAC3C,yCAAyC;AACzC,2CAA2C;AAE3C,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/client/hook/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,2CAA2C;AAC3C,+CAA+C;AAC/C,2CAA2C;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,CAAA;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,aAAa,CAAA;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,GAAG,cAAc,EAAE,CAAA;IAChE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAA;AAChD,CAAC,CAAA;AAED,2CAA2C;AAC3C,2CAA2C;AAC3C,2CAA2C;AAE3C,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,2CAA2C;AAC3C,yCAAyC;AACzC,2CAA2C;AAE3C,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA"}
@@ -1,19 +1,23 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { usePublicClient } from "wagmi";
4
- import { getTreasuryAirdropStatus } from "../../treasury.js";
4
+ import { getAirdropStatus } from "../../airdrop.js";
5
5
  /**
6
6
  * Hook to fetch airdrop status for a treasury
7
7
  * This should be called separately from project data
8
8
  */
9
- export function useAirdropStatusQuery({ project, enabled: e = true }) {
9
+ export function useAirdropStatusQuery({ project, enabled: e = true, ipfsSearchUrl, ipfsJsonUrl, }) {
10
10
  const publicClient = usePublicClient();
11
11
  const chainId = publicClient?.chain?.id;
12
12
  const enabled = !!publicClient && !!project && !!chainId && e;
13
13
  return useQuery({
14
- queryKey: ["airdrop-status", project?.token.address, chainId],
14
+ queryKey: ["airdrop-status", project?.token.address, chainId, ipfsSearchUrl, ipfsJsonUrl],
15
15
  enabled,
16
- queryFn: () => getTreasuryAirdropStatus(publicClient, project?.token.address, project?.treasury, project?.token.decimals, project?.pricing?.tokenUsd ? parseFloat(project?.pricing?.tokenUsd) : null),
16
+ queryFn: () => {
17
+ if (!publicClient || !project)
18
+ return null;
19
+ return getAirdropStatus(publicClient, project.token.address, project.treasury, project.token.decimals, project.pricing?.tokenUsd ? parseFloat(project.pricing.tokenUsd) : null, ipfsSearchUrl, ipfsJsonUrl);
20
+ },
17
21
  staleTime: 30000, // 30 seconds cache
18
22
  });
19
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-airdrop.js","sourceRoot":"","sources":["../../../../src/client/hook/use-airdrop.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAOzD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAA+B;IAC/F,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;IAE7D,OAAO,QAAQ,CAAuB;QACpC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;QAC7D,OAAO;QACP,OAAO,EAAE,GAAG,EAAE,CACZ,wBAAwB,CACtB,YAAa,EACb,OAAO,EAAE,KAAK,CAAC,OAAQ,EACvB,OAAO,EAAE,QAAS,EAClB,OAAO,EAAE,KAAK,CAAC,QAAS,EACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3E;QACH,SAAS,EAAE,MAAM,EAAE,mBAAmB;KACvC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"use-airdrop.js","sourceRoot":"","sources":["../../../../src/client/hook/use-airdrop.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAShD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,OAAO,EACP,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,aAAa,EACb,WAAW,GACiB;IAC5B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAA;IAE7D,OAAO,QAAQ,CAAuB;QACpC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC;QACzF,OAAO;QACP,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAA;YAC1C,OAAO,gBAAgB,CACrB,YAAY,EACZ,OAAO,CAAC,KAAK,CAAC,OAAO,EACrB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,KAAK,CAAC,QAAQ,EACtB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EACvE,aAAa,EACb,WAAW,CACZ,CAAA;QACH,CAAC;QACD,SAAS,EAAE,MAAM,EAAE,mBAAmB;KACvC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ import { usePublicClient, useWalletClient } from "wagmi";
4
+ import { configureSplitsAndUpdateRecipient } from "../../fee-receivers.js";
5
+ export function useConfigureSplits({ onConfigureSplitsSuccess, onUpdateRecipientSuccess, onRecipientAlreadyActive, onSplitsUnchanged, onSuccess, onError, } = {}) {
6
+ const publicClient = usePublicClient();
7
+ const wallet = useWalletClient();
8
+ const chainId = publicClient?.chain?.id;
9
+ return useMutation({
10
+ mutationFn: async (params) => {
11
+ // Use the smart flow that checks if splits/recipient updates are needed
12
+ const result = await configureSplitsAndUpdateRecipient({
13
+ walletClient: wallet.data,
14
+ publicClient: publicClient,
15
+ clankerToken: params.clankerToken,
16
+ chainId: chainId,
17
+ splits: params.splits,
18
+ rewardIndex: params.rewardIndex,
19
+ });
20
+ // Notify if splits were configured
21
+ if (result.configureSplitsReceipt) {
22
+ onConfigureSplitsSuccess?.(result.configureSplitsReceipt.transactionHash);
23
+ }
24
+ else if (result.splitsWereUnchanged) {
25
+ onSplitsUnchanged?.();
26
+ }
27
+ // Notify if recipient was updated
28
+ if (result.updateRecipientReceipt) {
29
+ onUpdateRecipientSuccess?.(result.updateRecipientReceipt.transactionHash);
30
+ }
31
+ else if (result.recipientWasAlreadyActive) {
32
+ onRecipientAlreadyActive?.();
33
+ }
34
+ // Return the final hash (prefer update, then configure, or undefined if nothing changed)
35
+ return (result.updateRecipientReceipt?.transactionHash ??
36
+ result.configureSplitsReceipt?.transactionHash);
37
+ },
38
+ onSuccess: async (hash) => {
39
+ onSuccess?.(hash);
40
+ },
41
+ onError: onError,
42
+ });
43
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-configure-splits.js","sourceRoot":"","sources":["../../../../src/client/hook/use-configure-splits.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGxD,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAA;AAmBvE,MAAM,UAAU,kBAAkB,CAAC,EACjC,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,SAAS,EACT,OAAO,MACqB,EAAE;IAC9B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,MAA4B,EAAE,EAAE;YACjD,wEAAwE;YACxE,MAAM,MAAM,GAAG,MAAM,iCAAiC,CAAC;gBACrD,YAAY,EAAE,MAAM,CAAC,IAAK;gBAC1B,YAAY,EAAE,YAAa;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE,OAAQ;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,CAAC,CAAA;YAEF,mCAAmC;YACnC,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;gBAClC,wBAAwB,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAA;YAC3E,CAAC;iBAAM,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACtC,iBAAiB,EAAE,EAAE,CAAA;YACvB,CAAC;YAED,kCAAkC;YAClC,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;gBAClC,wBAAwB,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAA;YAC3E,CAAC;iBAAM,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC;gBAC5C,wBAAwB,EAAE,EAAE,CAAA;YAC9B,CAAC;YAED,yFAAyF;YACzF,OAAO,CACL,MAAM,CAAC,sBAAsB,EAAE,eAAe;gBAC9C,MAAM,CAAC,sBAAsB,EAAE,eAAe,CAC/C,CAAA;QACH,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;AACJ,CAAC"}
@@ -3,12 +3,12 @@ import { deployV4 } from "../../deploy-v4.js";
3
3
  import { useClanker } from "./use-clanker.js";
4
4
  /**
5
5
  * Deploys a Clanker token and registers it with the Levr factory.
6
- * Returns tx hash and deployed address.
6
+ * Returns tx hash, deployed address, and merkle tree CID (if IPFS URL provided).
7
7
  */
8
- export function useDeploy({ onSuccess, onError }) {
8
+ export function useDeploy({ ipfsJsonUploadUrl, onSuccess, onError }) {
9
9
  const clanker = useClanker();
10
10
  return useMutation({
11
- mutationFn: (c) => deployV4({ c, clanker: clanker.data }),
11
+ mutationFn: (c) => deployV4({ c, clanker: clanker.data, ipfsJsonUploadUrl }),
12
12
  onSuccess,
13
13
  onError,
14
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-deploy.js","sourceRoot":"","sources":["../../../../src/client/hook/use-deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAQ1C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAmB;IAC/D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,CAAC,CAAkC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1F,SAAS;QACT,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"use-deploy.js","sourceRoot":"","sources":["../../../../src/client/hook/use-deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAa1C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAmB;IAClF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,CAAC,CAAkC,EAAE,EAAE,CACjD,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;QAC3D,SAAS;QACT,OAAO;KACR,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useChainId, usePublicClient } from "wagmi";
4
+ import { getFactoryConfig } from "../../factory.js";
5
+ import { useLevrContext } from "../levr-provider.js";
6
+ import { queryKeys } from "../query-keys.js";
7
+ /**
8
+ * Hook to fetch factory configuration directly (used internally by LevrProvider)
9
+ * @internal
10
+ */
11
+ export function useFactoryConfigQuery(params) {
12
+ const publicClient = usePublicClient();
13
+ const chainId = useChainId();
14
+ const enabled = params?.enabled ?? true;
15
+ return useQuery({
16
+ queryKey: queryKeys.factoryConfig(chainId),
17
+ queryFn: async () => {
18
+ if (!publicClient) {
19
+ return null;
20
+ }
21
+ return getFactoryConfig(publicClient, chainId);
22
+ },
23
+ enabled: enabled && !!publicClient,
24
+ staleTime: Infinity, // Factory config never changes unless chain changes
25
+ gcTime: 1000 * 60 * 60, // Cache for 1 hour
26
+ });
27
+ }
28
+ /**
29
+ * Hook to access factory config from LevrProvider
30
+ */
31
+ export function useFactory() {
32
+ return useLevrContext().factoryConfig;
33
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-factory.js","sourceRoot":"","sources":["../../../../src/client/hook/use-factory.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,IAAI,CAAA;IAEvC,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC;QAC1C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAChD,CAAC;QACD,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QAClC,SAAS,EAAE,QAAQ,EAAE,oDAAoD;QACzE,MAAM,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,mBAAmB;KAC5C,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,EAAE,CAAC,aAAa,CAAA;AACvC,CAAC"}
@@ -13,13 +13,14 @@ export function useFeeReceivers({ onSuccess, onError } = {}) {
13
13
  return useMutation({
14
14
  mutationFn: (params) => updateFeeReceiver({
15
15
  walletClient: wallet.data,
16
+ publicClient: publicClient,
16
17
  clankerToken: params.clankerToken,
17
18
  chainId: chainId,
18
19
  rewardIndex: params.rewardIndex,
19
20
  newRecipient: params.newRecipient,
20
21
  }),
21
- onSuccess: async (hash) => {
22
- onSuccess?.(hash);
22
+ onSuccess: async (receipt) => {
23
+ onSuccess?.(receipt.transactionHash);
23
24
  },
24
25
  onError: onError,
25
26
  });
@@ -1 +1 @@
1
- {"version":3,"file":"use-fee-receivers.js","sourceRoot":"","sources":["../../../../src/client/hook/use-fee-receivers.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAcvD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,KAA4B,EAAE;IAChF,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,CAAC,MAAiE,EAAE,EAAE,CAChF,iBAAiB,CAAC;YAChB,YAAY,EAAE,MAAM,CAAC,IAAK;YAC1B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,OAAQ;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC;QACJ,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"use-fee-receivers.js","sourceRoot":"","sources":["../../../../src/client/hook/use-fee-receivers.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAcvD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,KAA4B,EAAE;IAChF,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,CACV,MAAkF,EAClF,EAAE,CACF,iBAAiB,CAAC;YAChB,YAAY,EAAE,MAAM,CAAC,IAAK;YAC1B,YAAY,EAAE,YAAa;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,OAAQ;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC;QACJ,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,SAAS,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QACtC,CAAC;QACD,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;AACJ,CAAC"}