levr-sdk 0.2.1 → 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.
- package/dist/esm/abis/ClankerAirdropV2.js +289 -0
- package/dist/esm/abis/ClankerVault.js +215 -0
- package/dist/esm/abis/LevrFactory_v1.js +23 -0
- package/dist/esm/abis/LevrFeeSplitterFactory_v1.js +197 -0
- package/dist/esm/abis/LevrFeeSplitter_v1.js +544 -0
- package/dist/esm/abis/LevrGovernor_v1.js +10 -0
- package/dist/esm/abis/index.js +4 -0
- package/dist/esm/airdrop.js +160 -0
- package/dist/esm/airdrop.js.map +1 -0
- package/dist/esm/build-calldatas-v4.js +3 -1
- package/dist/esm/build-calldatas-v4.js.map +1 -1
- package/dist/esm/build-clanker-v4.js +75 -25
- package/dist/esm/build-clanker-v4.js.map +1 -1
- package/dist/esm/client/hook/index.js +10 -0
- package/dist/esm/client/hook/index.js.map +1 -1
- package/dist/esm/client/hook/use-airdrop.js +8 -4
- package/dist/esm/client/hook/use-airdrop.js.map +1 -1
- package/dist/esm/client/hook/use-configure-splits.js +43 -0
- package/dist/esm/client/hook/use-configure-splits.js.map +1 -0
- package/dist/esm/client/hook/use-deploy.js +3 -3
- package/dist/esm/client/hook/use-deploy.js.map +1 -1
- package/dist/esm/client/hook/use-factory.js +33 -0
- package/dist/esm/client/hook/use-factory.js.map +1 -0
- package/dist/esm/client/hook/use-fee-receivers.js +4 -12
- package/dist/esm/client/hook/use-fee-receivers.js.map +1 -1
- package/dist/esm/client/hook/use-governance.js +18 -3
- package/dist/esm/client/hook/use-governance.js.map +1 -1
- package/dist/esm/client/hook/use-project.js +7 -3
- package/dist/esm/client/hook/use-project.js.map +1 -1
- package/dist/esm/client/hook/use-proposal.js +11 -5
- package/dist/esm/client/hook/use-proposal.js.map +1 -1
- package/dist/esm/client/hook/use-stake.js +1 -1
- package/dist/esm/client/hook/use-stake.js.map +1 -1
- package/dist/esm/client/hook/use-vault.js +67 -0
- package/dist/esm/client/hook/use-vault.js.map +1 -0
- package/dist/esm/client/levr-provider.js +18 -2
- package/dist/esm/client/levr-provider.js.map +1 -1
- package/dist/esm/client/query-keys.js +13 -1
- package/dist/esm/client/query-keys.js.map +1 -1
- package/dist/esm/constants.js +83 -6
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/deploy-v4.js +56 -3
- package/dist/esm/deploy-v4.js.map +1 -1
- package/dist/esm/factory.js +94 -0
- package/dist/esm/factory.js.map +1 -0
- package/dist/esm/fee-receivers.js +315 -4
- package/dist/esm/fee-receivers.js.map +1 -1
- package/dist/esm/fee-splitter.js +68 -0
- package/dist/esm/fee-splitter.js.map +1 -0
- package/dist/esm/governance.js +86 -9
- package/dist/esm/governance.js.map +1 -1
- package/dist/esm/index.js +5 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/ipfs-merkle-tree.js +130 -0
- package/dist/esm/ipfs-merkle-tree.js.map +1 -0
- package/dist/esm/project.js +114 -26
- package/dist/esm/project.js.map +1 -1
- package/dist/esm/schema/levr.schema.js +94 -33
- package/dist/esm/schema/levr.schema.js.map +1 -1
- package/dist/esm/stake.js +157 -19
- package/dist/esm/stake.js.map +1 -1
- package/dist/esm/vault.js +136 -0
- package/dist/esm/vault.js.map +1 -0
- package/dist/types/abis/ClankerAirdropV2.d.ts +573 -0
- package/dist/types/abis/ClankerVault.d.ts +407 -0
- package/dist/types/abis/LevrFactory_v1.d.ts +18 -0
- package/dist/types/abis/LevrFeeSplitterFactory_v1.d.ts +149 -0
- package/dist/types/abis/LevrFeeSplitter_v1.d.ts +422 -0
- package/dist/types/abis/LevrGovernor_v1.d.ts +8 -0
- package/dist/types/abis/index.d.ts +4 -0
- package/dist/types/airdrop.d.ts +18 -0
- package/dist/types/airdrop.d.ts.map +1 -0
- package/dist/types/build-calldatas-v4.d.ts +3 -0
- package/dist/types/build-calldatas-v4.d.ts.map +1 -1
- package/dist/types/build-clanker-v4.d.ts +6 -1
- package/dist/types/build-clanker-v4.d.ts.map +1 -1
- package/dist/types/client/hook/index.d.ts +10 -0
- package/dist/types/client/hook/index.d.ts.map +1 -1
- package/dist/types/client/hook/use-airdrop.d.ts +3 -1
- package/dist/types/client/hook/use-airdrop.d.ts.map +1 -1
- package/dist/types/client/hook/use-configure-splits.d.ts +17 -0
- package/dist/types/client/hook/use-configure-splits.d.ts.map +1 -0
- package/dist/types/client/hook/use-deploy.d.ts +21 -14
- package/dist/types/client/hook/use-deploy.d.ts.map +1 -1
- package/dist/types/client/hook/use-factory.d.ts +34 -0
- package/dist/types/client/hook/use-factory.d.ts.map +1 -0
- package/dist/types/client/hook/use-fee-receivers.d.ts +1 -6
- package/dist/types/client/hook/use-fee-receivers.d.ts.map +1 -1
- package/dist/types/client/hook/use-governance.d.ts +18 -2
- package/dist/types/client/hook/use-governance.d.ts.map +1 -1
- package/dist/types/client/hook/use-project.d.ts +169 -1
- package/dist/types/client/hook/use-project.d.ts.map +1 -1
- package/dist/types/client/hook/use-proposal.d.ts +3 -2
- package/dist/types/client/hook/use-proposal.d.ts.map +1 -1
- package/dist/types/client/hook/use-vault.d.ts +13 -0
- package/dist/types/client/hook/use-vault.d.ts.map +1 -0
- package/dist/types/client/levr-provider.d.ts +15 -1
- package/dist/types/client/levr-provider.d.ts.map +1 -1
- package/dist/types/client/query-keys.d.ts +13 -1
- package/dist/types/client/query-keys.d.ts.map +1 -1
- package/dist/types/constants.d.ts +59 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/deploy-v4.d.ts +3 -1
- package/dist/types/deploy-v4.d.ts.map +1 -1
- package/dist/types/factory.d.ts +21 -0
- package/dist/types/factory.d.ts.map +1 -0
- package/dist/types/fee-receivers.d.ts +1836 -1
- package/dist/types/fee-receivers.d.ts.map +1 -1
- package/dist/types/fee-splitter.d.ts +23 -0
- package/dist/types/fee-splitter.d.ts.map +1 -0
- package/dist/types/governance.d.ts +18 -2
- package/dist/types/governance.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ipfs-merkle-tree.d.ts +72 -0
- package/dist/types/ipfs-merkle-tree.d.ts.map +1 -0
- package/dist/types/project.d.ts +10 -2
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/proposal.d.ts +16 -0
- package/dist/types/proposal.d.ts.map +1 -1
- package/dist/types/schema/levr.schema.d.ts +16 -4
- package/dist/types/schema/levr.schema.d.ts.map +1 -1
- package/dist/types/stake.d.ts +33 -2
- package/dist/types/stake.d.ts.map +1 -1
- package/dist/types/vault.d.ts +70 -0
- package/dist/types/vault.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/esm/treasury.js +0 -84
- package/dist/esm/treasury.js.map +0 -1
- package/dist/types/treasury.d.ts +0 -10
- package/dist/types/treasury.d.ts.map +0 -1
package/dist/esm/deploy-v4.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { LevrFactory_v1, LevrForwarder_v1 } from "./abis/index.js";
|
|
2
|
+
import ClankerAirdropV2 from "./abis/ClankerAirdropV2.js";
|
|
2
3
|
import { buildCalldatasV4 } from "./build-calldatas-v4.js";
|
|
3
|
-
import { GET_FACTORY_ADDRESS } from "./constants.js";
|
|
4
|
-
|
|
4
|
+
import { GET_CLANKER_AIRDROP_ADDRESS, GET_FACTORY_ADDRESS } from "./constants.js";
|
|
5
|
+
import { storeMerkleTreeToIPFS } from "./ipfs-merkle-tree.js";
|
|
6
|
+
export const deployV4 = async ({ c, clanker, ipfsJsonUploadUrl, }) => {
|
|
5
7
|
if (!clanker)
|
|
6
8
|
throw new Error("Clanker SDK not found");
|
|
7
9
|
const wallet = clanker.wallet;
|
|
@@ -11,6 +13,8 @@ export const deployV4 = async ({ c, clanker }) => {
|
|
|
11
13
|
if (!wallet)
|
|
12
14
|
throw new Error("Wallet not found");
|
|
13
15
|
const chainId = publicClient.chain?.id;
|
|
16
|
+
if (!chainId)
|
|
17
|
+
throw new Error("Chain ID not found");
|
|
14
18
|
const factoryAddress = GET_FACTORY_ADDRESS(chainId);
|
|
15
19
|
if (!factoryAddress)
|
|
16
20
|
throw new Error("Factory address is required");
|
|
@@ -19,7 +23,7 @@ export const deployV4 = async ({ c, clanker }) => {
|
|
|
19
23
|
abi: LevrFactory_v1,
|
|
20
24
|
functionName: "trustedForwarder",
|
|
21
25
|
});
|
|
22
|
-
const { callDatas, clankerTokenAddress, totalValue } = await buildCalldatasV4({
|
|
26
|
+
const { callDatas, clankerTokenAddress, totalValue, merkleTree } = await buildCalldatasV4({
|
|
23
27
|
c,
|
|
24
28
|
clanker,
|
|
25
29
|
publicClient,
|
|
@@ -38,9 +42,58 @@ export const deployV4 = async ({ c, clanker }) => {
|
|
|
38
42
|
if (receipt.status === "reverted") {
|
|
39
43
|
throw new Error("Deployment transaction reverted");
|
|
40
44
|
}
|
|
45
|
+
// Store merkle tree to IPFS if ipfsJsonUploadUrl is provided and airdrop exists
|
|
46
|
+
let merkleTreeCID;
|
|
47
|
+
if (ipfsJsonUploadUrl && merkleTree) {
|
|
48
|
+
// Get airdrop contract info to save metadata
|
|
49
|
+
const airdropAddress = GET_CLANKER_AIRDROP_ADDRESS(chainId);
|
|
50
|
+
if (airdropAddress) {
|
|
51
|
+
// Fetch airdrop info to get lockupEndTime and other metadata
|
|
52
|
+
const airdropInfo = await publicClient.readContract({
|
|
53
|
+
address: airdropAddress,
|
|
54
|
+
abi: ClankerAirdropV2,
|
|
55
|
+
functionName: "airdrops",
|
|
56
|
+
args: [clankerTokenAddress],
|
|
57
|
+
});
|
|
58
|
+
const lockupEndTime = Number(airdropInfo[4]) * 1000; // index 4 is lockupEndTime (convert to ms)
|
|
59
|
+
const lockupDuration = 86400; // 1 day in seconds
|
|
60
|
+
// Store the merkle tree data to IPFS with minimal metadata
|
|
61
|
+
// This will throw an error if upload fails, which will fail the entire deployment
|
|
62
|
+
const treeData = merkleTree.dump();
|
|
63
|
+
const cid = await storeMerkleTreeToIPFS({
|
|
64
|
+
tokenAddress: clankerTokenAddress,
|
|
65
|
+
chainId,
|
|
66
|
+
treeData,
|
|
67
|
+
ipfsJsonUploadUrl,
|
|
68
|
+
lockupEndTime,
|
|
69
|
+
lockupDuration,
|
|
70
|
+
});
|
|
71
|
+
merkleTreeCID = cid;
|
|
72
|
+
console.log(`Merkle tree stored to IPFS with CID: ${cid}`);
|
|
73
|
+
console.log(`Metadata: lockupEndTime=${new Date(lockupEndTime).toISOString()}`);
|
|
74
|
+
console.log(`Retrieve using: tokenAddress=${clankerTokenAddress}, chainId=${chainId}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.warn("No airdrop address found, storing merkle tree with default metadata");
|
|
78
|
+
const treeData = merkleTree.dump();
|
|
79
|
+
const currentBlock = await publicClient.getBlock();
|
|
80
|
+
const lockupDuration = 86400; // 1 day in seconds
|
|
81
|
+
const lockupEndTime = Number(currentBlock.timestamp) * 1000 + lockupDuration * 1000;
|
|
82
|
+
const cid = await storeMerkleTreeToIPFS({
|
|
83
|
+
tokenAddress: clankerTokenAddress,
|
|
84
|
+
chainId,
|
|
85
|
+
treeData,
|
|
86
|
+
ipfsJsonUploadUrl,
|
|
87
|
+
lockupEndTime,
|
|
88
|
+
lockupDuration,
|
|
89
|
+
});
|
|
90
|
+
merkleTreeCID = cid;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
41
93
|
return {
|
|
42
94
|
receipt,
|
|
43
95
|
address: clankerTokenAddress,
|
|
96
|
+
merkleTreeCID,
|
|
44
97
|
};
|
|
45
98
|
};
|
|
46
99
|
//# sourceMappingURL=deploy-v4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-v4.js","sourceRoot":"","sources":["../../src/deploy-v4.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy-v4.js","sourceRoot":"","sources":["../../src/deploy-v4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import LevrFactory_v1 from "./abis/LevrFactory_v1.js";
|
|
2
|
+
import { GET_FACTORY_ADDRESS } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fetches the factory configuration from the blockchain using multicall
|
|
5
|
+
* @param publicClient - The public client for reading from the blockchain
|
|
6
|
+
* @param chainId - The chain ID
|
|
7
|
+
* @returns The factory configuration
|
|
8
|
+
*/
|
|
9
|
+
export async function getFactoryConfig(publicClient, chainId) {
|
|
10
|
+
const factoryAddress = GET_FACTORY_ADDRESS(chainId);
|
|
11
|
+
if (!factoryAddress) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const results = await publicClient.multicall({
|
|
16
|
+
contracts: [
|
|
17
|
+
{
|
|
18
|
+
address: factoryAddress,
|
|
19
|
+
abi: LevrFactory_v1,
|
|
20
|
+
functionName: "protocolFeeBps",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
address: factoryAddress,
|
|
24
|
+
abi: LevrFactory_v1,
|
|
25
|
+
functionName: "protocolTreasury",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
address: factoryAddress,
|
|
29
|
+
abi: LevrFactory_v1,
|
|
30
|
+
functionName: "streamWindowSeconds",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
address: factoryAddress,
|
|
34
|
+
abi: LevrFactory_v1,
|
|
35
|
+
functionName: "proposalWindowSeconds",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
address: factoryAddress,
|
|
39
|
+
abi: LevrFactory_v1,
|
|
40
|
+
functionName: "votingWindowSeconds",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
address: factoryAddress,
|
|
44
|
+
abi: LevrFactory_v1,
|
|
45
|
+
functionName: "maxActiveProposals",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
address: factoryAddress,
|
|
49
|
+
abi: LevrFactory_v1,
|
|
50
|
+
functionName: "quorumBps",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
address: factoryAddress,
|
|
54
|
+
abi: LevrFactory_v1,
|
|
55
|
+
functionName: "approvalBps",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
address: factoryAddress,
|
|
59
|
+
abi: LevrFactory_v1,
|
|
60
|
+
functionName: "minSTokenBpsToSubmit",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
address: factoryAddress,
|
|
64
|
+
abi: LevrFactory_v1,
|
|
65
|
+
functionName: "maxProposalAmountBps",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
// Check for any errors in the results
|
|
70
|
+
const [protocolFeeBps, protocolTreasury, streamWindowSeconds, proposalWindowSeconds, votingWindowSeconds, maxActiveProposals, quorumBps, approvalBps, minSTokenBpsToSubmit, maxProposalAmountBps,] = results.map((result) => {
|
|
71
|
+
if (result.status === "failure") {
|
|
72
|
+
throw new Error(`Contract call failed: ${result.error?.message}`);
|
|
73
|
+
}
|
|
74
|
+
return result.result;
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
protocolFeeBps: protocolFeeBps,
|
|
78
|
+
protocolTreasury: protocolTreasury,
|
|
79
|
+
streamWindowSeconds: streamWindowSeconds,
|
|
80
|
+
proposalWindowSeconds: proposalWindowSeconds,
|
|
81
|
+
votingWindowSeconds: votingWindowSeconds,
|
|
82
|
+
maxActiveProposals: maxActiveProposals,
|
|
83
|
+
quorumBps: quorumBps,
|
|
84
|
+
approvalBps: approvalBps,
|
|
85
|
+
minSTokenBpsToSubmit: minSTokenBpsToSubmit,
|
|
86
|
+
maxProposalAmountBps: maxProposalAmountBps,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error("Failed to fetch factory config:", error);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAEA,OAAO,cAAc,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAejD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAA0B,EAC1B,OAAe;IAEf,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC;YAC3C,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,gBAAgB;iBAC/B;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,kBAAkB;iBACjC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,qBAAqB;iBACpC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,uBAAuB;iBACtC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,qBAAqB;iBACpC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,oBAAoB;iBACnC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,WAAW;iBAC1B;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,aAAa;iBAC5B;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,sBAAsB;iBACrC;gBACD;oBACE,OAAO,EAAE,cAAc;oBACvB,GAAG,EAAE,cAAc;oBACnB,YAAY,EAAE,sBAAsB;iBACrC;aACO;SACX,CAAC,CAAA;QAEF,sCAAsC;QACtC,MAAM,CACJ,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACrB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YACnE,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,cAAc,EAAE,cAAwB;YACxC,gBAAgB,EAAE,gBAA2B;YAC7C,mBAAmB,EAAE,mBAA6B;YAClD,qBAAqB,EAAE,qBAA+B;YACtD,mBAAmB,EAAE,mBAA6B;YAClD,kBAAkB,EAAE,kBAA4B;YAChD,SAAS,EAAE,SAAmB;YAC9B,WAAW,EAAE,WAAqB;YAClC,oBAAoB,EAAE,oBAA8B;YACpD,oBAAoB,EAAE,oBAA8B;SACrD,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;QACvD,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { IClankerLpLockerMultiple } from "./abis/index.js";
|
|
1
|
+
import { IClankerLpLockerMultiple, LevrFeeSplitter_v1 } from "./abis/index.js";
|
|
2
2
|
import { GET_LP_LOCKER_ADDRESS } from "./constants.js";
|
|
3
|
+
export var FeePreference;
|
|
4
|
+
(function (FeePreference) {
|
|
5
|
+
FeePreference[FeePreference["Both"] = 0] = "Both";
|
|
6
|
+
FeePreference[FeePreference["Paired"] = 1] = "Paired";
|
|
7
|
+
FeePreference[FeePreference["Clanker"] = 2] = "Clanker";
|
|
8
|
+
})(FeePreference || (FeePreference = {}));
|
|
3
9
|
/**
|
|
4
10
|
* Get tokenRewards from LP locker by reading the contract
|
|
5
11
|
* Returns pool info and fee receiver data
|
|
@@ -51,16 +57,19 @@ export async function getTokenRewards(publicClient, clankerToken) {
|
|
|
51
57
|
/**
|
|
52
58
|
* Parse fee receivers from tokenRewards result
|
|
53
59
|
* Shared utility to avoid logic duplication
|
|
60
|
+
* Note: feePreference is optional and should be added via a separate call to feePreferences()
|
|
54
61
|
*/
|
|
55
62
|
export function parseFeeReceivers(tokenRewardsResult, userAddress) {
|
|
56
63
|
const admins = tokenRewardsResult.rewardAdmins || [];
|
|
57
64
|
const recipients = tokenRewardsResult.rewardRecipients || [];
|
|
58
65
|
const bps = tokenRewardsResult.rewardBps || [];
|
|
66
|
+
const feePrefs = tokenRewardsResult.feePreferences || [];
|
|
59
67
|
return admins.map((admin, index) => ({
|
|
60
68
|
areYouAnAdmin: userAddress ? admin.toLowerCase() === userAddress.toLowerCase() : false,
|
|
61
69
|
admin,
|
|
62
70
|
recipient: recipients[index],
|
|
63
71
|
percentage: bps[index] / 100, // Convert bps to percentage
|
|
72
|
+
feePreference: feePrefs[index] !== undefined ? feePrefs[index] : undefined,
|
|
64
73
|
}));
|
|
65
74
|
}
|
|
66
75
|
/**
|
|
@@ -75,9 +84,10 @@ export async function feeReceivers({ publicClient, clankerToken, userAddress, })
|
|
|
75
84
|
}
|
|
76
85
|
/**
|
|
77
86
|
* Update fee receiver for a clanker token
|
|
87
|
+
* Waits for transaction confirmation before returning
|
|
78
88
|
*/
|
|
79
|
-
export async function updateFeeReceiver({ walletClient, clankerToken, chainId, rewardIndex, newRecipient, }) {
|
|
80
|
-
if (Object.values({ walletClient, clankerToken, chainId, newRecipient }).some((value) => !value)) {
|
|
89
|
+
export async function updateFeeReceiver({ walletClient, publicClient, clankerToken, chainId, rewardIndex, newRecipient, }) {
|
|
90
|
+
if (Object.values({ walletClient, publicClient, clankerToken, chainId, newRecipient }).some((value) => !value)) {
|
|
81
91
|
throw new Error("Invalid update fee receiver params");
|
|
82
92
|
}
|
|
83
93
|
const lpLockerAddress = GET_LP_LOCKER_ADDRESS(chainId);
|
|
@@ -91,6 +101,307 @@ export async function updateFeeReceiver({ walletClient, clankerToken, chainId, r
|
|
|
91
101
|
functionName: "updateRewardRecipient",
|
|
92
102
|
args: [clankerToken, BigInt(index), newRecipient],
|
|
93
103
|
});
|
|
94
|
-
|
|
104
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
105
|
+
if (receipt.status === "reverted") {
|
|
106
|
+
throw new Error("Update fee receiver transaction reverted");
|
|
107
|
+
}
|
|
108
|
+
return receipt;
|
|
109
|
+
}
|
|
110
|
+
export async function configureSplits({ walletClient, publicClient, clankerToken, chainId, splits, }) {
|
|
111
|
+
if (Object.values({ walletClient, publicClient, clankerToken, chainId }).some((value) => !value)) {
|
|
112
|
+
throw new Error("Invalid configure splits params");
|
|
113
|
+
}
|
|
114
|
+
const { deployFeeSplitter } = await import("./fee-splitter.js");
|
|
115
|
+
const { LevrFeeSplitter_v1 } = await import("./abis/index.js");
|
|
116
|
+
// Step 1: Ensure fee splitter is deployed for this token
|
|
117
|
+
// This will deploy if not exists, or return existing address
|
|
118
|
+
const splitterAddress = await deployFeeSplitter({
|
|
119
|
+
publicClient,
|
|
120
|
+
walletClient,
|
|
121
|
+
clankerToken,
|
|
122
|
+
});
|
|
123
|
+
// Step 2: Configure splits on the deployed splitter
|
|
124
|
+
const splitsWithBps = splits.map((s) => ({
|
|
125
|
+
receiver: s.receiver,
|
|
126
|
+
bps: Math.floor(s.percentage * 100), // percentage to basis points
|
|
127
|
+
}));
|
|
128
|
+
const hash = await walletClient.writeContract({
|
|
129
|
+
address: splitterAddress, // Use deployed splitter, not deployer!
|
|
130
|
+
abi: LevrFeeSplitter_v1,
|
|
131
|
+
functionName: "configureSplits",
|
|
132
|
+
args: [splitsWithBps],
|
|
133
|
+
});
|
|
134
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
135
|
+
if (receipt.status === "reverted") {
|
|
136
|
+
throw new Error("Configure splits transaction reverted");
|
|
137
|
+
}
|
|
138
|
+
return receipt;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Compare two split configurations for equality
|
|
142
|
+
* Compares receiver addresses and percentages (converted to bps)
|
|
143
|
+
*/
|
|
144
|
+
function areSplitsEqual(currentSplits, newSplits) {
|
|
145
|
+
if (currentSplits.length !== newSplits.length)
|
|
146
|
+
return false;
|
|
147
|
+
// Convert UI splits to bps for comparison
|
|
148
|
+
const newSplitsWithBps = newSplits.map((s) => ({
|
|
149
|
+
receiver: s.receiver.toLowerCase(),
|
|
150
|
+
bps: Math.floor(s.percentage * 100),
|
|
151
|
+
}));
|
|
152
|
+
// Sort both arrays by receiver for comparison
|
|
153
|
+
const sortedCurrent = [...currentSplits]
|
|
154
|
+
.map((s) => ({ receiver: s.receiver.toLowerCase(), bps: s.bps }))
|
|
155
|
+
.sort((a, b) => a.receiver.localeCompare(b.receiver));
|
|
156
|
+
const sortedNew = [...newSplitsWithBps].sort((a, b) => a.receiver.localeCompare(b.receiver));
|
|
157
|
+
// Compare each split
|
|
158
|
+
return sortedCurrent.every((current, index) => current.receiver === sortedNew[index].receiver && current.bps === sortedNew[index].bps);
|
|
159
|
+
}
|
|
160
|
+
export async function configureSplitsAndUpdateRecipient(params) {
|
|
161
|
+
const { walletClient, publicClient, clankerToken, chainId, splits, rewardIndex } = params;
|
|
162
|
+
const { getFeeSplitter } = await import("./fee-splitter.js");
|
|
163
|
+
const { LevrFeeSplitter_v1 } = await import("./abis/index.js");
|
|
164
|
+
// Step 0: Get or deploy fee splitter
|
|
165
|
+
const splitterAddress = await getFeeSplitter({
|
|
166
|
+
publicClient,
|
|
167
|
+
clankerToken,
|
|
168
|
+
chainId,
|
|
169
|
+
});
|
|
170
|
+
if (!splitterAddress) {
|
|
171
|
+
// Fee splitter doesn't exist, need to deploy and configure
|
|
172
|
+
const configureSplitsReceipt = await configureSplits({
|
|
173
|
+
walletClient,
|
|
174
|
+
publicClient,
|
|
175
|
+
clankerToken,
|
|
176
|
+
chainId,
|
|
177
|
+
splits,
|
|
178
|
+
});
|
|
179
|
+
// After first deployment, update recipient
|
|
180
|
+
const updateRecipientReceipt = await updateRecipientToSplitter({
|
|
181
|
+
walletClient,
|
|
182
|
+
publicClient,
|
|
183
|
+
clankerToken,
|
|
184
|
+
chainId,
|
|
185
|
+
rewardIndex,
|
|
186
|
+
});
|
|
187
|
+
return {
|
|
188
|
+
configureSplitsReceipt: {
|
|
189
|
+
transactionHash: configureSplitsReceipt.transactionHash,
|
|
190
|
+
status: configureSplitsReceipt.status,
|
|
191
|
+
},
|
|
192
|
+
updateRecipientReceipt: {
|
|
193
|
+
transactionHash: updateRecipientReceipt.transactionHash,
|
|
194
|
+
status: updateRecipientReceipt.status,
|
|
195
|
+
},
|
|
196
|
+
recipientWasAlreadyActive: false,
|
|
197
|
+
splitsWereUnchanged: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// Fee splitter exists - check if splits need updating
|
|
201
|
+
const currentSplits = await publicClient.readContract({
|
|
202
|
+
address: splitterAddress,
|
|
203
|
+
abi: LevrFeeSplitter_v1,
|
|
204
|
+
functionName: "getSplits",
|
|
205
|
+
});
|
|
206
|
+
const splitsUnchanged = areSplitsEqual(currentSplits, splits);
|
|
207
|
+
// Step 1: Configure splits only if they've changed
|
|
208
|
+
let configureSplitsReceipt;
|
|
209
|
+
if (!splitsUnchanged) {
|
|
210
|
+
const receipt = await configureSplits({
|
|
211
|
+
walletClient,
|
|
212
|
+
publicClient,
|
|
213
|
+
clankerToken,
|
|
214
|
+
chainId,
|
|
215
|
+
splits,
|
|
216
|
+
});
|
|
217
|
+
configureSplitsReceipt = {
|
|
218
|
+
transactionHash: receipt.transactionHash,
|
|
219
|
+
status: receipt.status,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// Step 2: Check if splitter is already the active recipient
|
|
223
|
+
const lpLockerAddress = GET_LP_LOCKER_ADDRESS(chainId);
|
|
224
|
+
if (!lpLockerAddress) {
|
|
225
|
+
throw new Error("LP locker address not found for chain");
|
|
226
|
+
}
|
|
227
|
+
const tokenRewards = await publicClient.readContract({
|
|
228
|
+
address: lpLockerAddress,
|
|
229
|
+
abi: IClankerLpLockerMultiple,
|
|
230
|
+
functionName: "tokenRewards",
|
|
231
|
+
args: [clankerToken],
|
|
232
|
+
});
|
|
233
|
+
const currentRecipient = tokenRewards.rewardRecipients?.[0];
|
|
234
|
+
const isAlreadyActive = currentRecipient && currentRecipient.toLowerCase() === splitterAddress.toLowerCase();
|
|
235
|
+
// Step 3: Update recipient only if not already active
|
|
236
|
+
if (!isAlreadyActive) {
|
|
237
|
+
const updateRecipientReceipt = await updateRecipientToSplitter({
|
|
238
|
+
walletClient,
|
|
239
|
+
publicClient,
|
|
240
|
+
clankerToken,
|
|
241
|
+
chainId,
|
|
242
|
+
rewardIndex,
|
|
243
|
+
});
|
|
244
|
+
return {
|
|
245
|
+
configureSplitsReceipt,
|
|
246
|
+
updateRecipientReceipt: {
|
|
247
|
+
transactionHash: updateRecipientReceipt.transactionHash,
|
|
248
|
+
status: updateRecipientReceipt.status,
|
|
249
|
+
},
|
|
250
|
+
recipientWasAlreadyActive: false,
|
|
251
|
+
splitsWereUnchanged: splitsUnchanged,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Recipient already active - return result based on whether splits were configured
|
|
255
|
+
return {
|
|
256
|
+
configureSplitsReceipt,
|
|
257
|
+
recipientWasAlreadyActive: true,
|
|
258
|
+
splitsWereUnchanged: splitsUnchanged,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
export async function updateRecipientToSplitter({ walletClient, publicClient, clankerToken, chainId, rewardIndex, }) {
|
|
262
|
+
// Get the deployed fee splitter for this token
|
|
263
|
+
const { getFeeSplitter } = await import("./fee-splitter.js");
|
|
264
|
+
const splitterAddress = await getFeeSplitter({
|
|
265
|
+
publicClient,
|
|
266
|
+
clankerToken,
|
|
267
|
+
chainId,
|
|
268
|
+
});
|
|
269
|
+
if (!splitterAddress) {
|
|
270
|
+
throw new Error("Fee splitter not deployed for this token. Deploy it first using deployFeeSplitter()");
|
|
271
|
+
}
|
|
272
|
+
// Update to splitter address (direct call from token admin)
|
|
273
|
+
return updateFeeReceiver({
|
|
274
|
+
walletClient,
|
|
275
|
+
publicClient,
|
|
276
|
+
clankerToken,
|
|
277
|
+
chainId,
|
|
278
|
+
rewardIndex,
|
|
279
|
+
newRecipient: splitterAddress,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Check which tokens a specific address is set up to receive as a fee receiver
|
|
284
|
+
* Returns array of tokens (clanker token address and/or WETH address) that this recipient can receive
|
|
285
|
+
* Uses feePreference to determine which tokens: Both (0), Paired/WETH only (1), or Clanker only (2)
|
|
286
|
+
*/
|
|
287
|
+
export function getReceivableTokens(feeReceivers, recipientAddress, clankerToken, wethAddress) {
|
|
288
|
+
if (!feeReceivers || feeReceivers.length === 0) {
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
const receivableTokens = [];
|
|
292
|
+
// Check each fee receiver to see if the recipient address matches
|
|
293
|
+
for (const receiver of feeReceivers) {
|
|
294
|
+
if (receiver.recipient.toLowerCase() === recipientAddress.toLowerCase()) {
|
|
295
|
+
// This recipient receives fees - check which tokens based on feePreference
|
|
296
|
+
const pref = receiver.feePreference;
|
|
297
|
+
if (pref === undefined) {
|
|
298
|
+
// If no preference is set, assume Both for backwards compatibility
|
|
299
|
+
receivableTokens.push(clankerToken);
|
|
300
|
+
if (wethAddress)
|
|
301
|
+
receivableTokens.push(wethAddress);
|
|
302
|
+
}
|
|
303
|
+
else if (pref === FeePreference.Both) {
|
|
304
|
+
// Receives both clanker token and WETH
|
|
305
|
+
receivableTokens.push(clankerToken);
|
|
306
|
+
if (wethAddress)
|
|
307
|
+
receivableTokens.push(wethAddress);
|
|
308
|
+
}
|
|
309
|
+
else if (pref === FeePreference.Paired) {
|
|
310
|
+
// Receives WETH only
|
|
311
|
+
if (wethAddress)
|
|
312
|
+
receivableTokens.push(wethAddress);
|
|
313
|
+
}
|
|
314
|
+
else if (pref === FeePreference.Clanker) {
|
|
315
|
+
// Receives clanker token only
|
|
316
|
+
receivableTokens.push(clankerToken);
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return receivableTokens;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get static fee splitter contracts for multicall
|
|
325
|
+
* Returns contracts for: isSplitsConfigured(), getSplits(), getTotalBps()
|
|
326
|
+
*/
|
|
327
|
+
export function getFeeSplitterStaticContracts(clankerToken, feeSplitterAddress) {
|
|
328
|
+
return [
|
|
329
|
+
{
|
|
330
|
+
address: feeSplitterAddress,
|
|
331
|
+
abi: LevrFeeSplitter_v1,
|
|
332
|
+
functionName: "isSplitsConfigured",
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
address: feeSplitterAddress,
|
|
336
|
+
abi: LevrFeeSplitter_v1,
|
|
337
|
+
functionName: "getSplits",
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
address: feeSplitterAddress,
|
|
341
|
+
abi: LevrFeeSplitter_v1,
|
|
342
|
+
functionName: "getTotalBps",
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Parse static fee splitter data from multicall results
|
|
348
|
+
* Returns null if splits are not configured
|
|
349
|
+
*/
|
|
350
|
+
export function parseFeeSplitterStatic(results, currentFeeRecipient, feeSplitterAddress) {
|
|
351
|
+
const [isConfiguredResult, splitsResult, totalBpsResult] = results;
|
|
352
|
+
// Check if all calls succeeded
|
|
353
|
+
if (isConfiguredResult.status !== "success" ||
|
|
354
|
+
splitsResult.status !== "success" ||
|
|
355
|
+
totalBpsResult.status !== "success") {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
// Check if splits are configured
|
|
359
|
+
if (!isConfiguredResult.result) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
// Ensure we have the fee splitter address
|
|
363
|
+
if (!feeSplitterAddress) {
|
|
364
|
+
throw new Error("Fee splitter address is required to parse static data");
|
|
365
|
+
}
|
|
366
|
+
// Determine if splitter is active by comparing current recipient to splitter address
|
|
367
|
+
const isActive = !!(currentFeeRecipient &&
|
|
368
|
+
feeSplitterAddress &&
|
|
369
|
+
currentFeeRecipient.toLowerCase() === feeSplitterAddress.toLowerCase());
|
|
370
|
+
return {
|
|
371
|
+
address: feeSplitterAddress,
|
|
372
|
+
isConfigured: isConfiguredResult.result,
|
|
373
|
+
isActive,
|
|
374
|
+
splits: splitsResult.result,
|
|
375
|
+
totalBps: Number(totalBpsResult.result),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get dynamic fee splitter contracts for multicall
|
|
380
|
+
* Returns contracts for: pendingFees() for each reward token
|
|
381
|
+
* Note: Fee splitter internally queries ClankerFeeLocker
|
|
382
|
+
*/
|
|
383
|
+
export function getFeeSplitterDynamicContracts(clankerToken, feeSplitterAddress, rewardTokens) {
|
|
384
|
+
return rewardTokens.map((rewardToken) => ({
|
|
385
|
+
address: feeSplitterAddress,
|
|
386
|
+
abi: LevrFeeSplitter_v1,
|
|
387
|
+
functionName: "pendingFees",
|
|
388
|
+
args: [rewardToken],
|
|
389
|
+
}));
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Parse dynamic fee splitter data from multicall results
|
|
393
|
+
* Maps pending fees results to { token, weth } structure
|
|
394
|
+
*/
|
|
395
|
+
export function parseFeeSplitterDynamic(results, wethAddress) {
|
|
396
|
+
// First result is always the clanker token
|
|
397
|
+
const tokenPending = results[0]?.status === "success" ? results[0].result : 0n;
|
|
398
|
+
// Second result is WETH (if provided)
|
|
399
|
+
const wethPending = wethAddress && results[1]?.status === "success" ? results[1].result : null;
|
|
400
|
+
return {
|
|
401
|
+
pendingFees: {
|
|
402
|
+
token: tokenPending,
|
|
403
|
+
weth: wethPending,
|
|
404
|
+
},
|
|
405
|
+
};
|
|
95
406
|
}
|
|
96
407
|
//# sourceMappingURL=fee-receivers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fee-receivers.js","sourceRoot":"","sources":["../../src/fee-receivers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fee-receivers.js","sourceRoot":"","sources":["../../src/fee-receivers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import LevrFeeSplitterFactory_v1 from "./abis/LevrFeeSplitterFactory_v1.js";
|
|
2
|
+
import { GET_FEE_SPLITTER_FACTORY_ADDRESS } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Deploy a new fee splitter for a Clanker token
|
|
5
|
+
* Only needs to be called once per token
|
|
6
|
+
* Returns the deployed splitter address (either newly deployed or existing)
|
|
7
|
+
*/
|
|
8
|
+
export async function deployFeeSplitter(params) {
|
|
9
|
+
const { publicClient, walletClient, clankerToken } = params;
|
|
10
|
+
const chainId = walletClient.chain?.id;
|
|
11
|
+
if (!chainId)
|
|
12
|
+
throw new Error("Chain ID not found");
|
|
13
|
+
const deployerAddress = GET_FEE_SPLITTER_FACTORY_ADDRESS(chainId);
|
|
14
|
+
if (!deployerAddress)
|
|
15
|
+
throw new Error("Fee splitter factory not found for this chain");
|
|
16
|
+
// Check if already deployed
|
|
17
|
+
const existing = await publicClient.readContract({
|
|
18
|
+
address: deployerAddress,
|
|
19
|
+
abi: LevrFeeSplitterFactory_v1,
|
|
20
|
+
functionName: "getSplitter",
|
|
21
|
+
args: [clankerToken],
|
|
22
|
+
});
|
|
23
|
+
if (existing && existing !== "0x0000000000000000000000000000000000000000") {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
// Deploy new splitter
|
|
27
|
+
const hash = await walletClient.writeContract({
|
|
28
|
+
address: deployerAddress,
|
|
29
|
+
abi: LevrFeeSplitterFactory_v1,
|
|
30
|
+
functionName: "deploy",
|
|
31
|
+
args: [clankerToken],
|
|
32
|
+
chain: walletClient.chain,
|
|
33
|
+
account: walletClient.account,
|
|
34
|
+
});
|
|
35
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
36
|
+
if (receipt.status === "reverted") {
|
|
37
|
+
throw new Error("Fee splitter deployment failed");
|
|
38
|
+
}
|
|
39
|
+
// Get deployed address
|
|
40
|
+
const splitterAddress = await publicClient.readContract({
|
|
41
|
+
address: deployerAddress,
|
|
42
|
+
abi: LevrFeeSplitterFactory_v1,
|
|
43
|
+
functionName: "getSplitter",
|
|
44
|
+
args: [clankerToken],
|
|
45
|
+
});
|
|
46
|
+
return splitterAddress;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the fee splitter address for a token (if deployed)
|
|
50
|
+
* Returns undefined if not deployed yet
|
|
51
|
+
*/
|
|
52
|
+
export async function getFeeSplitter(params) {
|
|
53
|
+
const { publicClient, clankerToken, chainId } = params;
|
|
54
|
+
const deployerAddress = GET_FEE_SPLITTER_FACTORY_ADDRESS(chainId);
|
|
55
|
+
if (!deployerAddress)
|
|
56
|
+
return undefined;
|
|
57
|
+
const splitterAddress = await publicClient.readContract({
|
|
58
|
+
address: deployerAddress,
|
|
59
|
+
abi: LevrFeeSplitterFactory_v1,
|
|
60
|
+
functionName: "getSplitter",
|
|
61
|
+
args: [clankerToken],
|
|
62
|
+
});
|
|
63
|
+
if (!splitterAddress || splitterAddress === "0x0000000000000000000000000000000000000000") {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return splitterAddress;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=fee-splitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-splitter.js","sourceRoot":"","sources":["../../src/fee-splitter.ts"],"names":[],"mappings":"AAEA,OAAO,yBAAyB,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAA;AAc9D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA+B;IACrE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAA;IACtC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAEnD,MAAM,eAAe,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACjE,IAAI,CAAC,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAEtF,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;QAC/C,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,yBAAyB;QAC9B,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,YAAY,CAAC;KACrB,CAAC,CAAA;IAEF,IAAI,QAAQ,IAAI,QAAQ,KAAK,4CAA4C,EAAE,CAAC;QAC1E,OAAO,QAAmB,CAAA;IAC5B,CAAC;IAED,sBAAsB;IACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;QAC5C,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,yBAAyB;QAC9B,YAAY,EAAE,QAAQ;QACtB,IAAI,EAAE,CAAC,YAAY,CAAC;QACpB,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,OAAO,EAAE,YAAY,CAAC,OAAQ;KAC/B,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,uBAAuB;IACvB,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;QACtD,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,yBAAyB;QAC9B,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,YAAY,CAAC;KACrB,CAAC,CAAA;IAEF,OAAO,eAA0B,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA4B;IAC/D,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAEtD,MAAM,eAAe,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACjE,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAA;IAEtC,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;QACtD,OAAO,EAAE,eAAe;QACxB,GAAG,EAAE,yBAAyB;QAC9B,YAAY,EAAE,aAAa;QAC3B,IAAI,EAAE,CAAC,YAAY,CAAC;KACrB,CAAC,CAAA;IAEF,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,4CAA4C,EAAE,CAAC;QACzF,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,eAA0B,CAAA;AACnC,CAAC"}
|