Skip to content

Commit b9a4364

Browse files
committed
src typescript updated to ethers v6
1 parent 23b3f9c commit b9a4364

14 files changed

Lines changed: 520 additions & 176 deletions

File tree

package-lock.json

Lines changed: 411 additions & 100 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,6 @@
109109
"dependencies": {
110110
"@tableland/evm": "^4.0.0",
111111
"@tableland/sqlparser": "^1.0.4",
112-
"ethers": "^5.7.2"
112+
"ethers": "^6.1.0"
113113
}
114114
}

src/helpers/config.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { type ChainName, getBaseUrl } from "./chains.js";
2-
import { type Signer, type ExternalProvider, getSigner } from "./ethers.js";
2+
import { type Signer, type Eip1193Provider, getSigner } from "./ethers.js";
33

44
export interface ReadConfig {
55
baseUrl: string;
@@ -19,24 +19,25 @@ export async function extractBaseUrl(
1919
conn: Config = {},
2020
chainNameOrId?: ChainName | number
2121
): Promise<string> {
22-
if (conn.baseUrl == null) {
23-
if (conn.signer == null) {
24-
if (chainNameOrId == null) {
25-
throw new Error(
26-
"missing connection information: baseUrl, signer, or chainId required"
27-
);
28-
}
29-
return getBaseUrl(chainNameOrId);
30-
}
31-
const chainId = await conn.signer.getChainId();
32-
return getBaseUrl(chainId);
22+
if (conn.baseUrl != null) return conn.baseUrl;
23+
24+
const network = await conn.signer?.provider?.getNetwork();
25+
if (network != null) {
26+
return getBaseUrl(Number(network.chainId));
27+
}
28+
29+
if (chainNameOrId != null) {
30+
return getBaseUrl(chainNameOrId);
3331
}
34-
return conn.baseUrl;
32+
33+
throw new Error(
34+
"missing connection information: baseUrl, signer, or chainId required"
35+
);
3536
}
3637

3738
export async function extractSigner(
3839
conn: Config = {},
39-
external?: ExternalProvider
40+
external?: Eip1193Provider
4041
): Promise<Signer> {
4142
if (conn.signer == null) {
4243
return await getSigner(external);
@@ -46,14 +47,14 @@ export async function extractSigner(
4647

4748
export async function extractChainId(conn: Config = {}): Promise<number> {
4849
const signer = await extractSigner(conn);
49-
const chainId = await signer.getChainId();
50+
const network = await signer.provider?.getNetwork();
5051

51-
if (chainId === 0 || isNaN(chainId) || chainId == null) {
52+
if (network == null || network.chainId == BigInt("0") || network.chainId == null) {
5253
/* c8 ignore next 4 */
5354
throw new Error(
5455
"cannot find chainId: is your signer connected to a network?"
5556
);
5657
}
5758

58-
return chainId;
59+
return Number(network.chainId);
5960
}

src/helpers/ethers.ts

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import {
2-
providers,
2+
getDefaultProvider,
3+
BrowserProvider,
4+
EventLog,
5+
type Eip1193Provider,
6+
type ContractTransactionResponse,
7+
type ContractTransactionReceipt,
38
type Signer,
49
type Overrides,
5-
type ContractTransaction,
6-
type ContractReceipt,
710
} from "ethers";
811
import { type TransactionReceipt } from "../validator/receipt.js";
912
import { type SignerConfig } from "./config.js";
1013

11-
type ExternalProvider = providers.ExternalProvider;
12-
const { getDefaultProvider, Web3Provider } = providers;
13-
1414
// eslint-disable-next-line @typescript-eslint/no-namespace
1515
declare module globalThis {
1616
// eslint-disable-next-line no-var
17-
var ethereum: ExternalProvider | undefined;
17+
var ethereum: Eip1193Provider | undefined;
1818
}
1919

2020
/**
@@ -29,11 +29,13 @@ export async function getOverrides({
2929
const opts: Overrides = {};
3030
const network = await signer.provider?.getNetwork();
3131
/* c8 ignore next 7 */
32-
if (network?.chainId === 137) {
33-
const feeData = await signer.getFeeData();
34-
if (feeData.gasPrice != null) {
32+
if (network?.chainId === BigInt("137")) {
33+
const feeData = await signer.provider?.getFeeData();
34+
if (feeData?.gasPrice != null) {
3535
opts.gasPrice =
36-
Math.floor(feeData.gasPrice.toNumber() * 1.1) ?? undefined;
36+
// NOTE: There's no guarantee `feeData.gasPrice` is a JS safe integer which means
37+
// this might not be accurate, but it's just an estimate so this is probably ok
38+
Math.floor(Number(feeData.gasPrice) * 1.1) ?? undefined;
3739
}
3840
}
3941
return opts;
@@ -44,20 +46,28 @@ export type RegistryReceipt = Required<
4446
>;
4547

4648
export async function getContractReceipt(
47-
tx: ContractTransaction
49+
tx: ContractTransactionResponse
4850
): Promise<RegistryReceipt> {
4951
const receipt = await tx.wait();
52+
53+
if (receipt == null) {
54+
throw new Error(`could not get receipt for transaction: ${tx}`);
55+
}
56+
5057
/* c8 ignore next */
51-
const events = receipt.events ?? [];
52-
const transactionHash = receipt.transactionHash;
58+
const logs = receipt.logs ?? [];
59+
const transactionHash = receipt.hash;
5360
const blockNumber = receipt.blockNumber;
54-
const chainId = tx.chainId;
61+
// NOTE: chainId is always a JS safe integer
62+
const chainId = Number(tx.chainId);
5563
let tableId: string = "";
56-
for (const event of events) {
57-
switch (event.event) {
64+
for (const log of logs) {
65+
if (!(log instanceof EventLog)) continue;
66+
67+
switch (log.eventName) {
5868
case "CreateTable":
5969
case "RunSQL":
60-
tableId = event.args?.tableId.toString();
70+
tableId = log.args?.tableId.toString();
6171
break;
6272
default:
6373
// Could be a Transfer or other
@@ -76,7 +86,7 @@ export async function getContractReceipt(
7686
* @returns A promise that resolves to a valid web3 provider/signer
7787
* @throws If no global ethereum object is available.
7888
*/
79-
export async function getSigner(external?: ExternalProvider): Promise<Signer> {
89+
export async function getSigner(external?: Eip1193Provider): Promise<Signer> {
8090
const provider = external ?? globalThis.ethereum;
8191
if (provider == null) {
8292
throw new Error("provider error: missing global ethereum provider");
@@ -87,14 +97,14 @@ export async function getSigner(external?: ExternalProvider): Promise<Signer> {
8797
);
8898
}
8999
await provider.request({ method: "eth_requestAccounts" });
90-
const web3Provider = new Web3Provider(provider);
100+
const web3Provider = new BrowserProvider(provider);
91101
return web3Provider.getSigner();
92102
}
93103

94104
export {
95-
Signer,
96105
getDefaultProvider,
97-
type ExternalProvider,
98-
type ContractTransaction,
99-
type ContractReceipt,
106+
type Signer,
107+
type ContractTransactionResponse,
108+
type ContractTransactionReceipt,
109+
type Eip1193Provider,
100110
};

src/helpers/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export {
2626
} from "./config.js";
2727
export {
2828
type Signer,
29-
type ExternalProvider,
29+
type Eip1193Provider,
3030
getDefaultProvider,
31-
type ContractTransaction,
32-
type ContractReceipt,
31+
type ContractTransactionResponse,
32+
type ContractTransactionReceipt,
3333
type RegistryReceipt,
3434
getSigner,
3535
} from "./ethers.js";

src/lowlevel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
type Config,
33
extractBaseUrl,
4+
extractChainId,
45
extractSigner,
56
type Signal,
67
type ReadConfig,
@@ -24,7 +25,7 @@ export async function exec(
2425
{ type, sql, tables: [first] }: ExtractedStatement
2526
): Promise<WaitableTransactionReceipt> {
2627
const signer = await extractSigner(config);
27-
const chainId = await signer.getChainId();
28+
const chainId = await extractChainId(config);
2829
const baseUrl = await extractBaseUrl(config, chainId);
2930
const _config = { baseUrl, signer };
3031
const _params = { chainId, first, statement: sql };

src/registry/contract.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
TablelandTables__factory as Factory,
44
} from "@tableland/evm";
55
import type { Overrides } from "ethers";
6+
// TODO: type Signer has changed.
67
import { getOverrides, type Signer } from "../helpers/ethers.js";
78
import { validateTableName } from "../helpers/parser.js";
89
import { getContractAddress } from "../helpers/chains.js";
@@ -38,7 +39,7 @@ export async function getContractAndOverrides(
3839
chainId: number
3940
): Promise<{ contract: TablelandTables; overrides: Overrides }> {
4041
const address = getContractAddress(chainId);
41-
signer._checkProvider();
42+
4243
const contract = connect(address, signer);
4344
const overrides = await getOverrides({ signer });
4445
return { contract, overrides };

src/registry/controller.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import { Typed } from "ethers";
12
import { type SignerConfig } from "../helpers/config.js";
2-
import { type ContractTransaction } from "../helpers/ethers.js";
3+
import { type ContractTransactionResponse } from "../helpers/ethers.js";
34
import { type TableIdentifier, getContractSetup } from "./contract.js";
45

56
export interface SetParams {
@@ -16,26 +17,35 @@ export interface SetParams {
1617
export async function setController(
1718
{ signer }: SignerConfig,
1819
params: SetParams
19-
): Promise<ContractTransaction> {
20+
): Promise<ContractTransactionResponse> {
2021
const { contract, overrides, tableId } = await getContractSetup(
2122
signer,
2223
params.tableName
2324
);
2425
const caller = await signer.getAddress();
2526
const controller = params.controller;
26-
return await contract.setController(caller, tableId, controller, overrides);
27+
return await contract.setController(
28+
Typed.address(caller),
29+
Typed.uint256(tableId),
30+
Typed.address(controller),
31+
overrides,
32+
);
2733
}
2834

2935
export async function lockController(
3036
{ signer }: SignerConfig,
3137
tableName: string | TableIdentifier
32-
): Promise<ContractTransaction> {
38+
): Promise<ContractTransactionResponse> {
3339
const { contract, overrides, tableId } = await getContractSetup(
3440
signer,
3541
tableName
3642
);
3743
const caller = await signer.getAddress();
38-
return await contract.lockController(caller, tableId, overrides);
44+
return await contract.lockController(
45+
Typed.address(caller),
46+
Typed.uint256(tableId),
47+
overrides,
48+
);
3949
}
4050

4151
export async function getController(
@@ -46,5 +56,5 @@ export async function getController(
4656
signer,
4757
tableName
4858
);
49-
return await contract.getController(tableId, overrides);
59+
return await contract.getController(Typed.uint256(tableId), overrides);
5060
}

src/registry/create.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Typed } from "ethers";
12
import { type SignerConfig } from "../helpers/config.js";
23
import { type ContractTransaction } from "../helpers/ethers.js";
34
import { validateTableName } from "../helpers/parser.js";
@@ -63,5 +64,5 @@ export async function createTable(
6364
signer,
6465
chainId
6566
);
66-
return await contract.createTable(owner, statement, overrides);
67+
return await contract.createTable(Typed.address(owner), Typed.string(statement), overrides);
6768
}

src/registry/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
type SignerConfig,
33
type Signer,
4-
type ContractTransaction,
4+
type ContractTransactionResponse,
55
} from "../helpers/index.js";
66
import { type TableIdentifier } from "./contract.js";
77
import { listTables } from "./tables.js";
@@ -70,7 +70,7 @@ export class Registry {
7070
*
7171
* Requires the msg sender to be the owner, approved, or operator
7272
*/
73-
async safeTransferFrom(params: TransferParams): Promise<ContractTransaction> {
73+
async safeTransferFrom(params: TransferParams): Promise<ContractTransactionResponse> {
7474
return await safeTransferFrom(this.config, params);
7575
}
7676

@@ -98,7 +98,7 @@ export class Registry {
9898
* - `tableId` must exist
9999
* - `tableId` controller must not be locked
100100
*/
101-
async setController(params: SetParams): Promise<ContractTransaction> {
101+
async setController(params: SetParams): Promise<ContractTransactionResponse> {
102102
return await setController(this.config, params);
103103
}
104104

@@ -119,7 +119,7 @@ export class Registry {
119119
*/
120120
async lockController(
121121
table: string | TableIdentifier
122-
): Promise<ContractTransaction> {
122+
): Promise<ContractTransactionResponse> {
123123
return await lockController(this.config, table);
124124
}
125125

@@ -142,7 +142,7 @@ export class Registry {
142142
*
143143
* - contract must be unpaused
144144
*/
145-
async createTable(params: CreateTableParams): Promise<ContractTransaction> {
145+
async createTable(params: CreateTableParams): Promise<ContractTransactionResponse> {
146146
return await createTable(this.config, params);
147147
}
148148

@@ -161,7 +161,7 @@ export class Registry {
161161
* - `caller` must be authorized by the table controller
162162
* - `statement` must be less than or equal to 35000 bytes
163163
*/
164-
async runSQL(params: RunSQLParams): Promise<ContractTransaction> {
164+
async runSQL(params: RunSQLParams): Promise<ContractTransactionResponse> {
165165
return await runSQL(this.config, params);
166166
}
167167
}

0 commit comments

Comments
 (0)