Skip to content

[WIP] ERC20 assets #7321

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 38 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
376d184
generate entrypoint functions
kumaryash90 Jun 11, 2025
2253ce5
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jun 23, 2025
6b816fb
Fix lint errors
MananTank Jun 23, 2025
7266b31
update package.json
MananTank Jun 23, 2025
47c87ea
remove export *
MananTank Jun 23, 2025
82cc116
remove export *
MananTank Jun 23, 2025
f44e15c
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jun 30, 2025
873e46d
base mainnet entrypoint
kumaryash90 Jun 30, 2025
b716941
fix entrypoint addr
kumaryash90 Jul 1, 2025
0d71393
fix lint
MananTank Jul 1, 2025
3b59656
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jul 7, 2025
6752878
Update contracts. New pool config encoder. Salt mixing
jakeloo Jul 10, 2025
2c8b80e
Fix build
MananTank Jul 10, 2025
3ea3f24
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jul 10, 2025
89e63f9
Update contracts. Add RewardLocker. Simplify assets
jakeloo Jul 15, 2025
9ed4e64
Update ABI and deployment
jakeloo Jul 15, 2025
6500b3d
Fix knip lint
MananTank Jul 15, 2025
cad9f80
fix build
MananTank Jul 15, 2025
f38c5f9
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jul 15, 2025
795ecd7
export getReward, run format
MananTank Jul 15, 2025
e1f1530
Update addresses
jakeloo Jul 16, 2025
09ca5c6
Update contract
jakeloo Jul 17, 2025
7e319a7
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jul 17, 2025
8dc959c
Update entrypoint contract
jakeloo Jul 18, 2025
9729174
pnpm run fix
MananTank Jul 22, 2025
583af3f
Merge branch 'main' into yash/ocr-contracts-integration
MananTank Jul 22, 2025
26f96d8
assets -> tokens. update contracts, remove unused
jakeloo Jul 23, 2025
705aa97
pnpm run fix
MananTank Jul 23, 2025
9f40f3e
Fix knip lint
MananTank Jul 23, 2025
ec263f6
Fix /tokens exports
MananTank Jul 23, 2025
4cb1582
export claimReward
MananTank Jul 23, 2025
5287079
delete /extensions/assets
MananTank Jul 23, 2025
fca8689
token salt guard
jakeloo Jul 23, 2025
1ef831a
Update ABIs and Interfaces
jakeloo Jul 26, 2025
b15abc7
Fix format
jakeloo Jul 26, 2025
e91dc3b
biome fix
jakeloo Jul 26, 2025
9989b9d
getEntrypointERC20 -> getDeployedEntrypointERC20
jakeloo Jul 26, 2025
6f42264
Update ABI and contract address
jakeloo Jul 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .changeset/young-carrots-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"thirdweb": patch
---

ERC20 assets
124 changes: 66 additions & 58 deletions packages/thirdweb/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"@emotion/styled": "11.14.1",
"@noble/curves": "1.8.2",
"@noble/hashes": "1.7.2",
"@passwordless-id/webauthn": "^2.1.2",
"@passwordless-id/webauthn": "^2.3.1",
"@radix-ui/react-dialog": "1.1.14",
"@radix-ui/react-focus-scope": "1.1.7",
"@radix-ui/react-icons": "1.3.2",
Expand All @@ -30,7 +30,7 @@
"abitype": "1.0.8",
"cross-spawn": "7.0.6",
"fuse.js": "7.1.0",
"input-otp": "^1.4.1",
"input-otp": "^1.4.2",
"mipd": "0.0.7",
"open": "10.1.1",
"ora": "8.2.0",
Expand Down Expand Up @@ -63,12 +63,12 @@
"@types/prompts": "2.4.9",
"@types/react": "19.1.8",
"@viem/anvil": "0.0.10",
"@vitejs/plugin-react": "^4.6.0",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/coverage-v8": "3.2.4",
"@vitest/ui": "3.2.4",
"dotenv-mono": "^1.3.14",
"ethers5": "npm:ethers@5",
"ethers6": "npm:ethers@6",
"dotenv-mono": "^1.4.0",
"ethers5": "npm:ethers@^5.8.0",
"ethers6": "npm:ethers@^6.15.0",
"expo-linking": "7.0.5",
"expo-web-browser": "14.0.2",
"happy-dom": "17.4.4",
Expand All @@ -83,7 +83,7 @@
"react-native-quick-crypto": "0.7.14",
"react-native-svg": "15.12.0",
"rimraf": "6.0.1",
"sharp": "^0.34.2",
"sharp": "^0.34.3",
"size-limit": "11.2.0",
"storybook": "9.0.15",
"typedoc": "0.27.9",
Expand All @@ -97,128 +97,133 @@
},
"exports": {
".": {
"types": "./dist/types/exports/thirdweb.d.ts",
"default": "./dist/cjs/exports/thirdweb.js",
"import": "./dist/esm/exports/thirdweb.js",
"default": "./dist/cjs/exports/thirdweb.js"
"types": "./dist/types/exports/thirdweb.d.ts"
},
"./adapters/*": {
"types": "./dist/types/exports/adapters/*.d.ts",
"default": "./dist/cjs/exports/adapters/*.js",
"import": "./dist/esm/exports/adapters/*.js",
"default": "./dist/cjs/exports/adapters/*.js"
"types": "./dist/types/exports/adapters/*.d.ts"
},
"./ai": {
"types": "./dist/types/exports/ai.d.ts",
"default": "./dist/cjs/exports/ai.js",
"import": "./dist/esm/exports/ai.js",
"default": "./dist/cjs/exports/ai.js"
"types": "./dist/types/exports/ai.d.ts"
},
"./tokens": {
"default": "./dist/cjs/exports/tokens.js",
"import": "./dist/esm/exports/tokens.js",
"types": "./dist/types/exports/tokens.d.ts"
},
"./auth": {
"types": "./dist/types/exports/auth.d.ts",
"default": "./dist/cjs/exports/auth.js",
"import": "./dist/esm/exports/auth.js",
"default": "./dist/cjs/exports/auth.js"
"types": "./dist/types/exports/auth.d.ts"
},
"./bridge": {
"types": "./dist/types/exports/bridge.d.ts",
"default": "./dist/cjs/exports/bridge.js",
"import": "./dist/esm/exports/bridge.js",
"default": "./dist/cjs/exports/bridge.js"
"types": "./dist/types/exports/bridge.d.ts"
},
"./chains": {
"types": "./dist/types/exports/chains.d.ts",
"default": "./dist/cjs/exports/chains.js",
"import": "./dist/esm/exports/chains.js",
"default": "./dist/cjs/exports/chains.js"
"types": "./dist/types/exports/chains.d.ts"
},
"./contract": {
"types": "./dist/types/exports/contract.d.ts",
"default": "./dist/cjs/exports/contract.js",
"import": "./dist/esm/exports/contract.js",
"default": "./dist/cjs/exports/contract.js"
"types": "./dist/types/exports/contract.d.ts"
},
"./deploys": {
"types": "./dist/types/exports/deploys.d.ts",
"default": "./dist/cjs/exports/deploys.js",
"import": "./dist/esm/exports/deploys.js",
"default": "./dist/cjs/exports/deploys.js"
"types": "./dist/types/exports/deploys.d.ts"
},
"./engine": {
"types": "./dist/types/exports/engine.d.ts",
"default": "./dist/cjs/exports/engine.js",
"import": "./dist/esm/exports/engine.js",
"default": "./dist/cjs/exports/engine.js"
"types": "./dist/types/exports/engine.d.ts"
},
"./event": {
"types": "./dist/types/exports/event.d.ts",
"default": "./dist/cjs/exports/event.js",
"import": "./dist/esm/exports/event.js",
"default": "./dist/cjs/exports/event.js"
"types": "./dist/types/exports/event.d.ts"
},
"./extensions/*": {
"types": "./dist/types/exports/extensions/*.d.ts",
"default": "./dist/cjs/exports/extensions/*.js",
"import": "./dist/esm/exports/extensions/*.js",
"default": "./dist/cjs/exports/extensions/*.js"
"types": "./dist/types/exports/extensions/*.d.ts"
},
"./insight": {
"types": "./dist/types/exports/insight.d.ts",
"default": "./dist/cjs/exports/insight.js",
"import": "./dist/esm/exports/insight.js",
"default": "./dist/cjs/exports/insight.js"
"types": "./dist/types/exports/insight.d.ts"
},
"./modules": {
"types": "./dist/types/exports/modules.d.ts",
"default": "./dist/cjs/exports/modules.js",
"import": "./dist/esm/exports/modules.js",
"default": "./dist/cjs/exports/modules.js"
"types": "./dist/types/exports/modules.d.ts"
},
"./package.json": "./package.json",
"./pay": {
"types": "./dist/types/exports/pay.d.ts",
"default": "./dist/cjs/exports/pay.js",
"import": "./dist/esm/exports/pay.js",
"default": "./dist/cjs/exports/pay.js"
"types": "./dist/types/exports/pay.d.ts"
},
"./react": {
"types": "./dist/types/exports/react.d.ts",
"react-native": "./dist/esm/exports/react.native.js",
"default": "./dist/cjs/exports/react.js",
"import": "./dist/esm/exports/react.js",
"default": "./dist/cjs/exports/react.js"
"react-native": "./dist/esm/exports/react.native.js",
"types": "./dist/types/exports/react.d.ts"
},
"./react-native": {
"types": "./dist/types/exports/react.native.d.ts",
"default": "./dist/cjs/exports/react.native.js",
"import": "./dist/esm/exports/react.native.js",
"default": "./dist/cjs/exports/react.native.js"
"types": "./dist/types/exports/react.native.d.ts"
},
"./rpc": {
"types": "./dist/types/exports/rpc.d.ts",
"default": "./dist/cjs/exports/rpc.js",
"import": "./dist/esm/exports/rpc.js",
"default": "./dist/cjs/exports/rpc.js"
"types": "./dist/types/exports/rpc.d.ts"
},
"./social": {
"types": "./dist/types/exports/social.d.ts",
"default": "./dist/cjs/exports/social.js",
"import": "./dist/esm/exports/social.js",
"default": "./dist/cjs/exports/social.js"
"types": "./dist/types/exports/social.d.ts"
},
"./storage": {
"types": "./dist/types/exports/storage.d.ts",
"default": "./dist/cjs/exports/storage.js",
"import": "./dist/esm/exports/storage.js",
"default": "./dist/cjs/exports/storage.js"
"types": "./dist/types/exports/storage.d.ts"
},
"./transaction": {
"types": "./dist/types/exports/transaction.d.ts",
"default": "./dist/cjs/exports/transaction.js",
"import": "./dist/esm/exports/transaction.js",
"default": "./dist/cjs/exports/transaction.js"
"types": "./dist/types/exports/transaction.d.ts"
},
"./utils": {
"types": "./dist/types/exports/utils.d.ts",
"default": "./dist/cjs/exports/utils.js",
"import": "./dist/esm/exports/utils.js",
"default": "./dist/cjs/exports/utils.js"
"types": "./dist/types/exports/utils.d.ts"
},
"./wallets": {
"types": "./dist/types/exports/wallets.d.ts",
"react-native": "./dist/esm/exports/wallets.native.js",
"default": "./dist/cjs/exports/wallets.js",
"import": "./dist/esm/exports/wallets.js",
"default": "./dist/cjs/exports/wallets.js"
"react-native": "./dist/esm/exports/wallets.native.js",
"types": "./dist/types/exports/wallets.d.ts"
},
"./wallets/*": {
"types": "./dist/types/exports/wallets/*.d.ts",
"default": "./dist/cjs/exports/wallets/*.js",
"import": "./dist/esm/exports/wallets/*.js",
"default": "./dist/cjs/exports/wallets/*.js"
"types": "./dist/types/exports/wallets/*.d.ts"
},
"./wallets/in-app": {
"types": "./dist/types/exports/wallets/in-app.d.ts",
"react-native": "./dist/esm/exports/wallets/in-app.native.js",
"default": "./dist/cjs/exports/wallets/in-app.js",
"import": "./dist/esm/exports/wallets/in-app.js",
"default": "./dist/cjs/exports/wallets/in-app.js"
"react-native": "./dist/esm/exports/wallets/in-app.native.js",
"types": "./dist/types/exports/wallets/in-app.d.ts"
}
},
"files": [
Expand Down Expand Up @@ -347,6 +352,9 @@
"ai": [
"./dist/types/exports/ai.d.ts"
],
"tokens": [
"./dist/types/exports/tokens.d.ts"
],
"auth": [
"./dist/types/exports/auth.d.ts"
],
Expand Down
49 changes: 49 additions & 0 deletions packages/thirdweb/scripts/generate/abis/tokens/ERC20Asset.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
[
"constructor()",
"function DOMAIN_SEPARATOR() view returns (bytes32 result)",
"function allowance(address owner, address spender) view returns (uint256 result)",
"function approve(address spender, uint256 amount) returns (bool)",
"function balanceOf(address owner) view returns (uint256 result)",
"function burn(uint256 amount)",
"function burnFrom(address from, uint256 amount)",
"function cancelOwnershipHandover() payable",
"function completeOwnershipHandover(address pendingOwner) payable",
"function contractURI() view returns (string)",
"function decimals() view returns (uint8)",
"function initialize(string name, string symbol, string contractURI, uint256 maxSupply, address owner)",
"function name() view returns (string)",
"function nonces(address owner) view returns (uint256 result)",
"function owner() view returns (address result)",
"function ownershipHandoverExpiresAt(address pendingOwner) view returns (uint256 result)",
"function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)",
"function renounceOwnership() payable",
"function requestOwnershipHandover() payable",
"function setContractURI(string _contractURI)",
"function supportsInterface(bytes4 interfaceId) pure returns (bool)",
"function symbol() view returns (string)",
"function totalSupply() view returns (uint256 result)",
"function transfer(address to, uint256 amount) returns (bool)",
"function transferFrom(address from, address to, uint256 amount) returns (bool)",
"function transferOwnership(address newOwner) payable",
"event Approval(address indexed owner, address indexed spender, uint256 amount)",
"event ContractURIUpdated()",
"event Initialized(uint64 version)",
"event OwnershipHandoverCanceled(address indexed pendingOwner)",
"event OwnershipHandoverRequested(address indexed pendingOwner)",
"event OwnershipTransferred(address indexed oldOwner, address indexed newOwner)",
"event Transfer(address indexed from, address indexed to, uint256 amount)",
"error AllowanceOverflow()",
"error AllowanceUnderflow()",
"error AlreadyInitialized()",
"error InsufficientAllowance()",
"error InsufficientBalance()",
"error InvalidInitialization()",
"error InvalidPermit()",
"error NewOwnerIsZeroAddress()",
"error NoHandoverRequest()",
"error NotInitializing()",
"error Permit2AllowanceIsFixedAtInfinity()",
"error PermitExpired()",
"error TotalSupplyOverflow()",
"error Unauthorized()"
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
[
"constructor()",
"function addImplementation((bytes32 contractId, address implementation, uint8 implementationType, uint8 createHook, bytes createHookData) config, bool isDefault)",
"function cancelOwnershipHandover() payable",
"function claimRewards(address asset)",
"function completeOwnershipHandover(address pendingOwner) payable",
"function create(address creator, (address referrer, bytes32 salt, bytes data, bytes hookData) createParams) payable returns (address asset)",
"function createById(bytes32 contractId, address creator, (address referrer, bytes32 salt, bytes data, bytes hookData) params) payable returns (address asset)",
"function createByImplementationConfig((bytes32 contractId, address implementation, uint8 implementationType, uint8 createHook, bytes createHookData) config, address creator, (address referrer, bytes32 salt, bytes data, bytes hookData) params) payable returns (address asset)",
"function distribute(address asset, (uint256 amount, address recipient)[] contents) payable",
"function getAirdrop() view returns (address airdrop)",
"function getImplementation(bytes32 contractId) view returns ((bytes32 contractId, address implementation, uint8 implementationType, uint8 createHook, bytes createHookData) config)",
"function getPoolRouter() view returns (address poolRouter)",
"function getRewards(address asset) view returns ((uint256 positionId, address recipient, address referrer, uint16 referrerBps, address positionManager, address rewardLocker)[])",
"function getSwapRouter() view returns (address swapRouter)",
"function guardSalt(bytes32 salt, address creator, bytes contractInitData, bytes hookInitData) view returns (bytes32)",
"function initialize(address owner, address poolRouter, address airdrop)",
"function owner() view returns (address result)",
"function ownershipHandoverExpiresAt(address pendingOwner) view returns (uint256 result)",
"function predictAddress(bytes32 contractId, address creator, (address referrer, bytes32 salt, bytes data, bytes hookData) params) view returns (address predicted)",
"function predictAddressByConfig((bytes32 contractId, address implementation, uint8 implementationType, uint8 createHook, bytes createHookData) config, address creator, (address referrer, bytes32 salt, bytes data, bytes hookData) params) view returns (address predicted)",
"function proxiableUUID() view returns (bytes32)",
"function renounceOwnership() payable",
"function requestOwnershipHandover() payable",
"function setAirdrop(address airdrop)",
"function setPoolRouter(address poolRouter)",
"function setSwapRouter(address swapRouter)",
"function swap((address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, address recipient, address referrer, uint256 deadline, bytes data) params) payable returns (uint256 amountIn, uint256 amountOut)",
"function transferOwnership(address newOwner) payable",
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function withdraw(address token, address to)",
"event AirdropUpdated(address airdrop)",
"event Created(bytes32 contractId, address indexed creator, address indexed asset, address referrer, bytes hookData)",
"event Distributed(address asset, uint256 recipientCount, uint256 totalAmount)",
"event ImplementationAdded(bytes32 contractId, address indexed implementation, uint8 implementationType, uint8 createHook, bytes createHookData)",
"event Initialized(uint64 version)",
"event OwnershipHandoverCanceled(address indexed pendingOwner)",
"event OwnershipHandoverRequested(address indexed pendingOwner)",
"event OwnershipTransferred(address indexed oldOwner, address indexed newOwner)",
"event PoolRouterUpdated(address poolRouter)",
"event RewardClaimed(address asset, address claimer)",
"event RewardLockerUpdated(address locker)",
"event SwapRouterUpdated(address swapRouter)",
"event Upgraded(address indexed implementation)",
"error AlreadyInitialized()",
"error ImplementationAlreadyExists()",
"error InvalidAmount()",
"error InvalidContractId()",
"error InvalidCreateHook()",
"error InvalidDeploymentCall()",
"error InvalidImplementation()",
"error InvalidInitialization()",
"error InvalidPoolAmount()",
"error InvalidSaltFlags()",
"error InvalidValue()",
"error NewOwnerIsZeroAddress()",
"error NoHandoverRequest()",
"error NotInitializing()",
"error PoolRouterDisabled()",
"error SwapRouterDisabled()",
"error Unauthorized()",
"error UnauthorizedCallContext()",
"error UpgradeFailed()"
]
Loading