Compare commits

..
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
cbfd445ae7 Version Packages (#1784)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-10-16 20:38:41 -07:00
Jonas DanielsandGitHub 137f46a547 chore(chains): fix up chain sync script (#1783) 2023-10-17 02:28:33 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
1b8accde30 Version Packages (#1782)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-10-16 15:51:35 -07:00
Joaquim VergesandGitHub 07544252b4 [SDK] expose utility functions for abi / sources (#1781) 2023-10-16 22:43:13 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
8708519cad Version Packages (#1772)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-10-16 12:57:26 -07:00
Joaquim VergesandGitHub 6c30b7efc7 [ContractsJS] update contracts-js package (#1771) 2023-10-16 19:50:17 +00:00
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
8b5e344f72 Version Packages (#1768)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2023-10-16 09:26:13 -07:00
Manan TankandGitHub 010955ff5c [react] - Fix OTP input not working well with Japanese keyboard (#1769) 2023-10-16 15:41:54 +00:00
Joaquim VergesandGitHub 956b5645e4 [SDK] Enable adding smart wallet admins with signature (#1756) 2023-10-15 23:46:45 +00:00
59 changed files with 806 additions and 291 deletions
+28
View File
@@ -1,5 +1,33 @@
# @thirdweb-dev/auth
## 4.0.7
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.0.7
## 4.0.6
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.0.6
## 4.0.5
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.0.5
## 4.0.4
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/wallets@2.0.4
## 4.0.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "4.0.3",
"version": "4.0.7",
"main": "dist/thirdweb-dev-auth.cjs.js",
"module": "dist/thirdweb-dev-auth.esm.js",
"browser": {
+6
View File
@@ -1,5 +1,11 @@
# @thirdweb-dev/chains
## 0.1.55
### Patch Changes
- [#1783](https://github.com/thirdweb-dev/js/pull/1783) [`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64) Thanks [@jnsdls](https://github.com/jnsdls)! - sync chains
## 0.1.54
### Patch Changes
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 100,
"explorers": [
{
"name": "gnosisscan",
"url": "https://gnosisscan.io",
"name": "blockscout",
"url": "https://gnosis.blockscout.com",
"standard": "EIP3091"
},
{
"name": "blockscout",
"url": "https://gnosis.blockscout.com",
"name": "gnosisscan",
"url": "https://gnosisscan.io",
"standard": "EIP3091"
}
],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 11110,
"explorers": [
{
"name": "Astra PingPub Explorer",
"url": "https://ping.astranaut.io/astra",
"name": "Astra EVM Explorer (Blockscout)",
"url": "https://explorer.astranaut.io",
"standard": "none"
},
{
"name": "Astra EVM Explorer (Blockscout)",
"url": "https://explorer.astranaut.io",
"name": "Astra PingPub Explorer",
"url": "https://ping.astranaut.io/astra",
"standard": "none"
}
],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "Astra",
"chainId": 11115,
"explorers": [
{
"name": "Astra PingPub Explorer",
"url": "https://ping.astranaut.dev/astra",
"standard": "none"
},
{
"name": "Astra EVM Explorer",
"url": "https://explorer.astranaut.dev",
"standard": "EIP3091"
},
{
"name": "Astra PingPub Explorer",
"url": "https://ping.astranaut.dev/astra",
"standard": "none"
}
],
"faucets": [
-1
View File
@@ -19,7 +19,6 @@ export default {
},
"redFlags": [],
"rpc": [
"https://localhost.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"http://localhost:8545"
],
"shortName": "local",
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 2023,
"explorers": [
{
"name": "Taycan Cosmos Explorer",
"url": "https://cosmoscan-test.hupayx.io",
"name": "Taycan Explorer(Blockscout)",
"url": "https://evmscan-test.hupayx.io",
"standard": "none"
},
{
"name": "Taycan Explorer(Blockscout)",
"url": "https://evmscan-test.hupayx.io",
"name": "Taycan Cosmos Explorer",
"url": "https://cosmoscan-test.hupayx.io",
"standard": "none"
}
],
-1
View File
@@ -30,7 +30,6 @@ export default {
"rpc": [
"https://kava-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://evm.testnet.kava.io",
"https://kava-evm-testnet.rpc.thirdweb.com",
"wss://wevm.testnet.kava.io"
],
"shortName": "tkava",
-1
View File
@@ -30,7 +30,6 @@ export default {
"https://evm.kava.io",
"https://evm2.kava.io",
"https://kava-rpc.gateway.pokt.network",
"https://kava-evm.rpc.thirdweb.com",
"wss://wevm.kava.io",
"wss://wevm2.kava.io",
"https://kava-evm.publicnode.com",
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 30,
"explorers": [
{
"name": "Rootstock Explorer",
"url": "https://explorer.rsk.co",
"name": "blockscout",
"url": "https://rootstock.blockscout.com",
"standard": "EIP3091"
},
{
"name": "blockscout",
"url": "https://rootstock.blockscout.com",
"name": "Rootstock Explorer",
"url": "https://explorer.rsk.co",
"standard": "EIP3091"
}
],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "SDN",
"chainId": 336,
"explorers": [
{
"name": "subscan",
"url": "https://shiden.subscan.io",
"standard": "none"
},
{
"name": "blockscout",
"url": "https://blockscout.com/shiden",
"standard": "EIP3091"
},
{
"name": "subscan",
"url": "https://shiden.subscan.io",
"standard": "none"
}
],
"faucets": [],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 369,
"explorers": [
{
"name": "otterscan",
"url": "https://otter.pulsechain.com",
"name": "blockscout",
"url": "https://scan.pulsechain.com",
"standard": "EIP3091"
},
{
"name": "blockscout",
"url": "https://scan.pulsechain.com",
"name": "otterscan",
"url": "https://otter.pulsechain.com",
"standard": "EIP3091"
}
],
+3 -3
View File
@@ -18,7 +18,7 @@ export default {
"format": "png"
},
"infoURL": "http://doschain.io/",
"name": "DOS Tesnet",
"name": "DOS Testnet",
"nativeCurrency": {
"name": "DOS",
"symbol": "DOS",
@@ -26,10 +26,10 @@ export default {
},
"redFlags": [],
"rpc": [
"https://dos-tesnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://dos-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://test.doschain.com"
],
"shortName": "dost",
"slug": "dos-tesnet",
"slug": "dos-testnet",
"testnet": true
} as const satisfies Chain;
+1 -2
View File
@@ -27,8 +27,7 @@ export default {
"redFlags": [],
"rpc": [
"https://wireshape-floripa-testnet.rpc.thirdweb.com/${THIRDWEB_API_KEY}",
"https://rpc-floripa.wireshape.org",
"https://wireshape-floripa-testnet.rpc.thirdweb.com"
"https://rpc-floripa.wireshape.org"
],
"shortName": "floripa",
"slug": "wireshape-floripa-testnet",
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 50,
"explorers": [
{
"name": "blocksscan",
"url": "https://xdc.blocksscan.io",
"name": "xdcscan",
"url": "https://xdcscan.io",
"standard": "EIP3091"
},
{
"name": "xdcscan",
"url": "https://xdcscan.io",
"name": "blocksscan",
"url": "https://xdc.blocksscan.io",
"standard": "EIP3091"
}
],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 51,
"explorers": [
{
"name": "blocksscan",
"url": "https://apothem.blocksscan.io",
"name": "xdcscan",
"url": "https://apothem.xinfinscan.com",
"standard": "EIP3091"
},
{
"name": "xdcscan",
"url": "https://apothem.xinfinscan.com",
"name": "blocksscan",
"url": "https://apothem.blocksscan.io",
"standard": "EIP3091"
}
],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "Imversed",
"chainId": 5555555,
"explorers": [
{
"name": "Imversed Cosmos Explorer (Big Dipper)",
"url": "https://tex-c.imversed.com",
"standard": "none"
},
{
"name": "Imversed EVM explorer (Blockscout)",
"url": "https://txe.imversed.network",
"standard": "EIP3091"
},
{
"name": "Imversed Cosmos Explorer (Big Dipper)",
"url": "https://tex-c.imversed.com",
"standard": "none"
}
],
"faucets": [],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "Imversed",
"chainId": 5555558,
"explorers": [
{
"name": "Imversed Cosmos Explorer (Big Dipper)",
"url": "https://tex-t.imversed.com",
"standard": "none"
},
{
"name": "Imversed EVM Explorer (Blockscout)",
"url": "https://txe-test.imversed.network",
"standard": "EIP3091"
},
{
"name": "Imversed Cosmos Explorer (Big Dipper)",
"url": "https://tex-t.imversed.com",
"standard": "none"
}
],
"faucets": [],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 59140,
"explorers": [
{
"name": "Blockscout",
"url": "https://explorer.goerli.linea.build",
"name": "Etherscan",
"url": "https://goerli.lineascan.build",
"standard": "EIP3091"
},
{
"name": "Etherscan",
"url": "https://goerli.lineascan.build",
"name": "Blockscout",
"url": "https://explorer.goerli.linea.build",
"standard": "EIP3091"
}
],
-5
View File
@@ -7,11 +7,6 @@ export default {
"name": "lineascan",
"url": "https://lineascan.build",
"standard": "EIP3091"
},
{
"name": "Linea Scan",
"url": "https://lineascan.build",
"standard": ""
}
],
"faucets": [
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "ASTR",
"chainId": 592,
"explorers": [
{
"name": "subscan",
"url": "https://astar.subscan.io",
"standard": "none"
},
{
"name": "blockscout",
"url": "https://blockscout.com/astar",
"standard": "EIP3091"
},
{
"name": "subscan",
"url": "https://astar.subscan.io",
"standard": "none"
}
],
"faucets": [],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 8000,
"explorers": [
{
"name": "Teleport Cosmos Explorer (Big Dipper)",
"url": "https://explorer.teleport.network",
"name": "Teleport EVM Explorer (Blockscout)",
"url": "https://evm-explorer.teleport.network",
"standard": "none"
},
{
"name": "Teleport EVM Explorer (Blockscout)",
"url": "https://evm-explorer.teleport.network",
"name": "Teleport Cosmos Explorer (Big Dipper)",
"url": "https://explorer.teleport.network",
"standard": "none"
}
],
+4 -4
View File
@@ -4,13 +4,13 @@ export default {
"chainId": 8001,
"explorers": [
{
"name": "Teleport Cosmos Explorer (Big Dipper)",
"url": "https://explorer.testnet.teleport.network",
"name": "Teleport EVM Explorer (Blockscout)",
"url": "https://evm-explorer.testnet.teleport.network",
"standard": "none"
},
{
"name": "Teleport EVM Explorer (Blockscout)",
"url": "https://evm-explorer.testnet.teleport.network",
"name": "Teleport Cosmos Explorer (Big Dipper)",
"url": "https://explorer.testnet.teleport.network",
"standard": "none"
}
],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "ETH",
"chainId": 8453,
"explorers": [
{
"name": "basescan",
"url": "https://basescan.org",
"standard": "none"
},
{
"name": "basescout",
"url": "https://base.blockscout.com",
"standard": "EIP3091"
},
{
"name": "basescan",
"url": "https://basescan.org",
"standard": "none"
}
],
"faucets": [],
+5 -5
View File
@@ -3,15 +3,15 @@ export default {
"chain": "ETH",
"chainId": 84531,
"explorers": [
{
"name": "basescan",
"url": "https://goerli.basescan.org",
"standard": "none"
},
{
"name": "basescout",
"url": "https://base-goerli.blockscout.com",
"standard": "EIP3091"
},
{
"name": "basescan",
"url": "https://goerli.basescan.org",
"standard": "none"
}
],
"faucets": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/chains",
"version": "0.1.54",
"version": "0.1.55",
"main": "dist/thirdweb-dev-chains.cjs.js",
"module": "dist/thirdweb-dev-chains.esm.js",
"browser": {
+22 -24
View File
@@ -6,7 +6,7 @@ const BASE_URI = (process.env.BASE_URI as string) || "https://api.thirdweb.com";
async function getAllPaginatedChains(
chains: any[] = [],
pathname = "/v1/chains",
pathname = "/v1/chains?limit=100",
) {
const url = new URL(BASE_URI);
url.pathname = pathname;
@@ -33,31 +33,37 @@ async function sync() {
const results = await Promise.all(
allChainsInDB.map(async (chain) => {
let chainId = chain.chainId;
// try to convert to number for legacy reasons
try {
chainId = Number(chainId);
} catch {
// if we fail here then we cannot use this chain in the chains package for now, so we skip it
return null;
}
const pkgChain: Chain = {
...chain,
chainId: Number(chain.chainId),
// assing back the chainId
chainId,
// map the features to the legacy format
features: chain.features?.map((feature) => ({ name: feature })),
};
// remove all null values
Object.keys(pkgChain).forEach((key) => {
// @ts-ignore
if (pkgChain[key] === null || pkgChain[key] === undefined) {
// @ts-ignore
delete pkgChain[key];
}
});
// sort top level keys alphabetically
// @ts-ignore
const sortedChain: Chain = {};
const sortedChain = {} as Chain;
Object.keys(pkgChain)
.sort()
.forEach((key) => {
// @ts-ignore
sortedChain[key] = pkgChain[key];
});
// @ts-ignore
await fs.writeFile(
`${chainsDir}/${sortedChain.chainId}.ts`,
`import type { Chain } from "../src/types";
@@ -78,17 +84,8 @@ export default ${JSON.stringify(
exportName = `_${exportName}`;
}
// imports.push(`import c${chain.chainId} from "../chains/${chain.chainId}";`);
// exports.push(
// `export { default as ${exportName} } from "../chains/${chain.chainId}"`,
// );
const key = `c${sortedChain.chainId}`;
// exportNames.push(key);
// exportNameToChain[key] = chain;
return {
imp: `import c${sortedChain.chainId} from "../chains/${sortedChain.chainId}";`,
exp: `export { default as ${exportName} } from "../chains/${sortedChain.chainId}"`,
@@ -101,20 +98,21 @@ export default ${JSON.stringify(
const { imports, exports, exportNames, exportNameToChain } = results.reduce(
(acc, result) => {
// @ts-ignore
// if it's a null result skip it (can happen when we skip chains above because their chainID is out of bounds)
if (result === null) {
return acc;
}
acc.imports.push(result.imp);
// @ts-ignore
acc.exports.push(result.exp);
// @ts-ignore
acc.exportNames.push(result.key);
acc.exportNameToChain[result.key] = result.chain;
return acc;
},
{
imports: [],
exports: [],
exportNames: [],
exportNameToChain: {},
imports: [] as string[],
exports: [] as string[],
exportNames: [] as string[],
exportNameToChain: {} as Record<string, Chain>,
},
);
+2 -2
View File
@@ -1587,7 +1587,7 @@ export { default as Alveychain } from "../chains/3797"
export { default as Kalychain } from "../chains/3888"
export { default as KalychainTestnet } from "../chains/3889"
export { default as DracNetwork } from "../chains/3912"
export { default as DosTesnet } from "../chains/3939"
export { default as DosTestnet } from "../chains/3939"
export { default as Dyno } from "../chains/3966"
export { default as DynoTestnet } from "../chains/3967"
export { default as Yuanchain } from "../chains/3999"
@@ -3727,7 +3727,7 @@ type ChainIdsBySlug = {
"kalychain": 3888,
"kalychain-testnet": 3889,
"drac-network": 3912,
"dos-tesnet": 3939,
"dos-testnet": 3939,
"dyno": 3966,
"dyno-testnet": 3967,
"yuanchain": 3999,
+37
View File
@@ -1,5 +1,42 @@
# thirdweb
## 0.13.7
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/sdk@4.0.6
- @thirdweb-dev/wallets@2.0.7
- @thirdweb-dev/auth@4.0.7
## 0.13.6
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
- @thirdweb-dev/wallets@2.0.6
- @thirdweb-dev/auth@4.0.6
## 0.13.5
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.4
- @thirdweb-dev/wallets@2.0.5
- @thirdweb-dev/auth@4.0.5
## 0.13.4
### Patch Changes
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/sdk@4.0.3
- @thirdweb-dev/wallets@2.0.4
- @thirdweb-dev/auth@4.0.4
## 0.13.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "thirdweb",
"main": "dist/cli/index.js",
"version": "0.13.3",
"version": "0.13.7",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+12
View File
@@ -1,5 +1,17 @@
# @thirdweb-dev/contracts-js
## 1.3.16
### Patch Changes
- [#1771](https://github.com/thirdweb-dev/js/pull/1771) [`6c30b7ef`](https://github.com/thirdweb-dev/js/commit/6c30b7efc708e1244f3be3e10eac8f3b8b14a8c3) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Updated to latest contracts package
## 1.3.15
### Patch Changes
- [#1756](https://github.com/thirdweb-dev/js/pull/1756) [`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Enable adding smart wallet admins via bundler for new account contracts
## 1.3.14
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/contracts-js",
"version": "1.3.14",
"version": "1.3.16",
"main": "dist/thirdweb-dev-contracts-js.cjs.js",
"module": "dist/thirdweb-dev-contracts-js.esm.js",
"browser": {
@@ -10,7 +10,7 @@
"license": "Apache-2.0",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/contracts-js",
"dependencies": {
"@thirdweb-dev/contracts": "3.10.2-3"
"@thirdweb-dev/contracts": "3.10.3"
},
"devDependencies": {
"@babel/preset-env": "^7.22.9",
+37
View File
@@ -1,5 +1,42 @@
# @thirdweb-dev/react-core
## 4.0.7
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/sdk@4.0.6
- @thirdweb-dev/wallets@2.0.7
- @thirdweb-dev/auth@4.0.7
## 4.0.6
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
- @thirdweb-dev/wallets@2.0.6
- @thirdweb-dev/auth@4.0.6
## 4.0.5
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.4
- @thirdweb-dev/wallets@2.0.5
- @thirdweb-dev/auth@4.0.5
## 4.0.4
### Patch Changes
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/sdk@4.0.3
- @thirdweb-dev/wallets@2.0.4
- @thirdweb-dev/auth@4.0.4
## 4.0.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-core",
"version": "4.0.3",
"version": "4.0.7",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-core",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -1,5 +1,13 @@
# @thirdweb-dev/react-native-compat
## 0.3.12
## 0.3.11
## 0.3.10
## 0.3.9
## 0.3.8
## 0.3.7
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@thirdweb-dev/react-native-compat",
"description": "Shims for Thirdweb in React Native Projects",
"version": "0.3.8",
"version": "0.3.12",
"author": "thirdweb eng <[email protected]>",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-native-compat",
"license": "Apache-2.0",
+37
View File
@@ -1,5 +1,42 @@
# @thirdweb-dev/react-native
## 0.3.12
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/react-core@4.0.7
- @thirdweb-dev/sdk@4.0.6
- @thirdweb-dev/wallets@2.0.7
## 0.3.11
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
- @thirdweb-dev/react-core@4.0.6
- @thirdweb-dev/wallets@2.0.6
## 0.3.10
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.4
- @thirdweb-dev/wallets@2.0.5
- @thirdweb-dev/react-core@4.0.5
## 0.3.9
### Patch Changes
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/sdk@4.0.3
- @thirdweb-dev/wallets@2.0.4
- @thirdweb-dev/react-core@4.0.4
## 0.3.8
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react-native",
"version": "0.3.8",
"version": "0.3.12",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react-native",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+39
View File
@@ -1,5 +1,44 @@
# @thirdweb-dev/react
## 4.0.7
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/react-core@4.0.7
- @thirdweb-dev/sdk@4.0.6
- @thirdweb-dev/wallets@2.0.7
## 4.0.6
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
- @thirdweb-dev/react-core@4.0.6
- @thirdweb-dev/wallets@2.0.6
## 4.0.5
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.4
- @thirdweb-dev/wallets@2.0.5
- @thirdweb-dev/react-core@4.0.5
## 4.0.4
### Patch Changes
- [#1769](https://github.com/thirdweb-dev/js/pull/1769) [`010955ff`](https://github.com/thirdweb-dev/js/commit/010955ff5cc35a975b54c25992b8e65b40e033a1) Thanks [@MananTank](https://github.com/MananTank)! - Fix OTP input not working well with Japanese keyboard
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/sdk@4.0.3
- @thirdweb-dev/wallets@2.0.4
- @thirdweb-dev/react-core@4.0.4
## 4.0.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react",
"version": "4.0.3",
"version": "4.0.7",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -38,7 +38,9 @@ export function OTPInput(props: {
key={i}
value={otp[i] ?? ""}
type="number"
pattern="[0-9]*"
variant="outline"
inputMode="numeric"
onPaste={(e) => {
const pastedData = e.clipboardData.getData("text/plain");
const newOTP = pastedData
+29
View File
@@ -1,5 +1,34 @@
# @thirdweb-dev/sdk
## 4.0.6
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
## 4.0.5
### Patch Changes
- [#1781](https://github.com/thirdweb-dev/js/pull/1781) [`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Expose utility functions for fetching ABI / sources
## 4.0.4
### Patch Changes
- Updated dependencies [[`6c30b7ef`](https://github.com/thirdweb-dev/js/commit/6c30b7efc708e1244f3be3e10eac8f3b8b14a8c3)]:
- @thirdweb-dev/contracts-js@1.3.16
## 4.0.3
### Patch Changes
- [#1756](https://github.com/thirdweb-dev/js/pull/1756) [`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Enable adding smart wallet admins via bundler for new account contracts
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/contracts-js@1.3.15
## 4.0.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/sdk",
"version": "4.0.2",
"version": "4.0.6",
"description": "The main thirdweb SDK.",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/sdk",
"license": "Apache-2.0",
@@ -73,6 +73,7 @@ import {
FEATURE_ACCOUNT,
FEATURE_ACCOUNT_FACTORY,
FEATURE_ACCOUNT_PERMISSIONS,
FEATURE_ACCOUNT_PERMISSIONS_V1,
} from "./thirdweb-features";
/**
@@ -146,6 +147,7 @@ export type Feature =
| typeof FEATURE_AIRDROP_ERC1155
| typeof FEATURE_ACCOUNT
| typeof FEATURE_ACCOUNT_PERMISSIONS
| typeof FEATURE_ACCOUNT_PERMISSIONS_V1
| typeof FEATURE_ACCOUNT_FACTORY;
export type Extension = Feature;
@@ -16,6 +16,7 @@ import IAirdropERC721 from "@thirdweb-dev/contracts-js/dist/abis/IAirdropERC721.
import IAirdropERC1155 from "@thirdweb-dev/contracts-js/dist/abis/IAirdropERC1155.json";
import IAccountFactoryCore from "@thirdweb-dev/contracts-js/dist/abis/IAccountFactoryCore.json";
import IAccountPermissions from "@thirdweb-dev/contracts-js/dist/abis/IAccountPermissions.json";
import IAccountPermissionsV1 from "@thirdweb-dev/contracts-js/dist/abis/IAccountPermissions_V1.json";
import IAccount from "@thirdweb-dev/contracts-js/dist/abis/IAccount.json";
export const getAllPluginsAbi = [
@@ -295,6 +296,18 @@ export const FEATURE_ACCOUNT_FACTORY = {
features: {},
} as const;
export const FEATURE_ACCOUNT_PERMISSIONS_V1 = {
name: "AccountPermissionsV1",
namespace: "accountPermissions",
docLinks: {
// TODO
sdk: "sdk.account",
contracts: "IAccountPermissions",
},
abis: [IAccountPermissionsV1],
features: {},
} as const;
export const FEATURE_ACCOUNT_PERMISSIONS = {
name: "AccountPermissions",
namespace: "accountPermissions",
@@ -316,7 +329,10 @@ export const FEATURE_ACCOUNT = {
contracts: "IAccount",
},
abis: [IAccount],
features: { [FEATURE_ACCOUNT_PERMISSIONS.name]: FEATURE_ACCOUNT_PERMISSIONS },
features: {
[FEATURE_ACCOUNT_PERMISSIONS.name]: FEATURE_ACCOUNT_PERMISSIONS,
[FEATURE_ACCOUNT_PERMISSIONS_V1.name]: FEATURE_ACCOUNT_PERMISSIONS_V1,
},
} as const;
export const FEATURE_AIRDROP_ERC20 = {
@@ -7,24 +7,30 @@ import { Transaction } from "./transactions";
import type {
IAccountCore,
IAccountPermissions,
IAccountPermissions_V1,
} from "@thirdweb-dev/contracts-js";
import invariant from "tiny-invariant";
import { resolveAddress } from "../../common";
import { detectContractFeature, resolveAddress } from "../../common";
import { resolveOrGenerateId } from "../../common/signature-minting";
import { buildTransactionFunction } from "../../common/transactions";
import { AddressOrEns } from "../../schema";
import {
AdminFlag,
DEFAULT_PERMISSIONS,
PermissionSnapshotInput,
PermissionSnapshotOutput,
PermissionSnapshotSchema,
SignedSignerPermissionsPayload,
SignedSignerPermissionsPayloadV1,
SignerPermissionRequest,
SignerPermissionRequestV1,
SignerPermissions,
SignerPermissionsInput,
SignerPermissionsOutput,
SignerPermissionsSchema,
SignerWithPermissions,
} from "../../types";
import { AddressZero } from "../../constants/addresses/AddressZero";
export class AccountPermissions implements DetectableFeature {
featureName = FEATURE_ACCOUNT_PERMISSIONS.name;
@@ -85,21 +91,44 @@ export class AccountPermissions implements DetectableFeature {
private async sendSignerPermissionRequest(
signerAddress: string,
permissions: SignerPermissionsOutput,
adminFlag: AdminFlag,
): Promise<Transaction> {
if (
detectContractFeature<IAccountPermissions_V1>(
this.contractWrapper,
"AccountPermissionsV1",
)
) {
// legacy account permissions contract
// admin is set only via EOA
// signer permissions are set via EOA or admin but no wildcard
if (
adminFlag === AdminFlag.AddAdmin ||
adminFlag === AdminFlag.RemoveAdmin
) {
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "setAdmin",
args: [signerAddress, adminFlag === AdminFlag.AddAdmin],
});
} else {
const { payload, signature } = await this.generateLegacyPayload(
signerAddress,
permissions,
);
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "setPermissionsForSigner",
args: [payload, signature],
});
}
}
const { payload, signature } = await this.generatePayload(
signerAddress,
permissions,
adminFlag,
);
const [success] = await this.contractWrapper.read(
"verifySignerPermissionRequest",
[payload, signature],
);
if (!success) {
throw new Error(`Invalid signature.`);
}
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "setPermissionsForSigner",
@@ -107,29 +136,6 @@ export class AccountPermissions implements DetectableFeature {
});
}
private async buildSignerPermissionRequest(
signerAddress: string,
permissions: SignerPermissionsOutput,
): Promise<string> {
const { payload, signature } = await this.generatePayload(
signerAddress,
permissions,
);
const isValidSigner = await this.contractWrapper.read(
"verifySignerPermissionRequest",
[payload, signature],
);
if (!isValidSigner) {
throw new Error(`Invalid signature.`);
}
return this.contractWrapper.writeContract.interface.encodeFunctionData(
"setPermissionsForSigner",
[payload, signature],
);
}
/**
* Generate and sign a payload to grant or revoke a signer's access to the account.
*
@@ -141,11 +147,16 @@ export class AccountPermissions implements DetectableFeature {
private async generatePayload(
signerAddress: string,
permissions: SignerPermissionsOutput,
isAdmin: AdminFlag,
): Promise<SignedSignerPermissionsPayload> {
// Get payload struct.
const payload: IAccountPermissions.SignerPermissionRequestStruct = {
signer: signerAddress,
approvedTargets: permissions.approvedCallTargets,
isAdmin: isAdmin.valueOf(),
approvedTargets:
permissions.approvedCallTargets === "*"
? [AddressZero]
: permissions.approvedCallTargets,
nativeTokenLimitPerTransaction: utils.parseEther(
permissions.nativeTokenLimitPerTransaction,
),
@@ -182,6 +193,53 @@ export class AccountPermissions implements DetectableFeature {
return { payload, signature };
}
private async generateLegacyPayload(
signerAddress: string,
permissions: SignerPermissionsOutput,
): Promise<SignedSignerPermissionsPayloadV1> {
if (permissions.approvedCallTargets === "*") {
throw new Error(
"Wildcard call targets are not supported on legacy account permissions contract, please deploy an updated contract factory.",
);
}
// legacy account permissions contract
// admin is set only via EOA
// signer permissions are set via EOA or admin but no wildcard
const payload: IAccountPermissions_V1.SignerPermissionRequestStruct = {
signer: signerAddress,
approvedTargets: permissions.approvedCallTargets,
nativeTokenLimitPerTransaction: utils.parseEther(
permissions.nativeTokenLimitPerTransaction,
),
permissionStartTimestamp: permissions.startDate,
permissionEndTimestamp: permissions.expirationDate,
reqValidityStartTimestamp: 0,
// Req validity ends 10 years from now.
reqValidityEndTimestamp: BigNumber.from(
Math.floor(
new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 10).getTime() /
1000,
),
),
uid: resolveOrGenerateId(undefined),
};
const chainId = await this.contractWrapper.getChainID();
const connectedSigner = this.contractWrapper.getSigner();
invariant(connectedSigner, "No signer available");
const signature = await this.contractWrapper.signTypedData(
connectedSigner,
{
name: "Account",
version: "1",
chainId,
verifyingContract: this.getAddress(),
},
{ SignerPermissionRequest: SignerPermissionRequestV1 },
payload,
);
return { payload, signature };
}
/*********************************
* READ FUNCTIONS
********************************/
@@ -320,11 +378,11 @@ export class AccountPermissions implements DetectableFeature {
grantAdminPermissions = /* @__PURE__ */ buildTransactionFunction(
async (signerAddress: AddressOrEns): Promise<Transaction> => {
const resolvedSignerAddress = await resolveAddress(signerAddress);
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "setAdmin",
args: [resolvedSignerAddress, true],
});
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
DEFAULT_PERMISSIONS,
AdminFlag.AddAdmin,
);
},
);
@@ -346,11 +404,11 @@ export class AccountPermissions implements DetectableFeature {
revokeAdminPermissions = /* @__PURE__ */ buildTransactionFunction(
async (signerAddress: AddressOrEns): Promise<Transaction> => {
const resolvedSignerAddress = await resolveAddress(signerAddress);
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "setAdmin",
args: [resolvedSignerAddress, false],
});
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
DEFAULT_PERMISSIONS,
AdminFlag.RemoveAdmin,
);
},
);
@@ -395,6 +453,7 @@ export class AccountPermissions implements DetectableFeature {
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
resolvedPermissions,
AdminFlag.None,
);
},
);
@@ -440,6 +499,7 @@ export class AccountPermissions implements DetectableFeature {
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
resolvedPermissions,
AdminFlag.None,
);
},
);
@@ -475,12 +535,16 @@ export class AccountPermissions implements DetectableFeature {
);
}
return await this.sendSignerPermissionRequest(resolvedSignerAddress, {
startDate: BigNumber.from(0),
expirationDate: BigNumber.from(0),
approvedCallTargets: [],
nativeTokenLimitPerTransaction: "0",
});
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
{
startDate: BigNumber.from(0),
expirationDate: BigNumber.from(0),
approvedCallTargets: [],
nativeTokenLimitPerTransaction: "0",
},
AdminFlag.None,
);
},
);
@@ -531,13 +595,17 @@ export class AccountPermissions implements DetectableFeature {
const newTargets = [...permissions.approvedTargets, resolvedTarget];
return await this.sendSignerPermissionRequest(resolvedSignerAddress, {
startDate: BigNumber.from(permissions.startTimestamp),
expirationDate: BigNumber.from(permissions.endTimestamp),
approvedCallTargets: newTargets,
nativeTokenLimitPerTransaction:
permissions.nativeTokenLimitPerTransaction.toString(),
});
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
{
startDate: BigNumber.from(permissions.startTimestamp),
expirationDate: BigNumber.from(permissions.endTimestamp),
approvedCallTargets: newTargets,
nativeTokenLimitPerTransaction:
permissions.nativeTokenLimitPerTransaction.toString(),
},
AdminFlag.None,
);
},
);
@@ -591,13 +659,17 @@ export class AccountPermissions implements DetectableFeature {
utils.getAddress(approvedTarget) !== utils.getAddress(resolvedTarget),
);
return await this.sendSignerPermissionRequest(resolvedSignerAddress, {
startDate: BigNumber.from(permissions.startTimestamp),
expirationDate: BigNumber.from(permissions.endTimestamp),
approvedCallTargets: newTargets,
nativeTokenLimitPerTransaction:
permissions.nativeTokenLimitPerTransaction.toString(),
});
return await this.sendSignerPermissionRequest(
resolvedSignerAddress,
{
startDate: BigNumber.from(permissions.startTimestamp),
expirationDate: BigNumber.from(permissions.endTimestamp),
approvedCallTargets: newTargets,
nativeTokenLimitPerTransaction:
permissions.nativeTokenLimitPerTransaction.toString(),
},
AdminFlag.None,
);
},
);
@@ -651,14 +723,16 @@ export class AccountPermissions implements DetectableFeature {
const allToMakeAdmin = resolvedSnapshot
.filter((item) => item.makeAdmin)
.map((item) => item.signer);
allAdmins.forEach((admin) => {
allAdmins.forEach(async (admin) => {
if (!allToMakeAdmin.includes(admin)) {
removeAdminData.push(
this.contractWrapper.writeContract.interface.encodeFunctionData(
"setAdmin",
[admin, false],
),
);
const data = (
await this.sendSignerPermissionRequest(
admin,
DEFAULT_PERMISSIONS,
AdminFlag.RemoveAdmin,
)
).encode();
removeAdminData.push(data);
}
});
@@ -672,13 +746,13 @@ export class AccountPermissions implements DetectableFeature {
await Promise.all(
allSigners.map(async (item) => {
if (!allToMakeSigners.includes(item.signer)) {
const data = await this.buildSignerPermissionRequest(item.signer, {
startDate: BigNumber.from(0),
expirationDate: BigNumber.from(0),
approvedCallTargets: [],
nativeTokenLimitPerTransaction: "0",
});
const data = (
await this.sendSignerPermissionRequest(
item.signer,
DEFAULT_PERMISSIONS,
AdminFlag.None,
)
).encode();
removeSignerData.push(data);
}
}),
@@ -687,18 +761,23 @@ export class AccountPermissions implements DetectableFeature {
for (const member of resolvedSnapshot) {
// Add new admin
if (member.makeAdmin) {
addAdminData.push(
this.contractWrapper.writeContract.interface.encodeFunctionData(
"setAdmin",
[member.signer, true],
),
);
const data = (
await this.sendSignerPermissionRequest(
member.signer,
DEFAULT_PERMISSIONS,
AdminFlag.AddAdmin,
)
).encode();
addAdminData.push(data);
} else {
// Add new scoped
const data = await this.buildSignerPermissionRequest(
member.signer,
member.permissions,
);
const data = (
await this.sendSignerPermissionRequest(
member.signer,
member.permissions,
AdminFlag.None,
)
).encode();
addOrUpdateSignerData.push(data);
}
}
+5 -1
View File
@@ -13,8 +13,8 @@ import {
SignerPermissionsInput,
SignerWithPermissions,
} from "../../types";
import { AccountPermissions } from "./account-permissions";
import { buildTransactionFunction } from "../../common/transactions";
import { AccountPermissions } from "./account-permissions";
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- TO BE REMOVED IN V4
export class Account<TContract extends IAccountCore>
@@ -34,6 +34,10 @@ export class Account<TContract extends IAccountCore>
detectContractFeature<IAccountCore>(
this.contractWrapper,
"AccountPermissions",
) ||
detectContractFeature<IAccountCore>(
this.contractWrapper,
"AccountPermissionsV1",
)
) {
return new AccountPermissions(this.contractWrapper);
@@ -7,9 +7,11 @@ import {
AbiEvent,
AbiFunction,
AbiSchema,
ContractSource,
PublishedMetadata,
} from "../../schema/contracts/custom";
import { ContractWrapper } from "./contract-wrapper";
import { fetchSourceFilesFromMetadata } from "../../common";
/**
* Handles publish metadata for a contract
@@ -47,6 +49,14 @@ export class ContractPublishedMetadata<TContract extends BaseContract> {
return this._cachedMetadata;
}
/**
* @public
*/
public async extractSources(): Promise<ContractSource[]> {
const publishedMetadata = await this.get();
return fetchSourceFilesFromMetadata(publishedMetadata, this.storage);
}
/**
* @public
*/
@@ -27,6 +27,7 @@ import { buildTransactionFunction } from "../../common/transactions";
import { isIncrementalVersion } from "../../common/version-checker";
import { getContractPublisherAddress } from "../../constants/addresses/getContractPublisherAddress";
import {
Abi,
AbiFunction,
AbiSchema,
ContractParam,
@@ -41,6 +42,7 @@ import {
PublishedContract,
PublishedContractFetched,
PublishedContractSchema,
PublishedMetadata,
} from "../../schema/contracts/custom";
import { SDKOptions } from "../../schema/sdk-options";
import { AddressOrEns } from "../../schema/shared/AddressOrEnsSchema";
@@ -137,10 +139,11 @@ export class ContractPublisher extends RPCConnectionHandler {
}
/**
* @internal
* @param address
*/
public async fetchCompilerMetadataFromAddress(address: AddressOrEns) {
public async fetchCompilerMetadataFromAddress(
address: AddressOrEns,
): Promise<PublishedMetadata> {
const resolvedAddress = await resolveAddress(address);
return fetchContractMetadataFromAddress(
resolvedAddress,
@@ -217,7 +220,7 @@ export class ContractPublisher extends RPCConnectionHandler {
}
/**
* @internal
* Fetch all sources for a contract from its address
* @param address
*/
public async fetchContractSourcesFromAddress(
@@ -230,6 +233,22 @@ export class ContractPublisher extends RPCConnectionHandler {
return await fetchSourceFilesFromMetadata(metadata, this.storage);
}
/**
* Fetch ABI from a contract, or undefined if not found
* @param address
*/
public async fetchContractAbiFromAddress(
address: AddressOrEns,
): Promise<Abi | undefined> {
const resolvedAddress = await resolveAddress(address);
const meta = await fetchContractMetadataFromAddress(
resolvedAddress,
this.getProvider(),
this.storage,
);
return meta.abi;
}
/**
* @internal
* @param profileMetadata
@@ -15,7 +15,6 @@ import { generateExtensionFunctions } from "../../common/plugin/generatePluginFu
import { Abi, AbiSchema, CommonContractSchema } from "../../schema";
import { utils } from "ethers";
import invariant from "tiny-invariant";
import { ExtensionAddedEvent } from "@thirdweb-dev/contracts-js/dist/declarations/src/CoreRouter";
import {
THIRDWEB_DEPLOYER,
deployContractDeterministic,
@@ -26,9 +25,12 @@ import {
} from "../../common";
import { joinABIs } from "../../common/plugin/joinABIs";
import { TransactionReceipt } from "@ethersproject/abstract-provider";
import { ExtensionRemovedEvent } from "@thirdweb-dev/contracts-js/dist/declarations/src/CoreRouter";
import { ExtensionReplacedEvent } from "@thirdweb-dev/contracts-js/dist/declarations/src/BaseRouter";
import { DynamicContractExtensionMetadataOrUri } from "../../types";
import {
ExtensionAddedEvent,
ExtensionRemovedEvent,
ExtensionReplacedEvent,
} from "@thirdweb-dev/contracts-js/dist/declarations/src/BaseRouter";
export class ExtensionManager implements DetectableFeature {
featureName = FEATURE_DYNAMIC_CONTRACT.name;
+38 -3
View File
@@ -1,4 +1,7 @@
import type { IAccountPermissions } from "@thirdweb-dev/contracts-js";
import type {
IAccountPermissions,
IAccountPermissions_V1,
} from "@thirdweb-dev/contracts-js";
import { BigNumber, BytesLike } from "ethers";
import { z } from "zod";
import { AmountSchema } from "../../core/schema/shared";
@@ -12,12 +15,27 @@ export type SignerPermissions = {
approvedCallTargets: string[];
};
export enum AdminFlag {
None = 0,
AddAdmin = 1,
RemoveAdmin = 2,
}
export const DEFAULT_PERMISSIONS = {
// eslint-disable-next-line better-tree-shaking/no-top-level-side-effects
startDate: BigNumber.from(0),
// eslint-disable-next-line better-tree-shaking/no-top-level-side-effects
expirationDate: BigNumber.from(0),
approvedCallTargets: [],
nativeTokenLimitPerTransaction: "0",
};
export const SignerPermissionsSchema = /* @__PURE__ */ (() =>
z.object({
startDate: StartDateSchema,
expirationDate: EndDateSchema,
nativeTokenLimitPerTransaction: AmountSchema.default(0),
approvedCallTargets: z.array(AddressOrEnsSchema),
approvedCallTargets: z.union([z.array(AddressOrEnsSchema), z.literal("*")]),
}))();
export type SignerPermissionsInput = z.input<typeof SignerPermissionsSchema>;
@@ -48,7 +66,12 @@ export type SignedSignerPermissionsPayload = {
signature: BytesLike;
};
export const SignerPermissionRequest = [
export type SignedSignerPermissionsPayloadV1 = {
payload: IAccountPermissions_V1.SignerPermissionRequestStruct;
signature: BytesLike;
};
export const SignerPermissionRequestV1 = [
{ name: "signer", type: "address" },
{ name: "approvedTargets", type: "address[]" },
{ name: "nativeTokenLimitPerTransaction", type: "uint256" },
@@ -58,3 +81,15 @@ export const SignerPermissionRequest = [
{ name: "reqValidityEndTimestamp", type: "uint128" },
{ name: "uid", type: "bytes32" },
];
export const SignerPermissionRequest = [
{ name: "signer", type: "address" },
{ name: "isAdmin", type: "uint8" },
{ name: "approvedTargets", type: "address[]" },
{ name: "nativeTokenLimitPerTransaction", type: "uint256" },
{ name: "permissionStartTimestamp", type: "uint128" },
{ name: "permissionEndTimestamp", type: "uint128" },
{ name: "reqValidityStartTimestamp", type: "uint128" },
{ name: "reqValidityEndTimestamp", type: "uint128" },
{ name: "uid", type: "bytes32" },
];
+112 -57
View File
@@ -9,7 +9,6 @@ import {
} from "../../src/evm";
import { ContractFactory, utils } from "ethers";
import EntrypointArtifact from "./mock/EntryPoint.json";
import AccountFactoryArtifact from "./mock/AccountFactory.json";
// Target ABIs
import IAccountCoreAbi from "@thirdweb-dev/contracts-js/dist/abis/IAccountCore.json";
@@ -17,7 +16,12 @@ import {
deployContractAndUploadMetadata,
mockUploadContractMetadata,
} from "./utils";
import { IAccountCore, IAccountFactory } from "@thirdweb-dev/contracts-js";
import {
AccountFactory__factory,
IAccountCore,
IAccountFactory,
} from "@thirdweb-dev/contracts-js";
import { AddressZero } from "../../src/evm/constants/addresses/AddressZero";
describe("Accounts with account factory", function () {
let accountFactory: AccountFactory<IAccountFactory>;
@@ -57,8 +61,8 @@ describe("Accounts with account factory", function () {
adminWallet,
).deploy();
const factoryAddress = await deployContractAndUploadMetadata(
AccountFactoryArtifact.abi,
AccountFactoryArtifact.bytecode.object,
AccountFactory__factory.abi,
AccountFactory__factory.bytecode,
adminWallet,
[entrypoint.address],
);
@@ -124,8 +128,8 @@ describe("Accounts with account factory", function () {
accountAddress,
IAccountCoreAbi,
);
const account = (await sdk.getContract(accountAddress)).account;
const allAdmins = await account.getAllAdmins();
const acc = (await sdk.getContract(accountAddress)).account;
const allAdmins = await acc.getAllAdmins();
assert.isTrue(
allAdmins.length === 1,
"Account should only have one admin.",
@@ -139,8 +143,9 @@ describe("Accounts with account factory", function () {
"Correct admin for account.",
);
const associatedAccounts =
await accountFactory.getAssociatedAccounts(admin);
const associatedAccounts = await accountFactory.getAssociatedAccounts(
admin,
);
assert.isTrue(
associatedAccounts.length === 1,
@@ -185,65 +190,65 @@ describe("Accounts with account factory", function () {
account = (await sdk.getContract(accountAddress)).account;
});
// it("Should be able to add another admin to the account.", async () => {
// assert.isFalse(
// await account.isAdmin(signer1Wallet.address),
// "New signer1 should not be an admin on the account.",
// );
it("Should be able to add another admin to the account.", async () => {
assert.isFalse(
await account.isAdmin(signer1Wallet.address),
"New signer1 should not be an admin on the account.",
);
// await account.grantAdminPermissions(signer1Wallet.address);
await account.grantAdminPermissions(signer1Wallet.address);
// assert.isTrue(
// await account.isAdmin(signer1Wallet.address),
// "New signer1 should be an admin on the account.",
// );
assert.isTrue(
await account.isAdmin(signer1Wallet.address),
"New signer1 should be an admin on the account.",
);
// const isAdmin = (await account.getAllAdmins()).includes(
// utils.getAddress(signer1Wallet.address),
// );
const isAdmin = (await account.getAllAdmins()).includes(
utils.getAddress(signer1Wallet.address),
);
// assert.isTrue(isAdmin, "New signer1 should be an admin on the account.");
assert.isTrue(isAdmin, "New signer1 should be an admin on the account.");
// assert.isTrue(
// (
// await accountFactory.getAssociatedAccounts(signer1Wallet.address)
// ).includes(account.getAddress()),
// "Wallet is an associated account of the signer.",
// );
// });
assert.isTrue(
(
await accountFactory.getAssociatedAccounts(signer1Wallet.address)
).includes(account.getAddress()),
"Wallet is an associated account of the signer.",
);
});
// it("Should be able to remove an admin from the account.", async () => {
// await account.grantAdminPermissions(signer1Wallet.address);
// assert.isTrue(
// await account.isAdmin(signer1Wallet.address),
// "New signer1 should be an admin on the account.",
// );
it("Should be able to remove an admin from the account.", async () => {
await account.grantAdminPermissions(signer1Wallet.address);
assert.isTrue(
await account.isAdmin(signer1Wallet.address),
"New signer1 should be an admin on the account.",
);
// await account.revokeAdminPermissions(signer1Wallet.address);
await account.revokeAdminPermissions(signer1Wallet.address);
// assert.isFalse(
// await account.isAdmin(signer1Wallet.address),
// "New signer1 should not be an admin on the account.",
// );
assert.isFalse(
await account.isAdmin(signer1Wallet.address),
"New signer1 should not be an admin on the account.",
);
// assert.isFalse(
// (await account.getAllSigners())
// .map((result) => utils.getAddress(result.signer))
// .includes(signer1Wallet.address),
// "New signer1 should not be an admin on the account.",
// );
assert.isFalse(
(await account.getAllSigners())
.map((result) => utils.getAddress(result.signer))
.includes(signer1Wallet.address),
"New signer1 should not be an admin on the account.",
);
// assert.isFalse(
// (await account.getAllAdmins()).includes(signer1Wallet.address),
// "New signer1 is not an associated signer of the account.",
// );
// assert.isFalse(
// (
// await accountFactory.getAssociatedAccounts(signer1Wallet.address)
// ).includes(account.getAddress()),
// "Wallet is not an associated account of the signer.",
// );
// });
assert.isFalse(
(await account.getAllAdmins()).includes(signer1Wallet.address),
"New signer1 is not an associated signer of the account.",
);
assert.isFalse(
(
await accountFactory.getAssociatedAccounts(signer1Wallet.address)
).includes(account.getAddress()),
"Wallet is not an associated account of the signer.",
);
});
it("Should be able to grant restricted access to a new signer.", async () => {
const signersWithRestrictions = await account.getAllSigners();
@@ -306,6 +311,56 @@ describe("Accounts with account factory", function () {
);
});
it("Should be able to restrict approved targets.", async () => {
// Grant access
await account.grantPermissions(signer1Wallet.address, {
nativeTokenLimitPerTransaction: "1",
approvedCallTargets: [adminWallet.address],
});
const s = await account.getAllSigners();
const restrictions = s.find(
(result) =>
utils.getAddress(result.signer) ===
utils.getAddress(signer1Wallet.address),
)?.permissions as SignerPermissions;
assert.strictEqual(
restrictions.approvedCallTargets.length,
1,
"New signer1 should have one approved call targets.",
);
assert.strictEqual(
restrictions.approvedCallTargets[0],
adminWallet.address,
"New signer1 should have the expected approved call targets.",
);
});
it("Should be able to approve any target.", async () => {
// Grant access
await account.grantPermissions(signer1Wallet.address, {
nativeTokenLimitPerTransaction: "1",
approvedCallTargets: "*",
});
const s = await account.getAllSigners();
const restrictions = s.find(
(result) =>
utils.getAddress(result.signer) ===
utils.getAddress(signer1Wallet.address),
)?.permissions as SignerPermissions;
assert.strictEqual(
restrictions.approvedCallTargets.length,
1,
"New signer1 should have one approved call targets.",
);
assert.strictEqual(
restrictions.approvedCallTargets[0],
AddressZero,
"New signer1 should have the expected approved call targets.",
);
});
it("Should not be able to grant restricted access to a signer who already has access.", async () => {
// Grant access to signer1
await account.grantPermissions(signer1Wallet.address, {
+2 -2
View File
@@ -230,7 +230,7 @@ export const mochaHooks = {
if (contractType === "custom" || contractType === "marketplace-v3") {
continue;
}
let factories: any[] = [];
const factories: any[] = [];
switch (contractType) {
case TokenInitializer.contractType:
factories.push(TokenERC20__factory);
@@ -367,7 +367,7 @@ async function setupMultichainRegistry(
// Setup marketplace-v3 for tests
async function setupMarketplaceV3(): Promise<string> {
let extensions: Extension[] = [];
const extensions: Extension[] = [];
// Direct Listings
const directListingsExtensionAddress = await deployContractAndUploadMetadata(
+37
View File
@@ -1,5 +1,42 @@
# @thirdweb-dev/unity-js-bridge
## 0.2.93
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/sdk@4.0.6
- @thirdweb-dev/wallets@2.0.7
- @thirdweb-dev/auth@4.0.7
## 0.2.92
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
- @thirdweb-dev/wallets@2.0.6
- @thirdweb-dev/auth@4.0.6
## 0.2.91
### Patch Changes
- Updated dependencies []:
- @thirdweb-dev/sdk@4.0.4
- @thirdweb-dev/wallets@2.0.5
- @thirdweb-dev/auth@4.0.5
## 0.2.90
### Patch Changes
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/sdk@4.0.3
- @thirdweb-dev/wallets@2.0.4
- @thirdweb-dev/auth@4.0.4
## 0.2.89
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/unity-js-bridge",
"version": "0.2.89",
"version": "0.2.93",
"main": "dist/thirdweb-unity-bridge.js",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/unity-js-bridge",
"license": "Apache-2.0",
+31
View File
@@ -1,5 +1,36 @@
# @thirdweb-dev/wallets
## 2.0.7
### Patch Changes
- Updated dependencies [[`137f46a5`](https://github.com/thirdweb-dev/js/commit/137f46a5470d2b5f9d7f9eda9b2d839a53ddeb64)]:
- @thirdweb-dev/chains@0.1.55
- @thirdweb-dev/sdk@4.0.6
## 2.0.6
### Patch Changes
- Updated dependencies [[`07544252`](https://github.com/thirdweb-dev/js/commit/07544252b49163e1ae84ba2cc76b99597a1c4553)]:
- @thirdweb-dev/sdk@4.0.5
## 2.0.5
### Patch Changes
- Updated dependencies [[`6c30b7ef`](https://github.com/thirdweb-dev/js/commit/6c30b7efc708e1244f3be3e10eac8f3b8b14a8c3)]:
- @thirdweb-dev/contracts-js@1.3.16
- @thirdweb-dev/sdk@4.0.4
## 2.0.4
### Patch Changes
- Updated dependencies [[`956b5645`](https://github.com/thirdweb-dev/js/commit/956b5645e4266cba536abd27ee250dab5aa9a177)]:
- @thirdweb-dev/contracts-js@1.3.15
- @thirdweb-dev/sdk@4.0.3
## 2.0.3
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/wallets",
"version": "2.0.3",
"version": "2.0.7",
"main": "dist/thirdweb-dev-wallets.cjs.js",
"module": "dist/thirdweb-dev-wallets.esm.js",
"types": "dist/thirdweb-dev-wallets.cjs.d.ts",
+7 -6
View File
@@ -380,8 +380,8 @@ importers:
packages/contracts-js:
dependencies:
'@thirdweb-dev/contracts':
specifier: 3.10.2-3
version: 3.10.2-3([email protected])
specifier: 3.10.3
version: 3.10.3([email protected])
devDependencies:
'@babel/preset-env':
specifier: ^7.22.9
@@ -12033,8 +12033,9 @@ packages:
use-sync-external-store: 1.2.0([email protected])
dev: false
/@thirdweb-dev/[email protected].2-3([email protected]):
resolution: {integrity: sha512-QWO9HT4k3s86oMyE/SbDWhgm/Na9FnxOkVjhyuOigmrwq5NlNp7NCcmecQgILxvUiLXO9if9OeFlYCFGsJinng==}
/@thirdweb-dev/[email protected]([email protected]):
resolution: {integrity: sha512-wSVNaEoosn0AgUtnxlvv7rgK+3EUMzJm2ZasofPgJgqGS3gYH5nDBmK29VMquA2BLc38OAPyYMWc/iQCiCikMg==}
engines: {node: '>=18.0.0'}
dependencies:
'@chainlink/contracts': 0.6.1([email protected])
'@openzeppelin/contracts': 4.9.3
@@ -17545,7 +17546,7 @@ packages:
minimatch: 3.1.2
object.values: 1.1.6
resolve: 1.22.1
semver: 7.5.4
semver: 7.5.3
tsconfig-paths: 3.14.2
transitivePeerDependencies:
- eslint-import-resolver-typescript
@@ -25549,7 +25550,7 @@ packages:
engines: {node: '>=12.0.0'}
hasBin: true
peerDependencies:
protobufjs: ^7.0.0
protobufjs: '>=7.2.4'
dependencies:
chalk: 4.1.2
escodegen: 1.14.3