@locker-labs/sdk
Version:
A utility library for enhancing your ERC-4337 experience
159 lines • 7.03 kB
JavaScript
import { createPublicClient, http } from "viem";
import { createLockerClient, } from "../accounts/impl.js";
import { splitPluginActions as baseSplitPluginActions } from "./gens/base/split/plugin.js";
import { splitPluginActions as sepoliaSplitPluginActions } from "./gens/sepolia/split/plugin.js";
import { splitPluginActions as baseSepoliaSplitPluginActions } from "./gens/baseSepolia/split/plugin.js";
import { isSplitPluginInstalled } from "./utils/helpers.js";
import { chainToSplitPluginAddress } from "./defs/split/config.js";
import { base, baseSepolia, sepolia } from "@account-kit/infra";
import { adaptLockerChain2AlchemyChain, waitForTransaction } from "../accounts/helpers.js";
import { SplitPluginAbi } from "./defs/split/abi.js";
/**
* Creates a Locker Split Client that the end user interacts with.
* It takes in all necessary parameters to build the extended client, then wraps it to expose only selected functions.
*
* @param params - The configuration parameters(ExtendedClientParams) for creating the client.
* @returns A promise that resolves to a LockerSplitClient.
*/
export async function createLockerSplitClient(params) {
const lockerClient = await createLockerClient(params);
const { chain: lockerChain, alchemyApiKey } = params;
const chain = adaptLockerChain2AlchemyChain(lockerChain);
const chainId = chain.id;
let splitPluginActions;
switch (chainId) {
case base.id:
splitPluginActions = baseSplitPluginActions;
break;
case baseSepolia.id:
splitPluginActions = baseSepoliaSplitPluginActions;
break;
case sepolia.id:
splitPluginActions = sepoliaSplitPluginActions;
break;
default:
throw new Error(`Unsupported chain: ${chain.id}`);
}
const splitLockerClient = await lockerClient.extend(splitPluginActions);
const alchemyRpcUrl = `${chain.rpcUrls.alchemy.http[0]}/${alchemyApiKey}`;
const client = createPublicClient({
chain,
transport: http(alchemyRpcUrl),
});
return {
...lockerClient,
async getConfigs() {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return [];
}
const globalIndexes = [];
// Get all the global indexes, Max possible 5.
// TODO: Replace with a query.
for (let i = 0; i < 5; i++) {
let globalIndex;
try {
globalIndex = await client.readContract({
address: chainToSplitPluginAddress[chain.id],
abi: SplitPluginAbi,
functionName: "splitConfigIndexes",
args: [await splitLockerClient.getAddress(), BigInt(i)],
});
globalIndexes.push(globalIndex);
}
catch {
break;
}
}
return globalIndexes;
},
async createSplit(tokenAddress, percentage, receiverAddresses) {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return null;
}
console.log("Creating Split Config...");
const res = await splitLockerClient.createSplit({
args: [tokenAddress, receiverAddresses, percentage],
});
console.log("Waiting for creation confirmation...");
await waitForTransaction(res.hash, alchemyRpcUrl);
console.log("Split config created:", res);
return res;
},
async installSplitPlugin(tokenAddress, percentages, splitAddresses) {
if (await isSplitPluginInstalled(splitLockerClient, chainId)) {
console.log("Split plugin already installed.");
return null;
}
console.log("Installing Split Plugin...");
const res = await splitLockerClient.installSplitPlugin({
args: [tokenAddress, splitAddresses, percentages],
});
console.log("Waiting for installation confirmation...");
await waitForTransaction(res.hash, alchemyRpcUrl);
console.log("Split plugin installed with:", res);
return res;
},
async isSplitPluginInstalled() {
return await isSplitPluginInstalled(splitLockerClient, chainId);
},
async uninstallSplitPlugin() {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return null;
}
console.log("Uninstalling Split Plugin...");
const res = await splitLockerClient.uninstallPlugin({
pluginAddress: chainToSplitPluginAddress[chain.id],
});
console.log("Waiting for uninstallation confirmation...");
await waitForTransaction(res.hash, alchemyRpcUrl);
return res;
},
async toggleIsSplitEnabled(configIndex) {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return null;
}
const res = await splitLockerClient.pauseAutomation({
args: [configIndex],
});
return res;
},
async split(configIndex) {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return null;
}
const res = await splitLockerClient.split({
args: [BigInt(configIndex)],
});
return res;
},
async deleteSplit(configIndex) {
if (!(await isSplitPluginInstalled(splitLockerClient, chainId))) {
console.log("Split plugin not installed.");
return null;
}
const isSplitCreator = await client.readContract({
address: chainToSplitPluginAddress[chain.id],
abi: SplitPluginAbi,
functionName: "isSplitCreator",
args: [configIndex, await splitLockerClient.getAddress()],
});
if (!isSplitCreator) {
console.log("You are not the creator of this split config:", Number(configIndex));
return null;
}
console.log("Deleting Split Config...");
const res = await splitLockerClient.deleteSplitConfig({
args: [configIndex],
});
console.log("Waiting for deletion confirmation...");
await waitForTransaction(res.hash, alchemyRpcUrl);
return res;
},
};
}
//# sourceMappingURL=index.js.map