@runonflux/aa-schnorr-multisig-sdk
Version:
Account Abstraction Schnorr Multi-Signatures SDK
94 lines (93 loc) • 3.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MULTISIG_ACCOUNT_SOURCE = void 0;
exports.createMultiSigSmartAccount = createMultiSigSmartAccount;
const aa_core_1 = require("@alchemy/aa-core");
const viem_1 = require("viem");
const ethers_1 = require("ethers");
const deployments_1 = require("../generated/deployments");
const abi_1 = require("../generated/abi");
const abi_2 = require("../abi");
exports.MULTISIG_ACCOUNT_SOURCE = "MultiSigSmartAccount";
async function createMultiSigSmartAccount({ transport, chain, entryPoint = (0, aa_core_1.getEntryPoint)(chain, { version: "0.6.0" }), accountAddress, combinedAddress = [], salt: _salt, }) {
const client = (0, aa_core_1.createBundlerClient)({
transport,
chain,
});
const salt = _salt ?? ethers_1.ethers.encodeBytes32String("salt");
const getAccountInitCode = async () => {
return (0, viem_1.concatHex)([
deployments_1.deployments[chain.id]?.MultiSigSmartAccountFactory,
(0, viem_1.encodeFunctionData)({
abi: abi_2.MultiSigSmartAccountFactory_abi,
functionName: "createAccount",
args: [combinedAddress, salt],
}),
]);
};
const address = await (0, aa_core_1.getAccountAddress)({
client,
entryPoint,
accountAddress,
getAccountInitCode,
});
const encodeUpgradeToAndCall = async ({ upgradeToAddress, upgradeToInitData }) => {
const storage = await client.getStorageAt({
address,
// the slot at which impl addresses are stored by UUPS
slot: "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc",
});
if (storage === null)
throw new aa_core_1.FailedToGetStorageSlotError("0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", "Proxy Implementation Address");
return (0, viem_1.encodeFunctionData)({
abi: abi_1.MultiSigSmartAccount_abi,
functionName: "upgradeToAndCall",
args: [upgradeToAddress, upgradeToInitData],
});
};
const account = await (0, aa_core_1.toSmartContractAccount)({
transport,
chain,
entryPoint,
accountAddress: address,
source: "MultiSigSmartAccount",
getAccountInitCode,
encodeExecute: async ({ target, data, value }) => {
return (0, viem_1.encodeFunctionData)({
abi: abi_1.MultiSigSmartAccount_abi,
functionName: "execute",
args: [target, value ?? 0n, data],
});
},
encodeBatchExecute: async (txs) => {
const [targets, values, datas] = txs.reduce((accum, curr) => {
accum[0].push(curr.target);
accum[1].push(curr.value ?? 0n);
accum[2].push(curr.data);
return accum;
}, [[], [], []]);
return (0, viem_1.encodeFunctionData)({
abi: abi_1.MultiSigSmartAccount_abi,
functionName: "executeBatch",
args: [targets, values, datas],
});
},
signUserOperationHash: async () => {
throw new Error("Use Schnorr Signer to get user operation hash signature");
},
async signMessage() {
throw new Error("Use Schnorr Signer to sign message");
},
async signTypedData() {
throw new Error("Use Schnorr Signer to sign message");
},
getDummySignature: () => {
return "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
},
encodeUpgradeToAndCall,
});
return {
...account,
source: "MultiSigSmartAccount",
};
}