-
Notifications
You must be signed in to change notification settings - Fork 9
/
createSubOrg.ts
117 lines (103 loc) · 2.91 KB
/
createSubOrg.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import type { NextApiRequest, NextApiResponse } from "next";
import {
TurnkeyApiTypes,
TurnkeyClient,
createActivityPoller,
} from "@turnkey/http";
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
type TAttestation = TurnkeyApiTypes["v1Attestation"];
type CreateSubOrgRequest = {
subOrgName: string;
challenge: string;
attestation: TAttestation;
};
type CreateSubOrgResponse = {
subOrgId: string;
privateKeyId: string;
privateKeyAddress: string;
};
type ErrorMessage = {
message: string;
};
export default async function createUser(
req: NextApiRequest,
res: NextApiResponse<CreateSubOrgResponse | ErrorMessage>
) {
const createSubOrgRequest = req.body as CreateSubOrgRequest;
const turnkeyClient = new TurnkeyClient(
{ baseUrl: process.env.NEXT_PUBLIC_BASE_URL! },
new ApiKeyStamper({
apiPublicKey: process.env.API_PUBLIC_KEY!,
apiPrivateKey: process.env.API_PRIVATE_KEY!,
})
);
const activityPoller = createActivityPoller({
client: turnkeyClient,
requestFn: turnkeyClient.createSubOrganization,
});
try {
const walletName = `Default Wallet`;
const completedActivity = await activityPoller({
type: "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4",
timestampMs: String(Date.now()),
organizationId: process.env.NEXT_PUBLIC_ORGANIZATION_ID!,
parameters: {
subOrganizationName: createSubOrgRequest.subOrgName,
rootQuorumThreshold: 1,
rootUsers: [
{
userName: "New user",
apiKeys: [],
authenticators: [
{
authenticatorName: "Passkey",
challenge: createSubOrgRequest.challenge,
attestation: createSubOrgRequest.attestation,
},
],
},
],
wallet: {
walletName,
accounts: [
{
curve: "CURVE_SECP256K1",
pathFormat: "PATH_FORMAT_BIP32",
path: "m/44'/60'/0'/0/0",
addressFormat: "ADDRESS_FORMAT_ETHEREUM",
},
],
},
},
});
const subOrgId = refineNonNull(
completedActivity.result.createSubOrganizationResultV3?.subOrganizationId
);
const privateKeys = refineNonNull(
completedActivity.result.createSubOrganizationResultV3?.privateKeys
);
const privateKeyId = refineNonNull(privateKeys?.[0]?.privateKeyId);
const privateKeyAddress = refineNonNull(
privateKeys?.[0]?.addresses?.[0]?.address
);
res.status(200).json({
subOrgId,
privateKeyId,
privateKeyAddress,
});
} catch (e) {
console.error(e);
res.status(500).json({
message: "Something went wrong.",
});
}
}
function refineNonNull<T>(
input: T | null | undefined,
errorMessage?: string
): T {
if (input == null) {
throw new Error(errorMessage ?? `Unexpected ${JSON.stringify(input)}`);
}
return input;
}