Compare commits
23
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
507d0e5bf4 | ||
|
|
79e6a047d6 | ||
|
|
4dce62de1c | ||
|
|
1c533efcd5 | ||
|
|
eca6217f77 | ||
|
|
df84f9c4ce | ||
|
|
17c0e6f282 | ||
|
|
d51c1883af | ||
|
|
9cf3a1d663 | ||
|
|
c94bcd574a | ||
|
|
41c6d04c2f | ||
|
|
3a78041de7 | ||
|
|
8b74602e3b | ||
|
|
f9081d58d4 | ||
|
|
b051d844d0 | ||
|
|
f8e0c5f84b | ||
|
|
476b6cc271 | ||
|
|
ffaff744f7 | ||
|
|
198f72c493 | ||
|
|
5cb580e99e | ||
|
|
eff710738c | ||
|
|
fb6a07d4b8 | ||
|
|
7768067bf4 |
@@ -106,7 +106,7 @@ jobs:
|
||||
|
||||
- name: Install Yarn (if needed)
|
||||
if: matrix.package_manager == 'yarn'
|
||||
run: npm install -g yarn
|
||||
run: npm install -g yarn@1.22.19
|
||||
|
||||
- name: Create test project
|
||||
run: |
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { getContract } from "thirdweb";
|
||||
import { zkSyncSepolia } from "thirdweb/chains";
|
||||
import { baseSepolia } from "thirdweb/chains";
|
||||
import { THIRDWEB_CLIENT } from "../../lib/client";
|
||||
|
||||
export const chain = zkSyncSepolia;
|
||||
export const editionDropAddress = "0xd563ACBeD80e63B257B2524562BdD7Ec666eEE77";
|
||||
export const chain = baseSepolia;
|
||||
export const editionDropAddress = "0x638263e3eAa3917a53630e61B1fBa685308024fa";
|
||||
export const editionDropTokenId = 0n;
|
||||
|
||||
export const editionDropContract = getContract({
|
||||
|
||||
@@ -12,7 +12,6 @@ import {
|
||||
useReadContract,
|
||||
} from "thirdweb/react";
|
||||
import { THIRDWEB_CLIENT } from "../../lib/client";
|
||||
import { CodeExample } from "../code/code-example";
|
||||
import { editionDropContract, editionDropTokenId } from "./constants";
|
||||
|
||||
export function SponsoredTxPreview() {
|
||||
@@ -50,7 +49,7 @@ export function SponsoredTxPreview() {
|
||||
/>
|
||||
) : null}
|
||||
{smartAccount ? (
|
||||
<>
|
||||
<div className="flex flex-col justify-center p-8">
|
||||
<p className="font-semibold text-center mb-2">
|
||||
You own {ownedNfts?.[0]?.quantityOwned.toString() || "0"}{" "}
|
||||
Kittens
|
||||
@@ -73,7 +72,7 @@ export function SponsoredTxPreview() {
|
||||
>
|
||||
Mint
|
||||
</TransactionButton>
|
||||
</>
|
||||
</div>
|
||||
) : (
|
||||
<p
|
||||
style={{
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
# @thirdweb-dev/auth
|
||||
|
||||
## 4.1.95
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.5.37
|
||||
|
||||
## 4.1.94
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.5.36
|
||||
|
||||
## 4.1.93
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/wallets@2.5.35
|
||||
|
||||
## 4.1.92
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/auth",
|
||||
"version": "4.1.92",
|
||||
"version": "4.1.95",
|
||||
"main": "dist/thirdweb-dev-auth.cjs.js",
|
||||
"module": "dist/thirdweb-dev-auth.esm.js",
|
||||
"browser": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @thirdweb-dev/chains
|
||||
|
||||
## 0.1.119
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3311](https://github.com/thirdweb-dev/js/pull/3311) [`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447) Thanks [@github-actions](https://github.com/apps/github-actions)! - Synced Chains Package
|
||||
|
||||
## 0.1.118
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -11,12 +11,6 @@ export default {
|
||||
"name": "EIP155"
|
||||
}
|
||||
],
|
||||
"icon": {
|
||||
"url": "ipfs://QmVt5Y585JqBSrkpZmYaEnX9FW7tDwfDLmUGNyDdyV2Pd2",
|
||||
"width": 48,
|
||||
"height": 48,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://www.dioneprotocol.com/",
|
||||
"name": "Odyssey Chain (Testnet)",
|
||||
"nativeCurrency": {
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "TCC Network",
|
||||
"chainId": 181155,
|
||||
"explorers": [
|
||||
{
|
||||
"name": "Tcc Scan",
|
||||
"url": "https://scan.tccworld.org/",
|
||||
"standard": "181155",
|
||||
"icon": {
|
||||
"url": "ipfs://QmchZTtvuU7oRe3rSu1HNPELJQdnutV79NjcHxoybJ4SVo/tcc-coin.png",
|
||||
"width": 100,
|
||||
"height": 100,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmchZTtvuU7oRe3rSu1HNPELJQdnutV79NjcHxoybJ4SVo/tcc-coin.png",
|
||||
"width": 100,
|
||||
"height": 100,
|
||||
"format": "png"
|
||||
},
|
||||
"name": "TCC Network",
|
||||
"nativeCurrency": {
|
||||
"name": "The ChampCoin",
|
||||
"symbol": "TCC",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 181155,
|
||||
"redFlags": [],
|
||||
"rpc": [],
|
||||
"shortName": "TCC",
|
||||
"slug": "tcc-network",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -10,12 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmdoUtvHDybu5ppYBZT8BMRp6AqByVSoQs8nFwKbaS55jd",
|
||||
"width": 367,
|
||||
"height": 367,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://milkomeda.com",
|
||||
"name": "Milkomeda C1 Mainnet",
|
||||
"nativeCurrency": {
|
||||
|
||||
@@ -10,12 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmdoUtvHDybu5ppYBZT8BMRp6AqByVSoQs8nFwKbaS55jd",
|
||||
"width": 367,
|
||||
"height": 367,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://milkomeda.com",
|
||||
"name": "Milkomeda C1 Testnet",
|
||||
"nativeCurrency": {
|
||||
|
||||
@@ -10,12 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmdoUtvHDybu5ppYBZT8BMRp6AqByVSoQs8nFwKbaS55jd",
|
||||
"width": 367,
|
||||
"height": 367,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://milkomeda.com",
|
||||
"name": "Milkomeda A1 Mainnet",
|
||||
"nativeCurrency": {
|
||||
|
||||
@@ -10,12 +10,6 @@ export default {
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmdoUtvHDybu5ppYBZT8BMRp6AqByVSoQs8nFwKbaS55jd",
|
||||
"width": 367,
|
||||
"height": 367,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://milkomeda.com",
|
||||
"name": "Milkomeda A1 Testnet",
|
||||
"nativeCurrency": {
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "Avalanche",
|
||||
"chainId": 57923,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
|
||||
"width": 256,
|
||||
"height": 256,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://avacloud.io",
|
||||
"name": "QI0614I1",
|
||||
"nativeCurrency": {
|
||||
"name": "QI0614I1 Token",
|
||||
"symbol": "GZD",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 57923,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://57923.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://subnets.avax.network/defi-kingdoms/dfk-chain/rpc"
|
||||
],
|
||||
"shortName": "QI0614I1",
|
||||
"slug": "qi0614i1",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,40 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "Open Campus Codex",
|
||||
"chainId": 656476,
|
||||
"explorers": [
|
||||
{
|
||||
"name": "Open Campus Codex",
|
||||
"url": "https://opencampus-codex.blockscout.com",
|
||||
"standard": "none",
|
||||
"icon": {
|
||||
"url": "ipfs://QmXbz7VEYvf6NVHezuBy5HpJTCiagEThBxxdDdfVXNQ8Bt",
|
||||
"width": 30,
|
||||
"height": 30,
|
||||
"format": "png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"icon": {
|
||||
"url": "ipfs://QmXbz7VEYvf6NVHezuBy5HpJTCiagEThBxxdDdfVXNQ8Bt",
|
||||
"width": 30,
|
||||
"height": 30,
|
||||
"format": "png"
|
||||
},
|
||||
"infoURL": "https://raas.gelato.network/rollups/details/public/open-campus-codex",
|
||||
"name": "Open Campus Codex",
|
||||
"nativeCurrency": {
|
||||
"name": "EDU",
|
||||
"symbol": "EDU",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 656476,
|
||||
"rpc": [
|
||||
"https://656476.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.open-campus-codex.gelato.digital"
|
||||
],
|
||||
"shortName": "open-campus-codex",
|
||||
"slug": "open-campus-codex",
|
||||
"testnet": false
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,24 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "OX",
|
||||
"chainId": 6699,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"infoURL": "https://ox.fun/chain",
|
||||
"name": "OX Chain",
|
||||
"nativeCurrency": {
|
||||
"name": "OX",
|
||||
"symbol": "OX",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 6699,
|
||||
"rpc": [
|
||||
"https://6699.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://rpc.oxscan.io"
|
||||
],
|
||||
"shortName": "ox-chain",
|
||||
"slug": "ox-chain",
|
||||
"status": "incubating",
|
||||
"testnet": false,
|
||||
"title": "OX Chain"
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,29 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "Darwinia Koi",
|
||||
"chainId": 701,
|
||||
"explorers": [
|
||||
{
|
||||
"name": "blockscout",
|
||||
"url": "https://koi-scan.darwinia.network",
|
||||
"standard": "EIP3091"
|
||||
}
|
||||
],
|
||||
"faucets": [],
|
||||
"infoURL": "https://darwinia.network/",
|
||||
"name": "Darwinia Koi Testnet",
|
||||
"nativeCurrency": {
|
||||
"name": "Koi Network Native Token",
|
||||
"symbol": "KRING",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 701,
|
||||
"rpc": [
|
||||
"https://701.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://koi-rpc.darwinia.network"
|
||||
],
|
||||
"shortName": "darwinia-koi",
|
||||
"slip44": 1,
|
||||
"slug": "darwinia-koi-testnet",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -0,0 +1,30 @@
|
||||
import type { Chain } from "../src/types";
|
||||
export default {
|
||||
"chain": "Avalanche",
|
||||
"chainId": 85405,
|
||||
"explorers": [],
|
||||
"faucets": [],
|
||||
"features": [],
|
||||
"icon": {
|
||||
"url": "https://images.ctfassets.net/9bazykntljf6/62CceHSYsRS4D9fgDSkLRB/877cb8f26954e1743ff535fd7fdaf78f/avacloud-placeholder.svg",
|
||||
"width": 256,
|
||||
"height": 256,
|
||||
"format": "svg"
|
||||
},
|
||||
"infoURL": "https://avacloud.io",
|
||||
"name": "QR0614T1tS",
|
||||
"nativeCurrency": {
|
||||
"name": "QR0614T1tS Token",
|
||||
"symbol": "FTW",
|
||||
"decimals": 18
|
||||
},
|
||||
"networkId": 85405,
|
||||
"redFlags": [],
|
||||
"rpc": [
|
||||
"https://85405.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
|
||||
"https://subnets.avax.network/qr0614t1ts/testnet/rpc"
|
||||
],
|
||||
"shortName": "QR0614T1tS",
|
||||
"slug": "qr0614t1ts",
|
||||
"testnet": true
|
||||
} as const satisfies Chain;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/chains",
|
||||
"version": "0.1.118",
|
||||
"version": "0.1.119",
|
||||
"main": "dist/thirdweb-dev-chains.cjs.js",
|
||||
"module": "dist/thirdweb-dev-chains.esm.js",
|
||||
"exports": {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,5 +1,33 @@
|
||||
# thirdweb
|
||||
|
||||
## 0.14.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/sdk@4.0.97
|
||||
- @thirdweb-dev/wallets@2.5.37
|
||||
- @thirdweb-dev/auth@4.1.95
|
||||
|
||||
## 0.14.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
- @thirdweb-dev/sdk@4.0.96
|
||||
- @thirdweb-dev/wallets@2.5.36
|
||||
- @thirdweb-dev/auth@4.1.94
|
||||
|
||||
## 0.14.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
|
||||
- @thirdweb-dev/sdk@4.0.95
|
||||
- @thirdweb-dev/wallets@2.5.35
|
||||
- @thirdweb-dev/auth@4.1.93
|
||||
|
||||
## 0.14.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/cli",
|
||||
"main": "dist/cli/index.js",
|
||||
"version": "0.14.7",
|
||||
"version": "0.14.10",
|
||||
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/cli",
|
||||
"author": "thirdweb eng <[email protected]>",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"@typescript-eslint/parser": "7.9.0",
|
||||
"eslint-config-next": "14.2.1",
|
||||
"eslint-config-prettier": "9.1.0",
|
||||
"eslint-config-turbo": "1.13.2",
|
||||
"eslint-config-turbo": "2.0.4",
|
||||
"eslint-plugin-react": "7.34.1"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
||||
@@ -1,5 +1,33 @@
|
||||
# @thirdweb-dev/react-core
|
||||
|
||||
## 4.9.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/sdk@4.0.97
|
||||
- @thirdweb-dev/wallets@2.5.37
|
||||
- @thirdweb-dev/auth@4.1.95
|
||||
|
||||
## 4.9.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
- @thirdweb-dev/sdk@4.0.96
|
||||
- @thirdweb-dev/wallets@2.5.36
|
||||
- @thirdweb-dev/auth@4.1.94
|
||||
|
||||
## 4.9.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
|
||||
- @thirdweb-dev/sdk@4.0.95
|
||||
- @thirdweb-dev/wallets@2.5.35
|
||||
- @thirdweb-dev/auth@4.1.93
|
||||
|
||||
## 4.8.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/react-core",
|
||||
"version": "4.8.0",
|
||||
"version": "4.9.2",
|
||||
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/react-core",
|
||||
"author": "thirdweb eng <[email protected]>",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,37 @@
|
||||
# @thirdweb-dev/react
|
||||
|
||||
## 4.9.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/sdk@4.0.97
|
||||
- @thirdweb-dev/react-core@4.9.2
|
||||
- @thirdweb-dev/wallets@2.5.37
|
||||
|
||||
## 4.9.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
- @thirdweb-dev/sdk@4.0.96
|
||||
- @thirdweb-dev/react-core@4.9.1
|
||||
- @thirdweb-dev/wallets@2.5.36
|
||||
|
||||
## 4.9.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#3315](https://github.com/thirdweb-dev/js/pull/3315) [`eff7107`](https://github.com/thirdweb-dev/js/commit/eff710738ce3d4341257e5912311c95b28a34b5d) Thanks [@MananTank](https://github.com/MananTank)! - Allow configuring WalletConnect `qrcode` and `qrModalOptions` from wallet configurator functions like `metamaskWallet`, `coreWallet`, `zerionWallet` etc
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
|
||||
- @thirdweb-dev/sdk@4.0.95
|
||||
- @thirdweb-dev/react-core@4.9.0
|
||||
- @thirdweb-dev/wallets@2.5.35
|
||||
|
||||
## 4.8.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/react",
|
||||
"version": "4.8.0",
|
||||
"version": "4.9.2",
|
||||
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/react",
|
||||
"author": "thirdweb eng <[email protected]>",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -6,6 +6,7 @@ import type {
|
||||
import { Coin98Wallet, getInjectedCoin98Provider } from "@thirdweb-dev/wallets";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const coin98WalletUris = {
|
||||
ios: "coin98://",
|
||||
@@ -29,6 +30,22 @@ export type Coin98WalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -78,7 +95,11 @@ export const coin98Wallet = (
|
||||
const wallet = new Coin98Wallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return wallet;
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
import { handelWCSessionRequest } from "../handleWCSessionRequest";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const coreWalletUris = {
|
||||
ios: "core://",
|
||||
@@ -33,6 +34,22 @@ export type CoreWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -81,7 +98,11 @@ export const coreWallet = (
|
||||
const wallet = new CoreWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
handelWCSessionRequest(wallet, coreWalletUris);
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import { handelWCSessionRequest } from "../handleWCSessionRequest";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const cryptoDefiWalletUris = {
|
||||
ios: "dfw://",
|
||||
@@ -33,6 +34,22 @@ export type CryptoDefiWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -82,7 +99,11 @@ export const cryptoDefiWallet = (
|
||||
const wallet = new CryptoDefiWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
handelWCSessionRequest(wallet, cryptoDefiWalletUris);
|
||||
|
||||
@@ -6,6 +6,7 @@ import type {
|
||||
import { ImTokenWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const imTokenWalletUris = {
|
||||
ios: "imtokenv2://",
|
||||
@@ -15,6 +16,22 @@ const imTokenWalletUris = {
|
||||
export type ImTokenWalletConfigOptions = {
|
||||
projectId?: string;
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
export const imTokenWallet = (
|
||||
@@ -30,7 +47,11 @@ export const imTokenWallet = (
|
||||
const wallet = new ImTokenWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return wallet;
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
import { MetamaskConnectUI } from "./MetamaskConnectUI";
|
||||
import { metamaskUris } from "./metamaskUris";
|
||||
import { handelWCSessionRequest } from "../handleWCSessionRequest";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
/**
|
||||
* @wallet
|
||||
@@ -35,6 +36,22 @@ export type MetamaskWalletConfigOptions = {
|
||||
* Default is `"walletconnect"`
|
||||
*/
|
||||
connectionMethod?: "walletConnect" | "metamaskBrowser";
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -89,7 +106,11 @@ export const metamaskWallet = (
|
||||
const wallet = new MetaMaskWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
if (connectionMethod === "walletConnect") {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { WalletOptions, WalletConfig } from "@thirdweb-dev/react-core";
|
||||
import { OKXWallet, getInjectedOKXProvider } from "@thirdweb-dev/wallets";
|
||||
import { OKXConnectUI } from "./OKXConnectUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
/**
|
||||
* @wallet
|
||||
@@ -18,6 +19,22 @@ export type OKXWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -67,7 +84,11 @@ export const okxWallet = (
|
||||
const wallet = new OKXWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return wallet;
|
||||
|
||||
@@ -6,6 +6,7 @@ import type {
|
||||
import { OneKeyWallet, getInjectedOneKeyProvider } from "@thirdweb-dev/wallets";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
export const oneKeyWalletUris = {
|
||||
ios: "onekey-wallet://",
|
||||
@@ -29,6 +30,22 @@ export type OneKeyWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -78,7 +95,11 @@ export const oneKeyWallet = (
|
||||
const wallet = new OneKeyWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return wallet;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { WalletOptions, WalletConfig } from "@thirdweb-dev/react-core";
|
||||
import { RabbyWallet, getInjectedRabbyProvider } from "@thirdweb-dev/wallets";
|
||||
import { RabbyConnectUI } from "./RabbyConnectUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
/**
|
||||
* @wallet
|
||||
@@ -18,6 +19,22 @@ export type RabbyWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -64,7 +81,11 @@ export const rabbyWallet = (
|
||||
const wallet = new RabbyWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
return wallet;
|
||||
|
||||
@@ -7,6 +7,7 @@ import { TrustWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
|
||||
import { handelWCSessionRequest } from "../handleWCSessionRequest";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const trustWalletUris = {
|
||||
ios: "trust://",
|
||||
@@ -30,6 +31,22 @@ export type TrustWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -72,7 +89,11 @@ export const trustWallet = (
|
||||
const wallet = new TrustWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
handelWCSessionRequest(wallet, trustWalletUris);
|
||||
|
||||
@@ -7,6 +7,7 @@ import { ZerionWallet, assertWindowEthereum } from "@thirdweb-dev/wallets";
|
||||
import { handelWCSessionRequest } from "../handleWCSessionRequest";
|
||||
import { useTWLocale } from "../../../evm/providers/locale-provider";
|
||||
import { ExtensionOrWCConnectionUI } from "../_common/ExtensionORWCConnectionUI";
|
||||
import type { QRModalOptions } from "@thirdweb-dev/wallets/src/evm/connectors/wallet-connect/qrModalOptions";
|
||||
|
||||
const zerionWalletUris = {
|
||||
ios: "zerion://",
|
||||
@@ -30,6 +31,22 @@ export type ZerionkWalletConfigOptions = {
|
||||
* If true, the wallet will be tagged as "recommended" in ConnectWallet Modal
|
||||
*/
|
||||
recommended?: boolean;
|
||||
|
||||
/**
|
||||
* Specify whether to open the official Wallet Connect Modal when connecting the wallet if no injected MetaMask provider is found when connecting the wallet.
|
||||
*
|
||||
* This should not be set if you are using ConnectWallet component and only when manually connecting the wallet using a hook like `useConnect`.
|
||||
*
|
||||
* You can set it to `true` or a configuration object to enable the Wallet Connect Modal.
|
||||
*/
|
||||
wcModal?:
|
||||
| {
|
||||
/**
|
||||
* Configure the style of Wallet Connect Modal.
|
||||
*/
|
||||
qrModalOptions?: QRModalOptions;
|
||||
}
|
||||
| boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -72,7 +89,11 @@ export const zerionWallet = (
|
||||
const wallet = new ZerionWallet({
|
||||
...walletOptions,
|
||||
projectId: options?.projectId,
|
||||
qrcode: false,
|
||||
qrcode: options?.wcModal ? true : false,
|
||||
qrModalOptions:
|
||||
typeof options?.wcModal === "object"
|
||||
? options?.wcModal?.qrModalOptions
|
||||
: undefined,
|
||||
});
|
||||
|
||||
handelWCSessionRequest(wallet, zerionWalletUris);
|
||||
|
||||
Binary file not shown.
@@ -1,5 +1,29 @@
|
||||
# @thirdweb-dev/sdk
|
||||
|
||||
## 4.0.97
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`79e6a04`](https://github.com/thirdweb-dev/js/commit/79e6a047d6ae6cb341fdad22137bd83ad6e611d4)]:
|
||||
- thirdweb@5.29.4
|
||||
|
||||
## 4.0.96
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`c94bcd5`](https://github.com/thirdweb-dev/js/commit/c94bcd574aa4eaf2bd76ab8b6379302de4731ed4), [`1c533ef`](https://github.com/thirdweb-dev/js/commit/1c533efcd5fbc8a72fd03c98510fa601ee5f34b5), [`ffaff74`](https://github.com/thirdweb-dev/js/commit/ffaff744f72d2cb22896e7501677b48f76ea857a), [`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447), [`9cf3a1d`](https://github.com/thirdweb-dev/js/commit/9cf3a1d6636fcd56559e889ab2bfe3249d51162a)]:
|
||||
- thirdweb@5.29.3
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
|
||||
## 4.0.95
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2880](https://github.com/thirdweb-dev/js/pull/2880) [`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Modular contract publish and deploy setup
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052), [`fb6a07d`](https://github.com/thirdweb-dev/js/commit/fb6a07d4b84ba8ea6389ca04c73625f670a0d9c4)]:
|
||||
- thirdweb@5.29.2
|
||||
|
||||
## 4.0.94
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/sdk",
|
||||
"version": "4.0.94",
|
||||
"version": "4.0.97",
|
||||
"description": "The main thirdweb SDK.",
|
||||
"repository": "https://github.com/thirdweb-dev/js/tree/main/legacy_packages/sdk",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
import { providers, utils } from "ethers";
|
||||
import {
|
||||
coreContractAbi,
|
||||
extensionContractAbi,
|
||||
} from "../../constants/thirdweb-features";
|
||||
import { hasDuplicates } from "../utils";
|
||||
import { getChainByChainIdAsync, getChainRPC } from "@thirdweb-dev/chains";
|
||||
|
||||
type CallbackFunction = {
|
||||
selector: string;
|
||||
};
|
||||
|
||||
type FallbackFunction = {
|
||||
selector: string;
|
||||
permissionBits: string;
|
||||
};
|
||||
|
||||
type SupportedCallbackFunction = {
|
||||
selector: string;
|
||||
mode: number;
|
||||
};
|
||||
|
||||
export async function compatibleExtensions(
|
||||
coreBytecode: string,
|
||||
extensionBytecodes: string[],
|
||||
chainId: number,
|
||||
): Promise<boolean> {
|
||||
const chain = await getChainByChainIdAsync(chainId);
|
||||
const rpcUrl = getChainRPC(chain);
|
||||
const jsonRpcProvider = new providers.JsonRpcProvider(rpcUrl);
|
||||
const addr = "0x0000000000000000000000000000000000000124"; // arbitrary address
|
||||
|
||||
/**
|
||||
* Here we use state override with eth_call.
|
||||
*
|
||||
* This lets us call functions on a non-deployed contract, by using its deployed bytecode
|
||||
* to override code of an arbitrary address in eth_call.
|
||||
*
|
||||
* Encode function calldata, and perform eth_call with bytecode override.
|
||||
*/
|
||||
|
||||
const coreIface = new utils.Interface(coreContractAbi);
|
||||
const coreCalldata = coreIface.encodeFunctionData(
|
||||
"getSupportedCallbackFunctions",
|
||||
[],
|
||||
);
|
||||
if (!coreBytecode.startsWith("0x6080604052")) {
|
||||
const index = coreBytecode.indexOf("6080604052");
|
||||
coreBytecode = `0x${coreBytecode.substring(index)}`;
|
||||
} else if (coreBytecode.lastIndexOf("6080604052") > 0) {
|
||||
const index = coreBytecode.lastIndexOf("6080604052");
|
||||
coreBytecode = `0x${coreBytecode.substring(index)}`;
|
||||
}
|
||||
const core = await jsonRpcProvider.send("eth_call", [
|
||||
{ to: addr, data: coreCalldata },
|
||||
"latest",
|
||||
{ [addr]: { code: coreBytecode } }, // eth_call with bytecode override
|
||||
]);
|
||||
|
||||
const extensionIface = new utils.Interface(extensionContractAbi);
|
||||
const extensionCalldata = extensionIface.encodeFunctionData(
|
||||
"getExtensionConfig",
|
||||
[],
|
||||
);
|
||||
const extensions = await Promise.all(
|
||||
extensionBytecodes.map((b: string) => {
|
||||
// TODO: Upload deployed bytecode on publish metadata
|
||||
|
||||
if (!b.startsWith("0x6080604052")) {
|
||||
const index = b.indexOf("6080604052");
|
||||
b = `0x${b.substring(index)}`;
|
||||
} else if (b.lastIndexOf("6080604052") > 0) {
|
||||
const index = b.lastIndexOf("6080604052");
|
||||
b = `0x${b.substring(index)}`;
|
||||
}
|
||||
|
||||
return jsonRpcProvider.send("eth_call", [
|
||||
{ to: addr, data: extensionCalldata },
|
||||
"latest",
|
||||
{ [addr]: { code: b } }, // eth_call with bytecode override
|
||||
]);
|
||||
}),
|
||||
);
|
||||
|
||||
const decodedCore = coreIface.decodeFunctionResult(
|
||||
"getSupportedCallbackFunctions",
|
||||
core,
|
||||
);
|
||||
const coreCallbackSelectors = decodedCore.flat().map(
|
||||
(c: SupportedCallbackFunction) => c.selector,
|
||||
);
|
||||
|
||||
// extract callback/fallback selectors and required interfaces from extension config
|
||||
const requiredInterfaces: string[] = [];
|
||||
const extensionFallbackSelectors: string[] = [];
|
||||
const extensionCallbackSelectors: string[] = [];
|
||||
const selectors: string[] = [];
|
||||
|
||||
extensions.forEach((e: string) => {
|
||||
const decodedExtensionConfig = extensionIface.decodeFunctionResult(
|
||||
"getExtensionConfig",
|
||||
e,
|
||||
);
|
||||
|
||||
requiredInterfaces.push(...decodedExtensionConfig[0].requiredInterfaces);
|
||||
const fallbackSelectors =
|
||||
decodedExtensionConfig[0].fallbackFunctions.map(
|
||||
(a: FallbackFunction) => a.selector,
|
||||
);
|
||||
const callbackSelectors =
|
||||
decodedExtensionConfig[0].callbackFunctions.map(
|
||||
(a: CallbackFunction) => a.selector,
|
||||
);
|
||||
|
||||
extensionFallbackSelectors.push(...fallbackSelectors);
|
||||
extensionCallbackSelectors.push(...callbackSelectors);
|
||||
});
|
||||
|
||||
// check if callback selectors are supported
|
||||
for(const callback of extensionCallbackSelectors) {
|
||||
if(!coreCallbackSelectors.includes(callback)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// check if the core contract supports required interfaces by extensions above
|
||||
if(requiredInterfaces.length > 0) {
|
||||
const supportsInterfaceResult = await Promise.all(
|
||||
requiredInterfaces.map((r) => {
|
||||
const supportsInterfaceCalldata = coreIface.encodeFunctionData(
|
||||
"supportsInterface",
|
||||
[r],
|
||||
);
|
||||
return jsonRpcProvider.send("eth_call", [
|
||||
{ to: addr, data: supportsInterfaceCalldata },
|
||||
"latest",
|
||||
{ [addr]: { code: coreBytecode } },
|
||||
]);
|
||||
}),
|
||||
);
|
||||
const supportsInterfaceDecoded = supportsInterfaceResult.map(r => {
|
||||
return coreIface.decodeFunctionResult(
|
||||
"supportsInterface",
|
||||
r,
|
||||
);
|
||||
})
|
||||
if (supportsInterfaceDecoded.flat().some((element) => element === false)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// check duplicate callback/fallback signatures
|
||||
selectors.push(...extensionFallbackSelectors, ...extensionCallbackSelectors);
|
||||
return !hasDuplicates(
|
||||
selectors.flat(),
|
||||
(a: string, b: string): boolean => a === b,
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
coreContractAbi,
|
||||
getAllExtensionsAbi,
|
||||
getAllPluginsAbi,
|
||||
} from "../../constants/thirdweb-features";
|
||||
@@ -38,6 +39,7 @@ export async function getCompositeABI(
|
||||
"DynamicContract",
|
||||
features,
|
||||
);
|
||||
const isModular: boolean = isExtensionEnabled(abi, "ModularCore", features);
|
||||
// check if the contract has fallback function - we'll further check for diamond pattern if needed
|
||||
const isFallback: boolean = isExtensionEnabled(abi, "Fallback", features);
|
||||
|
||||
@@ -59,6 +61,24 @@ export async function getCompositeABI(
|
||||
|
||||
// get ABIs of extension contracts --
|
||||
pluginABIs = await getPluginABI(pluginAddresses, provider, storage);
|
||||
} else if (isModular) {
|
||||
const contract = new ContractWrapper(
|
||||
provider,
|
||||
address,
|
||||
coreContractAbi,
|
||||
options,
|
||||
storage,
|
||||
);
|
||||
|
||||
const extensions = await contract.call("getInstalledExtensions");
|
||||
|
||||
// get extension addresses
|
||||
const extensionAddresses = extensions.map(
|
||||
(item: any) => item.implementation,
|
||||
);
|
||||
|
||||
// get ABIs of extension contracts --
|
||||
pluginABIs = await getPluginABI(extensionAddresses, provider, storage);
|
||||
} else if (isPluginRouter) {
|
||||
const contract = new ContractWrapper(
|
||||
provider,
|
||||
|
||||
@@ -30,6 +30,27 @@ export function unique<T>(a: T[], fn: (a: T, b: T) => boolean): T[] {
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
export function hasDuplicates<T>(arr: T[], fn: (a: T, b: T) => boolean): boolean {
|
||||
if (arr.length === 0 || arr.length === 1) {
|
||||
return false;
|
||||
}
|
||||
if (!fn) {
|
||||
throw new Error("Comparison function required");
|
||||
}
|
||||
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
for (let j = i + 1; j < arr.length; j++) {
|
||||
if (fn(arr[i], arr[j])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
|
||||
@@ -63,6 +63,8 @@ import {
|
||||
FEATURE_GASLESS,
|
||||
FEATURE_PACK_VRF,
|
||||
FEATURE_PLUGIN_ROUTER,
|
||||
FEATURE_MODULAR_CORE,
|
||||
FEATURE_MODULAR_EXTENSION,
|
||||
FEATURE_DIRECT_LISTINGS,
|
||||
FEATURE_ENGLISH_AUCTIONS,
|
||||
FEATURE_OFFERS,
|
||||
@@ -139,6 +141,8 @@ export type Feature =
|
||||
| typeof FEATURE_GASLESS
|
||||
| typeof FEATURE_PACK_VRF
|
||||
| typeof FEATURE_PLUGIN_ROUTER
|
||||
| typeof FEATURE_MODULAR_CORE
|
||||
| typeof FEATURE_MODULAR_EXTENSION
|
||||
| typeof FEATURE_DYNAMIC_CONTRACT
|
||||
| typeof FEATURE_DIRECT_LISTINGS
|
||||
| typeof FEATURE_ENGLISH_AUCTIONS
|
||||
@@ -189,6 +193,8 @@ export const SUPPORTED_FEATURES: Record<string, Feature> = /* @__PURE__ */ {
|
||||
[FEATURE_PACK_VRF.name]: FEATURE_PACK_VRF,
|
||||
[FEATURE_PLUGIN_ROUTER.name]: FEATURE_PLUGIN_ROUTER,
|
||||
[FEATURE_DYNAMIC_CONTRACT.name]: FEATURE_DYNAMIC_CONTRACT,
|
||||
[FEATURE_MODULAR_CORE.name]: FEATURE_MODULAR_CORE,
|
||||
[FEATURE_MODULAR_EXTENSION.name]: FEATURE_MODULAR_EXTENSION,
|
||||
[FEATURE_DIRECT_LISTINGS.name]: FEATURE_DIRECT_LISTINGS,
|
||||
[FEATURE_ENGLISH_AUCTIONS.name]: FEATURE_ENGLISH_AUCTIONS,
|
||||
[FEATURE_OFFERS.name]: FEATURE_OFFERS,
|
||||
|
||||
@@ -116,6 +116,450 @@ export const getAllExtensionsAbi = [
|
||||
},
|
||||
];
|
||||
|
||||
export const coreContractAbi = [
|
||||
{ type: "fallback", stateMutability: "payable" },
|
||||
{
|
||||
type: "function",
|
||||
name: "cancelOwnershipHandover",
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "completeOwnershipHandover",
|
||||
inputs: [
|
||||
{ name: "pendingOwner", type: "address", internalType: "address" },
|
||||
],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "getInstalledExtensions",
|
||||
inputs: [],
|
||||
outputs: [
|
||||
{
|
||||
name: "_installedExtensions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IModularCore.InstalledExtension[]",
|
||||
components: [
|
||||
{
|
||||
name: "implementation",
|
||||
type: "address",
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "config",
|
||||
type: "tuple",
|
||||
internalType: "struct IExtensionConfig.ExtensionConfig",
|
||||
components: [
|
||||
{
|
||||
name: "registerInstallationCallback",
|
||||
type: "bool",
|
||||
internalType: "bool",
|
||||
},
|
||||
{
|
||||
name: "requiredInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "supportedInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "callbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.CallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "fallbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.FallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
{
|
||||
name: "permissionBits",
|
||||
type: "uint256",
|
||||
internalType: "uint256",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "getSupportedCallbackFunctions",
|
||||
inputs: [],
|
||||
outputs: [
|
||||
{
|
||||
name: "",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IModularCore.SupportedCallbackFunction[]",
|
||||
components: [
|
||||
{ name: "selector", type: "bytes4", internalType: "bytes4" },
|
||||
{
|
||||
name: "mode",
|
||||
type: "uint8",
|
||||
internalType: "enum IModularCore.CallbackMode",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
stateMutability: "pure",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "grantRoles",
|
||||
inputs: [
|
||||
{ name: "user", type: "address", internalType: "address" },
|
||||
{ name: "roles", type: "uint256", internalType: "uint256" },
|
||||
],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "hasAllRoles",
|
||||
inputs: [
|
||||
{ name: "user", type: "address", internalType: "address" },
|
||||
{ name: "roles", type: "uint256", internalType: "uint256" },
|
||||
],
|
||||
outputs: [{ name: "", type: "bool", internalType: "bool" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "hasAnyRole",
|
||||
inputs: [
|
||||
{ name: "user", type: "address", internalType: "address" },
|
||||
{ name: "roles", type: "uint256", internalType: "uint256" },
|
||||
],
|
||||
outputs: [{ name: "", type: "bool", internalType: "bool" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "installExtension",
|
||||
inputs: [
|
||||
{ name: "_extension", type: "address", internalType: "address" },
|
||||
{ name: "_data", type: "bytes", internalType: "bytes" },
|
||||
],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "owner",
|
||||
inputs: [],
|
||||
outputs: [{ name: "result", type: "address", internalType: "address" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "ownershipHandoverExpiresAt",
|
||||
inputs: [
|
||||
{ name: "pendingOwner", type: "address", internalType: "address" },
|
||||
],
|
||||
outputs: [{ name: "result", type: "uint256", internalType: "uint256" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "renounceOwnership",
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "renounceRoles",
|
||||
inputs: [{ name: "roles", type: "uint256", internalType: "uint256" }],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "requestOwnershipHandover",
|
||||
inputs: [],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "revokeRoles",
|
||||
inputs: [
|
||||
{ name: "user", type: "address", internalType: "address" },
|
||||
{ name: "roles", type: "uint256", internalType: "uint256" },
|
||||
],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "rolesOf",
|
||||
inputs: [{ name: "user", type: "address", internalType: "address" }],
|
||||
outputs: [{ name: "roles", type: "uint256", internalType: "uint256" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "supportsInterface",
|
||||
inputs: [{ name: "interfaceId", type: "bytes4", internalType: "bytes4" }],
|
||||
outputs: [{ name: "", type: "bool", internalType: "bool" }],
|
||||
stateMutability: "view",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "transferOwnership",
|
||||
inputs: [{ name: "newOwner", type: "address", internalType: "address" }],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "function",
|
||||
name: "uninstallExtension",
|
||||
inputs: [
|
||||
{ name: "_extension", type: "address", internalType: "address" },
|
||||
{ name: "_data", type: "bytes", internalType: "bytes" },
|
||||
],
|
||||
outputs: [],
|
||||
stateMutability: "payable",
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "ExtensionInstalled",
|
||||
inputs: [
|
||||
{
|
||||
name: "caller",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "implementation",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "installedExtension",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "ExtensionUninstalled",
|
||||
inputs: [
|
||||
{
|
||||
name: "caller",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "implementation",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "installedExtension",
|
||||
type: "address",
|
||||
indexed: false,
|
||||
internalType: "address",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "OwnershipHandoverCanceled",
|
||||
inputs: [
|
||||
{
|
||||
name: "pendingOwner",
|
||||
type: "address",
|
||||
indexed: true,
|
||||
internalType: "address",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "OwnershipHandoverRequested",
|
||||
inputs: [
|
||||
{
|
||||
name: "pendingOwner",
|
||||
type: "address",
|
||||
indexed: true,
|
||||
internalType: "address",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "OwnershipTransferred",
|
||||
inputs: [
|
||||
{
|
||||
name: "oldOwner",
|
||||
type: "address",
|
||||
indexed: true,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "newOwner",
|
||||
type: "address",
|
||||
indexed: true,
|
||||
internalType: "address",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{
|
||||
type: "event",
|
||||
name: "RolesUpdated",
|
||||
inputs: [
|
||||
{
|
||||
name: "user",
|
||||
type: "address",
|
||||
indexed: true,
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "roles",
|
||||
type: "uint256",
|
||||
indexed: true,
|
||||
internalType: "uint256",
|
||||
},
|
||||
],
|
||||
anonymous: false,
|
||||
},
|
||||
{ type: "error", name: "AlreadyInitialized", inputs: [] },
|
||||
{ type: "error", name: "CallbackExecutionReverted", inputs: [] },
|
||||
{
|
||||
type: "error",
|
||||
name: "CallbackFunctionAlreadyInstalled",
|
||||
inputs: [],
|
||||
},
|
||||
{ type: "error", name: "CallbackFunctionNotSupported", inputs: [] },
|
||||
{ type: "error", name: "CallbackFunctionRequired", inputs: [] },
|
||||
{
|
||||
type: "error",
|
||||
name: "CallbackFunctionUnauthorizedCall",
|
||||
inputs: [],
|
||||
},
|
||||
{ type: "error", name: "ExtensionAlreadyInstalled", inputs: [] },
|
||||
{
|
||||
type: "error",
|
||||
name: "ExtensionInterfaceNotCompatible",
|
||||
inputs: [
|
||||
{
|
||||
name: "requiredInterfaceId",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
],
|
||||
},
|
||||
{ type: "error", name: "ExtensionNotInstalled", inputs: [] },
|
||||
{ type: "error", name: "ExtensionOutOfSync", inputs: [] },
|
||||
{
|
||||
type: "error",
|
||||
name: "FallbackFunctionAlreadyInstalled",
|
||||
inputs: [],
|
||||
},
|
||||
{ type: "error", name: "FallbackFunctionNotInstalled", inputs: [] },
|
||||
{ type: "error", name: "IndexOutOfBounds", inputs: [] },
|
||||
{ type: "error", name: "NewOwnerIsZeroAddress", inputs: [] },
|
||||
{ type: "error", name: "NoHandoverRequest", inputs: [] },
|
||||
{ type: "error", name: "Unauthorized", inputs: [] },
|
||||
];
|
||||
|
||||
export const extensionContractAbi = [
|
||||
{
|
||||
type: "function",
|
||||
name: "getExtensionConfig",
|
||||
inputs: [],
|
||||
outputs: [
|
||||
{
|
||||
name: "",
|
||||
type: "tuple",
|
||||
internalType: "struct IExtensionConfig.ExtensionConfig",
|
||||
components: [
|
||||
{
|
||||
name: "registerInstallationCallback",
|
||||
type: "bool",
|
||||
internalType: "bool",
|
||||
},
|
||||
{
|
||||
name: "requiredInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "supportedInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "callbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.CallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "fallbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.FallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
{
|
||||
name: "permissionBits",
|
||||
type: "uint256",
|
||||
internalType: "uint256",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
stateMutability: "pure",
|
||||
},
|
||||
];
|
||||
|
||||
export const FEATURE_ROYALTY = {
|
||||
name: "Royalty",
|
||||
namespace: "royalty",
|
||||
@@ -255,6 +699,30 @@ export const FEATURE_DYNAMIC_CONTRACT = {
|
||||
features: {},
|
||||
} as const;
|
||||
|
||||
export const FEATURE_MODULAR_CORE = {
|
||||
name: "ModularCore",
|
||||
namespace: "modular.core",
|
||||
docLinks: {
|
||||
sdk: "",
|
||||
//TODO
|
||||
contracts: "",
|
||||
},
|
||||
abis: [coreContractAbi],
|
||||
features: {},
|
||||
} as const;
|
||||
|
||||
export const FEATURE_MODULAR_EXTENSION = {
|
||||
name: "ModularExtension",
|
||||
namespace: "modular.extension",
|
||||
docLinks: {
|
||||
sdk: "",
|
||||
//TODO
|
||||
contracts: "",
|
||||
},
|
||||
abis: [extensionContractAbi],
|
||||
features: {},
|
||||
} as const;
|
||||
|
||||
export const FEATURE_DIRECT_LISTINGS = {
|
||||
name: "DirectListings",
|
||||
namespace: "direct.listings",
|
||||
|
||||
@@ -406,11 +406,18 @@ export class ContractPublisher extends RPCConnectionHandler {
|
||||
"DynamicContract",
|
||||
features,
|
||||
);
|
||||
const isModular = isFeatureEnabled(
|
||||
compilerMetadata.abi,
|
||||
"ModularCore",
|
||||
features,
|
||||
);
|
||||
extraMetadataCleaned.routerType = isPlugin
|
||||
? "plugin"
|
||||
: isDynamic
|
||||
? "dynamic"
|
||||
: "none";
|
||||
: isModular
|
||||
? "modular"
|
||||
: "none";
|
||||
|
||||
// For a dynamic contract Router, try to fetch plugin/extension metadata
|
||||
if (isDynamic || isPlugin) {
|
||||
|
||||
@@ -102,6 +102,7 @@ export * from "./common/feature-detection/detectContractFeature";
|
||||
export * from "./common/feature-detection/hasFunction";
|
||||
export * from "./common/plugin/joinABIs";
|
||||
export * from "./common/plugin/getCompositePluginABI";
|
||||
export * from "./common/modular/compatibleExtensions";
|
||||
export * from "./common/version-checker";
|
||||
export * from "./common/fetchSourceFilesFromMetadata";
|
||||
export { isNativeToken } from "./common/currency/isNativeToken";
|
||||
|
||||
@@ -166,6 +166,14 @@ export const CustomFactoryInput = /* @__PURE__ */ (() =>
|
||||
customFactoryAddresses: ChainIdToAddressSchema,
|
||||
}))();
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
export const ModularFactoryInput = /* @__PURE__ */ (() =>
|
||||
z.object({
|
||||
hooksParamName: z.string(),
|
||||
}))();
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
@@ -174,6 +182,7 @@ export const FactoryDeploymentSchema = /* @__PURE__ */ (() =>
|
||||
implementationAddresses: ChainIdToAddressSchema,
|
||||
implementationInitializerFunction: z.string().default("initialize"),
|
||||
customFactoryInput: CustomFactoryInput.optional(),
|
||||
modularFactoryInput: ModularFactoryInput.optional(),
|
||||
factoryAddresses: ChainIdToAddressSchema.optional(),
|
||||
}))();
|
||||
|
||||
@@ -191,7 +200,12 @@ export const DeployTypeInput = /* @__PURE__ */ (() =>
|
||||
* @internal
|
||||
*/
|
||||
export const RouterTypeInput = /* @__PURE__ */ (() =>
|
||||
z.union([z.literal("none"), z.literal("plugin"), z.literal("dynamic")]))();
|
||||
z.union([
|
||||
z.literal("none"),
|
||||
z.literal("plugin"),
|
||||
z.literal("dynamic"),
|
||||
z.literal("modular"),
|
||||
]))();
|
||||
|
||||
/**
|
||||
* @internal
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
export const mockExtensionWithInterfaceBytecode = "0x6080604052348015600f57600080fd5b506106f08061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100de5760003560e01c80637c173ecc1161008c5780638dc5fd9e116100665780638dc5fd9e146100e3578063ae7c8cb7146100e3578063edf8bf0514610141578063f2c9ecd81461014957600080fd5b80637c173ecc1461012c57806389242efb146100e35780638a91b0e31461010057600080fd5b80633fb5c1cb116100bd5780633fb5c1cb146100ed5780636d61fe7014610100578063774237fc1461011157600080fd5b8062862ba3146100e35780630a340d43146100e357806313efddd6146100e5575b600080fd5b005b6100e3610151565b6100e36100fb366004610388565b600055565b6100e361010e3660046103d0565b50565b610119602081565b6040519081526020015b60405180910390f35b61013461017c565b604051610123919061055b565b6100e3610249565b600054610119565b6040517f6a94d761ae01a14a6739229452f57b368e87612171065a3d5019e116a9d396f290600090a1565b6101b06040518060a00160405280600015158152602001606081526020016060815260200160608152602001606081525090565b6101b8610274565b606082015260408051600180825281830190925290602080830190803683375050506020820181905280517f123456780000000000000000000000000000000000000000000000000000000091906000906102155761021561064b565b7fffffffff000000000000000000000000000000000000000000000000000000009092166020928302919091019091015290565b6040517f79201cdedb9b351e17bd1274b3465126723ac336d7a6b1546a2f0e97b8f0a73090600090a1565b6060610282600a600161067a565b67ffffffffffffffff81111561029a5761029a6103a1565b6040519080825280602002602001820160405280156102da57816020015b6040805160208101909152600081528152602001906001900390816102b85790505b50905060005b600a811015610338578060e01b8282815181106102ff576102ff61064b565b60209081029190910101517fffffffff0000000000000000000000000000000000000000000000000000000090911690526001016102e0565b5063edf8bf0560e01b81600a815181106103545761035461064b565b60209081029190910101517fffffffff00000000000000000000000000000000000000000000000000000000909116905290565b60006020828403121561039a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156103e257600080fd5b813567ffffffffffffffff808211156103fa57600080fd5b818401915084601f83011261040e57600080fd5b813581811115610420576104206103a1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610466576104666103a1565b8160405282815287602084870101111561047f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008151808452602080850194506020840160005b838110156104f25781517fffffffff0000000000000000000000000000000000000000000000000000000016875295820195908201906001016104b4565b509495945050505050565b60008151808452602080850194506020840160005b838110156104f257815180517fffffffff000000000000000000000000000000000000000000000000000000001688528301518388015260409096019590820190600101610512565b6000602080835283511515818401528084015160a0604085015261058260c085018261049f565b905060408501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808684030160608701526105be838361049f565b6060880151878203830160808901528051808352908601945060009350908501905b80841015610623578451517fffffffff000000000000000000000000000000000000000000000000000000001682529385019360019390930192908501906105e0565b5060808801519450818782030160a088015261063f81866104fd565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808201808211156106b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea26469706673582212201665fc4a987397715b9892065ad27121276fc1052ea227a5f5cff3da42d5c25764736f6c63430008190033";
|
||||
@@ -0,0 +1,144 @@
|
||||
import {
|
||||
extendedMetadataMock,
|
||||
jsonProvider,
|
||||
signers,
|
||||
sdk,
|
||||
} from "./before-setup";
|
||||
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
|
||||
import { expect } from "chai";
|
||||
import { mockUploadMetadataWithBytecode } from "./utils";
|
||||
import {
|
||||
mockCoreBytecode,
|
||||
mockCoreCompilerMetadata,
|
||||
mockCoreDeployedBytecode,
|
||||
} from "./mock/mockCoreMetadata";
|
||||
import {
|
||||
mockExtensionWithFunctionsBytecode,
|
||||
mockExtensionWithFunctionsCompilerMetadata,
|
||||
} from "./mock/mockExtensionWithFunctionsMetadata";
|
||||
import { compatibleExtensions } from "../../src/evm/common/modular/compatibleExtensions";
|
||||
import { mockExtensionWithInterfaceBytecode } from "./mock/mockExtensionWithInterface";
|
||||
|
||||
describe("Modular contract deployment", async () => {
|
||||
let adminWallet: SignerWithAddress;
|
||||
|
||||
async function mockPublishExtension() {
|
||||
const mockPublisher = process.env.contractPublisherAddress;
|
||||
process.env.contractPublisherAddress =
|
||||
"0xf5b896Ddb5146D5dA77efF4efBb3Eae36E300808";
|
||||
|
||||
const publishUri = await mockUploadMetadataWithBytecode(
|
||||
"DemoExtensionWithFunctions",
|
||||
mockExtensionWithFunctionsCompilerMetadata.output.abi,
|
||||
mockExtensionWithFunctionsBytecode,
|
||||
"",
|
||||
{
|
||||
...extendedMetadataMock,
|
||||
deployType: "standard",
|
||||
networksForDeployment: {
|
||||
allNetworks: true,
|
||||
networksEnabled: [],
|
||||
},
|
||||
publisher: await adminWallet.getAddress(),
|
||||
},
|
||||
"ipfs://QmbAYkPwB2V8E8Phs62TFAoAa9fuP74DZFD2uCiSNAHpVb/0",
|
||||
);
|
||||
|
||||
process.env.contractPublisherAddress = mockPublisher;
|
||||
|
||||
return publishUri;
|
||||
}
|
||||
|
||||
async function mockPublishAndDeployMockCore() {
|
||||
const mockPublisher = process.env.contractPublisherAddress;
|
||||
process.env.contractPublisherAddress =
|
||||
"0xf5b896Ddb5146D5dA77efF4efBb3Eae36E300808";
|
||||
|
||||
const publishUri = await mockUploadMetadataWithBytecode(
|
||||
"DemoCore",
|
||||
mockCoreCompilerMetadata.output.abi,
|
||||
mockCoreBytecode,
|
||||
mockCoreDeployedBytecode,
|
||||
{
|
||||
...extendedMetadataMock,
|
||||
deployType: "autoFactory",
|
||||
routerType: "modular",
|
||||
defaultExtensions: [
|
||||
{
|
||||
extensionName: "DemoExtensionWithFunctions",
|
||||
extensionVersion: "",
|
||||
publisherAddress: await adminWallet.getAddress(),
|
||||
},
|
||||
],
|
||||
factoryDeploymentData: {
|
||||
implementationAddresses: {},
|
||||
factoryAddresses: {},
|
||||
implementationInitializerFunction: "initialize",
|
||||
|
||||
modularFactoryInput: { hooksParamName: "extensions" },
|
||||
},
|
||||
networksForDeployment: {
|
||||
allNetworks: true,
|
||||
networksEnabled: [],
|
||||
},
|
||||
publisher: await adminWallet.getAddress(),
|
||||
},
|
||||
"ipfs://QmbQLyXkhkF2tF6nSbB9TaXUShaLbEWMi11zuR5U5mfz2X/0",
|
||||
);
|
||||
|
||||
const walletAddress = await sdk.wallet.getAddress();
|
||||
|
||||
const address = await sdk.deployer.deployContractFromUri(
|
||||
publishUri,
|
||||
[walletAddress, [], ["0x"]],
|
||||
{
|
||||
forceDirectDeploy: false,
|
||||
},
|
||||
);
|
||||
|
||||
const core = await sdk.getContract(address);
|
||||
|
||||
process.env.contractPublisherAddress = mockPublisher;
|
||||
|
||||
return core;
|
||||
}
|
||||
|
||||
before(async () => {
|
||||
[adminWallet] = signers;
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
sdk.updateSignerOrProvider(adminWallet);
|
||||
await jsonProvider.send("hardhat_reset", []);
|
||||
});
|
||||
|
||||
it("should deploy core but not install hooks", async () => {
|
||||
// await mockPublishModularFactory();
|
||||
await mockPublishExtension();
|
||||
const mockCore = await mockPublishAndDeployMockCore();
|
||||
|
||||
const extensions = await mockCore.call("getInstalledExtensions");
|
||||
|
||||
expect(extensions.length).to.equal(0);
|
||||
});
|
||||
|
||||
it("should check extension compatibility", async () => {
|
||||
// duplicate callback/fallback
|
||||
let isCompatible = await compatibleExtensions(
|
||||
mockCoreBytecode,
|
||||
[mockExtensionWithFunctionsBytecode, mockExtensionWithFunctionsBytecode],
|
||||
11155111,
|
||||
);
|
||||
|
||||
expect(isCompatible).to.be.false;
|
||||
|
||||
// required interface not supported
|
||||
isCompatible = await compatibleExtensions(
|
||||
mockCoreBytecode,
|
||||
[mockExtensionWithInterfaceBytecode],
|
||||
11155111,
|
||||
);
|
||||
|
||||
expect(isCompatible).to.be.false;
|
||||
});
|
||||
});
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,35 @@
|
||||
# @thirdweb-dev/unity-js-bridge
|
||||
|
||||
## 0.6.46
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/sdk@4.0.97
|
||||
- @thirdweb-dev/wallets@2.5.37
|
||||
- @thirdweb-dev/auth@4.1.95
|
||||
|
||||
## 0.6.45
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3317](https://github.com/thirdweb-dev/js/pull/3317) [`198f72c`](https://github.com/thirdweb-dev/js/commit/198f72c4933633d44185ff7b1d7e995e90c4d618) Thanks [@0xFirekeeper](https://github.com/0xFirekeeper)! - [Unity] fix tx builder type parsing
|
||||
|
||||
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
- @thirdweb-dev/sdk@4.0.96
|
||||
- @thirdweb-dev/wallets@2.5.36
|
||||
- @thirdweb-dev/auth@4.1.94
|
||||
|
||||
## 0.6.44
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
|
||||
- @thirdweb-dev/sdk@4.0.95
|
||||
- @thirdweb-dev/wallets@2.5.35
|
||||
- @thirdweb-dev/auth@4.1.93
|
||||
|
||||
## 0.6.43
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/unity-js-bridge",
|
||||
"version": "0.6.43",
|
||||
"version": "0.6.46",
|
||||
"main": "dist/thirdweb-unity-bridge.js",
|
||||
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/unity-js-bridge",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -173,7 +173,7 @@ class ThirdwebBridge implements TWBridge {
|
||||
// biome-ignore lint/suspicious/noExplicitAny: TODO: fix use of any
|
||||
(globalThis as any).X_SDK_PLATFORM = "unity";
|
||||
// biome-ignore lint/suspicious/noExplicitAny: TODO: fix use of any
|
||||
(globalThis as any).X_SDK_VERSION = "4.16.3";
|
||||
(globalThis as any).X_SDK_VERSION = "4.16.4";
|
||||
// biome-ignore lint/suspicious/noExplicitAny: TODO: fix use of any
|
||||
(globalThis as any).X_SDK_OS = browser?.os ?? "unknown";
|
||||
}
|
||||
@@ -610,7 +610,9 @@ class ThirdwebBridge implements TWBridge {
|
||||
maxFeePerGas: txInput?.maxFeePerGas,
|
||||
maxPriorityFeePerGas: txInput?.maxPriorityFeePerGas,
|
||||
nonce: txInput?.nonce,
|
||||
type: txInput?.type?.toNumber(),
|
||||
type: txInput?.type
|
||||
? BigNumber.from(txInput.type).toNumber()
|
||||
: undefined,
|
||||
accessList: txInput?.accessList,
|
||||
// customData: txInput.data,
|
||||
// ccipReadEnabled: txInput.ccipReadEnabled,
|
||||
|
||||
@@ -1,5 +1,27 @@
|
||||
# @thirdweb-dev/wallets
|
||||
|
||||
## 2.5.37
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @thirdweb-dev/sdk@4.0.97
|
||||
|
||||
## 2.5.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`8b74602`](https://github.com/thirdweb-dev/js/commit/8b74602e3b7fbe011bf886b9d5ee0e2ea62f7447)]:
|
||||
- @thirdweb-dev/chains@0.1.119
|
||||
- @thirdweb-dev/sdk@4.0.96
|
||||
|
||||
## 2.5.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052)]:
|
||||
- @thirdweb-dev/sdk@4.0.95
|
||||
|
||||
## 2.5.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thirdweb-dev/wallets",
|
||||
"version": "2.5.34",
|
||||
"version": "2.5.37",
|
||||
"main": "dist/thirdweb-dev-wallets.cjs.js",
|
||||
"module": "dist/thirdweb-dev-wallets.esm.js",
|
||||
"browser": {
|
||||
|
||||
Binary file not shown.
+9
-6
@@ -12,7 +12,7 @@
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
"test": "turbo run test --filter=./packages/*",
|
||||
"test:legacy": "turbo run test --filter=./legacy_packages/* --filter=!sdk --filter=!auth",
|
||||
"test:legacy": "turbo run test --filter=./legacy_packages/* --filter=!@thirdweb-dev/sdk --filter=!@thirdweb-dev/auth",
|
||||
"e2e": "turbo run e2e --filter=./packages/*",
|
||||
"e2e:legacy": "turbo run e2e --filter=./legacy_packages/*",
|
||||
"build:packages": "turbo run build --filter=./packages/*",
|
||||
@@ -44,7 +44,7 @@
|
||||
"@manypkg/get-packages": "2.2.1",
|
||||
"@playwright/test": "1.31.2",
|
||||
"@types/node": "20.12.7",
|
||||
"turbo": "1.13.3",
|
||||
"turbo": "2.0.4",
|
||||
"yalc": "1.0.0-pre.53"
|
||||
},
|
||||
"_______ALL_PACKAGE_DEV_DEPENDENCIES_GO_IN_HERE_SO_CONSUMERS_DONT_END_UP_INSTALLING_THEM______": "_______ALL_PACKAGE_DEV_DEPENDENCIES_GO_IN_HERE_SO_CONSUMERS_DONT_END_UP_INSTALLING_THEM______",
|
||||
@@ -62,13 +62,13 @@
|
||||
"@viem/anvil": "0.0.9",
|
||||
"@vitest/coverage-v8": "1.5.0",
|
||||
"dotenv-mono": "1.3.14",
|
||||
"ethers5": "npm:[email protected]",
|
||||
"ethers6": "npm:[email protected]",
|
||||
"eslint-plugin-i18next": "^6.0.3",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-inclusive-language": "^2.2.1",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-tsdoc": "^0.2.17",
|
||||
"ethers5": "npm:[email protected]",
|
||||
"ethers6": "npm:[email protected]",
|
||||
"knip": "5.9.4",
|
||||
"mitata": "0.1.11",
|
||||
"react": "18.2.0",
|
||||
@@ -98,7 +98,10 @@
|
||||
"protobufjs@>=6.10.0 <7.2.4": ">=7.2.4",
|
||||
"tough-cookie@<4.1.3": ">=4.1.3",
|
||||
"@ethereumjs/util@<9.0.0": ">=9.0.0",
|
||||
"axios@<0.28.0": ">=0.28.0"
|
||||
"axios@<0.28.0": ">=0.28.0",
|
||||
"@grpc/grpc-js@<1.10.9": "1.10.9",
|
||||
"braces@<3.0.3": "3.0.3"
|
||||
}
|
||||
}
|
||||
},
|
||||
"packageManager": "[email protected]"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# thirdweb
|
||||
|
||||
## 5.29.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3345](https://github.com/thirdweb-dev/js/pull/3345) [`79e6a04`](https://github.com/thirdweb-dev/js/commit/79e6a047d6ae6cb341fdad22137bd83ad6e611d4) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Fix react native inAppWallet creation
|
||||
|
||||
## 5.29.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#3329](https://github.com/thirdweb-dev/js/pull/3329) [`c94bcd5`](https://github.com/thirdweb-dev/js/commit/c94bcd574aa4eaf2bd76ab8b6379302de4731ed4) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Dynamically import coinbase sdk to avoid cloudflare bundler issues
|
||||
|
||||
- [#3341](https://github.com/thirdweb-dev/js/pull/3341) [`1c533ef`](https://github.com/thirdweb-dev/js/commit/1c533efcd5fbc8a72fd03c98510fa601ee5f34b5) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Fix transaction button not respecting theme prop
|
||||
|
||||
- [#3298](https://github.com/thirdweb-dev/js/pull/3298) [`ffaff74`](https://github.com/thirdweb-dev/js/commit/ffaff744f72d2cb22896e7501677b48f76ea857a) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - refactor exports to handle native vs non-native dependencies
|
||||
|
||||
- [#3330](https://github.com/thirdweb-dev/js/pull/3330) [`9cf3a1d`](https://github.com/thirdweb-dev/js/commit/9cf3a1d6636fcd56559e889ab2bfe3249d51162a) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Fix coinbase wallet popup sometimes not opening on safari + improve inAppWallet web performance
|
||||
|
||||
## 5.29.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#2880](https://github.com/thirdweb-dev/js/pull/2880) [`7768067`](https://github.com/thirdweb-dev/js/commit/7768067bf4f571a8c8ee6b646a58e2fc5f6bd052) Thanks [@kumaryash90](https://github.com/kumaryash90)! - Modular contract publish and deploy setup
|
||||
|
||||
- [#3318](https://github.com/thirdweb-dev/js/pull/3318) [`fb6a07d`](https://github.com/thirdweb-dev/js/commit/fb6a07d4b84ba8ea6389ca04c73625f670a0d9c4) Thanks [@jnsdls](https://github.com/jnsdls)! - add missing erc4337 extensions
|
||||
|
||||
## 5.29.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "thirdweb",
|
||||
"version": "5.29.1",
|
||||
"version": "5.29.4",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/thirdweb-dev/js.git#main"
|
||||
@@ -68,7 +68,7 @@
|
||||
"./react": {
|
||||
"types": "./dist/types/exports/react.d.ts",
|
||||
"import": "./dist/esm/exports/react.js",
|
||||
"react-native": "./dist/esm/exports/react-native.js",
|
||||
"react-native": "./dist/esm/exports/react.native.js",
|
||||
"default": "./dist/cjs/exports/react.js"
|
||||
},
|
||||
"./react-native": {
|
||||
@@ -99,8 +99,15 @@
|
||||
"./wallets": {
|
||||
"types": "./dist/types/exports/wallets.d.ts",
|
||||
"import": "./dist/esm/exports/wallets.js",
|
||||
"react-native": "./dist/esm/exports/wallets.native.js",
|
||||
"default": "./dist/cjs/exports/wallets.js"
|
||||
},
|
||||
"./wallets/in-app": {
|
||||
"types": "./dist/types/exports/wallets/in-app.d.ts",
|
||||
"import": "./dist/esm/exports/wallets/in-app.js",
|
||||
"react-native": "./dist/esm/exports/wallets/in-app.native.js",
|
||||
"default": "./dist/cjs/exports/wallets/in-app.js"
|
||||
},
|
||||
"./wallets/*": {
|
||||
"types": "./dist/types/exports/wallets/*.d.ts",
|
||||
"import": "./dist/esm/exports/wallets/*.js",
|
||||
@@ -258,7 +265,7 @@
|
||||
"scripts": {
|
||||
"bench:compare": "bun run ./benchmarks/run.ts",
|
||||
"bench": "vitest -c ./test/vitest.config.ts bench",
|
||||
"format": "biome format 'src/**/*' --write",
|
||||
"format": "biome format src/ --write",
|
||||
"lint": "biome check src/",
|
||||
"fix": "biome check src/ --apply",
|
||||
"knip": "knip",
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
"function getAccountsOfSigner(address signer) view returns (address[] accounts)",
|
||||
"function getAddress(address adminSigner, bytes data) view returns (address)",
|
||||
"function getAllAccounts() view returns (address[])",
|
||||
"function getAccounts(uint256 start, uint256 end) view returns (address[])",
|
||||
"function onSignerAdded(address signer, address creatorAdmin, bytes data)",
|
||||
"function onSignerRemoved(address signer, address creatorAdmin, bytes data)"
|
||||
"function onSignerRemoved(address signer, address creatorAdmin, bytes data)",
|
||||
"function totalAccounts() view returns (uint256)",
|
||||
"function isRegistered(address account) view returns (bool)"
|
||||
]
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
[
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getInstalledExtensions",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IModularCore.InstalledExtension[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "implementation",
|
||||
"type": "address",
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"type": "tuple",
|
||||
"internalType": "struct IExtensionConfig.ExtensionConfig",
|
||||
"components": [
|
||||
{
|
||||
"name": "registerInstallationCallback",
|
||||
"type": "bool",
|
||||
"internalType": "bool"
|
||||
},
|
||||
{
|
||||
"name": "requiredInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "supportedInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "callbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.CallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fallbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.FallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
},
|
||||
{
|
||||
"name": "permissionBits",
|
||||
"type": "uint256",
|
||||
"internalType": "uint256"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getSupportedCallbackFunctions",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IModularCore.SupportedCallbackFunction[]",
|
||||
"components": [
|
||||
{ "name": "selector", "type": "bytes4", "internalType": "bytes4" },
|
||||
{
|
||||
"name": "mode",
|
||||
"type": "uint8",
|
||||
"internalType": "enum IModularCore.CallbackMode"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "pure"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "installExtension",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "extensionContract",
|
||||
"type": "address",
|
||||
"internalType": "address"
|
||||
},
|
||||
{ "name": "data", "type": "bytes", "internalType": "bytes" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "supportsInterface",
|
||||
"inputs": [
|
||||
{ "name": "interfaceID", "type": "bytes4", "internalType": "bytes4" }
|
||||
],
|
||||
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "uninstallExtension",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "extensionContract",
|
||||
"type": "address",
|
||||
"internalType": "address"
|
||||
},
|
||||
{ "name": "data", "type": "bytes", "internalType": "bytes" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,61 @@
|
||||
[
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getExtensionConfig",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "tuple",
|
||||
"internalType": "struct IExtensionConfig.ExtensionConfig",
|
||||
"components": [
|
||||
{
|
||||
"name": "registerInstallationCallback",
|
||||
"type": "bool",
|
||||
"internalType": "bool"
|
||||
},
|
||||
{
|
||||
"name": "requiredInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "supportedInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "callbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.CallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fallbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.FallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
},
|
||||
{
|
||||
"name": "permissionBits",
|
||||
"type": "uint256",
|
||||
"internalType": "uint256"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "pure"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,395 @@
|
||||
[
|
||||
{ "type": "fallback", "stateMutability": "payable" },
|
||||
{
|
||||
"type": "function",
|
||||
"name": "cancelOwnershipHandover",
|
||||
"inputs": [],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "completeOwnershipHandover",
|
||||
"inputs": [
|
||||
{ "name": "pendingOwner", "type": "address", "internalType": "address" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getInstalledExtensions",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "_installedExtensions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IModularCore.InstalledExtension[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "implementation",
|
||||
"type": "address",
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "config",
|
||||
"type": "tuple",
|
||||
"internalType": "struct IExtensionConfig.ExtensionConfig",
|
||||
"components": [
|
||||
{
|
||||
"name": "registerInstallationCallback",
|
||||
"type": "bool",
|
||||
"internalType": "bool"
|
||||
},
|
||||
{
|
||||
"name": "requiredInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "supportedInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "callbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.CallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fallbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.FallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
},
|
||||
{
|
||||
"name": "permissionBits",
|
||||
"type": "uint256",
|
||||
"internalType": "uint256"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getSupportedCallbackFunctions",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IModularCore.SupportedCallbackFunction[]",
|
||||
"components": [
|
||||
{ "name": "selector", "type": "bytes4", "internalType": "bytes4" },
|
||||
{
|
||||
"name": "mode",
|
||||
"type": "uint8",
|
||||
"internalType": "enum IModularCore.CallbackMode"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "pure"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "grantRoles",
|
||||
"inputs": [
|
||||
{ "name": "user", "type": "address", "internalType": "address" },
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "hasAllRoles",
|
||||
"inputs": [
|
||||
{ "name": "user", "type": "address", "internalType": "address" },
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "hasAnyRole",
|
||||
"inputs": [
|
||||
{ "name": "user", "type": "address", "internalType": "address" },
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "installExtension",
|
||||
"inputs": [
|
||||
{ "name": "_extension", "type": "address", "internalType": "address" },
|
||||
{ "name": "_data", "type": "bytes", "internalType": "bytes" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "owner",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{ "name": "result", "type": "address", "internalType": "address" }
|
||||
],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "ownershipHandoverExpiresAt",
|
||||
"inputs": [
|
||||
{ "name": "pendingOwner", "type": "address", "internalType": "address" }
|
||||
],
|
||||
"outputs": [
|
||||
{ "name": "result", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "renounceOwnership",
|
||||
"inputs": [],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "renounceRoles",
|
||||
"inputs": [
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "requestOwnershipHandover",
|
||||
"inputs": [],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "revokeRoles",
|
||||
"inputs": [
|
||||
{ "name": "user", "type": "address", "internalType": "address" },
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "rolesOf",
|
||||
"inputs": [
|
||||
{ "name": "user", "type": "address", "internalType": "address" }
|
||||
],
|
||||
"outputs": [
|
||||
{ "name": "roles", "type": "uint256", "internalType": "uint256" }
|
||||
],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "supportsInterface",
|
||||
"inputs": [
|
||||
{ "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" }
|
||||
],
|
||||
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
||||
"stateMutability": "view"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "transferOwnership",
|
||||
"inputs": [
|
||||
{ "name": "newOwner", "type": "address", "internalType": "address" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "function",
|
||||
"name": "uninstallExtension",
|
||||
"inputs": [
|
||||
{ "name": "_extension", "type": "address", "internalType": "address" },
|
||||
{ "name": "_data", "type": "bytes", "internalType": "bytes" }
|
||||
],
|
||||
"outputs": [],
|
||||
"stateMutability": "payable"
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "ExtensionInstalled",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "caller",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "implementation",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "installedExtension",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "ExtensionUninstalled",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "caller",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "implementation",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "installedExtension",
|
||||
"type": "address",
|
||||
"indexed": false,
|
||||
"internalType": "address"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "OwnershipHandoverCanceled",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "pendingOwner",
|
||||
"type": "address",
|
||||
"indexed": true,
|
||||
"internalType": "address"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "OwnershipHandoverRequested",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "pendingOwner",
|
||||
"type": "address",
|
||||
"indexed": true,
|
||||
"internalType": "address"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "OwnershipTransferred",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "oldOwner",
|
||||
"type": "address",
|
||||
"indexed": true,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "newOwner",
|
||||
"type": "address",
|
||||
"indexed": true,
|
||||
"internalType": "address"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{
|
||||
"type": "event",
|
||||
"name": "RolesUpdated",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "user",
|
||||
"type": "address",
|
||||
"indexed": true,
|
||||
"internalType": "address"
|
||||
},
|
||||
{
|
||||
"name": "roles",
|
||||
"type": "uint256",
|
||||
"indexed": true,
|
||||
"internalType": "uint256"
|
||||
}
|
||||
],
|
||||
"anonymous": false
|
||||
},
|
||||
{ "type": "error", "name": "AlreadyInitialized", "inputs": [] },
|
||||
{ "type": "error", "name": "CallbackExecutionReverted", "inputs": [] },
|
||||
{
|
||||
"type": "error",
|
||||
"name": "CallbackFunctionAlreadyInstalled",
|
||||
"inputs": []
|
||||
},
|
||||
{ "type": "error", "name": "CallbackFunctionNotSupported", "inputs": [] },
|
||||
{ "type": "error", "name": "CallbackFunctionRequired", "inputs": [] },
|
||||
{
|
||||
"type": "error",
|
||||
"name": "CallbackFunctionUnauthorizedCall",
|
||||
"inputs": []
|
||||
},
|
||||
{ "type": "error", "name": "ExtensionAlreadyInstalled", "inputs": [] },
|
||||
{
|
||||
"type": "error",
|
||||
"name": "ExtensionInterfaceNotCompatible",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "requiredInterfaceId",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{ "type": "error", "name": "ExtensionNotInstalled", "inputs": [] },
|
||||
{ "type": "error", "name": "ExtensionOutOfSync", "inputs": [] },
|
||||
{
|
||||
"type": "error",
|
||||
"name": "FallbackFunctionAlreadyInstalled",
|
||||
"inputs": []
|
||||
},
|
||||
{ "type": "error", "name": "FallbackFunctionNotInstalled", "inputs": [] },
|
||||
{ "type": "error", "name": "IndexOutOfBounds", "inputs": [] },
|
||||
{ "type": "error", "name": "NewOwnerIsZeroAddress", "inputs": [] },
|
||||
{ "type": "error", "name": "NoHandoverRequest", "inputs": [] },
|
||||
{ "type": "error", "name": "Unauthorized", "inputs": [] }
|
||||
]
|
||||
@@ -0,0 +1,61 @@
|
||||
[
|
||||
{
|
||||
"type": "function",
|
||||
"name": "getExtensionConfig",
|
||||
"inputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "",
|
||||
"type": "tuple",
|
||||
"internalType": "struct IExtensionConfig.ExtensionConfig",
|
||||
"components": [
|
||||
{
|
||||
"name": "registerInstallationCallback",
|
||||
"type": "bool",
|
||||
"internalType": "bool"
|
||||
},
|
||||
{
|
||||
"name": "requiredInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "supportedInterfaces",
|
||||
"type": "bytes4[]",
|
||||
"internalType": "bytes4[]"
|
||||
},
|
||||
{
|
||||
"name": "callbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.CallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "fallbackFunctions",
|
||||
"type": "tuple[]",
|
||||
"internalType": "struct IExtensionConfig.FallbackFunction[]",
|
||||
"components": [
|
||||
{
|
||||
"name": "selector",
|
||||
"type": "bytes4",
|
||||
"internalType": "bytes4"
|
||||
},
|
||||
{
|
||||
"name": "permissionBits",
|
||||
"type": "uint256",
|
||||
"internalType": "uint256"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"stateMutability": "pure"
|
||||
}
|
||||
]
|
||||
@@ -55,8 +55,9 @@ export async function generateFromAbi(
|
||||
events.map(async (e) => {
|
||||
await writeFile(
|
||||
join(outFolder, extensionFileName, "./events", `${e.name}.ts`),
|
||||
await format(generateEvent(e, extensionName), {
|
||||
format(generateEvent(e, extensionName), {
|
||||
parser: "babel-ts",
|
||||
trailingComma: "all",
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
@@ -73,8 +74,9 @@ export async function generateFromAbi(
|
||||
readFunctions.map(async (f) => {
|
||||
await writeFile(
|
||||
join(outFolder, extensionFileName, "./read", `${f.name}.ts`),
|
||||
await format(generateReadFunction(f, extensionName), {
|
||||
format(generateReadFunction(f, extensionName), {
|
||||
parser: "babel-ts",
|
||||
trailingComma: "all",
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
@@ -91,8 +93,9 @@ export async function generateFromAbi(
|
||||
writeFunctions.map(async (f) => {
|
||||
await writeFile(
|
||||
join(outFolder, extensionFileName, "./write", `${f.name}.ts`),
|
||||
await format(generateWriteFunction(f, extensionName), {
|
||||
format(generateWriteFunction(f, extensionName), {
|
||||
parser: "babel-ts",
|
||||
trailingComma: "all",
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { type Abi, formatAbi, parseAbi } from "abitype";
|
||||
import { getInstalledExtensions } from "../../extensions/modular/__generated__/ModularCore/read/getInstalledExtensions.js";
|
||||
import { download } from "../../storage/download.js";
|
||||
import { extractIPFSUri } from "../../utils/bytecode/extractIPFS.js";
|
||||
import { getClientFetch } from "../../utils/fetch.js";
|
||||
@@ -284,12 +285,14 @@ export async function resolveCompositeAbi(
|
||||
rootAbi_,
|
||||
pluginPatternAddresses,
|
||||
baseRouterAddresses,
|
||||
modularExtensionAddresses,
|
||||
diamondFacetAddresses,
|
||||
] = await Promise.all([
|
||||
rootAbi ? rootAbi : resolveAbiFromBytecode(contract),
|
||||
// check these all at the same time
|
||||
resolvePluginPatternAddresses(contract),
|
||||
resolveBaseRouterAddresses(contract),
|
||||
resolveModularExtensionAddresses(contract),
|
||||
resolveDiamondFacetAddresses(contract),
|
||||
]);
|
||||
|
||||
@@ -297,6 +300,7 @@ export async function resolveCompositeAbi(
|
||||
...new Set([
|
||||
...pluginPatternAddresses,
|
||||
...baseRouterAddresses,
|
||||
...modularExtensionAddresses,
|
||||
...diamondFacetAddresses,
|
||||
]),
|
||||
];
|
||||
@@ -358,6 +362,23 @@ async function resolveBaseRouterAddresses(
|
||||
return [];
|
||||
}
|
||||
|
||||
async function resolveModularExtensionAddresses(
|
||||
contract: ThirdwebContract,
|
||||
): Promise<string[]> {
|
||||
try {
|
||||
const extensions = await getInstalledExtensions({ contract });
|
||||
// if there are no plugins, return the root ABI
|
||||
if (!extensions.length) {
|
||||
return [];
|
||||
}
|
||||
// get all the plugin addresses
|
||||
return [...new Set(extensions.map((item) => item.implementation))];
|
||||
} catch {
|
||||
// no-op, expected because not everything supports this
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
async function resolveDiamondFacetAddresses(
|
||||
contract: ThirdwebContract,
|
||||
): Promise<string[]> {
|
||||
|
||||
@@ -21,6 +21,13 @@ export {
|
||||
checkVerificationStatus,
|
||||
} from "../contract/verification/index.js";
|
||||
|
||||
// publisher
|
||||
export {
|
||||
fetchPublishedContract,
|
||||
fetchPublishedContractMetadata,
|
||||
fetchDeployBytecodeFromPublishedContractMetadata,
|
||||
} from "../contract/deployment/publisher.js";
|
||||
|
||||
// deployment - TODO: these end up looking more like extensions -> should they be?
|
||||
export {
|
||||
prepareDirectDeployTransaction,
|
||||
|
||||
@@ -36,6 +36,9 @@ export { signerPermissionsUpdatedEvent } from "../../extensions/erc4337/__genera
|
||||
|
||||
// FACTORY
|
||||
export { getAllAccounts } from "../../extensions/erc4337/__generated__/IAccountFactory/read/getAllAccounts.js";
|
||||
export { getAccounts } from "../../extensions/erc4337/__generated__/IAccountFactory/read/getAccounts.js";
|
||||
export { totalAccounts } from "../../extensions/erc4337/__generated__/IAccountFactory/read/totalAccounts.js";
|
||||
export { isRegistered } from "../../extensions/erc4337/__generated__/IAccountFactory/read/isRegistered.js";
|
||||
export {
|
||||
getAccountsOfSigner,
|
||||
type GetAccountsOfSignerParams,
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* READ
|
||||
*/
|
||||
export {
|
||||
getInstalledExtensions,
|
||||
isGetInstalledExtensionsSupported,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/getInstalledExtensions.js";
|
||||
export {
|
||||
getSupportedCallbackFunctions,
|
||||
isGetSupportedCallbackFunctionsSupported,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/getSupportedCallbackFunctions.js";
|
||||
export {
|
||||
hasAnyRole,
|
||||
type HasAnyRoleParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/hasAnyRole.js";
|
||||
export {
|
||||
hasAllRoles,
|
||||
type HasAllRolesParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/hasAllRoles.js";
|
||||
export { owner } from "../../extensions/modular/__generated__/ModularCore/read/owner.js";
|
||||
export {
|
||||
ownershipHandoverExpiresAt,
|
||||
type OwnershipHandoverExpiresAtParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/ownershipHandoverExpiresAt.js";
|
||||
export {
|
||||
rolesOf,
|
||||
type RolesOfParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/read/rolesOf.js";
|
||||
|
||||
/**
|
||||
* Write
|
||||
*/
|
||||
export { cancelOwnershipHandover } from "../../extensions/modular/__generated__/ModularCore/write/cancelOwnershipHandover.js";
|
||||
export {
|
||||
completeOwnershipHandover,
|
||||
type CompleteOwnershipHandoverParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/completeOwnershipHandover.js";
|
||||
export {
|
||||
grantRoles,
|
||||
type GrantRolesParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/grantRoles.js";
|
||||
export {
|
||||
installExtension,
|
||||
isInstallExtensionSupported,
|
||||
type InstallExtensionParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/installExtension.js";
|
||||
export { renounceOwnership } from "../../extensions/modular/__generated__/ModularCore/write/renounceOwnership.js";
|
||||
export { requestOwnershipHandover } from "../../extensions/modular/__generated__/ModularCore/write/requestOwnershipHandover.js";
|
||||
export {
|
||||
renounceRoles,
|
||||
type RenounceRolesParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/renounceRoles.js";
|
||||
export {
|
||||
revokeRoles,
|
||||
type RevokeRolesParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/revokeRoles.js";
|
||||
export {
|
||||
transferOwnership,
|
||||
type TransferOwnershipParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/transferOwnership.js";
|
||||
export {
|
||||
uninstallExtension,
|
||||
isUninstallExtensionSupported,
|
||||
type UninstallExtensionParams,
|
||||
} from "../../extensions/modular/__generated__/ModularCore/write/uninstallExtension.js";
|
||||
export { getExtensionConfig } from "../../extensions/modular/__generated__/ModularExtension/read/getExtensionConfig.js";
|
||||
export {
|
||||
installPublishedExtension,
|
||||
type InstallPublishedExtensionOptions,
|
||||
} from "../../extensions/modular/ModularCore/write/installPublishedExtension.js";
|
||||
export {
|
||||
uninstallPublishedExtension,
|
||||
type UninstallPublishedExtensionOptions,
|
||||
} from "../../extensions/modular/ModularCore/write/uninstallPublishedExtension.js";
|
||||
export {
|
||||
uninstallExtensionByProxy,
|
||||
type UninstallExtensionByProxyOptions,
|
||||
} from "../../extensions/modular/ModularCore/write/uninstallExtensionByProxy.js";
|
||||
@@ -1,98 +0,0 @@
|
||||
export { ThirdwebProvider } from "../react/core/providers/thirdweb-provider.js";
|
||||
|
||||
// react/core
|
||||
export {
|
||||
useSetActiveWallet,
|
||||
useActiveWalletChain,
|
||||
useConnect,
|
||||
useDisconnect,
|
||||
useActiveAccount,
|
||||
useActiveWallet,
|
||||
useConnectedWallets,
|
||||
useSwitchActiveWalletChain,
|
||||
useActiveWalletConnectionStatus,
|
||||
useSetActiveWalletConnectionStatus,
|
||||
useIsAutoConnecting,
|
||||
} from "../react/core/hooks/wallets/wallet-hooks.js";
|
||||
export { useWalletBalance } from "../react/core/hooks/others/useWalletBalance.js";
|
||||
|
||||
// contract related
|
||||
export { useReadContract } from "../react/core/hooks/contract/useReadContract.js";
|
||||
|
||||
export { useEstimateGas } from "../react/core/hooks/contract/useEstimateGas.js";
|
||||
export { useWaitForReceipt } from "../react/core/hooks/contract/useWaitForReceipt.js";
|
||||
export { useContractEvents } from "../react/core/hooks/contract/useContractEvents.js";
|
||||
|
||||
// rpc related
|
||||
export {
|
||||
useBlockNumber,
|
||||
type UseBlockNumberOptions,
|
||||
} from "../react/core/hooks/rpc/useBlockNumber.js";
|
||||
|
||||
// utils
|
||||
export { createContractQuery } from "../react/core/utils/createQuery.js";
|
||||
export { useInvalidateContractQuery } from "../react/core/hooks/others/useInvalidateQueries.js";
|
||||
|
||||
// pay
|
||||
export {
|
||||
useBuyWithCryptoQuote,
|
||||
type BuyWithCryptoQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithCryptoQuote.js";
|
||||
export { useBuyWithCryptoStatus } from "../react/core/hooks/pay/useBuyWithCryptoStatus.js";
|
||||
export {
|
||||
useBuyWithCryptoHistory,
|
||||
type BuyWithCryptoHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithCryptoHistory.js";
|
||||
export {
|
||||
useBuyWithFiatQuote,
|
||||
type BuyWithFiatQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithFiatQuote.js";
|
||||
export { useBuyWithFiatStatus } from "../react/core/hooks/pay/useBuyWithFiatStatus.js";
|
||||
export {
|
||||
useBuyWithFiatHistory,
|
||||
type BuyWithFiatHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithFiatHistory.js";
|
||||
export {
|
||||
useBuyHistory,
|
||||
type BuyHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyHistory.js";
|
||||
export {
|
||||
usePostOnRampQuote,
|
||||
type PostOnRampQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/usePostOnrampQuote.js";
|
||||
|
||||
import { useSendTransactionCore } from "../react/core/hooks/contract/useSendTransaction.js";
|
||||
|
||||
/**
|
||||
* A hook to send a transaction.
|
||||
* @returns A mutation object to send a transaction.
|
||||
* @example
|
||||
* ```jsx
|
||||
* import { useSendTransaction } from "thirdweb/react-native";
|
||||
* const { mutate: sendTx, data: transactionResult } = useSendTransaction();
|
||||
*
|
||||
* // later
|
||||
* sendTx(tx);
|
||||
* ```
|
||||
* @transaction
|
||||
*/
|
||||
export const useSendTransaction = useSendTransactionCore;
|
||||
export { useSendBatchTransaction } from "../react/core/hooks/contract/useSendBatchTransaction.js";
|
||||
export { useSendAndConfirmTransaction } from "../react/core/hooks/contract/useSendAndConfirmTransaction.js";
|
||||
export { useEstimateGasCost } from "../react/core/hooks/contract/useEstimateGasCost.js";
|
||||
|
||||
// Components
|
||||
export {
|
||||
AutoConnect,
|
||||
type AutoConnectProps,
|
||||
} from "../react/core/hooks/connection/AutoConnect.js";
|
||||
export { useAutoConnect } from "../react/core/hooks/connection/useAutoConnect.js";
|
||||
|
||||
export { TransactionButton } from "../react/native/ui/TransactionButton/TrabsactionButton.js";
|
||||
export type { TransactionButtonProps } from "../react/core/hooks/transaction/button-core.js";
|
||||
|
||||
// wallet info
|
||||
export {
|
||||
useWalletInfo,
|
||||
useWalletImage,
|
||||
} from "../react/web/ui/hooks/useWalletInfo.js";
|
||||
@@ -0,0 +1,87 @@
|
||||
export { ThirdwebProvider } from "../react/core/providers/thirdweb-provider.js";
|
||||
|
||||
// wallet hooks
|
||||
export { useActiveWallet } from "../react/native/hooks/wallets/useActiveWallet.js";
|
||||
export { useActiveWalletChain } from "../react/native/hooks/wallets/useActiveWalletChain.js";
|
||||
export { useActiveWalletConnectionStatus } from "../react/native/hooks/wallets/useActiveWalletConnectionStatus.js";
|
||||
export { useActiveAccount } from "../react/native/hooks/wallets/useActiveAccount.js";
|
||||
export { useAutoConnect } from "../react/native/hooks/wallets/useAutoConnect.js";
|
||||
export { useCapabilities } from "../react/native/hooks/wallets/useCapabilities.js";
|
||||
export { useConnect } from "../react/native/hooks/wallets/useConnect.js";
|
||||
export { useConnectedWallets } from "../react/native/hooks/wallets/useConnectedWallets.js";
|
||||
export { useDisconnect } from "../react/native/hooks/wallets/useDisconnect.js";
|
||||
export { useIsAutoConnecting } from "../react/native/hooks/wallets/useIsAutoConnecting.js";
|
||||
export { useSetActiveWallet } from "../react/native/hooks/wallets/useSetActiveWallet.js";
|
||||
export { useSetActiveWalletConnectionStatus } from "../react/native/hooks/wallets/useSetActiveWalletConnectionStatus.js";
|
||||
export { useSendCalls } from "../react/native/hooks/wallets/useSendCalls.js";
|
||||
export { useSwitchActiveWalletChain } from "../react/native/hooks/wallets/useSwitchActiveWalletChain.js";
|
||||
export { useCallsStatus } from "../react/native/hooks/wallets/useCallsStatus.js";
|
||||
export { useWalletBalance } from "../react/core/hooks/others/useWalletBalance.js";
|
||||
|
||||
// contract
|
||||
export { useReadContract } from "../react/core/hooks/contract/useReadContract.js";
|
||||
export { useWaitForReceipt } from "../react/core/hooks/contract/useWaitForReceipt.js";
|
||||
export { useContractEvents } from "../react/core/hooks/contract/useContractEvents.js";
|
||||
|
||||
// transaction
|
||||
export {
|
||||
type SendTransactionConfig,
|
||||
type SendTransactionPayModalConfig,
|
||||
} from "../react/core/hooks/transaction/useSendTransaction.js";
|
||||
export { useSimulateTransaction } from "../react/core/hooks/transaction/useSimulateTransaction.js";
|
||||
export { useSendTransaction } from "../react/native/hooks/transaction/useSendTransaction.js";
|
||||
export { useSendBatchTransaction } from "../react/native/hooks/transaction/useSendBatchTransaction.js";
|
||||
export { useSendAndConfirmTransaction } from "../react/native/hooks/transaction/useSendAndConfirmTransaction.js";
|
||||
export { useEstimateGas } from "../react/native/hooks/transaction/useEstimateGas.js";
|
||||
export { useEstimateGasCost } from "../react/native/hooks/transaction/useEstimateGasCost.js";
|
||||
|
||||
// rpc related
|
||||
export {
|
||||
useBlockNumber,
|
||||
type UseBlockNumberOptions,
|
||||
} from "../react/core/hooks/rpc/useBlockNumber.js";
|
||||
|
||||
// utils
|
||||
export { createContractQuery } from "../react/core/utils/createQuery.js";
|
||||
export { useInvalidateContractQuery } from "../react/core/hooks/others/useInvalidateQueries.js";
|
||||
|
||||
// pay
|
||||
export {
|
||||
useBuyWithCryptoQuote,
|
||||
type BuyWithCryptoQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithCryptoQuote.js";
|
||||
export { useBuyWithCryptoStatus } from "../react/core/hooks/pay/useBuyWithCryptoStatus.js";
|
||||
export {
|
||||
useBuyWithCryptoHistory,
|
||||
type BuyWithCryptoHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithCryptoHistory.js";
|
||||
export {
|
||||
useBuyWithFiatQuote,
|
||||
type BuyWithFiatQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithFiatQuote.js";
|
||||
export { useBuyWithFiatStatus } from "../react/core/hooks/pay/useBuyWithFiatStatus.js";
|
||||
export {
|
||||
useBuyWithFiatHistory,
|
||||
type BuyWithFiatHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyWithFiatHistory.js";
|
||||
export {
|
||||
useBuyHistory,
|
||||
type BuyHistoryQueryOptions,
|
||||
} from "../react/core/hooks/pay/useBuyHistory.js";
|
||||
export {
|
||||
usePostOnRampQuote,
|
||||
type PostOnRampQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/usePostOnrampQuote.js";
|
||||
|
||||
// Components
|
||||
export { AutoConnect } from "../react/native/ui/AutoConnect/AutoConnect.js";
|
||||
export type { AutoConnectProps } from "../react/core/hooks/connection/types.js";
|
||||
|
||||
export { TransactionButton } from "../react/native/ui/TransactionButton/TrabsactionButton.js";
|
||||
export type { TransactionButtonProps } from "../react/core/hooks/transaction/transaction-button-utils.js";
|
||||
|
||||
// wallet info
|
||||
export {
|
||||
useWalletInfo,
|
||||
useWalletImage,
|
||||
} from "../react/web/ui/hooks/useWalletInfo.js";
|
||||
@@ -22,7 +22,7 @@ export type { WelcomeScreen } from "../react/web/ui/ConnectWallet/screens/types.
|
||||
export type { LocaleId } from "../react/web/ui/types.js";
|
||||
|
||||
export { TransactionButton } from "../react/web/ui/TransactionButton/index.js";
|
||||
export type { TransactionButtonProps } from "../react/core/hooks/transaction/button-core.js";
|
||||
export type { TransactionButtonProps } from "../react/core/hooks/transaction/transaction-button-utils.js";
|
||||
|
||||
export { ThirdwebProvider } from "../react/core/providers/thirdweb-provider.js";
|
||||
|
||||
@@ -37,38 +37,43 @@ export { defaultTokens } from "../react/web/ui/ConnectWallet/defaultTokens.js";
|
||||
export { MediaRenderer } from "../react/web/ui/MediaRenderer/MediaRenderer.js";
|
||||
export type { MediaRendererProps } from "../react/web/ui/MediaRenderer/types.js";
|
||||
|
||||
// react/core
|
||||
export {
|
||||
useSetActiveWallet,
|
||||
useActiveWalletChain,
|
||||
useConnect,
|
||||
useDisconnect,
|
||||
useActiveAccount,
|
||||
useActiveWallet,
|
||||
useConnectedWallets,
|
||||
useSwitchActiveWalletChain,
|
||||
useActiveWalletConnectionStatus,
|
||||
useSetActiveWalletConnectionStatus,
|
||||
useIsAutoConnecting,
|
||||
} from "../react/core/hooks/wallets/wallet-hooks.js";
|
||||
// wallet hooks
|
||||
export { useActiveWallet } from "../react/web/hooks/wallets/useActiveWallet.js";
|
||||
export { useActiveWalletChain } from "../react/web/hooks/wallets/useActiveWalletChain.js";
|
||||
export { useActiveWalletConnectionStatus } from "../react/web/hooks/wallets/useActiveWalletConnectionStatus.js";
|
||||
export { useActiveAccount } from "../react/web/hooks/wallets/useActiveAccount.js";
|
||||
export { useAutoConnect } from "../react/web/hooks/wallets/useAutoConnect.js";
|
||||
export { useCapabilities } from "../react/web/hooks/wallets/useCapabilities.js";
|
||||
export { useConnect } from "../react/web/hooks/wallets/useConnect.js";
|
||||
export { useConnectedWallets } from "../react/web/hooks/wallets/useConnectedWallets.js";
|
||||
export { useDisconnect } from "../react/web/hooks/wallets/useDisconnect.js";
|
||||
export { useIsAutoConnecting } from "../react/web/hooks/wallets/useIsAutoConnecting.js";
|
||||
export { useSetActiveWallet } from "../react/web/hooks/wallets/useSetActiveWallet.js";
|
||||
export { useSetActiveWalletConnectionStatus } from "../react/web/hooks/wallets/useSetActiveWalletConnectionStatus.js";
|
||||
export { useSendCalls } from "../react/web/hooks/wallets/useSendCalls.js";
|
||||
export { useSwitchActiveWalletChain } from "../react/web/hooks/wallets/useSwitchActiveWalletChain.js";
|
||||
export { useCallsStatus } from "../react/web/hooks/wallets/useCallsStatus.js";
|
||||
export { useWalletBalance } from "../react/core/hooks/others/useWalletBalance.js";
|
||||
|
||||
export type { ConnectManagerOptions } from "../wallets/manager/index.js";
|
||||
|
||||
// contract related
|
||||
// contract
|
||||
export { useReadContract } from "../react/core/hooks/contract/useReadContract.js";
|
||||
export {
|
||||
useSendTransaction,
|
||||
type SendTransactionConfig,
|
||||
type SendTransactionPayModalConfig,
|
||||
} from "../react/web/hooks/useSendTransaction.js";
|
||||
export { useSendBatchTransaction } from "../react/core/hooks/contract/useSendBatchTransaction.js";
|
||||
export { useSendAndConfirmTransaction } from "../react/core/hooks/contract/useSendAndConfirmTransaction.js";
|
||||
export { useEstimateGas } from "../react/core/hooks/contract/useEstimateGas.js";
|
||||
export { useEstimateGasCost } from "../react/core/hooks/contract/useEstimateGasCost.js";
|
||||
export { useWaitForReceipt } from "../react/core/hooks/contract/useWaitForReceipt.js";
|
||||
export { useContractEvents } from "../react/core/hooks/contract/useContractEvents.js";
|
||||
|
||||
// transaction
|
||||
export {
|
||||
type SendTransactionConfig,
|
||||
type SendTransactionPayModalConfig,
|
||||
} from "../react/core/hooks/transaction/useSendTransaction.js";
|
||||
export { useSimulateTransaction } from "../react/core/hooks/transaction/useSimulateTransaction.js";
|
||||
export { useSendTransaction } from "../react/web/hooks/transaction/useSendTransaction.js";
|
||||
export { useSendBatchTransaction } from "../react/web/hooks/transaction/useSendBatchTransaction.js";
|
||||
export { useSendAndConfirmTransaction } from "../react/web/hooks/transaction/useSendAndConfirmTransaction.js";
|
||||
export { useEstimateGas } from "../react/web/hooks/transaction/useEstimateGas.js";
|
||||
export { useEstimateGasCost } from "../react/web/hooks/transaction/useEstimateGasCost.js";
|
||||
|
||||
// rpc related
|
||||
export {
|
||||
useBlockNumber,
|
||||
@@ -107,11 +112,8 @@ export {
|
||||
type PostOnRampQuoteQueryOptions,
|
||||
} from "../react/core/hooks/pay/usePostOnrampQuote.js";
|
||||
|
||||
export {
|
||||
AutoConnect,
|
||||
type AutoConnectProps,
|
||||
} from "../react/core/hooks/connection/AutoConnect.js";
|
||||
export { useAutoConnect } from "../react/core/hooks/connection/useAutoConnect.js";
|
||||
export { AutoConnect } from "../react/web/ui/AutoConnect/AutoConnect.js";
|
||||
export type { AutoConnectProps } from "../react/core/hooks/connection/types.js";
|
||||
|
||||
// auth
|
||||
export { type SiweAuthOptions } from "../react/core/hooks/auth/useSiweAuth.js";
|
||||
@@ -138,8 +140,3 @@ export {
|
||||
useWalletDetailsModal,
|
||||
type UseWalletDetailsModalOptions,
|
||||
} from "../react/web/ui/ConnectWallet/Details.js";
|
||||
|
||||
// eip5792 hooks
|
||||
export { useSendCalls } from "../react/core/hooks/wallets/useSendCalls.js";
|
||||
export { useCallsStatus } from "../react/core/hooks/wallets/useCallsStatus.js";
|
||||
export { useCapabilities } from "../react/core/hooks/wallets/useCapabilities.js";
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
// --- KEEEP IN SYNC with exports/wallets.ts ---
|
||||
|
||||
export {
|
||||
createWallet,
|
||||
walletConnect,
|
||||
} from "../wallets/native/create-wallet.js";
|
||||
export { inAppWallet } from "../wallets/in-app/native/in-app.js";
|
||||
export { smartWallet } from "../wallets/smart/smart-wallet.js";
|
||||
|
||||
export type { Wallet, Account } from "../wallets/interfaces/wallet.js";
|
||||
export type { ConnectionStatus } from "../wallets/manager/index.js";
|
||||
|
||||
// utils
|
||||
export {
|
||||
getWalletBalance,
|
||||
type GetWalletBalanceOptions,
|
||||
} from "../wallets/utils/getWalletBalance.js";
|
||||
export {
|
||||
generateAccount,
|
||||
type GenerateAccountOptions,
|
||||
} from "../wallets/utils/generateAccount.js";
|
||||
|
||||
// private-key
|
||||
export {
|
||||
privateKeyToAccount,
|
||||
/**
|
||||
* @internal
|
||||
* @deprecated - use {@link privateKeyToAccount} instead
|
||||
*/
|
||||
privateKeyToAccount as privateKeyAccount,
|
||||
type PrivateKeyToAccountOptions,
|
||||
/**
|
||||
* @internal
|
||||
* @deprecated - use {@link PrivateKeyToAccountOptions} instead
|
||||
*/
|
||||
type PrivateKeyToAccountOptions as PrivateKeyAccountOptions,
|
||||
} from "../wallets/private-key.js";
|
||||
|
||||
export type {
|
||||
WalletId,
|
||||
WalletAutoConnectionOption,
|
||||
WalletCreationOptions,
|
||||
WalletConnectionOption,
|
||||
CreateWalletArgs,
|
||||
} from "../wallets/wallet-types.js";
|
||||
|
||||
export type {
|
||||
WCSupportedWalletIds,
|
||||
InjectedSupportedWalletIds,
|
||||
} from "../wallets/__generated__/wallet-ids.js";
|
||||
|
||||
export type {
|
||||
WCConnectOptions,
|
||||
WCAutoConnectOptions,
|
||||
} from "../wallets/wallet-connect/types.js";
|
||||
|
||||
export type {
|
||||
SmartWalletConnectionOptions,
|
||||
SmartWalletOptions,
|
||||
} from "../wallets/smart/types.js";
|
||||
|
||||
export type {
|
||||
InAppWalletAuth,
|
||||
/**
|
||||
* @deprecated use InAppWalletAuth instead
|
||||
*/
|
||||
InAppWalletAuth as EmbeddedWalletAuth,
|
||||
InAppWalletAutoConnectOptions,
|
||||
/**
|
||||
* @deprecated use InAppWalletAutoConnectOptions instead
|
||||
*/
|
||||
InAppWalletAutoConnectOptions as EmbeddedWalletAutoConnectOptions,
|
||||
InAppWalletConnectionOptions,
|
||||
/**
|
||||
* @deprecated use InAppWalletConnectionOptions instead
|
||||
*/
|
||||
InAppWalletConnectionOptions as EmbeddedWalletConnectionOptions,
|
||||
InAppWalletSocialAuth,
|
||||
/**
|
||||
* @deprecated use InAppWalletSocialAuth instead
|
||||
*/
|
||||
InAppWalletSocialAuth as EmbeddedWalletSocialAuth,
|
||||
} from "../wallets/in-app/core/wallet/types.js";
|
||||
|
||||
export type { CoinbaseSDKWalletConnectionOptions } from "../wallets/coinbase/coinbaseWebSDK.js";
|
||||
|
||||
export type {
|
||||
WalletEmitter,
|
||||
WalletEmitterEvents,
|
||||
} from "../wallets/wallet-emitter.js";
|
||||
|
||||
export { getAllWalletsList } from "../wallets/getAllWalletsList.js";
|
||||
export { getWalletInfo } from "../wallets/__generated__/getWalletInfo.js";
|
||||
export { type WalletInfo } from "../wallets/wallet-info.js";
|
||||
|
||||
export { createWalletAdapter } from "../adapters/wallet-adapter.js";
|
||||
|
||||
// NOT SUPPORTED
|
||||
|
||||
export const injectedProvider = () => {
|
||||
throw new Error("Not supported in native");
|
||||
};
|
||||
@@ -1,13 +1,17 @@
|
||||
// --- KEEEP IN SYNC with exports/wallets.native.ts ---
|
||||
|
||||
export {
|
||||
createWallet,
|
||||
smartWallet,
|
||||
walletConnect,
|
||||
} from "../wallets/create-wallet.js";
|
||||
export {
|
||||
inAppWallet,
|
||||
/**
|
||||
* @deprecated use inAppWallet instead
|
||||
*/
|
||||
inAppWallet as embeddedWallet,
|
||||
walletConnect,
|
||||
} from "../wallets/create-wallet.js";
|
||||
} from "../wallets/in-app/web/in-app.js";
|
||||
export { smartWallet } from "../wallets/smart/smart-wallet.js";
|
||||
|
||||
export type { Wallet, Account } from "../wallets/interfaces/wallet.js";
|
||||
export type { ConnectionStatus } from "../wallets/manager/index.js";
|
||||
@@ -38,9 +42,6 @@ export {
|
||||
type PrivateKeyToAccountOptions as PrivateKeyAccountOptions,
|
||||
} from "../wallets/private-key.js";
|
||||
|
||||
// injected
|
||||
export { injectedProvider } from "../wallets/injected/mipdStore.js";
|
||||
|
||||
export type {
|
||||
WalletId,
|
||||
WalletAutoConnectionOption,
|
||||
@@ -87,7 +88,7 @@ export type {
|
||||
InAppWalletSocialAuth as EmbeddedWalletSocialAuth,
|
||||
} from "../wallets/in-app/core/wallet/types.js";
|
||||
|
||||
export type { CoinbaseSDKWalletConnectionOptions } from "../wallets/coinbase/coinbaseSDKWallet.js";
|
||||
export type { CoinbaseSDKWalletConnectionOptions } from "../wallets/coinbase/coinbaseWebSDK.js";
|
||||
|
||||
export type {
|
||||
WalletEmitter,
|
||||
@@ -99,3 +100,8 @@ export { getWalletInfo } from "../wallets/__generated__/getWalletInfo.js";
|
||||
export { type WalletInfo } from "../wallets/wallet-info.js";
|
||||
|
||||
export { createWalletAdapter } from "../adapters/wallet-adapter.js";
|
||||
|
||||
// WEB ONLY EXPORTS
|
||||
|
||||
// injected
|
||||
export { injectedProvider } from "../wallets/injected/mipdStore.js";
|
||||
|
||||
@@ -26,6 +26,3 @@ export type {
|
||||
GetCallsStatusResponse,
|
||||
WalletCallReceipt,
|
||||
} from "../../wallets/eip5792/types.js";
|
||||
export { useSendCalls } from "../../react/core/hooks/wallets/useSendCalls.js";
|
||||
export { useCallsStatus } from "../../react/core/hooks/wallets/useCallsStatus.js";
|
||||
export { useCapabilities } from "../../react/core/hooks/wallets/useCapabilities.js";
|
||||
|
||||
@@ -4,11 +4,12 @@ export {
|
||||
* @deprecated use inAppWallet instead
|
||||
*/
|
||||
inAppWallet as embeddedWallet,
|
||||
} from "../../wallets/create-wallet.js";
|
||||
} from "../../wallets/in-app/web/in-app.js";
|
||||
|
||||
export {
|
||||
preAuthenticate,
|
||||
authenticate,
|
||||
getUserEmail,
|
||||
type GetAuthenticatedUserParams,
|
||||
} from "../../wallets/in-app/core/authentication/index.js";
|
||||
} from "../../wallets/in-app/web/lib/auth/index.js";
|
||||
|
||||
export { type GetAuthenticatedUserParams } from "../../wallets/in-app/core/authentication/type.js";
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// --- KEEEP IN SYNC with exports/wallets/in-app.ts ---
|
||||
|
||||
export { inAppWallet } from "../../wallets/in-app/native/in-app.js";
|
||||
|
||||
export {
|
||||
preAuthenticate,
|
||||
authenticate,
|
||||
getUserEmail,
|
||||
getUserPhoneNumber,
|
||||
} from "../../wallets/in-app/native/auth/index.js";
|
||||
|
||||
export { type GetAuthenticatedUserParams } from "../../wallets/in-app/core/authentication/type.js";
|
||||
|
||||
// NOT SUPPORTED (yet)
|
||||
|
||||
export const hasStoredPasskey = () => {
|
||||
throw new Error("Not supported in native");
|
||||
};
|
||||
@@ -1,12 +1,15 @@
|
||||
export { inAppWallet } from "../../wallets/create-wallet.js";
|
||||
// --- KEEEP IN SYNC with exports/wallets/in-app.native.ts ---
|
||||
|
||||
export { inAppWallet } from "../../wallets/in-app/web/in-app.js";
|
||||
|
||||
export {
|
||||
preAuthenticate,
|
||||
authenticate,
|
||||
getUserEmail,
|
||||
getUserPhoneNumber,
|
||||
type GetAuthenticatedUserParams,
|
||||
} from "../../wallets/in-app/core/authentication/index.js";
|
||||
} from "../../wallets/in-app/web/lib/auth/index.js";
|
||||
|
||||
export { type GetAuthenticatedUserParams } from "../../wallets/in-app/core/authentication/type.js";
|
||||
|
||||
export { hasStoredPasskey } from "../../wallets/in-app/web/lib/auth/passkeys.js";
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export { smartWallet } from "../../wallets/create-wallet.js";
|
||||
export { smartWallet } from "../../wallets/smart/smart-wallet.js";
|
||||
|
||||
export type {
|
||||
SmartWalletConnectionOptions,
|
||||
|
||||
Generated
+135
@@ -0,0 +1,135 @@
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
import { encodeAbiParameters } from "../../../../../utils/abi/encodeAbiParameters.js";
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
/**
|
||||
* Represents the parameters for the "getAccounts" function.
|
||||
*/
|
||||
export type GetAccountsParams = {
|
||||
start: AbiParameterToPrimitiveType<{ type: "uint256"; name: "start" }>;
|
||||
end: AbiParameterToPrimitiveType<{ type: "uint256"; name: "end" }>;
|
||||
};
|
||||
|
||||
export const FN_SELECTOR = "0xe68a7c3b" as const;
|
||||
const FN_INPUTS = [
|
||||
{
|
||||
type: "uint256",
|
||||
name: "start",
|
||||
},
|
||||
{
|
||||
type: "uint256",
|
||||
name: "end",
|
||||
},
|
||||
] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
type: "address[]",
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `getAccounts` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `getAccounts` method is supported.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isGetAccountsSupported } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const supported = await isGetAccountsSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isGetAccountsSupported(contract: ThirdwebContract<any>) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the parameters for the "getAccounts" function.
|
||||
* @param options - The options for the getAccounts function.
|
||||
* @returns The encoded ABI parameters.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeGetAccountsParams } "thirdweb/extensions/erc4337";
|
||||
* const result = encodeGetAccountsParams({
|
||||
* start: ...,
|
||||
* end: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeGetAccountsParams(options: GetAccountsParams) {
|
||||
return encodeAbiParameters(FN_INPUTS, [options.start, options.end]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the "getAccounts" function into a Hex string with its parameters.
|
||||
* @param options - The options for the getAccounts function.
|
||||
* @returns The encoded hexadecimal string.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeGetAccounts } "thirdweb/extensions/erc4337";
|
||||
* const result = encodeGetAccounts({
|
||||
* start: ...,
|
||||
* end: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeGetAccounts(options: GetAccountsParams) {
|
||||
// we do a "manual" concat here to avoid the overhead of the "concatHex" function
|
||||
// we can do this because we know the specific formats of the values
|
||||
return (FN_SELECTOR +
|
||||
encodeGetAccountsParams(options).slice(
|
||||
2,
|
||||
)) as `${typeof FN_SELECTOR}${string}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the getAccounts function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeGetAccountsResult } from "thirdweb/extensions/erc4337";
|
||||
* const result = decodeGetAccountsResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeGetAccountsResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "getAccounts" function on the contract.
|
||||
* @param options - The options for the getAccounts function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getAccounts } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const result = await getAccounts({
|
||||
* contract,
|
||||
* start: ...,
|
||||
* end: ...,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function getAccounts(
|
||||
options: BaseTransactionOptions<GetAccountsParams>,
|
||||
) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [options.start, options.end],
|
||||
});
|
||||
}
|
||||
Generated
+127
@@ -0,0 +1,127 @@
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
import { encodeAbiParameters } from "../../../../../utils/abi/encodeAbiParameters.js";
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
/**
|
||||
* Represents the parameters for the "isRegistered" function.
|
||||
*/
|
||||
export type IsRegisteredParams = {
|
||||
account: AbiParameterToPrimitiveType<{ type: "address"; name: "account" }>;
|
||||
};
|
||||
|
||||
export const FN_SELECTOR = "0xc3c5a547" as const;
|
||||
const FN_INPUTS = [
|
||||
{
|
||||
type: "address",
|
||||
name: "account",
|
||||
},
|
||||
] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
type: "bool",
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `isRegistered` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `isRegistered` method is supported.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isIsRegisteredSupported } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const supported = await isIsRegisteredSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isIsRegisteredSupported(contract: ThirdwebContract<any>) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the parameters for the "isRegistered" function.
|
||||
* @param options - The options for the isRegistered function.
|
||||
* @returns The encoded ABI parameters.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeIsRegisteredParams } "thirdweb/extensions/erc4337";
|
||||
* const result = encodeIsRegisteredParams({
|
||||
* account: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeIsRegisteredParams(options: IsRegisteredParams) {
|
||||
return encodeAbiParameters(FN_INPUTS, [options.account]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the "isRegistered" function into a Hex string with its parameters.
|
||||
* @param options - The options for the isRegistered function.
|
||||
* @returns The encoded hexadecimal string.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeIsRegistered } "thirdweb/extensions/erc4337";
|
||||
* const result = encodeIsRegistered({
|
||||
* account: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeIsRegistered(options: IsRegisteredParams) {
|
||||
// we do a "manual" concat here to avoid the overhead of the "concatHex" function
|
||||
// we can do this because we know the specific formats of the values
|
||||
return (FN_SELECTOR +
|
||||
encodeIsRegisteredParams(options).slice(
|
||||
2,
|
||||
)) as `${typeof FN_SELECTOR}${string}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the isRegistered function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeIsRegisteredResult } from "thirdweb/extensions/erc4337";
|
||||
* const result = decodeIsRegisteredResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeIsRegisteredResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "isRegistered" function on the contract.
|
||||
* @param options - The options for the isRegistered function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isRegistered } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const result = await isRegistered({
|
||||
* contract,
|
||||
* account: ...,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function isRegistered(
|
||||
options: BaseTransactionOptions<IsRegisteredParams>,
|
||||
) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [options.account],
|
||||
});
|
||||
}
|
||||
Generated
+74
@@ -0,0 +1,74 @@
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
export const FN_SELECTOR = "0x58451f97" as const;
|
||||
const FN_INPUTS = [] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
type: "uint256",
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `totalAccounts` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `totalAccounts` method is supported.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isTotalAccountsSupported } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const supported = await isTotalAccountsSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isTotalAccountsSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the totalAccounts function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeTotalAccountsResult } from "thirdweb/extensions/erc4337";
|
||||
* const result = decodeTotalAccountsResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeTotalAccountsResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "totalAccounts" function on the contract.
|
||||
* @param options - The options for the totalAccounts function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension ERC4337
|
||||
* @example
|
||||
* ```ts
|
||||
* import { totalAccounts } from "thirdweb/extensions/erc4337";
|
||||
*
|
||||
* const result = await totalAccounts({
|
||||
* contract,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function totalAccounts(options: BaseTransactionOptions) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [],
|
||||
});
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
import type { Chain } from "../../../../chains/types.js";
|
||||
import type { ThirdwebClient } from "../../../../client/client.js";
|
||||
import type { ThirdwebContract } from "../../../../contract/contract.js";
|
||||
import { getOrDeployInfraForPublishedContract } from "../../../../contract/deployment/utils/bootstrap.js";
|
||||
import type { Account } from "../../../../wallets/interfaces/wallet.js";
|
||||
import { installExtension } from "../../__generated__/ModularCore/write/installExtension.js";
|
||||
|
||||
export type InstallPublishedExtensionOptions = {
|
||||
client: ThirdwebClient;
|
||||
chain: Chain;
|
||||
account: Account;
|
||||
contract: ThirdwebContract;
|
||||
extensionName: string;
|
||||
publisherAddress: string;
|
||||
version?: string;
|
||||
constructorParams?: unknown[];
|
||||
extensionData?: `0x${string}`;
|
||||
};
|
||||
|
||||
export function installPublishedExtension(
|
||||
options: InstallPublishedExtensionOptions,
|
||||
) {
|
||||
const {
|
||||
client,
|
||||
chain,
|
||||
account,
|
||||
contract,
|
||||
extensionName,
|
||||
constructorParams,
|
||||
publisherAddress,
|
||||
extensionData,
|
||||
} = options;
|
||||
|
||||
return installExtension({
|
||||
contract,
|
||||
asyncParams: async () => {
|
||||
const deployedExtension = await getOrDeployInfraForPublishedContract({
|
||||
chain,
|
||||
client,
|
||||
account,
|
||||
contractId: extensionName,
|
||||
constructorParams: constructorParams || [],
|
||||
publisher: publisherAddress,
|
||||
});
|
||||
return {
|
||||
extension: deployedExtension.implementationContract.address as string,
|
||||
data: extensionData || "0x",
|
||||
};
|
||||
},
|
||||
});
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
import type { Chain } from "../../../../chains/types.js";
|
||||
import type { ThirdwebClient } from "../../../../client/client.js";
|
||||
import {
|
||||
type ThirdwebContract,
|
||||
getContract,
|
||||
} from "../../../../contract/contract.js";
|
||||
import { resolveImplementation } from "../../../../utils/bytecode/resolveImplementation.js";
|
||||
import { uninstallExtension } from "../../__generated__/ModularCore/write/uninstallExtension.js";
|
||||
|
||||
export type UninstallExtensionByProxyOptions = {
|
||||
client: ThirdwebClient;
|
||||
chain: Chain;
|
||||
contract: ThirdwebContract;
|
||||
extensionProxyAddress: string;
|
||||
extensionData?: `0x${string}`;
|
||||
};
|
||||
|
||||
export function uninstallExtensionByProxy(
|
||||
options: UninstallExtensionByProxyOptions,
|
||||
) {
|
||||
const { client, chain, contract, extensionProxyAddress, extensionData } =
|
||||
options;
|
||||
|
||||
return uninstallExtension({
|
||||
contract,
|
||||
asyncParams: async () => {
|
||||
const extensionImplementation = await resolveImplementation(
|
||||
getContract({
|
||||
chain,
|
||||
client,
|
||||
address: extensionProxyAddress,
|
||||
}),
|
||||
);
|
||||
return {
|
||||
extension: extensionImplementation.address,
|
||||
data: extensionData || "0x",
|
||||
};
|
||||
},
|
||||
});
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import type { Chain } from "../../../../chains/types.js";
|
||||
import type { ThirdwebClient } from "../../../../client/client.js";
|
||||
import type { ThirdwebContract } from "../../../../contract/contract.js";
|
||||
import { getDeployedInfraContract } from "../../../../contract/deployment/utils/infra.js";
|
||||
import { uninstallExtension } from "../../__generated__/ModularCore/write/uninstallExtension.js";
|
||||
|
||||
export type UninstallPublishedExtensionOptions = {
|
||||
client: ThirdwebClient;
|
||||
chain: Chain;
|
||||
contract: ThirdwebContract;
|
||||
extensionName: string;
|
||||
publisherAddress: string;
|
||||
version?: string;
|
||||
constructorParams?: unknown[];
|
||||
extensionData?: `0x${string}`;
|
||||
};
|
||||
|
||||
export function uninstallPublishedExtension(
|
||||
options: UninstallPublishedExtensionOptions,
|
||||
) {
|
||||
const {
|
||||
client,
|
||||
chain,
|
||||
contract,
|
||||
extensionName,
|
||||
publisherAddress,
|
||||
constructorParams,
|
||||
extensionData,
|
||||
} = options;
|
||||
|
||||
return uninstallExtension({
|
||||
contract,
|
||||
asyncParams: async () => {
|
||||
const deployedExtension = await getDeployedInfraContract({
|
||||
chain,
|
||||
client,
|
||||
contractId: extensionName,
|
||||
constructorParams: constructorParams || [],
|
||||
publisher: publisherAddress,
|
||||
});
|
||||
return {
|
||||
extension: deployedExtension?.address as string,
|
||||
data: extensionData || "0x",
|
||||
};
|
||||
},
|
||||
});
|
||||
}
|
||||
Generated
+134
@@ -0,0 +1,134 @@
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
export const FN_SELECTOR = "0x5357aa5e" as const;
|
||||
const FN_INPUTS = [] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
name: "",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IModularCore.InstalledExtension[]",
|
||||
components: [
|
||||
{
|
||||
name: "implementation",
|
||||
type: "address",
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "config",
|
||||
type: "tuple",
|
||||
internalType: "struct IExtensionConfig.ExtensionConfig",
|
||||
components: [
|
||||
{
|
||||
name: "registerInstallationCallback",
|
||||
type: "bool",
|
||||
internalType: "bool",
|
||||
},
|
||||
{
|
||||
name: "requiredInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "supportedInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "callbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.CallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "fallbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.FallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
{
|
||||
name: "permissionBits",
|
||||
type: "uint256",
|
||||
internalType: "uint256",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `getInstalledExtensions` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `getInstalledExtensions` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isGetInstalledExtensionsSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isGetInstalledExtensionsSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isGetInstalledExtensionsSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the getInstalledExtensions function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeGetInstalledExtensionsResult } from "thirdweb/extensions/modular";
|
||||
* const result = decodeGetInstalledExtensionsResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeGetInstalledExtensionsResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "getInstalledExtensions" function on the contract.
|
||||
* @param options - The options for the getInstalledExtensions function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getInstalledExtensions } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const result = await getInstalledExtensions({
|
||||
* contract,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function getInstalledExtensions(options: BaseTransactionOptions) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [],
|
||||
});
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
export const FN_SELECTOR = "0xf147db8a" as const;
|
||||
const FN_INPUTS = [] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
name: "",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IModularCore.SupportedCallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
{
|
||||
name: "mode",
|
||||
type: "uint8",
|
||||
internalType: "enum IModularCore.CallbackMode",
|
||||
},
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `getSupportedCallbackFunctions` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `getSupportedCallbackFunctions` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isGetSupportedCallbackFunctionsSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isGetSupportedCallbackFunctionsSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isGetSupportedCallbackFunctionsSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the getSupportedCallbackFunctions function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeGetSupportedCallbackFunctionsResult } from "thirdweb/extensions/modular";
|
||||
* const result = decodeGetSupportedCallbackFunctionsResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeGetSupportedCallbackFunctionsResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "getSupportedCallbackFunctions" function on the contract.
|
||||
* @param options - The options for the getSupportedCallbackFunctions function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getSupportedCallbackFunctions } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const result = await getSupportedCallbackFunctions({
|
||||
* contract,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function getSupportedCallbackFunctions(
|
||||
options: BaseTransactionOptions,
|
||||
) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [],
|
||||
});
|
||||
}
|
||||
Generated
+138
@@ -0,0 +1,138 @@
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
import { encodeAbiParameters } from "../../../../../utils/abi/encodeAbiParameters.js";
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
/**
|
||||
* Represents the parameters for the "supportsInterface" function.
|
||||
*/
|
||||
export type SupportsInterfaceParams = {
|
||||
interfaceID: AbiParameterToPrimitiveType<{
|
||||
name: "interfaceID";
|
||||
type: "bytes4";
|
||||
internalType: "bytes4";
|
||||
}>;
|
||||
};
|
||||
|
||||
export const FN_SELECTOR = "0x01ffc9a7" as const;
|
||||
const FN_INPUTS = [
|
||||
{
|
||||
name: "interfaceID",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
name: "",
|
||||
type: "bool",
|
||||
internalType: "bool",
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `supportsInterface` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `supportsInterface` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isSupportsInterfaceSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isSupportsInterfaceSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isSupportsInterfaceSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the parameters for the "supportsInterface" function.
|
||||
* @param options - The options for the supportsInterface function.
|
||||
* @returns The encoded ABI parameters.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeSupportsInterfaceParams } "thirdweb/extensions/modular";
|
||||
* const result = encodeSupportsInterfaceParams({
|
||||
* interfaceID: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeSupportsInterfaceParams(
|
||||
options: SupportsInterfaceParams,
|
||||
) {
|
||||
return encodeAbiParameters(FN_INPUTS, [options.interfaceID]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the "supportsInterface" function into a Hex string with its parameters.
|
||||
* @param options - The options for the supportsInterface function.
|
||||
* @returns The encoded hexadecimal string.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeSupportsInterface } "thirdweb/extensions/modular";
|
||||
* const result = encodeSupportsInterface({
|
||||
* interfaceID: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeSupportsInterface(options: SupportsInterfaceParams) {
|
||||
// we do a "manual" concat here to avoid the overhead of the "concatHex" function
|
||||
// we can do this because we know the specific formats of the values
|
||||
return (FN_SELECTOR +
|
||||
encodeSupportsInterfaceParams(options).slice(
|
||||
2,
|
||||
)) as `${typeof FN_SELECTOR}${string}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the supportsInterface function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeSupportsInterfaceResult } from "thirdweb/extensions/modular";
|
||||
* const result = decodeSupportsInterfaceResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeSupportsInterfaceResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "supportsInterface" function on the contract.
|
||||
* @param options - The options for the supportsInterface function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { supportsInterface } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const result = await supportsInterface({
|
||||
* contract,
|
||||
* interfaceID: ...,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function supportsInterface(
|
||||
options: BaseTransactionOptions<SupportsInterfaceParams>,
|
||||
) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [options.interfaceID],
|
||||
});
|
||||
}
|
||||
Generated
+160
@@ -0,0 +1,160 @@
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
import type {
|
||||
BaseTransactionOptions,
|
||||
WithOverrides,
|
||||
} from "../../../../../transaction/types.js";
|
||||
import { prepareContractCall } from "../../../../../transaction/prepare-contract-call.js";
|
||||
import { encodeAbiParameters } from "../../../../../utils/abi/encodeAbiParameters.js";
|
||||
import { once } from "../../../../../utils/promise/once.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
/**
|
||||
* Represents the parameters for the "installExtension" function.
|
||||
*/
|
||||
export type InstallExtensionParams = WithOverrides<{
|
||||
extensionContract: AbiParameterToPrimitiveType<{
|
||||
name: "extensionContract";
|
||||
type: "address";
|
||||
internalType: "address";
|
||||
}>;
|
||||
data: AbiParameterToPrimitiveType<{
|
||||
name: "data";
|
||||
type: "bytes";
|
||||
internalType: "bytes";
|
||||
}>;
|
||||
}>;
|
||||
|
||||
export const FN_SELECTOR = "0xaca696f5" as const;
|
||||
const FN_INPUTS = [
|
||||
{
|
||||
name: "extensionContract",
|
||||
type: "address",
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "data",
|
||||
type: "bytes",
|
||||
internalType: "bytes",
|
||||
},
|
||||
] as const;
|
||||
const FN_OUTPUTS = [] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `installExtension` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `installExtension` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isInstallExtensionSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isInstallExtensionSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isInstallExtensionSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the parameters for the "installExtension" function.
|
||||
* @param options - The options for the installExtension function.
|
||||
* @returns The encoded ABI parameters.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeInstallExtensionParams } "thirdweb/extensions/modular";
|
||||
* const result = encodeInstallExtensionParams({
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeInstallExtensionParams(options: InstallExtensionParams) {
|
||||
return encodeAbiParameters(FN_INPUTS, [
|
||||
options.extensionContract,
|
||||
options.data,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the "installExtension" function into a Hex string with its parameters.
|
||||
* @param options - The options for the installExtension function.
|
||||
* @returns The encoded hexadecimal string.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeInstallExtension } "thirdweb/extensions/modular";
|
||||
* const result = encodeInstallExtension({
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeInstallExtension(options: InstallExtensionParams) {
|
||||
// we do a "manual" concat here to avoid the overhead of the "concatHex" function
|
||||
// we can do this because we know the specific formats of the values
|
||||
return (FN_SELECTOR +
|
||||
encodeInstallExtensionParams(options).slice(
|
||||
2,
|
||||
)) as `${typeof FN_SELECTOR}${string}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares a transaction to call the "installExtension" function on the contract.
|
||||
* @param options - The options for the "installExtension" function.
|
||||
* @returns A prepared transaction object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { installExtension } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const transaction = installExtension({
|
||||
* contract,
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* overrides: {
|
||||
* ...
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Send the transaction
|
||||
* ...
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export function installExtension(
|
||||
options: BaseTransactionOptions<
|
||||
| InstallExtensionParams
|
||||
| {
|
||||
asyncParams: () => Promise<InstallExtensionParams>;
|
||||
}
|
||||
>,
|
||||
) {
|
||||
const asyncOptions = once(async () => {
|
||||
return "asyncParams" in options ? await options.asyncParams() : options;
|
||||
});
|
||||
|
||||
return prepareContractCall({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: async () => {
|
||||
const resolvedOptions = await asyncOptions();
|
||||
return [resolvedOptions.extensionContract, resolvedOptions.data] as const;
|
||||
},
|
||||
value: async () => (await asyncOptions()).overrides?.value,
|
||||
accessList: async () => (await asyncOptions()).overrides?.accessList,
|
||||
gas: async () => (await asyncOptions()).overrides?.gas,
|
||||
gasPrice: async () => (await asyncOptions()).overrides?.gasPrice,
|
||||
maxFeePerGas: async () => (await asyncOptions()).overrides?.maxFeePerGas,
|
||||
maxPriorityFeePerGas: async () =>
|
||||
(await asyncOptions()).overrides?.maxPriorityFeePerGas,
|
||||
nonce: async () => (await asyncOptions()).overrides?.nonce,
|
||||
extraGas: async () => (await asyncOptions()).overrides?.extraGas,
|
||||
});
|
||||
}
|
||||
Generated
+162
@@ -0,0 +1,162 @@
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
import type {
|
||||
BaseTransactionOptions,
|
||||
WithOverrides,
|
||||
} from "../../../../../transaction/types.js";
|
||||
import { prepareContractCall } from "../../../../../transaction/prepare-contract-call.js";
|
||||
import { encodeAbiParameters } from "../../../../../utils/abi/encodeAbiParameters.js";
|
||||
import { once } from "../../../../../utils/promise/once.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
/**
|
||||
* Represents the parameters for the "uninstallExtension" function.
|
||||
*/
|
||||
export type UninstallExtensionParams = WithOverrides<{
|
||||
extensionContract: AbiParameterToPrimitiveType<{
|
||||
name: "extensionContract";
|
||||
type: "address";
|
||||
internalType: "address";
|
||||
}>;
|
||||
data: AbiParameterToPrimitiveType<{
|
||||
name: "data";
|
||||
type: "bytes";
|
||||
internalType: "bytes";
|
||||
}>;
|
||||
}>;
|
||||
|
||||
export const FN_SELECTOR = "0x42b7d0c8" as const;
|
||||
const FN_INPUTS = [
|
||||
{
|
||||
name: "extensionContract",
|
||||
type: "address",
|
||||
internalType: "address",
|
||||
},
|
||||
{
|
||||
name: "data",
|
||||
type: "bytes",
|
||||
internalType: "bytes",
|
||||
},
|
||||
] as const;
|
||||
const FN_OUTPUTS = [] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `uninstallExtension` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `uninstallExtension` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isUninstallExtensionSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isUninstallExtensionSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isUninstallExtensionSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the parameters for the "uninstallExtension" function.
|
||||
* @param options - The options for the uninstallExtension function.
|
||||
* @returns The encoded ABI parameters.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeUninstallExtensionParams } "thirdweb/extensions/modular";
|
||||
* const result = encodeUninstallExtensionParams({
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeUninstallExtensionParams(
|
||||
options: UninstallExtensionParams,
|
||||
) {
|
||||
return encodeAbiParameters(FN_INPUTS, [
|
||||
options.extensionContract,
|
||||
options.data,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the "uninstallExtension" function into a Hex string with its parameters.
|
||||
* @param options - The options for the uninstallExtension function.
|
||||
* @returns The encoded hexadecimal string.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { encodeUninstallExtension } "thirdweb/extensions/modular";
|
||||
* const result = encodeUninstallExtension({
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function encodeUninstallExtension(options: UninstallExtensionParams) {
|
||||
// we do a "manual" concat here to avoid the overhead of the "concatHex" function
|
||||
// we can do this because we know the specific formats of the values
|
||||
return (FN_SELECTOR +
|
||||
encodeUninstallExtensionParams(options).slice(
|
||||
2,
|
||||
)) as `${typeof FN_SELECTOR}${string}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares a transaction to call the "uninstallExtension" function on the contract.
|
||||
* @param options - The options for the "uninstallExtension" function.
|
||||
* @returns A prepared transaction object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { uninstallExtension } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const transaction = uninstallExtension({
|
||||
* contract,
|
||||
* extensionContract: ...,
|
||||
* data: ...,
|
||||
* overrides: {
|
||||
* ...
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* // Send the transaction
|
||||
* ...
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export function uninstallExtension(
|
||||
options: BaseTransactionOptions<
|
||||
| UninstallExtensionParams
|
||||
| {
|
||||
asyncParams: () => Promise<UninstallExtensionParams>;
|
||||
}
|
||||
>,
|
||||
) {
|
||||
const asyncOptions = once(async () => {
|
||||
return "asyncParams" in options ? await options.asyncParams() : options;
|
||||
});
|
||||
|
||||
return prepareContractCall({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: async () => {
|
||||
const resolvedOptions = await asyncOptions();
|
||||
return [resolvedOptions.extensionContract, resolvedOptions.data] as const;
|
||||
},
|
||||
value: async () => (await asyncOptions()).overrides?.value,
|
||||
accessList: async () => (await asyncOptions()).overrides?.accessList,
|
||||
gas: async () => (await asyncOptions()).overrides?.gas,
|
||||
gasPrice: async () => (await asyncOptions()).overrides?.gasPrice,
|
||||
maxFeePerGas: async () => (await asyncOptions()).overrides?.maxFeePerGas,
|
||||
maxPriorityFeePerGas: async () =>
|
||||
(await asyncOptions()).overrides?.maxPriorityFeePerGas,
|
||||
nonce: async () => (await asyncOptions()).overrides?.nonce,
|
||||
extraGas: async () => (await asyncOptions()).overrides?.extraGas,
|
||||
});
|
||||
}
|
||||
Generated
+122
@@ -0,0 +1,122 @@
|
||||
import { readContract } from "../../../../../transaction/read-contract.js";
|
||||
import type { BaseTransactionOptions } from "../../../../../transaction/types.js";
|
||||
|
||||
import { decodeAbiParameters } from "viem";
|
||||
import type { Hex } from "../../../../../utils/encoding/hex.js";
|
||||
import type { ThirdwebContract } from "../../../../../contract/contract.js";
|
||||
import { detectMethod } from "../../../../../utils/bytecode/detectExtension.js";
|
||||
|
||||
export const FN_SELECTOR = "0x7c173ecc" as const;
|
||||
const FN_INPUTS = [] as const;
|
||||
const FN_OUTPUTS = [
|
||||
{
|
||||
name: "",
|
||||
type: "tuple",
|
||||
internalType: "struct IExtensionConfig.ExtensionConfig",
|
||||
components: [
|
||||
{
|
||||
name: "registerInstallationCallback",
|
||||
type: "bool",
|
||||
internalType: "bool",
|
||||
},
|
||||
{
|
||||
name: "requiredInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "supportedInterfaces",
|
||||
type: "bytes4[]",
|
||||
internalType: "bytes4[]",
|
||||
},
|
||||
{
|
||||
name: "callbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.CallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "fallbackFunctions",
|
||||
type: "tuple[]",
|
||||
internalType: "struct IExtensionConfig.FallbackFunction[]",
|
||||
components: [
|
||||
{
|
||||
name: "selector",
|
||||
type: "bytes4",
|
||||
internalType: "bytes4",
|
||||
},
|
||||
{
|
||||
name: "permissionBits",
|
||||
type: "uint256",
|
||||
internalType: "uint256",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Checks if the `getExtensionConfig` method is supported by the given contract.
|
||||
* @param contract The ThirdwebContract.
|
||||
* @returns A promise that resolves to a boolean indicating if the `getExtensionConfig` method is supported.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { isGetExtensionConfigSupported } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const supported = await isGetExtensionConfigSupported(contract);
|
||||
* ```
|
||||
*/
|
||||
export async function isGetExtensionConfigSupported(
|
||||
contract: ThirdwebContract<any>,
|
||||
) {
|
||||
return detectMethod({
|
||||
contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the result of the getExtensionConfig function call.
|
||||
* @param result - The hexadecimal result to decode.
|
||||
* @returns The decoded result as per the FN_OUTPUTS definition.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { decodeGetExtensionConfigResult } from "thirdweb/extensions/modular";
|
||||
* const result = decodeGetExtensionConfigResult("...");
|
||||
* ```
|
||||
*/
|
||||
export function decodeGetExtensionConfigResult(result: Hex) {
|
||||
return decodeAbiParameters(FN_OUTPUTS, result)[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the "getExtensionConfig" function on the contract.
|
||||
* @param options - The options for the getExtensionConfig function.
|
||||
* @returns The parsed result of the function call.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getExtensionConfig } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const result = await getExtensionConfig({
|
||||
* contract,
|
||||
* });
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export async function getExtensionConfig(options: BaseTransactionOptions) {
|
||||
return readContract({
|
||||
contract: options.contract,
|
||||
method: [FN_SELECTOR, FN_INPUTS, FN_OUTPUTS] as const,
|
||||
params: [],
|
||||
});
|
||||
}
|
||||
Generated
+25
@@ -0,0 +1,25 @@
|
||||
import { prepareEvent } from "../../../../../event/prepare-event.js";
|
||||
|
||||
/**
|
||||
* Creates an event object for the ExtensionInstalled event.
|
||||
* @returns The prepared event object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getContractEvents } from "thirdweb";
|
||||
* import { extensionInstalledEvent } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const events = await getContractEvents({
|
||||
* contract,
|
||||
* events: [
|
||||
* extensionInstalledEvent()
|
||||
* ],
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function extensionInstalledEvent() {
|
||||
return prepareEvent({
|
||||
signature:
|
||||
"event ExtensionInstalled(address caller, address implementation, address installedExtension)",
|
||||
});
|
||||
}
|
||||
Generated
+25
@@ -0,0 +1,25 @@
|
||||
import { prepareEvent } from "../../../../../event/prepare-event.js";
|
||||
|
||||
/**
|
||||
* Creates an event object for the ExtensionUninstalled event.
|
||||
* @returns The prepared event object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getContractEvents } from "thirdweb";
|
||||
* import { extensionUninstalledEvent } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const events = await getContractEvents({
|
||||
* contract,
|
||||
* events: [
|
||||
* extensionUninstalledEvent()
|
||||
* ],
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function extensionUninstalledEvent() {
|
||||
return prepareEvent({
|
||||
signature:
|
||||
"event ExtensionUninstalled(address caller, address implementation, address installedExtension)",
|
||||
});
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
import { prepareEvent } from "../../../../../event/prepare-event.js";
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
|
||||
/**
|
||||
* Represents the filters for the "OwnershipHandoverCanceled" event.
|
||||
*/
|
||||
export type OwnershipHandoverCanceledEventFilters = Partial<{
|
||||
pendingOwner: AbiParameterToPrimitiveType<{
|
||||
name: "pendingOwner";
|
||||
type: "address";
|
||||
indexed: true;
|
||||
internalType: "address";
|
||||
}>;
|
||||
}>;
|
||||
|
||||
/**
|
||||
* Creates an event object for the OwnershipHandoverCanceled event.
|
||||
* @param filters - Optional filters to apply to the event.
|
||||
* @returns The prepared event object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getContractEvents } from "thirdweb";
|
||||
* import { ownershipHandoverCanceledEvent } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const events = await getContractEvents({
|
||||
* contract,
|
||||
* events: [
|
||||
* ownershipHandoverCanceledEvent({
|
||||
* pendingOwner: ...,
|
||||
* })
|
||||
* ],
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function ownershipHandoverCanceledEvent(
|
||||
filters: OwnershipHandoverCanceledEventFilters = {},
|
||||
) {
|
||||
return prepareEvent({
|
||||
signature: "event OwnershipHandoverCanceled(address indexed pendingOwner)",
|
||||
filters,
|
||||
});
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
import { prepareEvent } from "../../../../../event/prepare-event.js";
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
|
||||
/**
|
||||
* Represents the filters for the "OwnershipHandoverRequested" event.
|
||||
*/
|
||||
export type OwnershipHandoverRequestedEventFilters = Partial<{
|
||||
pendingOwner: AbiParameterToPrimitiveType<{
|
||||
name: "pendingOwner";
|
||||
type: "address";
|
||||
indexed: true;
|
||||
internalType: "address";
|
||||
}>;
|
||||
}>;
|
||||
|
||||
/**
|
||||
* Creates an event object for the OwnershipHandoverRequested event.
|
||||
* @param filters - Optional filters to apply to the event.
|
||||
* @returns The prepared event object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getContractEvents } from "thirdweb";
|
||||
* import { ownershipHandoverRequestedEvent } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const events = await getContractEvents({
|
||||
* contract,
|
||||
* events: [
|
||||
* ownershipHandoverRequestedEvent({
|
||||
* pendingOwner: ...,
|
||||
* })
|
||||
* ],
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function ownershipHandoverRequestedEvent(
|
||||
filters: OwnershipHandoverRequestedEventFilters = {},
|
||||
) {
|
||||
return prepareEvent({
|
||||
signature: "event OwnershipHandoverRequested(address indexed pendingOwner)",
|
||||
filters,
|
||||
});
|
||||
}
|
||||
Generated
+51
@@ -0,0 +1,51 @@
|
||||
import { prepareEvent } from "../../../../../event/prepare-event.js";
|
||||
import type { AbiParameterToPrimitiveType } from "abitype";
|
||||
|
||||
/**
|
||||
* Represents the filters for the "OwnershipTransferred" event.
|
||||
*/
|
||||
export type OwnershipTransferredEventFilters = Partial<{
|
||||
oldOwner: AbiParameterToPrimitiveType<{
|
||||
name: "oldOwner";
|
||||
type: "address";
|
||||
indexed: true;
|
||||
internalType: "address";
|
||||
}>;
|
||||
newOwner: AbiParameterToPrimitiveType<{
|
||||
name: "newOwner";
|
||||
type: "address";
|
||||
indexed: true;
|
||||
internalType: "address";
|
||||
}>;
|
||||
}>;
|
||||
|
||||
/**
|
||||
* Creates an event object for the OwnershipTransferred event.
|
||||
* @param filters - Optional filters to apply to the event.
|
||||
* @returns The prepared event object.
|
||||
* @extension MODULAR
|
||||
* @example
|
||||
* ```ts
|
||||
* import { getContractEvents } from "thirdweb";
|
||||
* import { ownershipTransferredEvent } from "thirdweb/extensions/modular";
|
||||
*
|
||||
* const events = await getContractEvents({
|
||||
* contract,
|
||||
* events: [
|
||||
* ownershipTransferredEvent({
|
||||
* oldOwner: ...,
|
||||
* newOwner: ...,
|
||||
* })
|
||||
* ],
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function ownershipTransferredEvent(
|
||||
filters: OwnershipTransferredEventFilters = {},
|
||||
) {
|
||||
return prepareEvent({
|
||||
signature:
|
||||
"event OwnershipTransferred(address indexed oldOwner, address indexed newOwner)",
|
||||
filters,
|
||||
});
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user