@sei-js/create-sei 1.0.0 → 2.0.0
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.
- package/LICENSE +21 -0
- package/README.md +5 -4
- package/dist/extensions/precompiles/src/components/default/index.tsx +44 -51
- package/dist/main.js +112 -34
- package/dist/templates/next-template/.env.example +2 -2
- package/dist/templates/next-template/.eslintrc.json +1 -3
- package/dist/templates/next-template/README.md +56 -32
- package/dist/templates/next-template/biome.json +17 -10
- package/dist/templates/next-template/gitignore +41 -0
- package/dist/templates/next-template/next.config.mjs +17 -1
- package/dist/templates/next-template/package.json +37 -26
- package/dist/templates/next-template/public/brand/powered-by-sei-light.png +0 -0
- package/dist/templates/next-template/public/brand/sei-lockup-light.svg +7 -0
- package/dist/templates/next-template/public/brand/sei-mark.png +0 -0
- package/dist/templates/next-template/src/app/development/page.tsx +29 -30
- package/dist/templates/next-template/src/app/favicon.ico/route.ts +3 -0
- package/dist/templates/next-template/src/app/globals.css +49 -10
- package/dist/templates/next-template/src/app/layout.tsx +14 -13
- package/dist/templates/next-template/src/app/page.tsx +3 -3
- package/dist/templates/next-template/src/app/resources/page.tsx +34 -51
- package/dist/templates/next-template/src/app/resources/resources.ts +19 -32
- package/dist/templates/next-template/src/components/default/examples.ts +4 -7
- package/dist/templates/next-template/src/components/default/index.tsx +46 -46
- package/dist/templates/next-template/src/components/index.ts +3 -3
- package/dist/templates/next-template/src/components/landing/index.tsx +19 -49
- package/dist/templates/next-template/src/components/providers/index.ts +1 -1
- package/dist/templates/next-template/src/components/providers/providers.tsx +39 -26
- package/dist/templates/next-template/src/components/shell/index.ts +1 -1
- package/dist/templates/next-template/src/components/shell/shell.tsx +34 -26
- package/dist/templates/next-template/src/theme.ts +1 -0
- package/dist/templates/next-template/tailwind.config.js +4 -16
- package/package.json +25 -9
- package/.rsyncignore +0 -13
- package/CHANGELOG.md +0 -114
- package/biome.json +0 -8
- package/dist/extensions/precompiles/package.json +0 -44
- package/dist/main.test.js +0 -34
- package/dist/templates/next-template/public/favicon.ico +0 -0
- package/extensions/precompiles/package.json +0 -44
- package/extensions/precompiles/src/components/default/index.tsx +0 -201
- package/jest.config.js +0 -14
- package/src/main.test.ts +0 -38
- package/src/main.ts +0 -159
- package/templates/next-template/.env.example +0 -8
- package/templates/next-template/.eslintrc.json +0 -3
- package/templates/next-template/.nvmrc +0 -1
- package/templates/next-template/README.md +0 -58
- package/templates/next-template/biome.json +0 -48
- package/templates/next-template/next-env.d.ts +0 -5
- package/templates/next-template/next.config.mjs +0 -4
- package/templates/next-template/package.json +0 -44
- package/templates/next-template/postcss.config.mjs +0 -6
- package/templates/next-template/public/favicon.ico +0 -0
- package/templates/next-template/src/app/development/page.tsx +0 -260
- package/templates/next-template/src/app/globals.css +0 -14
- package/templates/next-template/src/app/layout.tsx +0 -30
- package/templates/next-template/src/app/page.tsx +0 -10
- package/templates/next-template/src/app/resources/page.tsx +0 -175
- package/templates/next-template/src/app/resources/resources.ts +0 -56
- package/templates/next-template/src/components/default/examples.ts +0 -63
- package/templates/next-template/src/components/default/index.tsx +0 -402
- package/templates/next-template/src/components/index.ts +0 -3
- package/templates/next-template/src/components/landing/index.tsx +0 -107
- package/templates/next-template/src/components/providers/index.ts +0 -1
- package/templates/next-template/src/components/providers/providers.tsx +0 -89
- package/templates/next-template/src/components/shell/index.ts +0 -1
- package/templates/next-template/src/components/shell/shell.tsx +0 -87
- package/templates/next-template/tailwind.config.js +0 -17
- package/templates/next-template/tsconfig.json +0 -27
- package/tsconfig.json +0 -19
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { CodeHighlight } from '@mantine/code-highlight';
|
|
5
|
-
import { ActionIcon, Badge, Button, Card, Collapse, Container, Flex, Group, Paper, Stack, Text, ThemeIcon, Title } from '@mantine/core';
|
|
6
|
-
import { notifications } from '@mantine/notifications';
|
|
7
|
-
import { BANK_PRECOMPILE_ADDRESS, VIEM_BANK_PRECOMPILE_ABI } from '@sei-js/precompiles';
|
|
8
|
-
import { IconBulb, IconChevronDown, IconChevronUp, IconCopy, IconDatabase } from '@tabler/icons-react';
|
|
9
|
-
import { useState } from 'react';
|
|
10
|
-
import { type ReadContractParameters, formatEther } from 'viem';
|
|
11
|
-
import { useAccount, usePublicClient } from 'wagmi';
|
|
12
|
-
|
|
13
|
-
function Examples() {
|
|
14
|
-
const [supply, setSupply] = useState('');
|
|
15
|
-
const [showCode, setShowCode] = useState(false);
|
|
16
|
-
|
|
17
|
-
const publicClient = usePublicClient();
|
|
18
|
-
const { address } = useAccount();
|
|
19
|
-
|
|
20
|
-
const formatLargeSeiNumber = (num: string, decimals: number): string => {
|
|
21
|
-
if (num.length > 10) {
|
|
22
|
-
return `${(Number(num) / 1000000 / 1000000000).toLocaleString(navigator.language, {
|
|
23
|
-
minimumFractionDigits: decimals,
|
|
24
|
-
maximumFractionDigits: decimals
|
|
25
|
-
})} B`;
|
|
26
|
-
}
|
|
27
|
-
return (Number(num) / 1000000).toLocaleString(navigator.language);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const copyToClipboard = (text: string) => {
|
|
31
|
-
try {
|
|
32
|
-
navigator.clipboard.writeText(text).then(() => {
|
|
33
|
-
notifications.show({
|
|
34
|
-
title: 'Copied!',
|
|
35
|
-
message: 'Code copied to clipboard',
|
|
36
|
-
color: 'green'
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
} catch (err) {
|
|
40
|
-
console.error('Failed to copy text: ', err);
|
|
41
|
-
notifications.show({
|
|
42
|
-
title: 'Error',
|
|
43
|
-
message: 'Failed to copy to clipboard',
|
|
44
|
-
color: 'red'
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const getSeiSupply = async () => {
|
|
50
|
-
if (!publicClient) {
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const readContractParams: ReadContractParameters = {
|
|
55
|
-
abi: VIEM_BANK_PRECOMPILE_ABI,
|
|
56
|
-
address: BANK_PRECOMPILE_ADDRESS,
|
|
57
|
-
functionName: 'supply',
|
|
58
|
-
args: ['usei']
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
try {
|
|
62
|
-
const result = await publicClient.readContract(readContractParams);
|
|
63
|
-
setSupply((result as bigint).toString());
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('Error fetching supply:', error);
|
|
66
|
-
notifications.show({
|
|
67
|
-
title: 'Error',
|
|
68
|
-
message: 'Failed to fetch SEI supply',
|
|
69
|
-
color: 'red'
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const codeExample = `// Sei Precompile Example - Bank Precompile
|
|
75
|
-
import { BANK_PRECOMPILE_ADDRESS, VIEM_BANK_PRECOMPILE_ABI } from '@sei-js/precompiles';
|
|
76
|
-
import { usePublicClient } from 'wagmi';
|
|
77
|
-
|
|
78
|
-
const publicClient = usePublicClient();
|
|
79
|
-
|
|
80
|
-
const getSeiSupply = async () => {
|
|
81
|
-
const readContractParams = {
|
|
82
|
-
abi: VIEM_BANK_PRECOMPILE_ABI,
|
|
83
|
-
address: BANK_PRECOMPILE_ADDRESS,
|
|
84
|
-
functionName: 'supply',
|
|
85
|
-
args: ['usei'],
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const result = await publicClient?.readContract(readContractParams);
|
|
89
|
-
return (result as bigint).toString();
|
|
90
|
-
};`;
|
|
91
|
-
|
|
92
|
-
return (
|
|
93
|
-
<Container size="xl" py="xl" pos="relative">
|
|
94
|
-
<Stack gap="xl">
|
|
95
|
-
{/* Header */}
|
|
96
|
-
<div>
|
|
97
|
-
<Group gap="md" align="center" mb="lg">
|
|
98
|
-
<ThemeIcon size={48} radius="md" c="orange" variant="light">
|
|
99
|
-
<IconBulb size={24} />
|
|
100
|
-
</ThemeIcon>
|
|
101
|
-
<div>
|
|
102
|
-
<Title order={1} fw={700} c="gray.9">
|
|
103
|
-
Sei Precompiles
|
|
104
|
-
</Title>
|
|
105
|
-
<Text size="lg" c="gray.6" mt={4}>
|
|
106
|
-
Access native Sei blockchain functionality through EVM precompiles
|
|
107
|
-
</Text>
|
|
108
|
-
</div>
|
|
109
|
-
</Group>
|
|
110
|
-
</div>
|
|
111
|
-
|
|
112
|
-
{/* Precompile Example Card */}
|
|
113
|
-
<Card shadow="xs" p="lg" radius="md" withBorder>
|
|
114
|
-
<Stack gap="md">
|
|
115
|
-
<Flex justify="space-between" align="flex-start">
|
|
116
|
-
<Stack gap="xs">
|
|
117
|
-
<Group gap="md">
|
|
118
|
-
<ThemeIcon size={40} radius="md" color="orange" variant="light">
|
|
119
|
-
<IconDatabase size={20} />
|
|
120
|
-
</ThemeIcon>
|
|
121
|
-
<Title order={3} fw={600} c="gray.9">
|
|
122
|
-
Bank Precompile
|
|
123
|
-
</Title>
|
|
124
|
-
</Group>
|
|
125
|
-
<Text size="sm" c="gray.6">
|
|
126
|
-
Query total SEI supply using Sei's native{' '}
|
|
127
|
-
<Text component="a" href="https://www.docs.sei.io/dev-interoperability/precompiles/bank" target="_blank" c="orange" td="underline">
|
|
128
|
-
Bank precompile
|
|
129
|
-
</Text>
|
|
130
|
-
</Text>
|
|
131
|
-
</Stack>
|
|
132
|
-
<Badge color="orange" variant="light" size="md" radius="md">
|
|
133
|
-
precompiles
|
|
134
|
-
</Badge>
|
|
135
|
-
</Flex>
|
|
136
|
-
|
|
137
|
-
<Paper p="md" radius="md" withBorder bg="gray.0">
|
|
138
|
-
<Text size="xs" fw={500} c="gray.6">
|
|
139
|
-
Total Supply
|
|
140
|
-
</Text>
|
|
141
|
-
<Flex justify="space-between" align="center">
|
|
142
|
-
<Flex align="baseline" gap="xs">
|
|
143
|
-
{supply ? (
|
|
144
|
-
<>
|
|
145
|
-
<Text fw={700} size="xl" c="gray.9" ff="monospace">
|
|
146
|
-
{formatLargeSeiNumber(supply, 2)}
|
|
147
|
-
</Text>
|
|
148
|
-
<Text size="sm" c="gray.6" fw={500}>
|
|
149
|
-
SEI
|
|
150
|
-
</Text>
|
|
151
|
-
</>
|
|
152
|
-
) : (
|
|
153
|
-
<Paper px="sm" py={4} bg="white" radius="md" withBorder>
|
|
154
|
-
<Flex align="baseline" gap="xs">
|
|
155
|
-
<Text fw={700} size="xl" c="gray.5" ff="monospace">
|
|
156
|
-
—
|
|
157
|
-
</Text>
|
|
158
|
-
<Text size="sm" c="gray.6" fw={500}>
|
|
159
|
-
SEI
|
|
160
|
-
</Text>
|
|
161
|
-
</Flex>
|
|
162
|
-
</Paper>
|
|
163
|
-
)}
|
|
164
|
-
</Flex>
|
|
165
|
-
<Button onClick={getSeiSupply} size="sm" radius="md" variant="light" color="orange" leftSection={<IconDatabase size={14} />}>
|
|
166
|
-
{supply ? 'Refresh' : 'Query Supply'}
|
|
167
|
-
</Button>
|
|
168
|
-
</Flex>
|
|
169
|
-
</Paper>
|
|
170
|
-
|
|
171
|
-
<Group justify="space-between" align="center" mt="sm">
|
|
172
|
-
<Button
|
|
173
|
-
variant="subtle"
|
|
174
|
-
color="gray"
|
|
175
|
-
size="sm"
|
|
176
|
-
radius="md"
|
|
177
|
-
leftSection={showCode ? <IconChevronUp size={14} /> : <IconChevronDown size={14} />}
|
|
178
|
-
onClick={() => setShowCode(!showCode)}
|
|
179
|
-
>
|
|
180
|
-
{showCode ? 'Hide' : 'View'} Implementation
|
|
181
|
-
</Button>
|
|
182
|
-
{showCode && (
|
|
183
|
-
<ActionIcon variant="subtle" color="gray" size="sm" radius="md" onClick={() => copyToClipboard(codeExample)}>
|
|
184
|
-
<IconCopy size={14} />
|
|
185
|
-
</ActionIcon>
|
|
186
|
-
)}
|
|
187
|
-
</Group>
|
|
188
|
-
|
|
189
|
-
<Collapse in={showCode}>
|
|
190
|
-
<Paper mt="sm" p="md" bg="gray.0" radius="md" withBorder>
|
|
191
|
-
<CodeHighlight code={codeExample} language="tsx" withCopyButton={false} expandCodeLabel="" collapseCodeLabel="" />
|
|
192
|
-
</Paper>
|
|
193
|
-
</Collapse>
|
|
194
|
-
</Stack>
|
|
195
|
-
</Card>
|
|
196
|
-
</Stack>
|
|
197
|
-
</Container>
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export default Examples;
|
package/jest.config.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
preset: 'ts-jest',
|
|
3
|
-
testEnvironment: 'node',
|
|
4
|
-
transform: {
|
|
5
|
-
'^.+\\.ts$': ['ts-jest', {
|
|
6
|
-
useESM: true
|
|
7
|
-
}]
|
|
8
|
-
},
|
|
9
|
-
extensionsToTreatAsEsm: ['.ts'],
|
|
10
|
-
moduleNameMapper: {
|
|
11
|
-
'^(\\.{1,2}/.*)\\.js$': '$1'
|
|
12
|
-
},
|
|
13
|
-
testPathIgnorePatterns: ['/node_modules/', '/dist/', '/templates/', '/test-smart-contract-app/']
|
|
14
|
-
};
|
package/src/main.test.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
|
|
5
|
-
describe('Extension System', () => {
|
|
6
|
-
const testDir = path.join(process.cwd(), 'test-output');
|
|
7
|
-
const extensionsDir = path.join(process.cwd(), 'extensions');
|
|
8
|
-
|
|
9
|
-
beforeEach(async () => {
|
|
10
|
-
// Clean up test directory
|
|
11
|
-
try {
|
|
12
|
-
await fs.rm(testDir, { recursive: true, force: true });
|
|
13
|
-
} catch (e) {
|
|
14
|
-
// Directory might not exist
|
|
15
|
-
}
|
|
16
|
-
await fs.mkdir(testDir, { recursive: true });
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
afterEach(async () => {
|
|
20
|
-
// Clean up test directory
|
|
21
|
-
try {
|
|
22
|
-
await fs.rm(testDir, { recursive: true, force: true });
|
|
23
|
-
} catch (e) {
|
|
24
|
-
// Directory might not exist
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test('should list available extensions', async () => {
|
|
29
|
-
const extensionExists = await fs.access(path.join(extensionsDir, 'precompiles'))
|
|
30
|
-
.then(() => true)
|
|
31
|
-
.catch(() => false);
|
|
32
|
-
|
|
33
|
-
expect(extensionExists).toBe(true);
|
|
34
|
-
|
|
35
|
-
const extensionFiles = await fs.readdir(extensionsDir);
|
|
36
|
-
expect(extensionFiles).toContain('precompiles');
|
|
37
|
-
});
|
|
38
|
-
});
|
package/src/main.ts
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import boxen from 'boxen';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
|
|
5
|
-
import fs from 'node:fs';
|
|
6
|
-
import path from 'node:path';
|
|
7
|
-
import { dirname } from 'node:path';
|
|
8
|
-
import { fileURLToPath } from 'node:url';
|
|
9
|
-
import { Command } from 'commander';
|
|
10
|
-
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
|
|
14
|
-
const program = new Command();
|
|
15
|
-
|
|
16
|
-
// Print welcome message
|
|
17
|
-
const printWelcomeMessage = () => {
|
|
18
|
-
console.log(
|
|
19
|
-
boxen('Welcome to the SEI DApp Generator!', {
|
|
20
|
-
padding: 1,
|
|
21
|
-
margin: 1,
|
|
22
|
-
borderStyle: 'double',
|
|
23
|
-
borderColor: '#932C23'
|
|
24
|
-
})
|
|
25
|
-
);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
interface WizardOptions {
|
|
29
|
-
name?: string;
|
|
30
|
-
extension?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function isValidDirectoryName(dirName) {
|
|
34
|
-
const illegalRe = /[<>:"/\\|?*]/g;
|
|
35
|
-
const windowsReservedRe = /^(con|prn|aux|nul|com[1-9]|lpt[1-9])$/i;
|
|
36
|
-
const trailingRe = /[. ]+$/;
|
|
37
|
-
const validNpmPackageRe = /^(?:@[a-z0-9-*~][a-z0-9-*._~]*)?[a-z0-9-~][a-z0-9-._~]*$/;
|
|
38
|
-
|
|
39
|
-
if (typeof dirName !== 'string' || dirName.length === 0) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Check for illegal characters, Windows reserved names, trailing spaces/dots
|
|
44
|
-
if (illegalRe.test(dirName) || windowsReservedRe.test(dirName) || trailingRe.test(dirName) || !validNpmPackageRe.test(dirName)) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const validateOptions = (options: WizardOptions): boolean => {
|
|
52
|
-
let valid = true;
|
|
53
|
-
|
|
54
|
-
if (options.name) {
|
|
55
|
-
if (!isValidDirectoryName(options.name)) {
|
|
56
|
-
console.log('Invalid package name. Please use a valid npm package name.');
|
|
57
|
-
valid = false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return valid;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
async function listExtensions(): Promise<void> {
|
|
65
|
-
const extensionsPath = path.join(__dirname, 'extensions');
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
const extensions = await fs.promises.readdir(extensionsPath, { withFileTypes: true });
|
|
69
|
-
const extensionDirs = extensions.filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
|
|
70
|
-
|
|
71
|
-
if (extensionDirs.length === 0) {
|
|
72
|
-
console.log('No extensions available.');
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
console.log('Available extensions:');
|
|
77
|
-
for (const ext of extensionDirs) {
|
|
78
|
-
console.log(` - ${ext}`);
|
|
79
|
-
}
|
|
80
|
-
} catch (error) {
|
|
81
|
-
console.log('No extensions directory found.');
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async function runWizard(options: WizardOptions): Promise<void> {
|
|
86
|
-
if (!validateOptions(options)) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
printWelcomeMessage();
|
|
91
|
-
|
|
92
|
-
let dAppName = '';
|
|
93
|
-
if (options.name) {
|
|
94
|
-
dAppName = options.name;
|
|
95
|
-
} else {
|
|
96
|
-
const promptResult = await inquirer.prompt([
|
|
97
|
-
{
|
|
98
|
-
type: 'input',
|
|
99
|
-
name: 'dAppName',
|
|
100
|
-
message: 'What is your dApp (project) name?',
|
|
101
|
-
validate: (input: string) => {
|
|
102
|
-
return isValidDirectoryName(input) || 'Invalid package name. Please use a valid npm package name.';
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
]);
|
|
106
|
-
|
|
107
|
-
dAppName = promptResult.dAppName;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Copy base template
|
|
111
|
-
const templateName = 'next-template';
|
|
112
|
-
const templatePath = path.join(__dirname, 'templates', templateName);
|
|
113
|
-
const dst = path.join(process.cwd(), dAppName);
|
|
114
|
-
await fs.promises.cp(templatePath, dst, { recursive: true });
|
|
115
|
-
|
|
116
|
-
// Apply extension if specified
|
|
117
|
-
if (options.extension) {
|
|
118
|
-
const extensionPath = path.join(__dirname, 'extensions', options.extension);
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
await fs.promises.access(extensionPath);
|
|
122
|
-
await fs.promises.cp(extensionPath, dst, { recursive: true });
|
|
123
|
-
console.log(`Applied extension: ${options.extension}`);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
console.log(`Warning: Extension '${options.extension}' not found. Continuing with base template.`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const extensionText = options.extension ? ` with ${options.extension} extension` : '';
|
|
130
|
-
console.log(`Project setup complete! Using template ${templateName}${extensionText}\n`);
|
|
131
|
-
console.log(`To start your app, run: \n > cd ${dAppName} \n > pnpm \n > pnpm dev\n`);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
program
|
|
135
|
-
.command('app')
|
|
136
|
-
.description('Create a new SEI dApp')
|
|
137
|
-
.option('--name <name>', 'Specify the name of your dApp. Name must be a valid package name.')
|
|
138
|
-
.option('--extension <extension>', 'Specify an extension to apply to the base template')
|
|
139
|
-
|
|
140
|
-
.action(async (options: WizardOptions) => {
|
|
141
|
-
try {
|
|
142
|
-
await runWizard(options);
|
|
143
|
-
} catch (error) {
|
|
144
|
-
console.error('An error occurred:', error);
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
program
|
|
149
|
-
.command('list-extensions')
|
|
150
|
-
.description('List all available extensions')
|
|
151
|
-
.action(async () => {
|
|
152
|
-
try {
|
|
153
|
-
await listExtensions();
|
|
154
|
-
} catch (error) {
|
|
155
|
-
console.error('An error occurred:', error);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
program.parse(process.argv);
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
# Chain configuration
|
|
2
|
-
# Options: mainnet, testnet, devnet
|
|
3
|
-
# Defaults to testnet (atlantic-2) if not set
|
|
4
|
-
NEXT_PUBLIC_CHAIN=testnet
|
|
5
|
-
|
|
6
|
-
# WalletConnect Project ID (optional)
|
|
7
|
-
# Get your project ID from https://cloud.walletconnect.com
|
|
8
|
-
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=your-project-id
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
v20
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
|
2
|
-
|
|
3
|
-
## Getting Started
|
|
4
|
-
|
|
5
|
-
Install dependencies by running
|
|
6
|
-
```bash
|
|
7
|
-
npm install
|
|
8
|
-
#or
|
|
9
|
-
yarn
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
Then, run the development server:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
npm run dev
|
|
16
|
-
# or
|
|
17
|
-
yarn dev
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
21
|
-
|
|
22
|
-
You can start editing the page by modifying `src/app/page.tsx`. The page auto-updates as you edit the file.
|
|
23
|
-
|
|
24
|
-
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
|
|
25
|
-
|
|
26
|
-
## Repository Basics
|
|
27
|
-
This repository includes basic features that allow you to connect to a wallet and use the wallet to interact with the chain.
|
|
28
|
-
|
|
29
|
-
Additionally, basic examples and links to documentation are provided on the example homepage in `src/app/components/Homepage`.
|
|
30
|
-
|
|
31
|
-
This repository uses helper methods from [@sei-js/evm/viem](https://github.com/sei-protocol/sei-js/tree/main/packages/evm/src/viem)
|
|
32
|
-
|
|
33
|
-
### Web3 Provider
|
|
34
|
-
This component is a Sei specific wrapper around a Wagmi Provider that should wrap the application. Wrapping the application in this provider will enable it to access hooks in Wagmi. These hooks are enable connection to a wallet and interaction with the chain.
|
|
35
|
-
|
|
36
|
-
In addition, this app uses [RainbowKit](https://www.rainbowkit.com/docs/wallet-button) which provides wallet connect functionality out of the box.
|
|
37
|
-
|
|
38
|
-
To change the list of supported wallets, as well as connection configurations you can modify the `src/app/components/Web3Provider.tsx` component.
|
|
39
|
-
|
|
40
|
-
### Changing the Chain
|
|
41
|
-
This application connects to the arctic-1 devnet by default, using chain configurations uploaded to viem.
|
|
42
|
-
|
|
43
|
-
To change the chain the app connects to, edit the `selectedChain` variable in the `chain.ts` file in `src/app/constants`
|
|
44
|
-
|
|
45
|
-
## Learn More
|
|
46
|
-
|
|
47
|
-
To learn more about Next.js, take a look at the following resources:
|
|
48
|
-
|
|
49
|
-
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
50
|
-
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
51
|
-
|
|
52
|
-
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
|
53
|
-
|
|
54
|
-
## Deploy on Vercel
|
|
55
|
-
|
|
56
|
-
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
57
|
-
|
|
58
|
-
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
|
3
|
-
"organizeImports": {
|
|
4
|
-
"enabled": true
|
|
5
|
-
},
|
|
6
|
-
"linter": {
|
|
7
|
-
"enabled": true,
|
|
8
|
-
"rules": {
|
|
9
|
-
"recommended": true,
|
|
10
|
-
"style": {
|
|
11
|
-
"noNonNullAssertion": "off"
|
|
12
|
-
},
|
|
13
|
-
"suspicious": {
|
|
14
|
-
"noExplicitAny": "off"
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"formatter": {
|
|
19
|
-
"enabled": true,
|
|
20
|
-
"formatWithErrors": false,
|
|
21
|
-
"indentStyle": "tab",
|
|
22
|
-
"lineEnding": "lf",
|
|
23
|
-
"lineWidth": 160,
|
|
24
|
-
"attributePosition": "auto"
|
|
25
|
-
},
|
|
26
|
-
"javascript": {
|
|
27
|
-
"formatter": {
|
|
28
|
-
"jsxQuoteStyle": "double",
|
|
29
|
-
"quoteProperties": "asNeeded",
|
|
30
|
-
"trailingCommas": "es5",
|
|
31
|
-
"semicolons": "always",
|
|
32
|
-
"arrowParentheses": "always",
|
|
33
|
-
"bracketSpacing": true,
|
|
34
|
-
"bracketSameLine": false,
|
|
35
|
-
"quoteStyle": "single",
|
|
36
|
-
"attributePosition": "auto"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"json": {
|
|
40
|
-
"formatter": {
|
|
41
|
-
"trailingCommas": "none"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"files": {
|
|
45
|
-
"include": ["src/**/*.ts", "src/**/*.tsx", "*.json", "*.md"],
|
|
46
|
-
"ignore": ["node_modules/**", "dist/**", ".next/**", ".yarn/**"]
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "template-next-create-sei-app",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"scripts": {
|
|
6
|
-
"dev": "next dev",
|
|
7
|
-
"build": "next build",
|
|
8
|
-
"start": "next start",
|
|
9
|
-
"lint": "biome lint .",
|
|
10
|
-
"lint:fix": "biome lint --write .",
|
|
11
|
-
"format": "biome format --write .",
|
|
12
|
-
"format:check": "biome format .",
|
|
13
|
-
"check": "biome check .",
|
|
14
|
-
"check:fix": "biome check --write .",
|
|
15
|
-
"deploy": "vercel --prod"
|
|
16
|
-
},
|
|
17
|
-
"dependencies": {
|
|
18
|
-
"@mantine/code-highlight": "^8.2.5",
|
|
19
|
-
"@mantine/core": "^8.2.5",
|
|
20
|
-
"@mantine/hooks": "^8.2.5",
|
|
21
|
-
"@mantine/notifications": "^8.2.5",
|
|
22
|
-
"@rainbow-me/rainbowkit": "^2.2.8",
|
|
23
|
-
"@sei-js/precompiles": "^2.1.2",
|
|
24
|
-
"@tabler/icons-react": "^3.34.1",
|
|
25
|
-
"@tailwindcss/postcss": "^4.1.12",
|
|
26
|
-
"@tanstack/react-query": "^5.85.3",
|
|
27
|
-
"ethers": "^6.15.0",
|
|
28
|
-
"next": "15.4.7",
|
|
29
|
-
"pino-pretty": "^13.1.1",
|
|
30
|
-
"postcss": "^8.4.45",
|
|
31
|
-
"react": "^19.1.1",
|
|
32
|
-
"react-dom": "^19.1.1",
|
|
33
|
-
"tailwindcss": "^4.1.12",
|
|
34
|
-
"viem": "^2.34.0",
|
|
35
|
-
"wagmi": "^2.16.4"
|
|
36
|
-
},
|
|
37
|
-
"devDependencies": {
|
|
38
|
-
"@types/node": "^24.3.0",
|
|
39
|
-
"@types/react": "^19.1.10",
|
|
40
|
-
"@types/react-dom": "^19.1.7",
|
|
41
|
-
"autoprefixer": "^10.4.21",
|
|
42
|
-
"typescript": "^5.9.2"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
Binary file
|