├── .gitignore
├── LICENSE
├── README.md
├── index.html
├── package.json
├── postcss.config.js
├── public
├── passport.wasm
├── passport_0001.zkey
└── snarkjs.min.js
├── src
├── App.tsx
├── common
│ └── constants.ts
├── components
│ ├── Account.tsx
│ ├── Email.tsx
│ ├── Login.tsx
│ └── NFTInfo.tsx
├── contracts
│ ├── INSRegistry.ts
│ ├── INSRegistry__factory.ts
│ ├── PublicResolver.ts
│ ├── PublicResolver__factory.ts
│ ├── ZKPWalletNFT.ts
│ ├── ZKPWalletNFT__factory.ts
│ ├── ZKPassAccount.ts
│ ├── ZKPassAccountFactory.ts
│ ├── ZKPassAccountFactory__factory.ts
│ ├── ZKPassAccount__factory.ts
│ ├── common.ts
│ └── index.ts
├── main.tsx
├── signer
│ └── index.ts
├── store
│ ├── base.ts
│ ├── index.ts
│ └── root.ts
└── styles
│ └── globals.css
├── tailwind.config.js
├── tsconfig.json
├── tsconfig.node.json
├── vite.config.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 IoTeX Network
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ZKP wallet UI
2 | =============
3 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 | ZKP Wallet
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zkp-wallet-ui",
3 | "version": "0.1.0",
4 | "scripts": {
5 | "dev": "vite",
6 | "build": "tsc && vite build",
7 | "preview": "vite preview"
8 | },
9 | "dependencies": {
10 | "@account-abstraction/contracts": "^0.6.0",
11 | "@headlessui/react": "^1.7.13",
12 | "@heroicons/react": "^2.0.16",
13 | "@tailwindcss/line-clamp": "^0.4.2",
14 | "ethers": "5.7.2",
15 | "mobx": "^6.2.0",
16 | "mobx-react-lite": "^3.2.0",
17 | "react": "^18.2.0",
18 | "react-dom": "^18.2.0",
19 | "snarkjs": "^0.7.0",
20 | "userop": "^0.3.3"
21 | },
22 | "devDependencies": {
23 | "@types/react": "^18.0.9",
24 | "@types/react-dom": "^18.0.5",
25 | "@vitejs/plugin-react": "^2",
26 | "autoprefixer": "^10.4.13",
27 | "postcss": "^8.4.21",
28 | "tailwindcss": "^3.2.7",
29 | "tailwindcss-safe-area": "^0.2.2",
30 | "typescript": "^4.7.2",
31 | "vite": "^3",
32 | "vite-plugin-node-polyfills": "^0.7.0"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/passport.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iotexproject/zkp-wallet-ui/9a664ccc97d4c5d03d95781f73e7cd06975bc76e/public/passport.wasm
--------------------------------------------------------------------------------
/public/passport_0001.zkey:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iotexproject/zkp-wallet-ui/9a664ccc97d4c5d03d95781f73e7cd06975bc76e/public/passport_0001.zkey
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { observer } from "mobx-react-lite";
2 | import { useStore } from "./store";
3 | import { Login } from "./components/Login";
4 | import { NFTInfo } from "./components/NFTInfo";
5 | import { Account } from "./components/Account";
6 |
7 | export const App = observer(() => {
8 | const { base } = useStore();
9 |
10 | return (
11 |
12 |
13 |
14 |
15 |
16 | Welcome to the ZKP NFT Wallet
17 |
18 |
Overview
19 |
20 | This demo illustrates the application of ZK-SNARK to Account Abstraction,
21 | enabling users to create a Blockchain Wallet that they can
22 | seamlessly control with just a username and password.
23 | Additionally, users can recover their wallet via email, and there
24 | is no requirement for them to maintain any token balance to
25 | execute transactions.
26 |
27 |
Key Features
28 |
29 |
30 | - Utilization of a ZK-SNARK Prover for generating proofs of
31 | password knowledge.
32 |
33 |
34 | - Implementation of DKIM verification in the Account logic
35 | to establish a secure email recovery process.
36 |
37 |
38 | - Integration of the
39 | Paymaster pattern to sponsor gas fees for transactions.
40 |
41 |
42 |
43 |
44 |
49 |
50 |
51 |
52 | {base.isLogin ?
:
}
53 |
54 |
55 |
56 | {base.info.show ? (
57 |
58 |
59 | {base.info.text}
60 |
61 |
62 | ) : null}
63 |
64 |
65 | );
66 | });
67 |
68 | export default App;
69 |
--------------------------------------------------------------------------------
/src/common/constants.ts:
--------------------------------------------------------------------------------
1 | export const addresses = {
2 | "testnet": {
3 | endpoint: "https://babel-api.testnet.iotex.io",
4 | bundler: "https://bundler.testnet.w3bstream.com",
5 | paymaster: "https://paymaster.testnet.w3bstream.com/rpc/a0a7767f2aaa4db1b385f71dd82e55ea",
6 | binder: "https://email-binder.testnet.iotex.io",
7 | // endpoint: "http://127.0.0.1:8545",
8 | // bundler: "http://127.0.0.1:4337",
9 | // paymaster: "http://localhost:8888/rpc/1234567890",
10 | // binder: "http://127.0.0.1:3000",
11 | entryPoint: "0xc3527348De07d591c9d567ce1998eFA2031B8675",
12 | accountFactory: "0x85B6E973EF283727A2c7E2D8D6C86AE8bcAb8029",
13 | registry: "0x845d8ccb0D92174B33AC9A876B65c49Ca4676685",
14 | nft: "0xA3Ce183b2EA38053f85A160857E6f6A8C10EF5f7",
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/components/Account.tsx:
--------------------------------------------------------------------------------
1 | import { observer } from "mobx-react-lite";
2 | import { useStore } from "../store";
3 | import { useEffect } from "react";
4 | import { Email } from "./Email";
5 |
6 | export const Account = observer(() => {
7 | const { base } = useStore();
8 |
9 | useEffect(() => {
10 | base.fillAccount()
11 | setInterval(async () => await base.fillAccount(), 10000)
12 | }, [])
13 |
14 | return (
15 | base.showEmail? :
16 |
17 |
18 |
Account name: {base.account.username}.t2wallet.io
19 |
Account minted: {base.account.created?'True':'False'}
20 |
21 |
Account balance: {base.account.balance} IOTX
22 |
Recovery email: {base.account.guarded?'Set':'Not Set'}
23 |
Minted NFT amount: {base.account.nft}
24 | {base.disableButton? (
25 |
Mint
29 |
30 | ) : (
31 |
base.mint()}
35 | >Mint an NFT
36 |
37 | )
38 | }
39 | {base.account.created?
40 |
base.openEmailGuardian()}
44 | >{base.account.guarded?'Change Recovery Email':'Add Recovery Email'}
45 |
46 | : null
47 | }
48 |
49 |
base.disconnect()}
53 | >Disconnect
54 |
55 |
56 |
57 | )
58 | })
59 |
--------------------------------------------------------------------------------
/src/components/Email.tsx:
--------------------------------------------------------------------------------
1 | import { observer } from "mobx-react-lite";
2 | import { useStore } from "../store";
3 |
4 | export const Email = observer(() => {
5 | const { base } = useStore();
6 |
7 | return (
8 |
50 | )
51 | })
52 |
--------------------------------------------------------------------------------
/src/components/Login.tsx:
--------------------------------------------------------------------------------
1 | import { observer } from "mobx-react-lite";
2 | import { useStore } from "../store";
3 |
4 | export const Login = observer(() => {
5 | const { base } = useStore();
6 |
7 | return (
8 |
9 |
69 | {base.showRecoveryMessage?
70 |
71 |
72 |
73 |
74 |
75 |
76 |
Recovery account
77 |
78 |
{base.recoveryMessage}
79 |
80 |
81 |
82 |
83 |
84 | base.closeRecoveryMessage()} className="mt-3 inline-flex w-full justify-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 sm:mt-0 sm:w-auto">Cancel
85 |
86 |
87 |
88 |
89 | : null}
90 |
91 | )
92 | })
93 |
--------------------------------------------------------------------------------
/src/components/NFTInfo.tsx:
--------------------------------------------------------------------------------
1 | import { observer } from "mobx-react-lite"
2 | import { useStore } from "../store"
3 | import { useEffect } from "react"
4 |
5 | export const NFTInfo = observer(() => {
6 | const { base } = useStore()
7 |
8 | useEffect(() => {
9 | base.fetchMintedNFT()
10 | setInterval(async () => await base.fetchMintedNFT(), 10000)
11 | }, [])
12 |
13 | return (
14 |
15 |
16 | {base.minted} / 20000
17 |
18 |
19 | NFTs minted by all users
20 |
21 |
22 | )
23 | })
24 |
--------------------------------------------------------------------------------
/src/contracts/INSRegistry.ts:
--------------------------------------------------------------------------------
1 | /* Autogenerated file. Do not edit manually. */
2 | /* tslint:disable */
3 | /* eslint-disable */
4 | import type {
5 | BaseContract,
6 | BigNumber,
7 | BigNumberish,
8 | BytesLike,
9 | CallOverrides,
10 | ContractTransaction,
11 | Overrides,
12 | PopulatedTransaction,
13 | Signer,
14 | utils,
15 | } from "ethers";
16 | import type {
17 | FunctionFragment,
18 | Result,
19 | EventFragment,
20 | } from "@ethersproject/abi";
21 | import type { Listener, Provider } from "@ethersproject/providers";
22 | import type {
23 | TypedEventFilter,
24 | TypedEvent,
25 | TypedListener,
26 | OnEvent,
27 | PromiseOrValue,
28 | } from "./common";
29 |
30 | export interface INSRegistryInterface extends utils.Interface {
31 | functions: {
32 | "isApprovedForAll(address,address)": FunctionFragment;
33 | "owner(bytes32)": FunctionFragment;
34 | "recordExists(bytes32)": FunctionFragment;
35 | "resolver(bytes32)": FunctionFragment;
36 | "setApprovalForAll(address,bool)": FunctionFragment;
37 | "setOwner(bytes32,address)": FunctionFragment;
38 | "setRecord(bytes32,address,address,uint64)": FunctionFragment;
39 | "setResolver(bytes32,address)": FunctionFragment;
40 | "setSubnodeOwner(bytes32,bytes32,address)": FunctionFragment;
41 | "setSubnodeRecord(bytes32,bytes32,address,address,uint64)": FunctionFragment;
42 | "setTTL(bytes32,uint64)": FunctionFragment;
43 | "ttl(bytes32)": FunctionFragment;
44 | };
45 |
46 | getFunction(
47 | nameOrSignatureOrTopic:
48 | | "isApprovedForAll"
49 | | "owner"
50 | | "recordExists"
51 | | "resolver"
52 | | "setApprovalForAll"
53 | | "setOwner"
54 | | "setRecord"
55 | | "setResolver"
56 | | "setSubnodeOwner"
57 | | "setSubnodeRecord"
58 | | "setTTL"
59 | | "ttl"
60 | ): FunctionFragment;
61 |
62 | encodeFunctionData(
63 | functionFragment: "isApprovedForAll",
64 | values: [PromiseOrValue, PromiseOrValue]
65 | ): string;
66 | encodeFunctionData(
67 | functionFragment: "owner",
68 | values: [PromiseOrValue]
69 | ): string;
70 | encodeFunctionData(
71 | functionFragment: "recordExists",
72 | values: [PromiseOrValue]
73 | ): string;
74 | encodeFunctionData(
75 | functionFragment: "resolver",
76 | values: [PromiseOrValue]
77 | ): string;
78 | encodeFunctionData(
79 | functionFragment: "setApprovalForAll",
80 | values: [PromiseOrValue, PromiseOrValue]
81 | ): string;
82 | encodeFunctionData(
83 | functionFragment: "setOwner",
84 | values: [PromiseOrValue, PromiseOrValue]
85 | ): string;
86 | encodeFunctionData(
87 | functionFragment: "setRecord",
88 | values: [
89 | PromiseOrValue,
90 | PromiseOrValue,
91 | PromiseOrValue,
92 | PromiseOrValue
93 | ]
94 | ): string;
95 | encodeFunctionData(
96 | functionFragment: "setResolver",
97 | values: [PromiseOrValue, PromiseOrValue]
98 | ): string;
99 | encodeFunctionData(
100 | functionFragment: "setSubnodeOwner",
101 | values: [
102 | PromiseOrValue,
103 | PromiseOrValue,
104 | PromiseOrValue
105 | ]
106 | ): string;
107 | encodeFunctionData(
108 | functionFragment: "setSubnodeRecord",
109 | values: [
110 | PromiseOrValue,
111 | PromiseOrValue,
112 | PromiseOrValue,
113 | PromiseOrValue,
114 | PromiseOrValue
115 | ]
116 | ): string;
117 | encodeFunctionData(
118 | functionFragment: "setTTL",
119 | values: [PromiseOrValue, PromiseOrValue]
120 | ): string;
121 | encodeFunctionData(
122 | functionFragment: "ttl",
123 | values: [PromiseOrValue]
124 | ): string;
125 |
126 | decodeFunctionResult(
127 | functionFragment: "isApprovedForAll",
128 | data: BytesLike
129 | ): Result;
130 | decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result;
131 | decodeFunctionResult(
132 | functionFragment: "recordExists",
133 | data: BytesLike
134 | ): Result;
135 | decodeFunctionResult(functionFragment: "resolver", data: BytesLike): Result;
136 | decodeFunctionResult(
137 | functionFragment: "setApprovalForAll",
138 | data: BytesLike
139 | ): Result;
140 | decodeFunctionResult(functionFragment: "setOwner", data: BytesLike): Result;
141 | decodeFunctionResult(functionFragment: "setRecord", data: BytesLike): Result;
142 | decodeFunctionResult(
143 | functionFragment: "setResolver",
144 | data: BytesLike
145 | ): Result;
146 | decodeFunctionResult(
147 | functionFragment: "setSubnodeOwner",
148 | data: BytesLike
149 | ): Result;
150 | decodeFunctionResult(
151 | functionFragment: "setSubnodeRecord",
152 | data: BytesLike
153 | ): Result;
154 | decodeFunctionResult(functionFragment: "setTTL", data: BytesLike): Result;
155 | decodeFunctionResult(functionFragment: "ttl", data: BytesLike): Result;
156 |
157 | events: {
158 | "ApprovalForAll(address,address,bool)": EventFragment;
159 | "NewOwner(bytes32,bytes32,address)": EventFragment;
160 | "NewResolver(bytes32,address)": EventFragment;
161 | "NewTTL(bytes32,uint64)": EventFragment;
162 | "Transfer(bytes32,address)": EventFragment;
163 | };
164 |
165 | getEvent(nameOrSignatureOrTopic: "ApprovalForAll"): EventFragment;
166 | getEvent(nameOrSignatureOrTopic: "NewOwner"): EventFragment;
167 | getEvent(nameOrSignatureOrTopic: "NewResolver"): EventFragment;
168 | getEvent(nameOrSignatureOrTopic: "NewTTL"): EventFragment;
169 | getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment;
170 | }
171 |
172 | export interface ApprovalForAllEventObject {
173 | owner: string;
174 | operator: string;
175 | approved: boolean;
176 | }
177 | export type ApprovalForAllEvent = TypedEvent<
178 | [string, string, boolean],
179 | ApprovalForAllEventObject
180 | >;
181 |
182 | export type ApprovalForAllEventFilter = TypedEventFilter;
183 |
184 | export interface NewOwnerEventObject {
185 | node: string;
186 | label: string;
187 | owner: string;
188 | }
189 | export type NewOwnerEvent = TypedEvent<
190 | [string, string, string],
191 | NewOwnerEventObject
192 | >;
193 |
194 | export type NewOwnerEventFilter = TypedEventFilter;
195 |
196 | export interface NewResolverEventObject {
197 | node: string;
198 | resolver: string;
199 | }
200 | export type NewResolverEvent = TypedEvent<
201 | [string, string],
202 | NewResolverEventObject
203 | >;
204 |
205 | export type NewResolverEventFilter = TypedEventFilter;
206 |
207 | export interface NewTTLEventObject {
208 | node: string;
209 | ttl: BigNumber;
210 | }
211 | export type NewTTLEvent = TypedEvent<[string, BigNumber], NewTTLEventObject>;
212 |
213 | export type NewTTLEventFilter = TypedEventFilter;
214 |
215 | export interface TransferEventObject {
216 | node: string;
217 | owner: string;
218 | }
219 | export type TransferEvent = TypedEvent<[string, string], TransferEventObject>;
220 |
221 | export type TransferEventFilter = TypedEventFilter;
222 |
223 | export interface INSRegistry extends BaseContract {
224 | connect(signerOrProvider: Signer | Provider | string): this;
225 | attach(addressOrName: string): this;
226 | deployed(): Promise;
227 |
228 | interface: INSRegistryInterface;
229 |
230 | queryFilter(
231 | event: TypedEventFilter,
232 | fromBlockOrBlockhash?: string | number | undefined,
233 | toBlock?: string | number | undefined
234 | ): Promise>;
235 |
236 | listeners(
237 | eventFilter?: TypedEventFilter
238 | ): Array>;
239 | listeners(eventName?: string): Array;
240 | removeAllListeners(
241 | eventFilter: TypedEventFilter
242 | ): this;
243 | removeAllListeners(eventName?: string): this;
244 | off: OnEvent;
245 | on: OnEvent;
246 | once: OnEvent;
247 | removeListener: OnEvent;
248 |
249 | functions: {
250 | isApprovedForAll(
251 | _owner: PromiseOrValue,
252 | _operator: PromiseOrValue,
253 | overrides?: CallOverrides
254 | ): Promise<[boolean]>;
255 |
256 | owner(
257 | node: PromiseOrValue,
258 | overrides?: CallOverrides
259 | ): Promise<[string]>;
260 |
261 | recordExists(
262 | node: PromiseOrValue,
263 | overrides?: CallOverrides
264 | ): Promise<[boolean]>;
265 |
266 | resolver(
267 | node: PromiseOrValue,
268 | overrides?: CallOverrides
269 | ): Promise<[string]>;
270 |
271 | setApprovalForAll(
272 | operator: PromiseOrValue,
273 | approved: PromiseOrValue,
274 | overrides?: Overrides & { from?: PromiseOrValue }
275 | ): Promise;
276 |
277 | setOwner(
278 | _node: PromiseOrValue,
279 | _owner: PromiseOrValue,
280 | overrides?: Overrides & { from?: PromiseOrValue }
281 | ): Promise;
282 |
283 | setRecord(
284 | _node: PromiseOrValue,
285 | _owner: PromiseOrValue,
286 | _resolver: PromiseOrValue,
287 | _ttl: PromiseOrValue,
288 | overrides?: Overrides & { from?: PromiseOrValue }
289 | ): Promise;
290 |
291 | setResolver(
292 | _node: PromiseOrValue,
293 | _resolver: PromiseOrValue,
294 | overrides?: Overrides & { from?: PromiseOrValue }
295 | ): Promise;
296 |
297 | setSubnodeOwner(
298 | _node: PromiseOrValue,
299 | _label: PromiseOrValue,
300 | _owner: PromiseOrValue,
301 | overrides?: Overrides & { from?: PromiseOrValue }
302 | ): Promise;
303 |
304 | setSubnodeRecord(
305 | _node: PromiseOrValue,
306 | _label: PromiseOrValue,
307 | _owner: PromiseOrValue,
308 | _resolver: PromiseOrValue,
309 | _ttl: PromiseOrValue,
310 | overrides?: Overrides & { from?: PromiseOrValue }
311 | ): Promise;
312 |
313 | setTTL(
314 | _node: PromiseOrValue,
315 | _ttl: PromiseOrValue,
316 | overrides?: Overrides & { from?: PromiseOrValue }
317 | ): Promise;
318 |
319 | ttl(
320 | node: PromiseOrValue,
321 | overrides?: CallOverrides
322 | ): Promise<[BigNumber]>;
323 | };
324 |
325 | isApprovedForAll(
326 | _owner: PromiseOrValue,
327 | _operator: PromiseOrValue,
328 | overrides?: CallOverrides
329 | ): Promise;
330 |
331 | owner(
332 | node: PromiseOrValue,
333 | overrides?: CallOverrides
334 | ): Promise;
335 |
336 | recordExists(
337 | node: PromiseOrValue,
338 | overrides?: CallOverrides
339 | ): Promise;
340 |
341 | resolver(
342 | node: PromiseOrValue,
343 | overrides?: CallOverrides
344 | ): Promise;
345 |
346 | setApprovalForAll(
347 | operator: PromiseOrValue,
348 | approved: PromiseOrValue,
349 | overrides?: Overrides & { from?: PromiseOrValue }
350 | ): Promise;
351 |
352 | setOwner(
353 | _node: PromiseOrValue,
354 | _owner: PromiseOrValue,
355 | overrides?: Overrides & { from?: PromiseOrValue }
356 | ): Promise;
357 |
358 | setRecord(
359 | _node: PromiseOrValue,
360 | _owner: PromiseOrValue,
361 | _resolver: PromiseOrValue,
362 | _ttl: PromiseOrValue,
363 | overrides?: Overrides & { from?: PromiseOrValue }
364 | ): Promise;
365 |
366 | setResolver(
367 | _node: PromiseOrValue,
368 | _resolver: PromiseOrValue,
369 | overrides?: Overrides & { from?: PromiseOrValue }
370 | ): Promise;
371 |
372 | setSubnodeOwner(
373 | _node: PromiseOrValue,
374 | _label: PromiseOrValue,
375 | _owner: PromiseOrValue,
376 | overrides?: Overrides & { from?: PromiseOrValue }
377 | ): Promise;
378 |
379 | setSubnodeRecord(
380 | _node: PromiseOrValue,
381 | _label: PromiseOrValue,
382 | _owner: PromiseOrValue,
383 | _resolver: PromiseOrValue,
384 | _ttl: PromiseOrValue,
385 | overrides?: Overrides & { from?: PromiseOrValue }
386 | ): Promise;
387 |
388 | setTTL(
389 | _node: PromiseOrValue,
390 | _ttl: PromiseOrValue,
391 | overrides?: Overrides & { from?: PromiseOrValue }
392 | ): Promise;
393 |
394 | ttl(
395 | node: PromiseOrValue,
396 | overrides?: CallOverrides
397 | ): Promise;
398 |
399 | callStatic: {
400 | isApprovedForAll(
401 | _owner: PromiseOrValue,
402 | _operator: PromiseOrValue,
403 | overrides?: CallOverrides
404 | ): Promise;
405 |
406 | owner(
407 | node: PromiseOrValue,
408 | overrides?: CallOverrides
409 | ): Promise;
410 |
411 | recordExists(
412 | node: PromiseOrValue,
413 | overrides?: CallOverrides
414 | ): Promise;
415 |
416 | resolver(
417 | node: PromiseOrValue,
418 | overrides?: CallOverrides
419 | ): Promise;
420 |
421 | setApprovalForAll(
422 | operator: PromiseOrValue,
423 | approved: PromiseOrValue,
424 | overrides?: CallOverrides
425 | ): Promise;
426 |
427 | setOwner(
428 | _node: PromiseOrValue,
429 | _owner: PromiseOrValue,
430 | overrides?: CallOverrides
431 | ): Promise;
432 |
433 | setRecord(
434 | _node: PromiseOrValue,
435 | _owner: PromiseOrValue,
436 | _resolver: PromiseOrValue,
437 | _ttl: PromiseOrValue,
438 | overrides?: CallOverrides
439 | ): Promise;
440 |
441 | setResolver(
442 | _node: PromiseOrValue,
443 | _resolver: PromiseOrValue,
444 | overrides?: CallOverrides
445 | ): Promise;
446 |
447 | setSubnodeOwner(
448 | _node: PromiseOrValue,
449 | _label: PromiseOrValue,
450 | _owner: PromiseOrValue,
451 | overrides?: CallOverrides
452 | ): Promise;
453 |
454 | setSubnodeRecord(
455 | _node: PromiseOrValue,
456 | _label: PromiseOrValue,
457 | _owner: PromiseOrValue,
458 | _resolver: PromiseOrValue,
459 | _ttl: PromiseOrValue,
460 | overrides?: CallOverrides
461 | ): Promise;
462 |
463 | setTTL(
464 | _node: PromiseOrValue,
465 | _ttl: PromiseOrValue,
466 | overrides?: CallOverrides
467 | ): Promise;
468 |
469 | ttl(
470 | node: PromiseOrValue,
471 | overrides?: CallOverrides
472 | ): Promise;
473 | };
474 |
475 | filters: {
476 | "ApprovalForAll(address,address,bool)"(
477 | owner?: PromiseOrValue | null,
478 | operator?: PromiseOrValue | null,
479 | approved?: null
480 | ): ApprovalForAllEventFilter;
481 | ApprovalForAll(
482 | owner?: PromiseOrValue | null,
483 | operator?: PromiseOrValue | null,
484 | approved?: null
485 | ): ApprovalForAllEventFilter;
486 |
487 | "NewOwner(bytes32,bytes32,address)"(
488 | node?: PromiseOrValue | null,
489 | label?: PromiseOrValue | null,
490 | owner?: null
491 | ): NewOwnerEventFilter;
492 | NewOwner(
493 | node?: PromiseOrValue | null,
494 | label?: PromiseOrValue | null,
495 | owner?: null
496 | ): NewOwnerEventFilter;
497 |
498 | "NewResolver(bytes32,address)"(
499 | node?: PromiseOrValue | null,
500 | resolver?: null
501 | ): NewResolverEventFilter;
502 | NewResolver(
503 | node?: PromiseOrValue | null,
504 | resolver?: null
505 | ): NewResolverEventFilter;
506 |
507 | "NewTTL(bytes32,uint64)"(
508 | node?: PromiseOrValue | null,
509 | ttl?: null
510 | ): NewTTLEventFilter;
511 | NewTTL(
512 | node?: PromiseOrValue | null,
513 | ttl?: null
514 | ): NewTTLEventFilter;
515 |
516 | "Transfer(bytes32,address)"(
517 | node?: PromiseOrValue | null,
518 | owner?: null
519 | ): TransferEventFilter;
520 | Transfer(
521 | node?: PromiseOrValue | null,
522 | owner?: null
523 | ): TransferEventFilter;
524 | };
525 |
526 | estimateGas: {
527 | isApprovedForAll(
528 | _owner: PromiseOrValue,
529 | _operator: PromiseOrValue,
530 | overrides?: CallOverrides
531 | ): Promise;
532 |
533 | owner(
534 | node: PromiseOrValue,
535 | overrides?: CallOverrides
536 | ): Promise;
537 |
538 | recordExists(
539 | node: PromiseOrValue,
540 | overrides?: CallOverrides
541 | ): Promise;
542 |
543 | resolver(
544 | node: PromiseOrValue,
545 | overrides?: CallOverrides
546 | ): Promise;
547 |
548 | setApprovalForAll(
549 | operator: PromiseOrValue,
550 | approved: PromiseOrValue,
551 | overrides?: Overrides & { from?: PromiseOrValue }
552 | ): Promise;
553 |
554 | setOwner(
555 | _node: PromiseOrValue,
556 | _owner: PromiseOrValue,
557 | overrides?: Overrides & { from?: PromiseOrValue }
558 | ): Promise;
559 |
560 | setRecord(
561 | _node: PromiseOrValue,
562 | _owner: PromiseOrValue,
563 | _resolver: PromiseOrValue,
564 | _ttl: PromiseOrValue,
565 | overrides?: Overrides & { from?: PromiseOrValue }
566 | ): Promise;
567 |
568 | setResolver(
569 | _node: PromiseOrValue,
570 | _resolver: PromiseOrValue,
571 | overrides?: Overrides & { from?: PromiseOrValue }
572 | ): Promise;
573 |
574 | setSubnodeOwner(
575 | _node: PromiseOrValue,
576 | _label: PromiseOrValue,
577 | _owner: PromiseOrValue,
578 | overrides?: Overrides & { from?: PromiseOrValue }
579 | ): Promise;
580 |
581 | setSubnodeRecord(
582 | _node: PromiseOrValue,
583 | _label: PromiseOrValue,
584 | _owner: PromiseOrValue,
585 | _resolver: PromiseOrValue,
586 | _ttl: PromiseOrValue,
587 | overrides?: Overrides & { from?: PromiseOrValue }
588 | ): Promise;
589 |
590 | setTTL(
591 | _node: PromiseOrValue,
592 | _ttl: PromiseOrValue,
593 | overrides?: Overrides & { from?: PromiseOrValue }
594 | ): Promise;
595 |
596 | ttl(
597 | node: PromiseOrValue,
598 | overrides?: CallOverrides
599 | ): Promise;
600 | };
601 |
602 | populateTransaction: {
603 | isApprovedForAll(
604 | _owner: PromiseOrValue,
605 | _operator: PromiseOrValue,
606 | overrides?: CallOverrides
607 | ): Promise;
608 |
609 | owner(
610 | node: PromiseOrValue,
611 | overrides?: CallOverrides
612 | ): Promise;
613 |
614 | recordExists(
615 | node: PromiseOrValue,
616 | overrides?: CallOverrides
617 | ): Promise;
618 |
619 | resolver(
620 | node: PromiseOrValue,
621 | overrides?: CallOverrides
622 | ): Promise;
623 |
624 | setApprovalForAll(
625 | operator: PromiseOrValue,
626 | approved: PromiseOrValue,
627 | overrides?: Overrides & { from?: PromiseOrValue }
628 | ): Promise;
629 |
630 | setOwner(
631 | _node: PromiseOrValue,
632 | _owner: PromiseOrValue,
633 | overrides?: Overrides & { from?: PromiseOrValue }
634 | ): Promise;
635 |
636 | setRecord(
637 | _node: PromiseOrValue,
638 | _owner: PromiseOrValue,
639 | _resolver: PromiseOrValue,
640 | _ttl: PromiseOrValue,
641 | overrides?: Overrides & { from?: PromiseOrValue }
642 | ): Promise;
643 |
644 | setResolver(
645 | _node: PromiseOrValue,
646 | _resolver: PromiseOrValue,
647 | overrides?: Overrides & { from?: PromiseOrValue }
648 | ): Promise