@openfort/openfort-node 0.6.78 → 0.7.1

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/Makefile +75 -0
  3. package/README.md +174 -65
  4. package/biome.json +34 -4
  5. package/dist/index.d.mts +8860 -14863
  6. package/dist/index.d.ts +8860 -14863
  7. package/dist/index.js +4967 -24180
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +4666 -23904
  10. package/dist/index.mjs.map +1 -1
  11. package/examples/.env.example +16 -0
  12. package/examples/README.md +157 -0
  13. package/examples/contracts/createContract.ts +25 -0
  14. package/examples/contracts/listContracts.ts +18 -0
  15. package/examples/evm/accounts/createAccount.ts +18 -0
  16. package/examples/evm/accounts/exportAccount.ts +39 -0
  17. package/examples/evm/accounts/getAccount.ts +30 -0
  18. package/examples/evm/accounts/importAccount.ts +31 -0
  19. package/examples/evm/accounts/listAccounts.ts +32 -0
  20. package/examples/evm/embedded/pregenerate.ts +33 -0
  21. package/examples/evm/signing/signHash.ts +28 -0
  22. package/examples/evm/signing/signMessage.ts +32 -0
  23. package/examples/evm/signing/signTransaction.ts +42 -0
  24. package/examples/evm/signing/signTypedData.ts +71 -0
  25. package/examples/exchange/createSwap.ts +49 -0
  26. package/examples/exchange/quoteSwap.ts +34 -0
  27. package/examples/iam/deleteUser.ts +22 -0
  28. package/examples/iam/getSession.ts +30 -0
  29. package/examples/iam/getUser.ts +32 -0
  30. package/examples/iam/listUsers.ts +18 -0
  31. package/examples/package.json +31 -0
  32. package/examples/pnpm-lock.yaml +1231 -0
  33. package/examples/policies/createPolicy.ts +25 -0
  34. package/examples/policies/createPolicyRule.ts +43 -0
  35. package/examples/policies/disableEnablePolicy.ts +29 -0
  36. package/examples/policies/getPolicy.ts +30 -0
  37. package/examples/policies/listPolicies.ts +17 -0
  38. package/examples/policies/listPolicyRules.ts +37 -0
  39. package/examples/policies/updatePolicy.ts +29 -0
  40. package/examples/solana/accounts/createAccount.ts +18 -0
  41. package/examples/solana/accounts/exportAccount.ts +29 -0
  42. package/examples/solana/accounts/getAccount.ts +24 -0
  43. package/examples/solana/accounts/importAccount.ts +28 -0
  44. package/examples/solana/accounts/listAccounts.ts +32 -0
  45. package/examples/solana/signing/signMessage.ts +22 -0
  46. package/examples/solana/signing/signTransaction.ts +41 -0
  47. package/examples/transactions/createTransactionIntent.ts +54 -0
  48. package/examples/transactions/estimateGas.ts +62 -0
  49. package/examples/transactions/getTransactionIntent.ts +65 -0
  50. package/examples/transactions/listTransactionIntents.ts +31 -0
  51. package/examples/tsconfig.json +15 -0
  52. package/examples/webhook/index.ts +43 -0
  53. package/openapi-auth.json +6526 -0
  54. package/openapi.json +20425 -0
  55. package/orval.config.ts +41 -0
  56. package/package.json +22 -12
  57. package/pnpm-workspace.yaml +2 -0
  58. package/tsconfig.json +1 -1
  59. package/vitest.config.ts +20 -0
  60. package/updateGeneratedCode.sh +0 -8
@@ -0,0 +1,16 @@
1
+ # Openfort API Key (required)
2
+ OPENFORT_API_KEY=sk_test_...
3
+ OPENFORT_PUBLISHABLE_KEY=pk_test_...
4
+ # Optional: Custom API base URL
5
+ # OPENFORT_BASE_URL=https://api.openfort.io
6
+
7
+ # Optional: Wallet secret for backend wallet operations
8
+ # OPENFORT_WALLET_SECRET=your-wallet-secret
9
+
10
+ # Chain ID for EVM operations (e.g., 80002 for Amoy, 84532 for Base Sepolia)
11
+ CHAIN_ID=80002
12
+
13
+ # Shield Configuration (required for evm/embedded/pregenerate.ts)
14
+ SHIELD_API_KEY=your_shield_api_key
15
+ SHIELD_API_SECRET=your_shield_api_secret
16
+ SHIELD_ENCRYPTION_SHARE=your_encryption_share
@@ -0,0 +1,157 @@
1
+ # Openfort Node SDK Examples
2
+
3
+ This directory contains examples demonstrating how to use the Openfort Node SDK.
4
+
5
+ ## Setup
6
+
7
+ 1. Build the SDK and install dependencies:
8
+ ```bash
9
+ pnpm setup
10
+ ```
11
+
12
+ This will:
13
+ - Build the parent SDK package
14
+ - Install example dependencies (linked to local SDK)
15
+
16
+ 2. Copy the environment template and configure your API keys:
17
+ ```bash
18
+ cp .env.example .env
19
+ ```
20
+
21
+ 3. Edit `.env` with your Openfort API key:
22
+ ```bash
23
+ OPENFORT_API_KEY=sk_test_...
24
+ CHAIN_ID=80002 # Polygon Amoy testnet
25
+ ```
26
+
27
+ ## Running Examples
28
+
29
+ Run any example using `pnpm example`:
30
+
31
+ ```bash
32
+ pnpm example evm/accounts/createAccount.ts
33
+ ```
34
+
35
+ Or directly with tsx:
36
+
37
+ ```bash
38
+ npx tsx evm/accounts/createAccount.ts
39
+ ```
40
+
41
+ ## Development Workflow
42
+
43
+ When making changes to the SDK:
44
+
45
+ 1. Make your changes in the parent `src/` directory
46
+ 2. Rebuild the SDK:
47
+ ```bash
48
+ pnpm build:sdk
49
+ ```
50
+ 3. Run an example to test:
51
+ ```bash
52
+ pnpm example evm/accounts/createAccount.ts
53
+ ```
54
+
55
+ ## Examples Overview
56
+
57
+ ### EVM Wallet Examples
58
+
59
+ #### Accounts (`evm/accounts/`)
60
+ | Example | Description |
61
+ | ------------------ | ------------------------------------ |
62
+ | `createAccount.ts` | Create a new EVM account |
63
+ | `getAccount.ts` | Retrieve an account by ID or address |
64
+ | `listAccounts.ts` | List all EVM accounts |
65
+ | `importAccount.ts` | Import an account from private key |
66
+ | `exportAccount.ts` | Export an account's private key |
67
+
68
+ #### Signing (`evm/signing/`)
69
+ | Example | Description |
70
+ | -------------------- | ---------------------------------- |
71
+ | `signMessage.ts` | Sign a message with an EVM account |
72
+ | `signTypedData.ts` | Sign EIP-712 typed data |
73
+ | `signHash.ts` | Sign a raw hash |
74
+ | `signTransaction.ts` | Sign a transaction |
75
+
76
+ #### Embedded Wallets (`evm/embedded/`)
77
+ | Example | Description |
78
+ | ---------------- | ---------------------------------------- |
79
+ | `pregenerate.ts` | Pre-generate a user with embedded wallet |
80
+
81
+ > **Note:** The `pregenerate.ts` example requires Shield configuration. See `.env.example` for required environment variables:
82
+ > - `SHIELD_API_KEY`
83
+ > - `SHIELD_API_SECRET`
84
+ > - `SHIELD_ENCRYPTION_SHARE`
85
+
86
+ ### Solana Wallet Examples
87
+
88
+ #### Accounts (`solana/accounts/`)
89
+ | Example | Description |
90
+ | ------------------ | ------------------------------------ |
91
+ | `createAccount.ts` | Create a new Solana account |
92
+ | `getAccount.ts` | Retrieve an account by ID or address |
93
+ | `listAccounts.ts` | List all Solana accounts |
94
+ | `importAccount.ts` | Import an account from private key |
95
+ | `exportAccount.ts` | Export an account's private key |
96
+
97
+ #### Signing (`solana/signing/`)
98
+ | Example | Description |
99
+ | -------------------- | ------------------------------------ |
100
+ | `signMessage.ts` | Sign a message with a Solana account |
101
+ | `signTransaction.ts` | Sign a Solana transaction |
102
+
103
+
104
+ ### Policies
105
+
106
+ | Example | Description |
107
+ | --------------------------------- | ------------------------------- |
108
+ | `policies/createPolicy.ts` | Create a gas sponsorship policy |
109
+ | `policies/getPolicy.ts` | Get a policy by ID |
110
+ | `policies/listPolicies.ts` | List all policies |
111
+ | `policies/updatePolicy.ts` | Update a policy |
112
+ | `policies/disableEnablePolicy.ts` | Enable/disable a policy |
113
+ | `policies/createPolicyRule.ts` | Create a policy rule |
114
+ | `policies/listPolicyRules.ts` | List policy rules |
115
+
116
+ ### Contracts
117
+
118
+ | Example | Description |
119
+ | ----------------------------- | ------------------- |
120
+ | `contracts/createContract.ts` | Register a contract |
121
+ | `contracts/listContracts.ts` | List all contracts |
122
+
123
+ ### Transaction Intents
124
+
125
+ | Example | Description |
126
+ | ----------------------------------------- | ------------------------------ |
127
+ | `transactions/createTransactionIntent.ts` | Create a transaction intent |
128
+ | `transactions/getTransactionIntent.ts` | Get a transaction intent |
129
+ | `transactions/listTransactionIntents.ts` | List transaction intents |
130
+ | `transactions/estimateGas.ts` | Estimate gas for a transaction |
131
+
132
+ ### Exchange / Swaps
133
+
134
+ | Example | Description |
135
+ | ------------------------ | -------------------------- |
136
+ | `exchange/quoteSwap.ts` | Get a quote for token swap |
137
+ | `exchange/createSwap.ts` | Execute a token swap |
138
+
139
+ ### IAM (Identity & Access Management)
140
+
141
+ | Example | Description |
142
+ | ------------------- | ----------------------------- |
143
+ | `iam/listUsers.ts` | List all authenticated users |
144
+ | `iam/getUser.ts` | Get a user by ID |
145
+ | `iam/deleteUser.ts` | Delete a user |
146
+ | `iam/getSession.ts` | Verify auth token server-side |
147
+
148
+ ### Webhooks
149
+
150
+ | Example | Description |
151
+ | ------------------ | --------------------------------------------------- |
152
+ | `webhook/index.ts` | Express server to receive and verify webhook events |
153
+
154
+ ## Additional Resources
155
+
156
+ - [Openfort Documentation](https://www.openfort.io/docs)
157
+ - [Dashboard](https://dashboard.openfort.io)
@@ -0,0 +1,25 @@
1
+ // Usage: npx tsx contracts/createContract.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ });
9
+
10
+ const chainId = Number(process.env.CHAIN_ID) || 80002;
11
+
12
+ // Create a contract reference
13
+ const contract = await openfort.contracts.create({
14
+ name: "My Token Contract",
15
+ chainId,
16
+ address: "0xbabe0001489722187FbaF0689C47B2f5E97545C5",
17
+ // Optional: provide ABI for function name validation
18
+ // abi: [...]
19
+ });
20
+
21
+ console.log("Created contract:");
22
+ console.log(" ID:", contract.id);
23
+ console.log(" Name:", contract.name);
24
+ console.log(" Address:", contract.address);
25
+ console.log(" Chain ID:", contract.chainId);
@@ -0,0 +1,18 @@
1
+ // Usage: npx tsx contracts/listContracts.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ });
9
+
10
+ // List all contracts
11
+ const result = await openfort.contracts.list({ limit: 10 });
12
+
13
+ console.log(`Found ${result.total} contracts:`);
14
+ for (const contract of result.data) {
15
+ console.log(` - ${contract.name} (${contract.id})`);
16
+ console.log(` Address: ${contract.address}`);
17
+ console.log(` Chain: ${contract.chainId}`);
18
+ }
@@ -0,0 +1,18 @@
1
+ // Usage: npx tsx evm/accounts/createAccount.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
9
+ });
10
+
11
+ // Create an EVM backend account
12
+ const account = await openfort.accounts.evm.backend.create({
13
+ name: `MyWallet-${Date.now()}`,
14
+ });
15
+
16
+ console.log("Created EVM account:");
17
+ console.log(" ID:", account.id);
18
+ console.log(" Address:", account.address);
@@ -0,0 +1,39 @@
1
+ // Usage: npx tsx evm/accounts/exportAccount.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // First import an account so we can export it
13
+ const originalPrivateKey = generatePrivateKey();
14
+ const originalAccount = privateKeyToAccount(originalPrivateKey);
15
+
16
+ console.log("Original private key:", originalPrivateKey);
17
+ console.log("Original address:", originalAccount.address);
18
+
19
+ const account = await openfort.accounts.evm.backend.import({
20
+ privateKey: originalPrivateKey,
21
+ name: "ExportTestWallet",
22
+ });
23
+
24
+ console.log("\nImported account ID:", account.id);
25
+
26
+ // Export the account's private key
27
+ const exportedPrivateKey = await openfort.accounts.evm.backend.export({
28
+ id: account.id,
29
+ });
30
+
31
+ console.log("\nExported private key:", `0x${exportedPrivateKey}`);
32
+
33
+ // Verify the exported key matches
34
+ const derivedAccount = privateKeyToAccount(`0x${exportedPrivateKey}`);
35
+ console.log("Derived address:", derivedAccount.address);
36
+ console.log(
37
+ "Keys match:",
38
+ originalPrivateKey.toLowerCase() === `0x${exportedPrivateKey}`.toLowerCase()
39
+ );
@@ -0,0 +1,30 @@
1
+ // Usage: npx tsx evm/accounts/getAccount.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
9
+ });
10
+
11
+ // Create a player and account first
12
+ const player = await openfort.players.create({
13
+ name: `Player-${Date.now()}`,
14
+ });
15
+ console.log("Created player:", player.id);
16
+
17
+ const account = await openfort.accounts.evm.backend.create({
18
+ name: `MyWallet-${Date.now()}`,
19
+ });
20
+ console.log("Created account:", account.address);
21
+
22
+ // Retrieve account by ID
23
+ const accountById = await openfort.accounts.evm.backend.get({ id: account.id });
24
+ console.log("Retrieved account by ID:", accountById.address);
25
+
26
+ // Retrieve account by address
27
+ const accountByAddress = await openfort.accounts.evm.backend.get({
28
+ address: account.address,
29
+ });
30
+ console.log("Retrieved account by address:", accountByAddress.address);
@@ -0,0 +1,31 @@
1
+ // Usage: npx tsx evm/accounts/importAccount.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // Generate a random private key for demonstration
13
+ const privateKey = generatePrivateKey();
14
+ const localAccount = privateKeyToAccount(privateKey);
15
+
16
+ console.log("Generated private key:", privateKey);
17
+ console.log("Expected address:", localAccount.address);
18
+
19
+ // Import the account to Openfort
20
+ const account = await openfort.accounts.evm.backend.import({
21
+ privateKey,
22
+ name: "ImportedWallet",
23
+ });
24
+
25
+ console.log("\nImported account:");
26
+ console.log(" ID:", account.id);
27
+ console.log(" Address:", account.address);
28
+ console.log(
29
+ " Addresses match:",
30
+ account.address.toLowerCase() === localAccount.address.toLowerCase()
31
+ );
@@ -0,0 +1,32 @@
1
+ // Usage: npx tsx evm/accounts/listAccounts.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
9
+ });
10
+
11
+ // List all EVM backend accounts
12
+ const result = await openfort.accounts.evm.backend.list({ limit: 10 });
13
+
14
+ console.log(`Found ${result.total} EVM accounts:`);
15
+ for (const account of result.accounts) {
16
+ console.log(` - ${account.address} (${account.id})`);
17
+ }
18
+
19
+ // Create a few more accounts
20
+ await openfort.accounts.evm.backend.create({ name: `Wallet-${Date.now()}-1` });
21
+ await openfort.accounts.evm.backend.create({ name: `Wallet-${Date.now()}-2` });
22
+
23
+ // List accounts with pagination
24
+ const moreAccounts = await openfort.accounts.evm.backend.list({
25
+ limit: 5,
26
+ skip: 0,
27
+ });
28
+
29
+ console.log(`\nPaginated results (first 5):`);
30
+ for (const account of moreAccounts.accounts) {
31
+ console.log(` - ${account.address}`);
32
+ }
@@ -0,0 +1,33 @@
1
+ // Usage: npx tsx evm/embedded/pregenerate.ts
2
+
3
+ import Openfort, { ShieldAuthProvider } from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ });
9
+
10
+ // Pre-generate a user with an embedded wallet
11
+ // This creates the user and wallet before they authenticate
12
+ const result = await openfort.accounts.evm.embedded.pregenerate(
13
+ {
14
+ email: "jaume+1@openfort.xyz",
15
+ accountType: "Externally Owned Account"
16
+ },
17
+ {
18
+ shieldApiKey: process.env.SHIELD_API_KEY!,
19
+ shieldApiSecret: process.env.SHIELD_API_SECRET!,
20
+ shieldAuthProvider: ShieldAuthProvider.OPENFORT,
21
+ encryptionShare: process.env.SHIELD_ENCRYPTION_SHARE!,
22
+ }
23
+ );
24
+
25
+ console.log("Pre-generated user with embedded wallet:");
26
+ console.log(" Account ID:", result.id);
27
+ console.log(" User ID:", result.user);
28
+ console.log(" Address:", result.address);
29
+ console.log(" Owner Address:", result.ownerAddress);
30
+ console.log(" Account Type:", result.accountType);
31
+ console.log(" Chain ID:", result.chainId);
32
+ console.log(" Chain Type:", result.chainType);
33
+ console.log(" Created:", new Date(result.createdAt * 1000).toISOString());
@@ -0,0 +1,28 @@
1
+ // Usage: npx tsx evm/signing/signHash.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { keccak256, toBytes } from "viem";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // Create a backend account
13
+ const account = await openfort.accounts.evm.backend.create({
14
+ name: `Wallet-${Date.now()}`,
15
+ });
16
+ console.log("Created account:", account.address);
17
+
18
+ // Create a hash to sign
19
+ const message = "Hello, Openfort!";
20
+ const hash = keccak256(toBytes(message));
21
+
22
+ console.log("\nOriginal message:", message);
23
+ console.log("Hash:", hash);
24
+
25
+ // Sign the hash directly
26
+ const signature = await account.sign({ hash });
27
+
28
+ console.log("Signature:", signature);
@@ -0,0 +1,32 @@
1
+ // Usage: npx tsx evm/signing/signMessage.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { verifyMessage } from "viem";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // Create a backend account
13
+ const account = await openfort.accounts.evm.backend.create({
14
+ name: `Wallet-${Date.now()}`,
15
+ });
16
+ console.log("Created account:", account.address);
17
+
18
+ // Sign a message
19
+ const message = "Hello, Openfort!";
20
+ const signature = await account.signMessage({ message });
21
+
22
+ console.log("\nMessage:", message);
23
+ console.log("Signature:", signature);
24
+
25
+ // Verify the signature using viem
26
+ const isValid = await verifyMessage({
27
+ address: account.address,
28
+ message,
29
+ signature,
30
+ });
31
+
32
+ console.log("Signature valid:", isValid);
@@ -0,0 +1,42 @@
1
+ // Usage: npx tsx evm/signing/signTransaction.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { parseEther, parseTransaction } from "viem";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // Create a backend account
13
+ const account = await openfort.accounts.evm.backend.create({
14
+ name: `Wallet-${Date.now()}`,
15
+ });
16
+ console.log("Created account:", account.address);
17
+
18
+ // Define a transaction to sign
19
+ const transaction = {
20
+ to: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" as const,
21
+ value: parseEther("0.001"),
22
+ nonce: 0,
23
+ gas: 21000n,
24
+ maxFeePerGas: 20000000000n,
25
+ maxPriorityFeePerGas: 1000000000n,
26
+ chainId: Number(process.env.CHAIN_ID) || 80002,
27
+ };
28
+
29
+ console.log("\nTransaction to sign:");
30
+ console.log(" To:", transaction.to);
31
+ console.log(" Value:", transaction.value.toString(), "wei");
32
+ console.log(" Chain ID:", transaction.chainId);
33
+
34
+ // Sign the transaction
35
+ const signedTransaction = await account.signTransaction(transaction);
36
+
37
+ console.log("\nSigned transaction:", signedTransaction);
38
+
39
+ // Parse and display the signed transaction
40
+ const parsed = parseTransaction(signedTransaction);
41
+ console.log("\nParsed signed transaction:");
42
+ console.log(" To:", parsed.to);
@@ -0,0 +1,71 @@
1
+ // Usage: npx tsx evm/signing/signTypedData.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+ import { verifyTypedData } from "viem";
6
+
7
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
8
+ basePath: process.env.OPENFORT_BASE_URL,
9
+ walletSecret: process.env.OPENFORT_WALLET_SECRET,
10
+ });
11
+
12
+ // Create a backend account
13
+ const account = await openfort.accounts.evm.backend.create({
14
+ name: `Wallet-${Date.now()}`,
15
+ });
16
+ console.log("Created account:", account.address);
17
+
18
+ // Define EIP-712 typed data
19
+ const domain = {
20
+ name: "Example App",
21
+ version: "1",
22
+ chainId: 1,
23
+ verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" as const,
24
+ };
25
+
26
+ const types = {
27
+ Person: [
28
+ { name: "name", type: "string" },
29
+ { name: "wallet", type: "address" },
30
+ ],
31
+ Mail: [
32
+ { name: "from", type: "Person" },
33
+ { name: "to", type: "Person" },
34
+ { name: "contents", type: "string" },
35
+ ],
36
+ } as const;
37
+
38
+ const message = {
39
+ from: {
40
+ name: "Alice",
41
+ wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" as const,
42
+ },
43
+ to: {
44
+ name: "Bob",
45
+ wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" as const,
46
+ },
47
+ contents: "Hello, Bob!",
48
+ };
49
+
50
+ // Sign the typed data
51
+ const signature = await account.signTypedData({
52
+ domain,
53
+ types,
54
+ primaryType: "Mail",
55
+ message,
56
+ });
57
+
58
+ console.log("\nTyped data signed successfully!");
59
+ console.log("Signature:", signature);
60
+
61
+ // Verify the signature
62
+ const isValid = await verifyTypedData({
63
+ address: account.address,
64
+ domain,
65
+ types,
66
+ primaryType: "Mail",
67
+ message,
68
+ signature,
69
+ });
70
+
71
+ console.log("Signature valid:", isValid);
@@ -0,0 +1,49 @@
1
+ // Usage: npx tsx exchange/createSwap.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ });
9
+
10
+ const chainId = Number(process.env.CHAIN_ID) || 80002;
11
+
12
+ // Create an account (V1 legacy API)
13
+ const account = await openfort.accounts.v1.create({
14
+ chainId,
15
+ });
16
+
17
+ // Create a policy for the swap
18
+ const policy = await openfort.policies.create({
19
+ name: `SwapPolicy-${Date.now()}`,
20
+ chainId,
21
+ strategy: {
22
+ sponsorSchema: "pay_for_user",
23
+ },
24
+ });
25
+
26
+ await openfort.policyRules.create({
27
+ type: "account_functions",
28
+ policy: policy.id,
29
+ });
30
+
31
+ console.log("Account address:", account.address);
32
+ console.log("Policy ID:", policy.id);
33
+
34
+ // Create a swap transaction
35
+ // Note: Token addresses and amounts will vary by network
36
+ // The account must have sufficient balance for the swap
37
+ const swap = await openfort.exchange.createSwap({
38
+ fromAddress: account.id,
39
+ chainId,
40
+ tokenInAddress: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // Native token
41
+ tokenOutAddress: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", // USDC
42
+ amount: "1000000000000000", // 0.001 native token
43
+ tradeType: "EXACT_INPUT",
44
+ policy: policy.id,
45
+ });
46
+
47
+ console.log("\nSwap created:");
48
+ console.log(" Transaction Intent ID:", swap.id);
49
+ console.log(" Status:", swap.response?.status || "pending");
@@ -0,0 +1,34 @@
1
+ // Usage: npx tsx exchange/quoteSwap.ts
2
+
3
+ import Openfort from "@openfort/openfort-node";
4
+ import "dotenv/config";
5
+
6
+ const openfort = new Openfort(process.env.OPENFORT_API_KEY!, {
7
+ basePath: process.env.OPENFORT_BASE_URL,
8
+ });
9
+
10
+ const chainId = Number(process.env.CHAIN_ID) || 80002;
11
+
12
+ // Create an account (V1 legacy API)
13
+ const account = await openfort.accounts.v1.create({
14
+ chainId,
15
+ });
16
+
17
+ console.log("Account address:", account.address);
18
+
19
+ // Get a quote for swapping tokens
20
+ // Note: Token addresses and amounts will vary by network
21
+ const quote = await openfort.exchange.quoteSwap({
22
+ fromAddress: account.id,
23
+ chainId,
24
+ tokenInAddress: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // Native token (ETH/MATIC)
25
+ tokenOutAddress: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", // USDC on Polygon
26
+ amount: "1000000000000000", // 0.001 native token
27
+ tradeType: "EXACT_INPUT",
28
+ });
29
+
30
+ console.log("\nSwap quote:");
31
+ console.log(" Amount:", quote.amount);
32
+ console.log(" Slippage:", quote.slippage);
33
+ console.log(" Estimated Gas Fee:", quote.estimatedTXGasFee);
34
+ console.log(" Estimated Gas Fee (USD):", quote.estimatedTXGasFeeUSD);