levr-sdk 0.0.1
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/LICENSE.md +201 -0
- package/README.md +711 -0
- package/dist/esm/abis/IClankerAirdrop.js +443 -0
- package/dist/esm/abis/IClankerHookDynamicFee.js +198 -0
- package/dist/esm/abis/IClankerHookStaticFee.js +75 -0
- package/dist/esm/abis/IClankerLPLocker.js +402 -0
- package/dist/esm/abis/IClankerLpLockerMultiple.js +609 -0
- package/dist/esm/abis/IClankerToken.js +421 -0
- package/dist/esm/abis/LevrFactory_v1.js +608 -0
- package/dist/esm/abis/LevrForwarder_v1.js +622 -0
- package/dist/esm/abis/LevrGovernor_v1.js +726 -0
- package/dist/esm/abis/LevrStakedToken_v1.js +441 -0
- package/dist/esm/abis/LevrStaking_v1.js +607 -0
- package/dist/esm/abis/LevrTreasury_v1.js +219 -0
- package/dist/esm/abis/Permit2.js +29 -0
- package/dist/esm/abis/V4Quoter.js +466 -0
- package/dist/esm/abis/WETH9.js +153 -0
- package/dist/esm/abis/index.js +23 -0
- package/dist/esm/balance.js +72 -0
- package/dist/esm/balance.js.map +1 -0
- package/dist/esm/build-calldatas-v4.js +98 -0
- package/dist/esm/build-calldatas-v4.js.map +1 -0
- package/dist/esm/build-clanker-v4.js +128 -0
- package/dist/esm/build-clanker-v4.js.map +1 -0
- package/dist/esm/client/hook/index.js +36 -0
- package/dist/esm/client/hook/index.js.map +1 -0
- package/dist/esm/client/hook/use-balance.js +56 -0
- package/dist/esm/client/hook/use-balance.js.map +1 -0
- package/dist/esm/client/hook/use-clanker.js +57 -0
- package/dist/esm/client/hook/use-clanker.js.map +1 -0
- package/dist/esm/client/hook/use-deploy.js +16 -0
- package/dist/esm/client/hook/use-deploy.js.map +1 -0
- package/dist/esm/client/hook/use-fee-receivers.js +54 -0
- package/dist/esm/client/hook/use-fee-receivers.js.map +1 -0
- package/dist/esm/client/hook/use-governance.js +389 -0
- package/dist/esm/client/hook/use-governance.js.map +1 -0
- package/dist/esm/client/hook/use-prepare.js +47 -0
- package/dist/esm/client/hook/use-prepare.js.map +1 -0
- package/dist/esm/client/hook/use-project.js +29 -0
- package/dist/esm/client/hook/use-project.js.map +1 -0
- package/dist/esm/client/hook/use-projects.js +22 -0
- package/dist/esm/client/hook/use-projects.js.map +1 -0
- package/dist/esm/client/hook/use-proposals.js +31 -0
- package/dist/esm/client/hook/use-proposals.js.map +1 -0
- package/dist/esm/client/hook/use-register.js +101 -0
- package/dist/esm/client/hook/use-register.js.map +1 -0
- package/dist/esm/client/hook/use-stake.js +327 -0
- package/dist/esm/client/hook/use-stake.js.map +1 -0
- package/dist/esm/client/hook/use-swap.js +110 -0
- package/dist/esm/client/hook/use-swap.js.map +1 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/levr-provider.js +201 -0
- package/dist/esm/client/levr-provider.js.map +1 -0
- package/dist/esm/client/query-keys.js +61 -0
- package/dist/esm/client/query-keys.js.map +1 -0
- package/dist/esm/constants.js +182 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/deploy-v4.js +46 -0
- package/dist/esm/deploy-v4.js.map +1 -0
- package/dist/esm/fee-receivers.js +52 -0
- package/dist/esm/fee-receivers.js.map +1 -0
- package/dist/esm/governance.js +555 -0
- package/dist/esm/governance.js.map +1 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/project.js +146 -0
- package/dist/esm/project.js.map +1 -0
- package/dist/esm/projects.js +212 -0
- package/dist/esm/projects.js.map +1 -0
- package/dist/esm/proposals.js +98 -0
- package/dist/esm/proposals.js.map +1 -0
- package/dist/esm/quote-v4.js +169 -0
- package/dist/esm/quote-v4.js.map +1 -0
- package/dist/esm/schema/base.schema.js +11 -0
- package/dist/esm/schema/base.schema.js.map +1 -0
- package/dist/esm/schema/clanker.schema.js +191 -0
- package/dist/esm/schema/clanker.schema.js.map +1 -0
- package/dist/esm/schema/index.js +4 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/levr.schema.js +114 -0
- package/dist/esm/schema/levr.schema.js.map +1 -0
- package/dist/esm/stake.js +384 -0
- package/dist/esm/stake.js.map +1 -0
- package/dist/esm/swap-v4.js +281 -0
- package/dist/esm/swap-v4.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.js +19 -0
- package/dist/esm/util.js.map +1 -0
- package/dist/types/abis/IClankerAirdrop.d.ts +348 -0
- package/dist/types/abis/IClankerHookDynamicFee.d.ts +156 -0
- package/dist/types/abis/IClankerHookStaticFee.d.ts +58 -0
- package/dist/types/abis/IClankerLPLocker.d.ts +316 -0
- package/dist/types/abis/IClankerLpLockerMultiple.d.ts +481 -0
- package/dist/types/abis/IClankerToken.d.ts +326 -0
- package/dist/types/abis/LevrFactory_v1.d.ts +471 -0
- package/dist/types/abis/LevrForwarder_v1.d.ts +478 -0
- package/dist/types/abis/LevrGovernor_v1.d.ts +562 -0
- package/dist/types/abis/LevrStakedToken_v1.d.ts +338 -0
- package/dist/types/abis/LevrStaking_v1.d.ts +468 -0
- package/dist/types/abis/LevrTreasury_v1.d.ts +169 -0
- package/dist/types/abis/Permit2.d.ts +54 -0
- package/dist/types/abis/V4Quoter.d.ts +496 -0
- package/dist/types/abis/WETH9.d.ts +244 -0
- package/dist/types/abis/index.d.ts +15 -0
- package/dist/types/balance.d.ts +24 -0
- package/dist/types/balance.d.ts.map +1 -0
- package/dist/types/build-calldatas-v4.d.ts +20 -0
- package/dist/types/build-calldatas-v4.d.ts.map +1 -0
- package/dist/types/build-clanker-v4.d.ts +12 -0
- package/dist/types/build-clanker-v4.d.ts.map +1 -0
- package/dist/types/client/hook/index.d.ts +32 -0
- package/dist/types/client/hook/index.d.ts.map +1 -0
- package/dist/types/client/hook/use-balance.d.ts +18 -0
- package/dist/types/client/hook/use-balance.d.ts.map +1 -0
- package/dist/types/client/hook/use-clanker.d.ts +23 -0
- package/dist/types/client/hook/use-clanker.d.ts.map +1 -0
- package/dist/types/client/hook/use-deploy.d.ts +45 -0
- package/dist/types/client/hook/use-deploy.d.ts.map +1 -0
- package/dist/types/client/hook/use-fee-receivers.d.ts +26 -0
- package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -0
- package/dist/types/client/hook/use-governance.d.ts +145 -0
- package/dist/types/client/hook/use-governance.d.ts.map +1 -0
- package/dist/types/client/hook/use-prepare.d.ts +21 -0
- package/dist/types/client/hook/use-prepare.d.ts.map +1 -0
- package/dist/types/client/hook/use-project.d.ts +11 -0
- package/dist/types/client/hook/use-project.d.ts.map +1 -0
- package/dist/types/client/hook/use-projects.d.ts +6 -0
- package/dist/types/client/hook/use-projects.d.ts.map +1 -0
- package/dist/types/client/hook/use-proposals.d.ts +16 -0
- package/dist/types/client/hook/use-proposals.d.ts.map +1 -0
- package/dist/types/client/hook/use-register.d.ts +31 -0
- package/dist/types/client/hook/use-register.d.ts.map +1 -0
- package/dist/types/client/hook/use-stake.d.ts +195 -0
- package/dist/types/client/hook/use-stake.d.ts.map +1 -0
- package/dist/types/client/hook/use-swap.d.ts +59 -0
- package/dist/types/client/hook/use-swap.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +4 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/client/levr-provider.d.ts +127 -0
- package/dist/types/client/levr-provider.d.ts.map +1 -0
- package/dist/types/client/query-keys.d.ts +61 -0
- package/dist/types/client/query-keys.d.ts.map +1 -0
- package/dist/types/constants.d.ts +101 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/deploy-v4.d.ts +13 -0
- package/dist/types/deploy-v4.d.ts.map +1 -0
- package/dist/types/fee-receivers.d.ts +29 -0
- package/dist/types/fee-receivers.d.ts.map +1 -0
- package/dist/types/governance.d.ts +205 -0
- package/dist/types/governance.d.ts.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/project.d.ts +51 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/projects.d.ts +20 -0
- package/dist/types/projects.d.ts.map +1 -0
- package/dist/types/proposals.d.ts +20 -0
- package/dist/types/proposals.d.ts.map +1 -0
- package/dist/types/quote-v4.d.ts +54 -0
- package/dist/types/quote-v4.d.ts.map +1 -0
- package/dist/types/schema/base.schema.d.ts +5 -0
- package/dist/types/schema/base.schema.d.ts.map +1 -0
- package/dist/types/schema/clanker.schema.d.ts +104 -0
- package/dist/types/schema/clanker.schema.d.ts.map +1 -0
- package/dist/types/schema/index.d.ts +4 -0
- package/dist/types/schema/index.d.ts.map +1 -0
- package/dist/types/schema/levr.schema.d.ts +34 -0
- package/dist/types/schema/levr.schema.d.ts.map +1 -0
- package/dist/types/stake.d.ts +137 -0
- package/dist/types/stake.d.ts.map +1 -0
- package/dist/types/swap-v4.d.ts +97 -0
- package/dist/types/swap-v4.d.ts.map +1 -0
- package/dist/types/types.d.ts +20 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/util.d.ts +5 -0
- package/dist/types/util.d.ts.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { erc20Abi, formatUnits, zeroAddress } from 'viem';
|
|
2
|
+
/**
|
|
3
|
+
* Get balances for multiple tokens including native currency
|
|
4
|
+
* @param publicClient - The public client to use for queries
|
|
5
|
+
* @param address - The address to check balances for
|
|
6
|
+
* @param tokens - Array of token configurations (use zeroAddress for native currency)
|
|
7
|
+
* @returns Object with balances keyed by token address or custom key
|
|
8
|
+
*/
|
|
9
|
+
export async function balance({ publicClient, address, tokens, }) {
|
|
10
|
+
if (!address || tokens.length === 0)
|
|
11
|
+
return {};
|
|
12
|
+
const balances = {};
|
|
13
|
+
// Separate native and ERC20 tokens
|
|
14
|
+
const erc20Tokens = tokens.filter((token) => token.address !== zeroAddress);
|
|
15
|
+
const nativeTokens = tokens.filter((token) => token.address === zeroAddress);
|
|
16
|
+
// Handle native balance
|
|
17
|
+
if (nativeTokens.length > 0) {
|
|
18
|
+
try {
|
|
19
|
+
const nativeBalance = await publicClient.getBalance({ address });
|
|
20
|
+
nativeTokens.forEach((token) => {
|
|
21
|
+
const key = token.key || token.address;
|
|
22
|
+
balances[key] = {
|
|
23
|
+
raw: nativeBalance,
|
|
24
|
+
formatted: formatUnits(nativeBalance, token.decimals),
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// If native balance fetch fails, set to 0
|
|
30
|
+
nativeTokens.forEach((token) => {
|
|
31
|
+
const key = token.key || token.address;
|
|
32
|
+
balances[key] = {
|
|
33
|
+
raw: 0n,
|
|
34
|
+
formatted: '0',
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Handle ERC20 balances using multicall
|
|
40
|
+
if (erc20Tokens.length > 0) {
|
|
41
|
+
try {
|
|
42
|
+
const results = await publicClient.multicall({
|
|
43
|
+
contracts: erc20Tokens.map((token) => ({
|
|
44
|
+
address: token.address,
|
|
45
|
+
abi: erc20Abi,
|
|
46
|
+
functionName: 'balanceOf',
|
|
47
|
+
args: [address],
|
|
48
|
+
})),
|
|
49
|
+
});
|
|
50
|
+
erc20Tokens.forEach((token, index) => {
|
|
51
|
+
const result = results[index].result;
|
|
52
|
+
const key = token.key || token.address;
|
|
53
|
+
balances[key] = {
|
|
54
|
+
raw: result || 0n,
|
|
55
|
+
formatted: formatUnits(result || 0n, token.decimals),
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// If multicall fails, set all ERC20 balances to 0
|
|
61
|
+
erc20Tokens.forEach((token) => {
|
|
62
|
+
const key = token.key || token.address;
|
|
63
|
+
balances[key] = {
|
|
64
|
+
raw: 0n,
|
|
65
|
+
formatted: '0',
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return balances;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAqBzD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAC5B,YAAY,EACZ,OAAO,EACP,MAAM,GACQ;IACd,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE9C,MAAM,QAAQ,GAAkC,EAAE,CAAA;IAElD,mCAAmC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,WAAW,CAAC,CAAA;IAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,WAAW,CAAC,CAAA;IAE5E,wBAAwB;IACxB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YAEhE,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAA;gBACtC,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,GAAG,EAAE,aAAa;oBAClB,SAAS,EAAE,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC;iBACtD,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAA;gBACtC,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,GAAG,EAAE,EAAE;oBACP,SAAS,EAAE,GAAG;iBACf,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC;gBAC3C,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACrC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,EAAE,QAAQ;oBACb,YAAY,EAAE,WAAoB;oBAClC,IAAI,EAAE,CAAC,OAAO,CAAC;iBAChB,CAAC,CAAC;aACJ,CAAC,CAAA;YAEF,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACnC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;gBACpC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAA;gBACtC,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,GAAG,EAAG,MAAiB,IAAI,EAAE;oBAC7B,SAAS,EAAE,WAAW,CAAE,MAAiB,IAAI,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC;iBACjE,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kDAAkD;YAClD,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAA;gBACtC,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,GAAG,EAAE,EAAE;oBACP,SAAS,EAAE,GAAG;iBACf,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { CLANKERS } from "clanker-sdk";
|
|
2
|
+
import { decodeFunctionResult, encodeFunctionData } from "viem";
|
|
3
|
+
import * as chains from "viem/chains";
|
|
4
|
+
import { LevrFactory_v1, LevrForwarder_v1 } from "./abis/index.js";
|
|
5
|
+
import { buildClankerV4 } from "./build-clanker-v4.js";
|
|
6
|
+
export const clankerV4Factory = {
|
|
7
|
+
// In our dev monorepo, we have a clanker_v4_anvil contract, but in the remote package, it's not defined
|
|
8
|
+
[chains.anvil.id]: CLANKERS?.clanker_v4_anvil?.address,
|
|
9
|
+
[chains.base.id]: CLANKERS.clanker_v4.address,
|
|
10
|
+
[chains.baseSepolia.id]: CLANKERS.clanker_v4_sepolia.address,
|
|
11
|
+
};
|
|
12
|
+
export const buildCalldatasV4 = async ({ c, clanker, publicClient, wallet, factoryAddress, forwarderAddress, }) => {
|
|
13
|
+
const deployer = wallet.account?.address;
|
|
14
|
+
if (!publicClient.chain?.id)
|
|
15
|
+
throw new Error("Chain ID not found");
|
|
16
|
+
const chainId = publicClient.chain.id;
|
|
17
|
+
const clankerFactory = clankerV4Factory?.[chainId];
|
|
18
|
+
if (!clankerFactory)
|
|
19
|
+
throw new Error("Clanker factory not found");
|
|
20
|
+
if (!deployer)
|
|
21
|
+
throw new Error("Deployer address not found");
|
|
22
|
+
const prepareForDeploymentTransaction = encodeFunctionData({
|
|
23
|
+
abi: LevrFactory_v1,
|
|
24
|
+
functionName: "prepareForDeployment",
|
|
25
|
+
args: [],
|
|
26
|
+
});
|
|
27
|
+
const result = await publicClient.call({
|
|
28
|
+
to: factoryAddress, // Your LevrFactory_v1 contract address
|
|
29
|
+
data: prepareForDeploymentTransaction,
|
|
30
|
+
account: wallet.account, // The sender address
|
|
31
|
+
});
|
|
32
|
+
if (!result.data)
|
|
33
|
+
throw new Error("Prepare for deployment failed");
|
|
34
|
+
// Then decode the result
|
|
35
|
+
const [treasury, staking] = decodeFunctionResult({
|
|
36
|
+
abi: LevrFactory_v1,
|
|
37
|
+
functionName: "prepareForDeployment",
|
|
38
|
+
data: result.data,
|
|
39
|
+
});
|
|
40
|
+
const config = buildClankerV4({
|
|
41
|
+
c,
|
|
42
|
+
treasuryAddress: treasury,
|
|
43
|
+
deployer,
|
|
44
|
+
staking,
|
|
45
|
+
chainId,
|
|
46
|
+
});
|
|
47
|
+
// Validate and get the deployment transaction
|
|
48
|
+
// The SDK computes the token address deterministically when vanity is enabled
|
|
49
|
+
const deployContractCall = await clanker.getDeployTransaction(config);
|
|
50
|
+
// Extract the expected token address from the deployment call
|
|
51
|
+
// When vanity: true, the SDK uses CREATE2 and computes the address in advance
|
|
52
|
+
const tokenAddress = deployContractCall.expectedAddress;
|
|
53
|
+
if (!tokenAddress) {
|
|
54
|
+
throw new Error("Expected token address not found - ensure vanity is enabled");
|
|
55
|
+
}
|
|
56
|
+
const deployTransaction = encodeFunctionData({
|
|
57
|
+
abi: deployContractCall.abi,
|
|
58
|
+
functionName: deployContractCall.functionName,
|
|
59
|
+
args: deployContractCall.args,
|
|
60
|
+
});
|
|
61
|
+
const proxyDeployTransaction = encodeFunctionData({
|
|
62
|
+
abi: LevrForwarder_v1,
|
|
63
|
+
functionName: "executeTransaction",
|
|
64
|
+
args: [clankerFactory, deployTransaction],
|
|
65
|
+
});
|
|
66
|
+
// Calculate the ETH value needed for devBuy (if specified)
|
|
67
|
+
const devBuyValue = config.devBuy ? BigInt(Math.floor(config.devBuy.ethAmount * 1000000000000000000)) : 0n;
|
|
68
|
+
const callDatas = [
|
|
69
|
+
{
|
|
70
|
+
target: factoryAddress,
|
|
71
|
+
allowFailure: false,
|
|
72
|
+
value: 0n,
|
|
73
|
+
callData: prepareForDeploymentTransaction,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
target: forwarderAddress,
|
|
77
|
+
allowFailure: false,
|
|
78
|
+
value: devBuyValue, // ETH forwarded through executeTransaction to Clanker deployment
|
|
79
|
+
callData: proxyDeployTransaction,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
target: factoryAddress,
|
|
83
|
+
allowFailure: false,
|
|
84
|
+
value: 0n,
|
|
85
|
+
callData: encodeFunctionData({
|
|
86
|
+
abi: LevrFactory_v1,
|
|
87
|
+
functionName: "register",
|
|
88
|
+
args: [tokenAddress],
|
|
89
|
+
}),
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
return {
|
|
93
|
+
callDatas,
|
|
94
|
+
clankerTokenAddress: tokenAddress,
|
|
95
|
+
totalValue: devBuyValue, // Total ETH to send with executeMulticall
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=build-calldatas-v4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-calldatas-v4.js","sourceRoot":"","sources":["../../src/build-calldatas-v4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createMerkleTree, FEE_CONFIGS } from "clanker-sdk";
|
|
2
|
+
import { omit } from "lodash";
|
|
3
|
+
import { STAKING_REWARDS, STATIC_FEE_TIERS, TREASURY_AIRDROP_AMOUNTS } from "./constants.js";
|
|
4
|
+
export const buildClankerV4 = ({ c, treasuryAddress, deployer, staking, chainId, }) => {
|
|
5
|
+
const airdrop = getAirdrop(c.airdrop, treasuryAddress, c.treasuryFunding);
|
|
6
|
+
const devBuy = getDevBuy(c.devBuy);
|
|
7
|
+
const metadata = getMetadata(c.metadata);
|
|
8
|
+
const fees = getFees(c.fees);
|
|
9
|
+
const rewards = getRewards(deployer, staking, c.stakingReward, c.rewards);
|
|
10
|
+
const config = {
|
|
11
|
+
...omit(c, "treasuryFunding", "stakingReward"),
|
|
12
|
+
tokenAdmin: deployer,
|
|
13
|
+
devBuy,
|
|
14
|
+
airdrop,
|
|
15
|
+
metadata,
|
|
16
|
+
fees,
|
|
17
|
+
rewards,
|
|
18
|
+
chainId: chainId,
|
|
19
|
+
vanity: true,
|
|
20
|
+
};
|
|
21
|
+
return config;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Builds the fees for the Clanker token using the Levr fees
|
|
25
|
+
* @param fees - Levr fees
|
|
26
|
+
* @returns Clanker fees
|
|
27
|
+
*/
|
|
28
|
+
const getFees = (fees) => {
|
|
29
|
+
if (fees.type === "static") {
|
|
30
|
+
return {
|
|
31
|
+
type: "static",
|
|
32
|
+
clankerFee: STATIC_FEE_TIERS[fees.feeTier],
|
|
33
|
+
pairedFee: STATIC_FEE_TIERS[fees.feeTier],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (fees.type === "dynamic 3%") {
|
|
37
|
+
return FEE_CONFIGS.Dynamic3;
|
|
38
|
+
}
|
|
39
|
+
return FEE_CONFIGS.Dynamic3;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Builds the rewards for the Clanker token using the Levr rewards
|
|
43
|
+
* @param rewards - Levr rewards
|
|
44
|
+
* @returns Clanker rewards
|
|
45
|
+
*/
|
|
46
|
+
const getRewards = (admin, staking, stakingReward = "100%", rewards) => {
|
|
47
|
+
const recipients = rewards
|
|
48
|
+
? rewards.map((r) => ({
|
|
49
|
+
admin: r.admin,
|
|
50
|
+
recipient: r.recipient,
|
|
51
|
+
// Convert percentage to basis points
|
|
52
|
+
bps: r.percentage * 100,
|
|
53
|
+
token: r.token,
|
|
54
|
+
}))
|
|
55
|
+
: [];
|
|
56
|
+
recipients.push({
|
|
57
|
+
admin,
|
|
58
|
+
recipient: staking,
|
|
59
|
+
bps: STAKING_REWARDS[stakingReward],
|
|
60
|
+
token: "Both",
|
|
61
|
+
});
|
|
62
|
+
return { recipients };
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Builds the metadata for the Clanker token using the Levr metadata
|
|
66
|
+
* @param metadata - Levr metadata
|
|
67
|
+
* @returns Clanker metadata
|
|
68
|
+
*/
|
|
69
|
+
const getMetadata = (metadata) => {
|
|
70
|
+
if (!metadata)
|
|
71
|
+
return undefined;
|
|
72
|
+
const { description, ...socials } = metadata;
|
|
73
|
+
const platformMap = {
|
|
74
|
+
telegramLink: "telegram",
|
|
75
|
+
websiteLink: "website",
|
|
76
|
+
xLink: "x",
|
|
77
|
+
farcasterLink: "farcaster",
|
|
78
|
+
};
|
|
79
|
+
const socialMediaUrls = Object.entries(socials).map(([key, value]) => ({
|
|
80
|
+
platform: platformMap[key],
|
|
81
|
+
url: value,
|
|
82
|
+
}));
|
|
83
|
+
return {
|
|
84
|
+
description,
|
|
85
|
+
socialMediaUrls,
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Builds the dev buy for the Clanker token using the Levr dev buy
|
|
90
|
+
* @param devBuy - Levr dev buy
|
|
91
|
+
* @returns Clanker dev buy
|
|
92
|
+
*/
|
|
93
|
+
const getDevBuy = (devBuy) => {
|
|
94
|
+
if (!devBuy)
|
|
95
|
+
return undefined;
|
|
96
|
+
return {
|
|
97
|
+
ethAmount: Number(devBuy.replace(" ETH", "")),
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Builds the airdrop for the Clanker token using the Levr airdrop
|
|
102
|
+
* @param airdrop - Levr airdrop
|
|
103
|
+
* @param treasuryAddress - Treasury address
|
|
104
|
+
* @param treasuryAirdropAmount - Treasury airdrop amount
|
|
105
|
+
* @returns Clanker airdrop
|
|
106
|
+
*/
|
|
107
|
+
const getAirdrop = (airdrop, treasuryAddress, treasuryAirdrop) => {
|
|
108
|
+
// Always include treasury in airdrop, even if no other recipients specified
|
|
109
|
+
const airdropData = airdrop
|
|
110
|
+
? airdrop.map((a) => ({
|
|
111
|
+
account: a.account,
|
|
112
|
+
amount: a.amount,
|
|
113
|
+
}))
|
|
114
|
+
: [];
|
|
115
|
+
// Always add treasury to airdrop
|
|
116
|
+
airdropData.push({
|
|
117
|
+
account: treasuryAddress,
|
|
118
|
+
amount: TREASURY_AIRDROP_AMOUNTS[treasuryAirdrop],
|
|
119
|
+
});
|
|
120
|
+
const merkleTree = createMerkleTree(airdropData);
|
|
121
|
+
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,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=build-clanker-v4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-clanker-v4.js","sourceRoot":"","sources":["../../src/build-clanker-v4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useLevrContext } from "../levr-provider.js";
|
|
2
|
+
// ========================================
|
|
3
|
+
// SIMPLE CONTEXT ACCESSORS (one-liner exports)
|
|
4
|
+
// ========================================
|
|
5
|
+
/**
|
|
6
|
+
* Hook to access project data from LevrProvider
|
|
7
|
+
*/
|
|
8
|
+
export const useProject = () => useLevrContext().project;
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access balance data from LevrProvider
|
|
11
|
+
*/
|
|
12
|
+
export const useBalance = () => useLevrContext().balances;
|
|
13
|
+
/**
|
|
14
|
+
* Hook to access proposals from LevrProvider
|
|
15
|
+
*/
|
|
16
|
+
export const useProposals = () => useLevrContext().proposals;
|
|
17
|
+
/**
|
|
18
|
+
* Hook to access clanker token metadata from LevrProvider
|
|
19
|
+
*/
|
|
20
|
+
export const useClankerToken = () => useLevrContext().tokenData;
|
|
21
|
+
// ========================================
|
|
22
|
+
// COMPLEX HOOKS (with mutations/callbacks)
|
|
23
|
+
// ========================================
|
|
24
|
+
export * from "./use-clanker.js";
|
|
25
|
+
export * from "./use-fee-receivers.js";
|
|
26
|
+
export * from "./use-governance.js";
|
|
27
|
+
export * from "./use-stake.js";
|
|
28
|
+
export * from "./use-swap.js";
|
|
29
|
+
// ========================================
|
|
30
|
+
// OTHER HOOKS (not part of Levr context)
|
|
31
|
+
// ========================================
|
|
32
|
+
export * from "./use-deploy.js";
|
|
33
|
+
export * from "./use-prepare.js";
|
|
34
|
+
export * from "./use-projects.js";
|
|
35
|
+
export * from "./use-register.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,CAAA;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAA;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,SAAS,CAAA;AAE/D,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,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { zeroAddress } from "viem";
|
|
5
|
+
import { useAccount, useChainId, usePublicClient } from "wagmi";
|
|
6
|
+
import { balance } from "../../balance.js";
|
|
7
|
+
import { WETH } from "../../constants.js";
|
|
8
|
+
import { queryKeys } from "../query-keys.js";
|
|
9
|
+
/**
|
|
10
|
+
* Internal: Creates balance query with all logic
|
|
11
|
+
* Used by LevrProvider
|
|
12
|
+
*/
|
|
13
|
+
export function useBalanceQuery({ clankerToken, projectTokenDecimals = 18, enabled: e = true, }) {
|
|
14
|
+
const publicClient = usePublicClient();
|
|
15
|
+
const chainId = useChainId();
|
|
16
|
+
const { address: userAddress } = useAccount();
|
|
17
|
+
const wethAddress = WETH(chainId)?.address;
|
|
18
|
+
const tokenAddresses = useMemo(() => {
|
|
19
|
+
const addresses = [];
|
|
20
|
+
if (clankerToken) {
|
|
21
|
+
addresses.push({
|
|
22
|
+
address: clankerToken,
|
|
23
|
+
decimals: projectTokenDecimals,
|
|
24
|
+
key: "token",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (wethAddress) {
|
|
28
|
+
addresses.push({
|
|
29
|
+
address: wethAddress,
|
|
30
|
+
decimals: 18,
|
|
31
|
+
key: "weth",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Add native ETH balance
|
|
35
|
+
addresses.push({
|
|
36
|
+
address: zeroAddress,
|
|
37
|
+
decimals: 18,
|
|
38
|
+
key: "eth",
|
|
39
|
+
});
|
|
40
|
+
return addresses;
|
|
41
|
+
}, [clankerToken, projectTokenDecimals, wethAddress]);
|
|
42
|
+
return useQuery({
|
|
43
|
+
queryKey: queryKeys.balance(tokenAddresses.map((t) => t.address).join(","), userAddress),
|
|
44
|
+
queryFn: async () => {
|
|
45
|
+
if (!userAddress || tokenAddresses.length === 0)
|
|
46
|
+
return {};
|
|
47
|
+
return balance({
|
|
48
|
+
publicClient: publicClient,
|
|
49
|
+
address: userAddress,
|
|
50
|
+
tokens: tokenAddresses,
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
enabled: e && !!publicClient && !!userAddress && tokenAddresses.length > 0,
|
|
54
|
+
refetchInterval: 10000,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-balance.js","sourceRoot":"","sources":["../../../../src/client/hook/use-balance.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAczC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,YAAY,EACZ,oBAAoB,GAAG,EAAE,EACzB,OAAO,EAAE,CAAC,GAAG,IAAI,GACK;IACtB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAA;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAE1C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,SAAS,GAA+D,EAAE,CAAA;QAEhF,IAAI,YAAY,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,oBAAoB;gBAC9B,GAAG,EAAE,OAAO;aACb,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,MAAM;aACZ,CAAC,CAAA;QACJ,CAAC;QAED,yBAAyB;QACzB,SAAS,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,EAAE;YACZ,GAAG,EAAE,KAAK;SACX,CAAC,CAAA;QAEF,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAA;IAErD,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAY,CAAC;QACzF,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC1D,OAAO,OAAO,CAAC;gBACb,YAAY,EAAE,YAAa;gBAC3B,OAAO,EAAE,WAAW;gBACpB,MAAM,EAAE,cAAc;aACvB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,WAAW,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;QAC1E,eAAe,EAAE,MAAM;KACxB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { Clanker } from "clanker-sdk/v4";
|
|
4
|
+
import { usePublicClient, useWalletClient } from "wagmi";
|
|
5
|
+
import { IClankerToken } from "../../abis/index.js";
|
|
6
|
+
import { queryKeys } from "../query-keys.js";
|
|
7
|
+
/**
|
|
8
|
+
* Internal: Creates clanker token metadata query
|
|
9
|
+
* Used by LevrProvider
|
|
10
|
+
*/
|
|
11
|
+
export function useClankerTokenQuery({ clankerToken, enabled: e = true, }) {
|
|
12
|
+
const publicClient = usePublicClient();
|
|
13
|
+
return useQuery({
|
|
14
|
+
queryKey: queryKeys.clankerToken(clankerToken),
|
|
15
|
+
queryFn: async () => {
|
|
16
|
+
const allData = await publicClient?.readContract({
|
|
17
|
+
address: clankerToken,
|
|
18
|
+
abi: IClankerToken,
|
|
19
|
+
functionName: "allData",
|
|
20
|
+
});
|
|
21
|
+
if (!allData)
|
|
22
|
+
return null;
|
|
23
|
+
const [originalAdmin, admin, image, metadata, context] = allData;
|
|
24
|
+
return {
|
|
25
|
+
originalAdmin,
|
|
26
|
+
admin,
|
|
27
|
+
image,
|
|
28
|
+
metadata,
|
|
29
|
+
context,
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
enabled: e && !!clankerToken && !!publicClient,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// ========================================
|
|
36
|
+
// PUBLIC HOOK (exported from index.ts)
|
|
37
|
+
// ========================================
|
|
38
|
+
/**
|
|
39
|
+
* Hook to get Clanker SDK instance
|
|
40
|
+
* For token metadata, use useClankerToken() from index.ts
|
|
41
|
+
*/
|
|
42
|
+
export function useClanker(_clankerToken) {
|
|
43
|
+
const publicClient = usePublicClient();
|
|
44
|
+
const { data: wallet } = useWalletClient();
|
|
45
|
+
return useQuery({
|
|
46
|
+
queryKey: queryKeys.clanker(publicClient?.chain.id, wallet?.account?.address),
|
|
47
|
+
queryFn: () => {
|
|
48
|
+
try {
|
|
49
|
+
return new Clanker({ publicClient: publicClient, wallet: wallet });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
enabled: !!publicClient && !!wallet,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-clanker.js","sourceRoot":"","sources":["../../../../src/client/hook/use-clanker.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAExC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAOzC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,YAAY,EACZ,OAAO,EAAE,CAAC,GAAG,IAAI,GACU;IAC3B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IAEtC,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC;QAC/C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,YAAY,CAAC;gBAC/C,OAAO,EAAE,YAAa;gBACtB,GAAG,EAAE,aAAa;gBAClB,YAAY,EAAE,SAAS;aACxB,CAAC,CAAA;YAEF,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAA;YAEzB,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;YAEhE,OAAO;gBACL,aAAa;gBACb,KAAK;gBACL,KAAK;gBACL,QAAQ;gBACR,OAAO;aACR,CAAA;QACH,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY;KAC/C,CAAC,CAAA;AACJ,CAAC;AAED,2CAA2C;AAC3C,uCAAuC;AACvC,2CAA2C;AAE3C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,aAA6B;IACtD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAA;IAE1C,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;QAC7E,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,OAAO,CAAC,EAAE,YAAY,EAAE,YAAa,EAAE,MAAM,EAAE,MAAO,EAAE,CAAC,CAAA;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM;KACpC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useMutation } from "@tanstack/react-query";
|
|
2
|
+
import { deployV4 } from "../../deploy-v4.js";
|
|
3
|
+
import { useClanker } from "./use-clanker.js";
|
|
4
|
+
/**
|
|
5
|
+
* Deploys a Clanker token and registers it with the Levr factory.
|
|
6
|
+
* Returns tx hash and deployed address.
|
|
7
|
+
*/
|
|
8
|
+
export function useDeploy({ onSuccess, onError }) {
|
|
9
|
+
const clanker = useClanker();
|
|
10
|
+
return useMutation({
|
|
11
|
+
mutationFn: (c) => deployV4({ c, clanker: clanker.data }),
|
|
12
|
+
onSuccess,
|
|
13
|
+
onError,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=use-deploy.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation, useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { useAccount, useChainId, usePublicClient, useWalletClient } from "wagmi";
|
|
4
|
+
import { feeReceivers, updateFeeReceiver } from "../../fee-receivers.js";
|
|
5
|
+
import { useLevrContext } from "../levr-provider.js";
|
|
6
|
+
import { queryKeys } from "../query-keys.js";
|
|
7
|
+
/**
|
|
8
|
+
* Internal: Creates fee receivers query with all logic
|
|
9
|
+
* Used by LevrProvider
|
|
10
|
+
*/
|
|
11
|
+
export function useFeeReceiversQuery({ clankerToken, enabled: e = true, }) {
|
|
12
|
+
const publicClient = usePublicClient();
|
|
13
|
+
const chainId = useChainId();
|
|
14
|
+
const { address: userAddress } = useAccount();
|
|
15
|
+
return useQuery({
|
|
16
|
+
queryKey: queryKeys.feeReceivers(clankerToken, userAddress, chainId),
|
|
17
|
+
queryFn: () => feeReceivers({
|
|
18
|
+
publicClient: publicClient,
|
|
19
|
+
clankerToken: clankerToken,
|
|
20
|
+
chainId: chainId,
|
|
21
|
+
userAddress,
|
|
22
|
+
}),
|
|
23
|
+
enabled: e && !!publicClient && !!chainId && !!clankerToken,
|
|
24
|
+
staleTime: 15000,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hook to access fee receivers query and mutations
|
|
29
|
+
* Returns both query data and mutation function
|
|
30
|
+
*/
|
|
31
|
+
export function useFeeReceivers({ clankerToken: _clankerToken, enabled: _e = true, onSuccess, onError, } = {}) {
|
|
32
|
+
const { feeReceivers: query, refetch } = useLevrContext();
|
|
33
|
+
const publicClient = usePublicClient();
|
|
34
|
+
const wallet = useWalletClient();
|
|
35
|
+
const chainId = publicClient?.chain?.id;
|
|
36
|
+
const mutate = useMutation({
|
|
37
|
+
mutationFn: (params) => updateFeeReceiver({
|
|
38
|
+
walletClient: wallet.data,
|
|
39
|
+
clankerToken: params.clankerToken,
|
|
40
|
+
chainId: chainId,
|
|
41
|
+
rewardIndex: params.rewardIndex,
|
|
42
|
+
newRecipient: params.newRecipient,
|
|
43
|
+
}),
|
|
44
|
+
onSuccess: async (hash) => {
|
|
45
|
+
await refetch.feeReceivers();
|
|
46
|
+
onSuccess?.(hash);
|
|
47
|
+
},
|
|
48
|
+
onError: onError,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
query,
|
|
52
|
+
mutate,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +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,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAGhF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAOzC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,YAAY,EACZ,OAAO,EAAE,CAAC,GAAG,IAAI,GACU;IAC3B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAA;IAE7C,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC,YAAa,EAAE,WAAW,EAAE,OAAO,CAAC;QACrE,OAAO,EAAE,GAAG,EAAE,CACZ,YAAY,CAAC;YACX,YAAY,EAAE,YAAa;YAC3B,YAAY,EAAE,YAAa;YAC3B,OAAO,EAAE,OAAQ;YACjB,WAAW;SACZ,CAAC;QACJ,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,YAAY;QAC3D,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;AACJ,CAAC;AAaD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,YAAY,EAAE,aAAa,EAC3B,OAAO,EAAE,EAAE,GAAG,IAAI,EAClB,SAAS,EACT,OAAO,MACkB,EAAE;IAC3B,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAA;IACzD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,YAAY,EAAE,KAAK,EAAE,EAAE,CAAA;IAEvC,MAAM,MAAM,GAAG,WAAW,CAAC;QACzB,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,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;YAC5B,SAAS,EAAE,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,MAAM;KACP,CAAA;AACH,CAAC"}
|