import { Request } from "express";
import dotenv from "dotenv";
import { DEFAULT_ETHEREUM_ACCOUNTS, Turnkey } from "@turnkey/sdk-server";
import { CreateSubOrgParams, CreateSubOrgResponse } from "./types.js";
dotenv.config();
export const turnkeyConfig = {
apiBaseUrl: process.env.TURNKEY_API_URL ?? "",
defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID ?? "",
apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY ?? "",
apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY ?? "",
};
const turnkey = new Turnkey(turnkeyConfig).apiClient();
export async function createSubOrg(
req: Request<{}, {}, CreateSubOrgParams>
): Promise<CreateSubOrgResponse> {
const { email, phone, passkey, oauth, apiKeys } = req.body;
const authenticators = passkey
? [
{
authenticatorName: "Passkey",
challenge: passkey.challenge,
attestation: passkey.attestation,
},
]
: [];
const oauthProviders = oauth
? [
{
providerName: oauth.providerName,
oidcToken: oauth.oidcToken,
},
]
: [];
let userEmail = email;
const userPhoneNumber = phone;
const subOrganizationName = `Sub Org - ${new Date().toISOString()}`;
const result = await turnkey.createSubOrganization({
organizationId: turnkeyConfig.defaultOrganizationId,
subOrganizationName,
rootUsers: [
{
userName: "User",
userEmail,
userPhoneNumber,
authenticators,
oauthProviders: oauthProviders,
apiKeys: apiKeys ?? [],
},
],
rootQuorumThreshold: 1,
wallet: {
walletName: "Default Wallet",
accounts: DEFAULT_ETHEREUM_ACCOUNTS,
},
});
return { subOrganizationId: result.subOrganizationId };
}