diff --git a/playground/src/index.tsx b/playground/src/index.tsx index 440bb00d..ddea4f93 100644 --- a/playground/src/index.tsx +++ b/playground/src/index.tsx @@ -1,8 +1,8 @@ import { Button, Frog, TextInput } from 'frog' -import { wagmiExampleAbi } from '../constants/abi.js' import { app as routingApp } from './routing.js' import { app as todoApp } from './todos.js' +import { app as transactionApp } from './transaction.js' export const app = new Frog({ browserLocation: '/:path/dev', @@ -225,52 +225,6 @@ app.frame('/redirect-buttons', (c) => { }) }) -app.frame('/transaction', () => { - return { - image: ( -
- Example -
- ), - intents: [ - /tx, - - /tx-contract - , - ], - } -}) - -// Raw transaction -app.transaction('/tx', (c) => { - return c.res({ - chainId: 'eip155:1', - method: 'eth_sendTransaction', - params: { - to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', - value: 1n, - }, - }) -}) - -// Send transaction -app.transaction('/tx-send', (c) => { - return c.send({ - chainId: 'eip155:1', - to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', - value: 1n, - }) -}) - -// Contract transaction -app.transaction('/tx-contract', (c) => { - return c.contract({ - abi: wagmiExampleAbi, - chainId: 'eip155:1', - functionName: 'mint', - to: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', - }) -}) - -app.route('/todos', todoApp) app.route('/routing', routingApp) +app.route('/transaction', transactionApp) +app.route('/todos', todoApp) diff --git a/playground/src/transaction.tsx b/playground/src/transaction.tsx new file mode 100644 index 00000000..a6dc8e35 --- /dev/null +++ b/playground/src/transaction.tsx @@ -0,0 +1,255 @@ +import { Button, Frog } from 'frog' + +export const app = new Frog({ + hubApiUrl: 'https://api.hub.wevm.dev', + verify: 'silent', +}) + +app.frame('/', () => { + return { + image: ( +
+ Example +
+ ), + intents: [ + Raw, + + Send Transaction + , + Mint, + ], + } +}) + +// Raw transaction +app.transaction('/raw-send', (c) => { + return c.res({ + chainId: 'eip155:1', + method: 'eth_sendTransaction', + params: { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: 1n, + }, + }) +}) + +// Send transaction +app.transaction('/send', (c) => { + return c.send({ + chainId: 'eip155:1', + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: 1n, + }) +}) + +// Contract transaction +app.transaction('/mint', (c) => { + return c.contract({ + abi: wagmiExampleAbi, + chainId: 'eip155:1', + functionName: 'mint', + to: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', + }) +}) + +///////////////////////////////////////////////////////////////////// +// Constants + +export const wagmiExampleAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'approved', + type: 'address', + }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { indexed: false, internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { + indexed: true, + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'approve', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'getApproved', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'operator', type: 'address' }, + ], + name: 'isApprovedForAll', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'ownerOf', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'operator', type: 'address' }, + { internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }], + name: 'supportsInterface', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const