Compare commits

..
54 changed files with 698 additions and 241 deletions
+1
View File
@@ -23,6 +23,7 @@
| Package | Description | Latest Version |
| ---------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [/sdk](./packages/sdk) | Best in class web3 SDK for Browser, Node and Mobile apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/sdk"><img src="https://img.shields.io/npm/v/@thirdweb-dev/sdk?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/wallets](./packages/wallets) | Unified web3 Wallet library to integrate any wallet into your applications. | <a href="https://www.npmjs.com/package/@thirdweb-dev/wallets"><img src="https://img.shields.io/npm/v/@thirdweb-dev/wallets?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react](./packages/react) | Ultimate collection of React hooks for your web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/react-native](./packages/react-native) | Ultimate collection of React hooks for your native mobile web3 apps | <a href="https://www.npmjs.com/package/@thirdweb-dev/react-native"><img src="https://img.shields.io/npm/v/@thirdweb-dev/react-native?color=red&label=npm&logo=npm" alt="npm version"/></a> |
| [/auth](./packages/auth) | Best in class wallet authentication for Node backends | <a href="https://www.npmjs.com/package/@thirdweb-dev/auth"><img src="https://img.shields.io/npm/v/@thirdweb-dev/auth?color=red&label=npm&logo=npm" alt="npm version"/></a> |
+7
View File
@@ -1,5 +1,12 @@
# @thirdweb-dev/auth
## 3.2.40
### Patch Changes
- Updated dependencies [[`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/wallets@1.1.23
## 3.2.39
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "3.2.39",
"version": "3.2.40",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Worldland Mainnet",
"chain": "Worldland",
"rpc": [
"https://worldland.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://seoul.worldland.foundation"
],
"faucets": [],
"nativeCurrency": {
"name": "Worldland",
"symbol": "WL",
"decimals": 18
},
"infoURL": "https://worldland.foundation",
"shortName": "WLC",
"chainId": 103,
"networkId": 103,
"explorers": [
{
"name": "Worldland Explorer",
"url": "https://scan.worldland.foundation",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "worldland"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "Worldland Testnet",
"chain": "Worldland",
"rpc": [
"https://worldland-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://gwangju.worldland.foundation"
],
"faucets": [],
"nativeCurrency": {
"name": "Worldland",
"symbol": "WL",
"decimals": 18
},
"infoURL": "https://worldland.foundation",
"shortName": "TWLC",
"chainId": 10395,
"networkId": 10395,
"explorers": [
{
"name": "Worldland Explorer",
"url": "https://testscan.worldland.foundation",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "worldland-testnet"
} as const satisfies Chain;
+32
View File
@@ -0,0 +1,32 @@
import type { Chain } from "../src/types";
export default {
"name": "Polygon Supernet Arianee",
"chain": "Arianee",
"rpc": [
"https://polygon-supernet-arianee.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.polygonsupernet.public.arianee.net"
],
"faucets": [],
"nativeCurrency": {
"name": "Arianee",
"symbol": "ARIA20",
"decimals": 18
},
"infoURL": "https://arianee.org",
"shortName": "Arianee",
"chainId": 11891,
"networkId": 11891,
"explorers": [
{
"name": "Polygon Supernet Arianee Explorer",
"url": "https://polygonsupernet.explorer.arianee.net",
"standard": "EIP3091"
}
],
"parent": {
"chain": "eip155-1",
"type": "L2"
},
"testnet": false,
"slug": "polygon-supernet-arianee"
} as const satisfies Chain;
+33
View File
@@ -0,0 +1,33 @@
import type { Chain } from "../src/types";
export default {
"name": "Shrapnel Testnet",
"chain": "SHRAPNEL",
"rpc": [
"https://shrapnel-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://subnets.avax.network/shrapnel/testnet/rpc"
],
"features": [
{
"name": "EIP1559"
}
],
"faucets": [],
"nativeCurrency": {
"name": "SHRAPG",
"symbol": "SHRAPG",
"decimals": 18
},
"infoURL": "https://www.shrapnel.com/",
"shortName": "shraptest",
"chainId": 2038,
"networkId": 2038,
"explorers": [
{
"name": "SHRAPNEL Explorer",
"url": "https://subnets-test.avax.network/shrapnel",
"standard": "EIP3091"
}
],
"testnet": true,
"slug": "shrapnel-testnet"
} as const satisfies Chain;
+23
View File
@@ -0,0 +1,23 @@
import type { Chain } from "../src/types";
export default {
"name": "BigShortBets",
"chain": "BIGSB",
"rpc": [
"https://bigshortbets.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://market.bigsb.io",
"wss://market.bigsb.io"
],
"faucets": [],
"nativeCurrency": {
"name": "USD Coin",
"symbol": "USDC",
"decimals": 18
},
"infoURL": "https://bigshortbets.com/",
"shortName": "bigsb",
"chainId": 2137,
"networkId": 2137,
"explorers": [],
"testnet": false,
"slug": "bigshortbets"
} as const satisfies Chain;
+36
View File
@@ -0,0 +1,36 @@
import type { Chain } from "../src/types";
export default {
"name": "ConnectorManager Robin",
"chain": "Rangers",
"icon": {
"url": "ipfs://QmXR5e5SDABWfQn6XT9uMsVYAo5Bv7vUv4jVs8DFqatZWG",
"width": 2000,
"height": 2000,
"format": "png"
},
"rpc": [
"https://connectormanager-robin.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://robin-cm.rangersprotocol.com/api/jsonrpc"
],
"faucets": [
"https://robin-faucet.rangersprotocol.com"
],
"nativeCurrency": {
"name": "Rangers Protocol Gas",
"symbol": "ttRPG",
"decimals": 18
},
"infoURL": "https://rangersprotocol.com",
"shortName": "ttrpg",
"chainId": 38401,
"networkId": 38401,
"explorers": [
{
"name": "rangersscan-robin",
"url": "https://robin-rangersscan.rangersprotocol.com",
"standard": "none"
}
],
"testnet": false,
"slug": "connectormanager-robin"
} as const satisfies Chain;
+43
View File
@@ -0,0 +1,43 @@
import type { Chain } from "../src/types";
export default {
"name": "Tritanium Testnet",
"chain": "TRITANIUM",
"rpc": [
"https://tritanium-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://nodetestnet-station-one.tritanium.network/",
"https://nodetestnet-station-two.tritanium.network/"
],
"faucets": [
"https://faucet.tritanium.network"
],
"nativeCurrency": {
"name": "Tritanium Native Token",
"symbol": "tTRN",
"decimals": 18
},
"infoURL": "https://tritanium.network",
"shortName": "ttrn",
"chainId": 5353,
"networkId": 5353,
"icon": {
"url": "ipfs://QmRm6gcEPJmU9a86zrmyP7FALTN4Toz9HrnrL2Kwg6FPeh",
"width": 512,
"height": 512,
"format": "png"
},
"explorers": [
{
"name": "TRITANIUM Testnet Explorer",
"icon": {
"url": "ipfs://QmRm6gcEPJmU9a86zrmyP7FALTN4Toz9HrnrL2Kwg6FPeh",
"width": 512,
"height": 512,
"format": "png"
},
"url": "https://testnet.tritanium.network",
"standard": "none"
}
],
"testnet": true,
"slug": "tritanium-testnet"
} as const satisfies Chain;
+50
View File
@@ -0,0 +1,50 @@
import type { Chain } from "../src/types";
export default {
"name": "Rethereum Mainnet",
"chain": "RTH",
"rpc": [
"https://rethereum.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.rethereum.org",
"https://rethereum.rpc.restratagem.com",
"https://rpc.rthcentral.org"
],
"faucets": [],
"nativeCurrency": {
"name": "Rethereum",
"symbol": "RTH",
"decimals": 18
},
"features": [
{
"name": "EIP155"
},
{
"name": "EIP1559"
}
],
"infoURL": "https://www.rethereum.org",
"shortName": "rth",
"chainId": 622277,
"networkId": 622277,
"icon": {
"url": "ipfs://bafkreiawlhc2trzyxgnz24vowdymxme2m446uk4vmrplgxsdd74ecpfloq",
"width": 830,
"height": 830,
"format": "png"
},
"explorers": [
{
"name": "rethereum",
"url": "https://explorer.rethereum.org",
"icon": {
"url": "ipfs://QmYtUimyqHkkFxYdbXXRbUqNg2VLPUg6Uu2C2nmFWowiZM",
"width": 551,
"height": 540,
"format": "png"
},
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "rethereum"
} as const satisfies Chain;
+28
View File
@@ -0,0 +1,28 @@
import type { Chain } from "../src/types";
export default {
"name": "JuncaChain",
"chain": "JuncaChain",
"rpc": [
"https://juncachain.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc.juncachain.com"
],
"nativeCurrency": {
"name": "JuncaChain Native Token",
"symbol": "JGC",
"decimals": 18
},
"faucets": [],
"infoURL": "https://junca-cash.world",
"shortName": "junca",
"chainId": 668,
"networkId": 668,
"explorers": [
{
"name": "JuncaScan",
"url": "https://scan.juncachain.com",
"standard": "EIP3091"
}
],
"testnet": false,
"slug": "juncachain"
} as const satisfies Chain;
+14
View File
@@ -1,5 +1,19 @@
# thirdweb
## 0.12.2
### Patch Changes
- [#1562](https://github.com/thirdweb-dev/js/pull/1562) [`04b6ef73`](https://github.com/thirdweb-dev/js/commit/04b6ef73e4641c5284353bffc43dbc5c597405de) Thanks [@Marfuen](https://github.com/Marfuen)! - Logout underlying wallet on logout
- [#1569](https://github.com/thirdweb-dev/js/pull/1569) [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b) Thanks [@Marfuen](https://github.com/Marfuen)! - Use a different globalThis for CLI related flow.
- Updated dependencies [[`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f), [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0), [`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/storage@1.2.10
- @thirdweb-dev/sdk@3.10.59
- @thirdweb-dev/wallets@1.1.23
- @thirdweb-dev/auth@3.2.40
## 0.12.1
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "thirdweb",
"main": "dist/cli/index.js",
"version": "0.12.1",
"version": "0.12.2",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+3 -3
View File
@@ -43,7 +43,7 @@ export async function loginUser(
if (showLogs) {
console.log(chalk.green("You are already logged in"));
}
globalThis["TW_AUTH_TOKEN"] = authToken;
globalThis["TW_CLI_AUTH_TOKEN"] = authToken;
return authToken;
} else {
const token = await authenticateUser({ browser: true, configPaths });
@@ -51,7 +51,7 @@ export async function loginUser(
throw new Error("Failed to login");
}
globalThis["TW_AUTH_TOKEN"] = token;
globalThis["TW_CLI_AUTH_TOKEN"] = token;
return token;
}
}
@@ -59,7 +59,7 @@ export async function loginUser(
export async function logoutUser(credsConfigPath: string, tokenPath: string, cliWalletPath: string) {
try {
ora("Logging out...").start();
const dirExists = fs.existsSync(credsConfigPath) && fs.existsSync(tokenPath);
const dirExists = fs.existsSync(credsConfigPath) && fs.existsSync(tokenPath) && fs.existsSync(cliWalletPath);
if (!dirExists) {
ora().warn(chalk.yellow("You are already logged out, did you mean to login?"));
return;
+2 -1
View File
@@ -1,4 +1,5 @@
/* eslint-disable no-var */
declare module globalThis {
// eslint-disable-next-line no-var
var TW_AUTH_TOKEN: string;
var TW_CLI_AUTH_TOKEN: string;
}
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/react-core
## 3.14.40
### Patch Changes
- Updated dependencies [[`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f), [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0), [`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/storage@1.2.10
- @thirdweb-dev/sdk@3.10.59
- @thirdweb-dev/wallets@1.1.23
- @thirdweb-dev/auth@3.2.40
## 3.14.39
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-core",
"version": "3.14.39",
"version": "3.14.40",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-core",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -1,5 +1,7 @@
# @thirdweb-dev/react-native-compat
## 0.2.59
## 0.2.58
## 0.2.57
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@thirdweb-dev/react-native-compat",
"description": "Shims for Thirdweb in React Native Projects",
"version": "0.2.58",
"version": "0.2.59",
"author": "thirdweb eng <[email protected]>",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-native-compat",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/react-native
## 0.2.59
### Patch Changes
- Updated dependencies [[`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f), [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0), [`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/storage@1.2.10
- @thirdweb-dev/sdk@3.10.59
- @thirdweb-dev/wallets@1.1.23
- @thirdweb-dev/react-core@3.14.40
## 0.2.58
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-native",
"version": "0.2.58",
"version": "0.2.59",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-native",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @thirdweb-dev/react
## 3.14.40
### Patch Changes
- Updated dependencies [[`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/sdk@3.10.59
- @thirdweb-dev/wallets@1.1.23
- @thirdweb-dev/react-core@3.14.40
## 3.14.39
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react",
"version": "3.14.39",
"version": "3.14.40",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+15
View File
@@ -1,5 +1,20 @@
# @thirdweb-dev/sdk
## 3.10.59
### Patch Changes
- [#1567](https://github.com/thirdweb-dev/js/pull/1567) [`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Fix constructor param encoding for deterministic deployments
- [#1568](https://github.com/thirdweb-dev/js/pull/1568) [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Better fee calculations for OP stack
- [#1572](https://github.com/thirdweb-dev/js/pull/1572) [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Dynamic gas fee estimations
- [#1569](https://github.com/thirdweb-dev/js/pull/1569) [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b) Thanks [@Marfuen](https://github.com/Marfuen)! - Use a different globalThis for CLI related flow.
- Updated dependencies [[`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f), [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/storage@1.2.10
## 3.10.58
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/sdk",
"version": "3.10.58",
"version": "3.10.59",
"description": "The main thirdweb SDK.",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/sdk",
"license": "Apache-2.0",
@@ -48,17 +48,24 @@ export async function directDeployDeterministic(
const create2Factory = await deployCreate2Factory(signer);
// 2. Encode constructor params
const constructorParamTypes = extractConstructorParamsFromAbi(abi).map(
(p) => {
return p.type;
},
);
const constructorParams = extractConstructorParamsFromAbi(abi);
const constructorParamTypes = constructorParams.map((p) => {
return p.type;
});
const paramValues = convertParamValues(
constructorParamTypes,
constructorArgs,
);
const paramTypesForEncoder = constructorParams.map((p) => {
if (p.type === "tuple[]") {
return utils.ParamType.from(p);
} else {
return p.type;
}
});
const encodedArgs = utils.defaultAbiCoder.encode(
constructorParamTypes,
paramTypesForEncoder,
paramValues,
);
@@ -212,18 +219,24 @@ export async function predictAddressDeterministic(
const create2Factory = await getCreate2FactoryAddress(provider);
// 2. Encode constructor params
const constructorParamTypes = extractConstructorParamsFromAbi(abi).map(
(p) => {
return p.type;
},
);
const constructorParams = extractConstructorParamsFromAbi(abi);
const constructorParamTypes = constructorParams.map((p) => {
return p.type;
});
const paramValues = convertParamValues(
constructorParamTypes,
constructorArgs,
);
const paramTypesForEncoder = constructorParams.map((p) => {
if (p.type === "tuple[]") {
return utils.ParamType.from(p);
} else {
return p.type;
}
});
const encodedArgs = utils.defaultAbiCoder.encode(
constructorParamTypes,
paramTypesForEncoder,
paramValues,
);
+103 -1
View File
@@ -1,6 +1,108 @@
import { ChainId } from "../constants/chains/ChainId";
import fetch from "cross-fetch";
import { BigNumber, utils } from "ethers";
import { BigNumber, utils, providers } from "ethers";
import { Mumbai, Polygon } from "@thirdweb-dev/chains";
import { isBrowser } from "./utils";
type FeeData = {
maxFeePerGas: null | BigNumber;
maxPriorityFeePerGas: null | BigNumber;
};
export async function getDefaultGasOverrides(provider: providers.Provider) {
// If we're running in the browser, let users configure gas price in their wallet UI
if (isBrowser()) {
return {};
}
// handle smart wallet provider
if ((provider as any).originalProvider) {
provider = (provider as any).originalProvider;
}
const feeData = await getDynamicFeeData(
provider as providers.JsonRpcProvider,
);
if (feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {
return {
maxFeePerGas: feeData.maxPriorityFeePerGas,
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,
};
} else {
return {
gasPrice: await getGasPrice(provider),
};
}
}
export async function getDynamicFeeData(
provider: providers.JsonRpcProvider,
): Promise<FeeData> {
let maxFeePerGas: null | BigNumber = null;
let maxPriorityFeePerGas: null | BigNumber = null;
const [chainId, block, eth_maxPriorityFeePerGas] = await Promise.all([
(await provider.getNetwork()).chainId,
await provider.getBlock("latest"),
await provider.send("eth_maxPriorityFeePerGas", []).catch(() => null),
]);
const baseBlockFee =
block && block.baseFeePerGas
? block.baseFeePerGas
: utils.parseUnits("100", "wei");
if (chainId === Mumbai.chainId || chainId === Polygon.chainId) {
// for polygon, get fee data from gas station
maxPriorityFeePerGas = await getPolygonGasPriorityFee(chainId);
console.log(
"DYNAMIC: polygon fee",
utils.formatUnits(maxPriorityFeePerGas, "gwei"),
);
} else if (eth_maxPriorityFeePerGas) {
// prioritize fee from eth_maxPriorityFeePerGas
maxPriorityFeePerGas = BigNumber.from(eth_maxPriorityFeePerGas);
} else {
// if eth_maxPriorityFeePerGas is not available, use 1.5 gwei default
const feeData = await provider.getFeeData();
maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;
if (!maxPriorityFeePerGas) {
// chain does not support eip-1559, return null for both
return { maxFeePerGas: null, maxPriorityFeePerGas: null };
}
}
// eip-1559 formula, with an extra 10% tip to account for gas volatility
maxFeePerGas = baseBlockFee
.mul(2)
.add(getPreferredPriorityFee(maxPriorityFeePerGas));
return { maxFeePerGas, maxPriorityFeePerGas };
}
function getPreferredPriorityFee(
defaultPriorityFeePerGas: BigNumber,
percentMultiplier: number = 10,
): BigNumber {
const extraTip = defaultPriorityFeePerGas.div(100).mul(percentMultiplier); // + 10%
const txGasPrice = defaultPriorityFeePerGas.add(extraTip);
return txGasPrice;
}
export async function getGasPrice(
provider: providers.Provider,
): Promise<BigNumber> {
const gasPrice = await provider.getGasPrice();
const maxGasPrice = utils.parseUnits("300", "gwei"); // 300 gwei
const extraTip = gasPrice.div(100).mul(10); // + 10%
const txGasPrice = gasPrice.add(extraTip);
if (txGasPrice.gt(maxGasPrice)) {
return maxGasPrice;
}
return txGasPrice;
}
/**
* @internal
+1 -4
View File
@@ -12,10 +12,7 @@ export * from "./addresses/getDefaultTrustedForwarders";
export * from "./chains/ChainId";
export * from "./chains/SUPPORTED_CHAIN_ID";
export * from "./chains/SUPPORTED_CHAIN_IDS";
export {
setSupportedChains,
getSupportedChains,
} from "./chains/supportedChains";
export * from "./chains/supportedChains";
export * from "./contract";
export * from "./currency";
+8 -1
View File
@@ -240,10 +240,17 @@ export function getProviderFromRpcUrl(
headers["authorization"] = `Bearer ${
(globalThis as any).TW_AUTH_TOKEN as string
}`;
headers["x-authorize-wallet"] = "true";
authStrategy = "twAuthToken";
}
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
headers["x-authorize-wallet"] = "true";
}
const bundleId =
typeof globalThis !== "undefined" && "APP_BUNDLE_ID" in globalThis
? ((globalThis as any).APP_BUNDLE_ID as string)
@@ -27,14 +27,12 @@ import {
ForwardRequest,
getAndIncrementNonce,
} from "../../common/forwarder";
import { getPolygonGasPriorityFee } from "../../common/gas-price";
import { getDefaultGasOverrides } from "../../common/gas-price";
import { fetchContractMetadataFromAddress } from "../../common/metadata-resolver";
import { signEIP2612Permit } from "../../common/permit";
import { signTypedDataInternal } from "../../common/sign";
import { isBrowser } from "../../common/utils";
import { CONTRACT_ADDRESSES } from "../../constants/addresses/CONTRACT_ADDRESSES";
import { getContractAddressByChainId } from "../../constants/addresses/getContractAddressByChainId";
import { ChainId } from "../../constants/chains/ChainId";
import { EventType } from "../../constants/events";
import { AbiSchema, ContractSource } from "../../schema/contracts/custom";
import { SDKOptions } from "../../schema/sdk-options";
@@ -133,105 +131,7 @@ export class ContractWrapper<
* @internal
*/
public async getCallOverrides(): Promise<CallOverrides> {
if (isBrowser()) {
// When running in the browser, let the wallet suggest gas estimates
// this means that the gas speed preferences set in the SDK options are ignored in a browser context
// but it also allows users to select their own gas speed prefs per tx from their wallet directly
return {};
}
const feeData = await this.getProvider().getFeeData();
const supports1559 = feeData.maxFeePerGas && feeData.maxPriorityFeePerGas;
if (supports1559) {
const chainId = await this.getChainID();
const block = await this.getProvider().getBlock("latest");
const baseBlockFee =
block && block.baseFeePerGas
? block.baseFeePerGas
: utils.parseUnits("1", "gwei");
let defaultPriorityFee: BigNumber;
if (chainId === ChainId.Mumbai || chainId === ChainId.Polygon) {
// for polygon, get fee data from gas station
defaultPriorityFee = await getPolygonGasPriorityFee(chainId);
} else {
// otherwise get it from ethers
defaultPriorityFee = BigNumber.from(feeData.maxPriorityFeePerGas);
}
// then add additional fee based on user preferences
const maxPriorityFeePerGas =
this.getPreferredPriorityFee(defaultPriorityFee);
// See: https://eips.ethereum.org/EIPS/eip-1559 for formula
const baseMaxFeePerGas = baseBlockFee.mul(2);
const maxFeePerGas = baseMaxFeePerGas.add(maxPriorityFeePerGas);
return {
maxFeePerGas,
maxPriorityFeePerGas,
};
} else {
return {
gasPrice: await this.getPreferredGasPrice(),
};
}
}
/**
* Calculates the priority fee per gas according to user preferences
* @param defaultPriorityFeePerGas - the base priority fee
*/
private getPreferredPriorityFee(
defaultPriorityFeePerGas: BigNumber,
): BigNumber {
const speed = this.options.gasSettings.speed;
const maxGasPrice = this.options.gasSettings.maxPriceInGwei;
let extraTip;
switch (speed) {
case "standard":
extraTip = BigNumber.from(0); // default is 2.5 gwei for ETH, 31 gwei for polygon
break;
case "fast":
extraTip = defaultPriorityFeePerGas.div(100).mul(5); // + 5% - 2.625 gwei / 32.5 gwei
break;
case "fastest":
extraTip = defaultPriorityFeePerGas.div(100).mul(10); // + 10% - 2.75 gwei / 34.1 gwei
break;
}
let txGasPrice = defaultPriorityFeePerGas.add(extraTip);
const max = utils.parseUnits(maxGasPrice.toString(), "gwei"); // no more than max gas setting
const min = utils.parseUnits("2.5", "gwei"); // no less than 2.5 gwei
if (txGasPrice.gt(max)) {
txGasPrice = max;
}
if (txGasPrice.lt(min)) {
txGasPrice = min;
}
return txGasPrice;
}
/**
* Calculates the gas price for transactions according to user preferences
*/
public async getPreferredGasPrice(): Promise<BigNumber> {
const gasPrice = await this.getProvider().getGasPrice();
const speed = this.options.gasSettings.speed;
const maxGasPrice = this.options.gasSettings.maxPriceInGwei;
let txGasPrice = gasPrice;
let extraTip;
switch (speed) {
case "standard":
extraTip = BigNumber.from(1); // min 1 wei
break;
case "fast":
extraTip = gasPrice.div(100).mul(5); // + 5%
break;
case "fastest":
extraTip = gasPrice.div(100).mul(10); // + 10%
break;
}
txGasPrice = txGasPrice.add(extraTip);
const max = utils.parseUnits(maxGasPrice.toString(), "gwei");
if (txGasPrice.gt(max)) {
txGasPrice = max;
}
return txGasPrice;
return getDefaultGasOverrides(this.getProvider());
}
/**
@@ -35,7 +35,7 @@ export class GasCostEstimator<TContract extends BaseContract> {
fn: keyof TContract["functions"] | (string & {}),
args: Parameters<TContract["functions"][typeof fn]> | any[],
): Promise<string> {
const price = await this.contractWrapper.getPreferredGasPrice();
const price = await this.contractWrapper.getProvider().getGasPrice();
const gasUnits = await this.contractWrapper.estimateGas(fn, args);
return utils.formatEther(gasUnits.mul(price));
}
@@ -1,10 +1,8 @@
import { TransactionError, parseRevertReason } from "../../common/error";
import { getPolygonGasPriorityFee } from "../../common/gas-price";
import { getDefaultGasOverrides, getGasPrice } from "../../common/gas-price";
import { fetchContractMetadataFromAddress } from "../../common/metadata-resolver";
import { fetchSourceFilesFromMetadata } from "../../common/fetchSourceFilesFromMetadata";
import { isRouterContract } from "../../common/plugin/isRouterContract";
import { isBrowser } from "../../common/utils";
import { ChainId } from "../../constants/chains/ChainId";
import { ContractSource } from "../../schema/contracts/custom";
import { SDKOptionsOutput } from "../../schema/sdk-options";
import type {
@@ -205,16 +203,7 @@ abstract class TransactionContext {
* Calculates the gas price for transactions (adding a 10% tip buffer)
*/
public async getGasPrice(): Promise<BigNumber> {
const gasPrice = await this.provider.getGasPrice();
const maxGasPrice = utils.parseUnits("300", "gwei"); // 300 gwei
const extraTip = gasPrice.div(100).mul(10); // + 10%
const txGasPrice = gasPrice.add(extraTip);
if (txGasPrice.gt(maxGasPrice)) {
return maxGasPrice;
}
return txGasPrice;
return getGasPrice(this.provider);
}
/**
@@ -228,43 +217,7 @@ abstract class TransactionContext {
* Get gas overrides for the transaction
*/
protected async getGasOverrides() {
// If we're running in the browser, let users configure gas price in their wallet UI
if (isBrowser()) {
return {};
}
const feeData = await this.provider.getFeeData();
const supports1559 = feeData.maxFeePerGas && feeData.maxPriorityFeePerGas;
if (supports1559) {
const chainId = (await this.provider.getNetwork()).chainId;
const block = await this.provider.getBlock("latest");
const baseBlockFee =
block && block.baseFeePerGas
? block.baseFeePerGas
: utils.parseUnits("1", "gwei");
let defaultPriorityFee: BigNumber;
if (chainId === ChainId.Mumbai || chainId === ChainId.Polygon) {
// for polygon, get fee data from gas station
defaultPriorityFee = await getPolygonGasPriorityFee(chainId);
} else {
// otherwise get it from ethers
defaultPriorityFee = BigNumber.from(feeData.maxPriorityFeePerGas);
}
// then add additional fee based on user preferences
const maxPriorityFeePerGas =
this.getPreferredPriorityFee(defaultPriorityFee);
// See: https://eips.ethereum.org/EIPS/eip-1559 for formula
const baseMaxFeePerGas = baseBlockFee.mul(2);
const maxFeePerGas = baseMaxFeePerGas.add(maxPriorityFeePerGas);
return {
maxFeePerGas,
maxPriorityFeePerGas,
};
} else {
return {
gasPrice: await this.getGasPrice(),
};
}
return getDefaultGasOverrides(this.provider);
}
/**
@@ -275,16 +228,6 @@ abstract class TransactionContext {
): BigNumber {
const extraTip = defaultPriorityFeePerGas.div(100).mul(10); // + 10%
const txGasPrice = defaultPriorityFeePerGas.add(extraTip);
const maxGasPrice = utils.parseUnits("300", "gwei"); // no more than 300 gwei
const minGasPrice = utils.parseUnits("2.5", "gwei"); // no less than 2.5 gwei
if (txGasPrice.gt(maxGasPrice)) {
return maxGasPrice;
}
if (txGasPrice.lt(minGasPrice)) {
return minGasPrice;
}
return txGasPrice;
}
}
+2 -1
View File
@@ -1,4 +1,5 @@
/* eslint-disable no-var */
declare module globalThis {
// eslint-disable-next-line no-var
var TW_AUTH_TOKEN: string;
var TW_CLI_AUTH_TOKEN: string;
}
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/service-utils
## 0.4.4
### Patch Changes
- [#1566](https://github.com/thirdweb-dev/js/pull/1566) [`d378106a`](https://github.com/thirdweb-dev/js/commit/d378106a852f941779bb72ac1841bddf34fc15a6) Thanks [@ElasticBottle](https://github.com/ElasticBottle)! - docs(service-utils): Add documentation for authorizeNode for node auth function
- [#1569](https://github.com/thirdweb-dev/js/pull/1569) [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b) Thanks [@Marfuen](https://github.com/Marfuen)! - Use a different globalThis for CLI related flow.
- [#1559](https://github.com/thirdweb-dev/js/pull/1559) [`13ef6a50`](https://github.com/thirdweb-dev/js/commit/13ef6a50cf10b442b2b54b780e42210cab2db762) Thanks [@assimovt](https://github.com/assimovt)! - expose account status in api key metadata
## 0.4.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/service-utils",
"version": "0.4.3",
"version": "0.4.4",
"main": "dist/thirdweb-dev-service-utils.cjs.js",
"module": "dist/thirdweb-dev-service-utils.esm.js",
"exports": {
+18 -5
View File
@@ -1,5 +1,6 @@
import type { ServiceName } from "./services";
export type CoreServiceConfig = {
enforceAuth: boolean;
apiUrl: string;
@@ -13,6 +14,8 @@ export type ApiKeyMetadata = {
id: string;
key: string;
accountId: string;
accountStatus: "noCustomer" | "noPayment" | "validPayment" | "invalidPayment";
accountPlan: "free" | "enterprise";
creatorWalletAddress: string;
secretHash: string;
walletAddresses: string[];
@@ -62,11 +65,15 @@ export async function fetchKeyMetadataFromApi(
"content-type": "application/json",
},
});
let json: ApiResponse
let json: ApiResponse;
try {
json = await response.json();
} catch (e) {
throw new Error(`Error fetching key metadata from API: ${response.status} - ${response.statusText} - ${await response.text()}`);
throw new Error(
`Error fetching key metadata from API: ${response.status} - ${
response.statusText
} - ${await response.text()}`,
);
}
return json;
}
@@ -77,7 +84,9 @@ export async function fetchAccountFromApi(
useWalletAuth: boolean,
): Promise<ApiAccountResponse> {
const { apiUrl, serviceApiKey } = config;
const url = useWalletAuth ? `${apiUrl}/v1/wallet/me` : `${apiUrl}/v1/account/me`
const url = useWalletAuth
? `${apiUrl}/v1/wallet/me`
: `${apiUrl}/v1/account/me`;
const response = await fetch(url, {
method: "GET",
headers: {
@@ -86,11 +95,15 @@ export async function fetchAccountFromApi(
authorization: `Bearer ${jwt}`,
},
});
let json: ApiAccountResponse
let json: ApiAccountResponse;
try {
json = await response.json();
} catch (e) {
throw new Error(`Error fetching account from API: ${response.status} - ${response.statusText} - ${await response.text()}`);
throw new Error(
`Error fetching account from API: ${response.status} - ${
response.statusText
} - ${await response.text()}`,
);
}
return json;
}
@@ -12,6 +12,8 @@ describe("authorizeClient", () => {
bundleIds: ["com.example.app"],
services: [],
accountId: "test-account-id",
accountStatus: "noCustomer",
accountPlan: "free",
};
const validAuthOptions: ClientAuthorizationPayload = {
@@ -11,6 +11,8 @@ describe("authorizeService", () => {
domains: [],
bundleIds: [],
accountId: "test-account-id",
accountStatus: "noCustomer",
accountPlan: "free",
services: [
{
name: "storage",
+19 -2
View File
@@ -1,12 +1,12 @@
import { createHash } from "node:crypto";
import { authorize } from "../core/authorize";
import type { ServerResponse } from "http";
import type { IncomingHttpHeaders, IncomingMessage } from "node:http";
import type { AuthorizationInput } from "../core/authorize";
import type { CoreServiceConfig } from "../core/api";
import type { AuthorizationInput } from "../core/authorize";
import type { AuthorizationResult } from "../core/authorize/types";
import type { CoreAuthInput } from "../core/types";
import type { ServerResponse } from "http";
export * from "../core/services";
@@ -16,6 +16,23 @@ export type AuthInput = CoreAuthInput & {
req: IncomingMessage;
};
/**
*
* @param {AuthInput['req']} authInput.req - The incoming request from which information will be pulled from. These information includes (checks are in order and terminates on first match):
* - clientId: Checks header `x-client-id`, search param `clientId`
* - bundleId: Checks header `x-bundle-id`, search param `bundleId`
* - secretKey: Checks header `x-secret-key`
* - origin (the requesting domain): Checks header `origin`, `referer`
* @param {AuthInput['clientId']} authInput.clientId - Overrides any clientId found on the `req` object
* @param {AuthInput['targetAddress']} authInput.targetAddress - Only used in smart wallets to determine if the request is authorized to interact with the target address.
* @param {NodeServiceConfig['enforceAuth']} serviceConfig - Always `true` unless you need to turn auth off. Tells the service whether or not to enforce auth.
* @param {NodeServiceConfig['apiUrl']} serviceConfig.apiUrl - The url of the api server to fetch information for verification. `https://api.thirdweb.com` for production and `https://api.staging.thirdweb.com` for staging
* @param {NodeServiceConfig['serviceApiKey']} serviceConfig.serviceApiKey - secret key to be used authenticate the caller of the api-server. Check the api-server's env variable for the keys.
* @param {NodeServiceConfig['serviceScope']} serviceConfig.serviceScope - The service that we are requesting authorization for. E.g. `relayer`, `rpc`, 'bundler', 'storage' etc.
* @param {NodeServiceConfig['serviceAction']} serviceConfig.serviceAction - Needed when the `serviceScope` is `storage`. Can be either `read` or `write`.
* @param {NodeServiceConfig['useWalletAuth']} serviceConfig.useWalletAuth - If true it pings the `wallet/me` or else, `account/me`. You most likely can leave this as false.
* @returns {AuthorizationResult} authorizationResult - contains if the request is authorized, and information about the account if it is authorized. Otherwise, it contains the error message and status code.
*/
export async function authorizeNode(
authInput: AuthInput,
serviceConfig: NodeServiceConfig,
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/storage
## 1.2.10
### Patch Changes
- [#1565](https://github.com/thirdweb-dev/js/pull/1565) [`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - [Storage] Up default download timeout to 60s + expose option to override
- [#1564](https://github.com/thirdweb-dev/js/pull/1564) [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0) Thanks [@nessup](https://github.com/nessup)! - Improve IPFS upload error logging in Node
- [#1569](https://github.com/thirdweb-dev/js/pull/1569) [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b) Thanks [@Marfuen](https://github.com/Marfuen)! - Use a different globalThis for CLI related flow.
## 1.2.9
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/storage",
"version": "1.2.9",
"version": "1.2.10",
"main": "dist/thirdweb-dev-storage.cjs.js",
"module": "dist/thirdweb-dev-storage.esm.js",
"browser": {
@@ -29,15 +29,18 @@ import pkg from "../../../package.json";
* @public
*/
export class StorageDownloader implements IStorageDownloader {
DEFAULT_TIMEOUT_IN_SECONDS = 30;
DEFAULT_TIMEOUT_IN_SECONDS = 60;
DEFAULT_MAX_RETRIES = 3;
private secretKey?: string;
private clientId?: string;
private defaultTimeout: number;
constructor(options: IpfsDownloaderOptions) {
this.secretKey = options.secretKey;
this.clientId = options.clientId;
this.defaultTimeout =
options.timeoutInSeconds || this.DEFAULT_TIMEOUT_IN_SECONDS;
}
async download(
@@ -105,17 +108,28 @@ export class StorageDownloader implements IStorageDownloader {
headers = {
...headers,
authorization: `Bearer ${(globalThis as any).TW_AUTH_TOKEN as string}`,
"x-authorize-wallet": 'true',
};
}
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
headers = {
...headers,
authorization: `Bearer ${(globalThis as any).TW_CLI_AUTH_TOKEN as string}`,
};
headers["x-authorize-wallet"] = "true";
}
headers["x-sdk-version"] = pkg.version;
headers["x-sdk-name"] = pkg.name;
headers["x-sdk-platform"] = bundleId
? "react-native"
: isBrowser()
? "browser"
: "node";
? "browser"
: "node";
}
if (isTooManyRequests(resolvedUri)) {
@@ -124,8 +138,7 @@ export class StorageDownloader implements IStorageDownloader {
}
const controller = new AbortController();
const timeoutInSeconds =
options?.timeoutInSeconds || this.DEFAULT_TIMEOUT_IN_SECONDS;
const timeoutInSeconds = options?.timeoutInSeconds || this.defaultTimeout;
const timeout = setTimeout(
() => controller.abort(),
timeoutInSeconds * 1000,
@@ -142,10 +155,9 @@ export class StorageDownloader implements IStorageDownloader {
if (!("status" in resOrErr)) {
// early exit if we don't have a status code
throw new Error(
`Request timed out after ${timeoutInSeconds} seconds. ${
isTwGatewayUrl(resolvedUri)
? "You can update the timeoutInSeconds option to increase the timeout."
: "You're using a public IPFS gateway, pass in a clientId or secretKey for a reliable IPFS gateway."
`Request timed out after ${timeoutInSeconds} seconds. ${isTwGatewayUrl(resolvedUri)
? "You can update the timeoutInSeconds option to increase the timeout."
: "You're using a public IPFS gateway, pass in a clientId or secretKey for a reliable IPFS gateway."
}`,
);
}
@@ -289,7 +289,7 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
bundleId ? "react-native" : isBrowser() ? "browser" : "node",
);
// if we have a authorization token on global context then add that to the headers
// if we have a authorization token on global context then add that to the headers, this is for the dashboard.
if (
typeof globalThis !== "undefined" &&
"TW_AUTH_TOKEN" in globalThis &&
@@ -299,6 +299,18 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
"authorization",
`Bearer ${(globalThis as any).TW_AUTH_TOKEN as string}`,
);
}
// CLI auth token
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
xhr.setRequestHeader(
"authorization",
`Bearer ${(globalThis as any).TW_CLI_AUTH_TOKEN as string}`,
);
xhr.setRequestHeader(
"x-authorize-wallet",
`true`,
@@ -331,7 +343,7 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
headers["x-bundle-id"] = (globalThis as any).APP_BUNDLE_ID as string;
}
// if we have a authorization token on global context then add that to the headers
// if we have a authorization token on global context then add that to the headers, this is for the dashboard.
if (
typeof globalThis !== "undefined" &&
"TW_AUTH_TOKEN" in globalThis &&
@@ -339,6 +351,16 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
) {
headers["authorization"] = `Bearer ${(globalThis as any).TW_AUTH_TOKEN as string
}`;
}
// CLI auth token
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
headers["authorization"] = `Bearer ${(globalThis as any).TW_CLI_AUTH_TOKEN as string
}`;
headers["x-authorize-wallet"] = "true";
}
@@ -357,14 +379,14 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
"Unauthorized - You don't have permission to use this service.",
);
}
throw new Error("Failed to upload files to IPFS");
throw new Error(`Failed to upload files to IPFS - ${res.status} - ${res.statusText} - ${await res.text()}`);
}
const body = await res.json();
const cid = body.IpfsHash;
if (!cid) {
throw new Error("Failed to upload files to IPFS");
throw new Error("Failed to upload files to IPFS - Bad CID");
}
if (options?.uploadWithoutDirectory) {
+4
View File
@@ -31,6 +31,10 @@ export type IpfsDownloaderOptions = {
* You can get a clientId here: https://thirdweb.com/create-api-key
*/
clientId?: string;
/**
* Optional timeout in seconds for the download request, overrides the default timeout
*/
timeoutInSeconds?: number;
};
export type SingleDownloadOptions = {
+2 -1
View File
@@ -1,4 +1,5 @@
/* eslint-disable no-var */
declare module globalThis {
// eslint-disable-next-line no-var
var TW_AUTH_TOKEN: string;
var TW_CLI_AUTH_TOKEN: string;
}
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/unity-js-bridge
## 0.2.77
### Patch Changes
- Updated dependencies [[`3eb9592e`](https://github.com/thirdweb-dev/js/commit/3eb9592e10154e06d2fa5effbc0c1a483f62498f), [`066b9cfa`](https://github.com/thirdweb-dev/js/commit/066b9cfa09df2531c9e5440477a24edc1374e0e0), [`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/storage@1.2.10
- @thirdweb-dev/sdk@3.10.59
- @thirdweb-dev/wallets@1.1.23
- @thirdweb-dev/auth@3.2.40
## 0.2.76
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/unity-js-bridge",
"version": "0.2.76",
"version": "0.2.77",
"main": "dist/thirdweb-unity-bridge.js",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/unity-js-bridge",
"license": "Apache-2.0",
+13
View File
@@ -1,5 +1,18 @@
# @thirdweb-dev/wallets
## 1.1.23
### Patch Changes
- [#1568](https://github.com/thirdweb-dev/js/pull/1568) [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Better fee calculations for OP stack
- [#1572](https://github.com/thirdweb-dev/js/pull/1572) [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Dynamic gas fee estimations
- [#1569](https://github.com/thirdweb-dev/js/pull/1569) [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b) Thanks [@Marfuen](https://github.com/Marfuen)! - Use a different globalThis for CLI related flow.
- Updated dependencies [[`a00cbaf7`](https://github.com/thirdweb-dev/js/commit/a00cbaf78c05ea43d3814ba9f9ec8e667f0ddb25), [`a023cb8c`](https://github.com/thirdweb-dev/js/commit/a023cb8cf1e4f08be56a2e33c146c8d307c80f40), [`2088de1c`](https://github.com/thirdweb-dev/js/commit/2088de1cacbc903d4f18a84c21a8f27af8d06b29), [`1e6f9dcc`](https://github.com/thirdweb-dev/js/commit/1e6f9dcc04022c6a8a39d490123a3e22e52b5e0b)]:
- @thirdweb-dev/sdk@3.10.59
## 1.1.22
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/wallets",
"version": "1.1.22",
"version": "1.1.23",
"main": "dist/thirdweb-dev-wallets.cjs.js",
"module": "dist/thirdweb-dev-wallets.esm.js",
"types": "dist/thirdweb-dev-wallets.cjs.d.ts",
@@ -1,4 +1,5 @@
/* eslint-disable no-var */
declare module globalThis {
// eslint-disable-next-line no-var
var TW_AUTH_TOKEN: string;
var TW_CLI_AUTH_TOKEN: string;
}
@@ -18,10 +18,8 @@ import {
CeloAlfajoresTestnet,
CeloBaklavaTestnet,
Celo,
Mumbai,
Polygon,
} from "@thirdweb-dev/chains";
import { getPolygonGasPriorityFee } from "@thirdweb-dev/sdk";
import { getDynamicFeeData } from "@thirdweb-dev/sdk";
export interface BaseApiParams {
provider: providers.Provider;
@@ -293,7 +291,9 @@ export abstract class BaseAccountAPI {
let { maxFeePerGas, maxPriorityFeePerGas } = info;
if (!maxFeePerGas || !maxPriorityFeePerGas) {
const feeData = await this.provider.getFeeData();
const feeData = await getDynamicFeeData(
this.provider as providers.JsonRpcProvider,
);
if (!maxPriorityFeePerGas) {
maxPriorityFeePerGas = feeData.maxPriorityFeePerGas ?? undefined;
}
@@ -309,22 +309,6 @@ export abstract class BaseAccountAPI {
) {
maxPriorityFeePerGas = maxFeePerGas;
}
if (
maxPriorityFeePerGas &&
(chainId === Mumbai.chainId || chainId === Polygon.chainId)
) {
// for polygon/mumbai, override fee data from gas station
const block = await this.provider.getBlock("latest");
const baseBlockFee =
block && block.baseFeePerGas
? block.baseFeePerGas
: utils.parseUnits("1", "gwei");
maxPriorityFeePerGas = await getPolygonGasPriorityFee(chainId);
// See: https://eips.ethereum.org/EIPS/eip-1559 for formula
const baseMaxFeePerGas = baseBlockFee.mul(2);
maxFeePerGas = baseMaxFeePerGas.add(maxPriorityFeePerGas);
}
}
}
@@ -46,6 +46,7 @@ export class HttpRpcClient {
}
}
// Dashboard token
if (
typeof globalThis !== "undefined" &&
"TW_AUTH_TOKEN" in globalThis &&
@@ -54,6 +55,17 @@ export class HttpRpcClient {
headers["authorization"] = `Bearer ${
(globalThis as any).TW_AUTH_TOKEN as string
}`;
}
// CLI token
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
headers["authorization"] = `Bearer ${
(globalThis as any).TW_CLI_AUTH_TOKEN as string
}`;
headers["x-authorize-wallet"] = "true";
}
@@ -52,12 +52,23 @@ class VerifyingPaymasterAPI extends PaymasterAPI {
headers["x-bundle-id"] = (globalThis as any).APP_BUNDLE_ID as string;
}
}
// Dashboard token.
if (
typeof globalThis !== "undefined" &&
"TW_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_AUTH_TOKEN === "string"
) {
headers["authorization"] = `Bearer ${(globalThis as any).TW_AUTH_TOKEN as string}`;
}
// CLI token.
if (
typeof globalThis !== "undefined" &&
"TW_CLI_AUTH_TOKEN" in globalThis &&
typeof (globalThis as any).TW_CLI_AUTH_TOKEN === "string"
) {
headers["authorization"] = `Bearer ${(globalThis as any).TW_CLI_AUTH_TOKEN as string}`;
headers["x-authorize-wallet"] = "true";
}
}