diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 000000000..eb67e3b0d --- /dev/null +++ b/.cursorrules @@ -0,0 +1,11 @@ +# Cursor AI Assistant Rules + +## Test Execution Guidelines + +### Always use non-interactive mode for tests +When running tests with npm, yarn, or vitest, ALWAYS include flags to prevent interactive/watch mode: + +- For npm test: use `npm test -- --run` +- For yarn test: use `yarn test --run` +- For vitest directly: use `vitest run` +- For jest: use `jest --no-watch` \ No newline at end of file diff --git a/.github/workflows/generator-generic-ossf-slsa3-publish.yml b/.github/workflows/generator-generic-ossf-slsa3-publish.yml new file mode 100644 index 000000000..35c829b13 --- /dev/null +++ b/.github/workflows/generator-generic-ossf-slsa3-publish.yml @@ -0,0 +1,66 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# This workflow lets you generate SLSA provenance file for your project. +# The generation satisfies level 3 for the provenance requirements - see https://slsa.dev/spec/v0.1/requirements +# The project is an initiative of the OpenSSF (openssf.org) and is developed at +# https://github.com/slsa-framework/slsa-github-generator. +# The provenance file can be verified using https://github.com/slsa-framework/slsa-verifier. +# For more information about SLSA and how it improves the supply-chain, visit slsa.dev. + +name: SLSA generic generator +on: + workflow_dispatch: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + outputs: + digests: ${{ steps.hash.outputs.digests }} + + steps: + - uses: actions/checkout@v4 + + # ======================================================== + # + # Step 1: Build your artifacts. + # + # ======================================================== + - name: Build artifacts + run: | + # These are some amazing artifacts. + echo "artifact1" > artifact1 + echo "artifact2" > artifact2 + + # ======================================================== + # + # Step 2: Add a step to generate the provenance subjects + # as shown below. Update the sha256 sum arguments + # to include all binaries that you generate + # provenance for. + # + # ======================================================== + - name: Generate subject for provenance + id: hash + run: | + set -euo pipefail + + # List the artifacts the provenance will refer to. + files=$(ls artifact*) + # Generate the subjects (base64 encoded). + echo "hashes=$(sha256sum $files | base64 -w0)" >> "${GITHUB_OUTPUT}" + + provenance: + needs: [build] + permissions: + actions: read # To read the workflow path. + id-token: write # To sign the provenance. + contents: write # To add assets to a release. + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.4.0 + with: + base64-subjects: "${{ needs.build.outputs.digests }}" + upload-assets: true # Optional: Upload to a new release diff --git a/.github/workflows/transactions (1).csv b/.github/workflows/transactions (1).csv new file mode 100644 index 000000000..8ff0029db --- /dev/null +++ b/.github/workflows/transactions (1).csv @@ -0,0 +1,312 @@ +Date,Type,Transaction ID,Received Quantity,Received Currency,Received Cost Basis (USD),Received Wallet,Received Address,Received Comment,Sent Quantity,Sent Currency,Sent Cost Basis (USD),Sent Wallet,Sent Address,Sent Comment,Fee Amount,Fee Currency,Fee Cost Basis (USD),Realized Return (USD),Fee Realized Return (USD),Transaction Hash +09/13/2024 15:37:34,TRADE,019223e4-58ed-7b32-ac7e-b563617498ed,586.499218,USDC,586.5,Coinbase USDC Wallet,,,586.446438,USDT,586.49,Coinbase USDT Wallet,,,,,,0.01,, +09/13/2024 15:36:19,BUY,019223e4-5a35-7353-b7e0-ab1eee44a383,586.42,USDT,586.46,Coinbase USDT Wallet,,,586.4551852,USD,,Coinbase Cash (USD),,,0.00586455,USD,,,, +09/14/2024 2:47:01,BUY,019223e4-57a1-7e3f-82bc-61b00cd9fea0,500,USDC,500,Coinbase USDC Wallet,,,500,USD,,Coinbase Cash (USD),,,,,,,, +09/13/2024 15:40:41,SELL,019223e4-5795-7a79-94be-bba488a08898,500,USD,,Coinbase Cash (USD),,,500,USDC,500,Coinbase USDC Wallet,,,,,,0,, +09/18/2024 9:00:23,SEND,019223e4-5aec-7180-ac96-05c566d5e16f,,,,,,,300.672124,USDC,300.67,Coinbase USDC Wallet,,,,,,0,, +09/13/2024 16:09:45,SELL,019223e4-579d-785d-8a49-44cfb322166a,300,USD,,Coinbase Cash (USD),,,300,USDC,300,Coinbase USDC Wallet,,,,,,0,, +09/18/2024 9:00:25,SEND,019223e4-5b2f-76db-a4eb-befb7dced9ae,,,,,,,2.01984888,SOL,279.85,Coinbase SOL Wallet,,,,,,-15.86,, +09/13/2024 15:43:15,BUY,019223e4-5799-7c23-be69-1d1fbb426719,259,USDC,259,Coinbase USDC Wallet,,,259,USD,,Coinbase Cash (USD),,,,,,,, +09/13/2024 16:12:18,TRADE,019223e4-58f1-7def-bfd8-56132ffa724a,1.05191529,SOL,145.5,Coinbase SOL Wallet,,,145.504323,USDC,145.5,Coinbase USDC Wallet,,,,,,0,, +09/13/2024 16:12:23,TRANSFER,019223e4-5b2c-7a50-b5d0-d9417ab79843,1.05191529,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",1.05191529,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +09/17/2024 2:00:06,TRANSFER,019223e4-5b44-7c98-8ecc-7ded93c7c5ac,1.05628402,SOL,0,Coinbase SOL Wallet,,,1.05628402,SOL,0,Coinbase Staked SOL,,,,,,0,, +09/14/2024 12:10:01,BUY,019223e4-5a17-7e8a-aaf9-1d0893429d85,0.96314501,SOL,133.63,Coinbase SOL Wallet,,,132.0471809,USD,,Coinbase Cash (USD),,,1.58456617,USD,,,, +09/18/2024 9:00:27,SEND,019223e4-5b5d-7a72-ae3e-01ca6b80fa5e,,,,,,,20.685297,TIA,98.94,Coinbase TIA Wallet,,,,,,9.43,, +09/13/2024 2:55:43,BUY,019223e4-5791-7460-bd47-b1212c04ff41,100,USDC,100,Coinbase USDC Wallet,,,100,USD,,Coinbase Cash (USD),,,,,,,, +09/14/2024 12:12:53,TRADE,019223e4-5a05-7464-8e94-ef8305b4e6f1,168.93004,XRP,99.04,Coinbase XRP Wallet,,,99.04368245,USDC,99.05,Coinbase USDC Wallet,,,1.18852419,USDC,1.19,-1.2,0, +09/18/2024 9:00:29,SEND,019223e4-5b47-7c70-b084-b3028187ee9c,,,,,,,168.997781,XRP,99.08,Coinbase XRP Wallet,,,,,,-1.68,, +09/15/2024 8:35:51,TRADE,019223e4-59ed-776a-9f50-1e68c2de7459,18.68,TIA,89.35,Coinbase TIA Wallet,,,89.34644,USDC,89.35,Coinbase USDC Wallet,,,1.07215728,USDC,1.07,-1.07,0, +09/14/2024 2:40:33,BUY,019223e4-57cb-7100-bcc9-cdfc2b8bdb6f,3538241.601,SHIB,50,Coinbase SHIB Wallet,,,50,USD,,Coinbase Cash (USD),,,,,,,, +09/18/2024 9:00:30,SEND,019223e4-5ae3-72b0-9b40-ae1d827a3766,,,,,,,0.00079286,BTC,48.65,Coinbase BTC Wallet,,,,,,-0.95,, +09/18/2024 9:00:31,SEND,019223e4-5b5a-7953-b7f5-2fb4c0dd84f8,,,,,,,3538241.601,SHIB,50,Coinbase SHIB Wallet,,,,,,-3.34,, +09/13/2024 21:05:35,BUY,019223e4-5a29-7ea8-99fc-b657d5906c7f,5.78980119,DOT,26.02,Coinbase DOT Wallet,,,25.70671728,USD,,Coinbase Cash (USD),,,0.30848061,USD,,,, +09/14/2024 2:31:39,TRADE,019223e4-5873-76f7-9490-8dc1b680d08d,0.00041623,BTC,25.65,Coinbase BTC Wallet,,,5.79220525,DOT,26.03,Coinbase DOT Wallet,,,,,,-0.38,, +09/14/2024 2:33:05,BUY,019223e4-577d-7aaa-a460-6a0d24d35f31,0.00037663,BTC,23,Coinbase BTC Wallet,,,23,USD,,Coinbase Cash (USD),,,,,,,, +04/28/2024 2:32:55,TRADE,019223e4-57df-7b1e-b7cd-b7d75a92f9ce,10.567794,USDC,10.68,Coinbase USDC Wallet,,,0.00016801,BTC,11.01,Coinbase BTC Wallet,,,,,,-0.33,, +04/28/2024 2:35:51,TRADE,019223e4-5877-7d11-a565-deb92898a822,0.00319417,ETH,10.57,Coinbase ETH Wallet,,,10.567794,USDC,10.68,Coinbase USDC Wallet,,,,,,-0.11,, +04/28/2024 2:37:25,SEND,019223e4-5af4-7f41-8990-c5da04f6a0c8,,,,,,,0.00306817,ETH,10.15,Coinbase ETH Wallet,,,0.000126,ETH,0.42,-0.51,0, +07/10/2024 6:03:02,INCOME,019223e4-492d-7f08-bfa5-1c2bc0be33b4,386.8471954,VET,10,Coinbase VET Wallet,,,,,,,,,,,,,, +07/10/2024 6:12:50,TRADE,019223e4-5929-7f7b-aa17-123c71b936ff,0.06651872,SOL,9.85,Coinbase SOL Wallet,,,377.9742287,VET,9.77,Coinbase VET Wallet,,,3.87296669,VET,0.1,-0.02,0, +07/10/2024 6:12:56,TRANSFER,019223e4-5b1b-7df9-bd04-a6b2be8e5bab,0.06651872,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.06651872,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +09/15/2024 8:35:51,TRADE,019223e4-59f3-7b4a-b2e6-459465103556,1.99,TIA,9.52,Coinbase TIA Wallet,,,9.51618,USDC,9.52,Coinbase USDC Wallet,,,0.11419416,USDC,0.11,-0.11,0, +07/13/2024 10:00:04,TRANSFER,019223e4-5b3e-74f8-8c9a-fc0ab5d6c58d,0.06237438,SOL,0,Coinbase SOL Wallet,,,0.06237438,SOL,0,Coinbase Staked SOL,,,,,,0,, +07/17/2024 4:31:41,TRANSFER,019223e4-5b0d-71bf-b8d1-a5774b3f406d,7.4,MATIC,0,Coinbase Staked MATIC,,"Staked MATIC +on Coinbase",7.4,MATIC,0,Coinbase MATIC Wallet,,"Staked MATIC +on Coinbase",,,,0,, +07/15/2024 10:50:49,BUY,019223e4-5ad7-71a9-ba6b-2b5098b757aa,7.4,MATIC,3.96,Coinbase MATIC Wallet,,,3.93532,USD,,Coinbase Cash (USD),,,0.02361192,USD,,,, +07/14/2024 23:42:21,SEND,019223e4-5b21-754c-af5d-42f808aae5e5,,,,,,,0.02608616,SOL,3.86,Coinbase SOL Wallet,,,0.0001,SOL,0.01,0,0, +04/26/2024 11:19:15,TRADE,019223e4-57d7-77ed-9137-a8a7e5f90d5a,0.00004577,BTC,3,Coinbase BTC Wallet,,,0.41844932,NEAR,3,Coinbase NEAR Wallet,,,,,,0,, +04/26/2024 11:17:16,TRADE,019223e4-57d3-74e3-9629-b22de04edc76,0.00004579,BTC,3,Coinbase BTC Wallet,,,0.643546,AKT,3,Coinbase AKT Wallet,,,,,,0,, +04/26/2024 11:02:11,TRADE,019223e4-57cf-7711-bf93-2705b9beb00a,0.00004582,BTC,3,Coinbase BTC Wallet,,,30.88803089,VARA,3,Coinbase VARA Wallet,,,,,,0,, +04/26/2024 11:00:38,INCOME,019223e4-4924-7565-abd2-fdcf121be36e,30.88803089,VARA,3,Coinbase VARA Wallet,,,,,,,,,,,,,, +08/06/2024 18:32:54,TRADE,019223e4-5989-721e-a593-9853b2f597ab,5.46418838,ZETA,2.41,Coinbase ZETA Wallet,,,5.70599614,MATIC,3.05,Coinbase MATIC Wallet,,,0.12088974,MATIC,0.06,-0.69,-0.01, +08/05/2024 22:00:30,TRANSFER,019223e4-5b54-77d2-9829-68501f8019a1,5.82920431,MATIC,0,Coinbase MATIC Wallet,,,5.82920431,MATIC,0,Coinbase Staked MATIC,,,,,,0,, +07/14/2024 10:07:22,TRADE,019223e4-58bd-7f19-bee5-eb70454adbe2,1.999727,USDC,2.02,Coinbase USDC Wallet,,,0.01377805,SOL,2.04,Coinbase SOL Wallet,,,,,,-0.02,, +04/26/2024 11:19:45,TRADE,019223e4-57db-7015-b455-e6c7836fc93e,0.00003063,BTC,2.01,Coinbase BTC Wallet,,,51.04970986,VET,2,Coinbase VET Wallet,,,,,,0.01,, +06/14/2024 15:36:29,TRADE,019223e4-57e3-72f2-8cc2-851657ab59e7,0.00002853,BTC,2,Coinbase BTC Wallet,,,0.73557149,RON,2,Coinbase RONIN Wallet,,,0.0188608,RON,0.05,-0.05,0, +08/09/2024 22:21:50,SELL,019223e4-5a6b-7360-af8e-abaadefd73de,1.9996,USD,,Coinbase Cash (USD),,,4,ZETA,1.76,Coinbase ZETA Wallet,,,0.0239952,USD,,0.21,, +07/14/2024 10:10:50,SELL,019223e4-5781-7506-b8ae-cc8c8ddbde50,1.99,USD,,Coinbase Cash (USD),,,1.999727,USDC,2.02,Coinbase USDC Wallet,,,,,,-0.03,, +08/15/2024 4:53:00,BUY,019223e4-5785-7b6e-b22f-b9eed8714b9f,1.98,USDC,1.98,Coinbase USDC Wallet,,,1.98,USD,,Coinbase Cash (USD),,,,,,,, +08/15/2024 11:36:53,SELL,019223e4-5789-769b-b94b-b63836409f95,1.42,USD,,Coinbase Cash (USD),,,1.424065,USDC,1.42,Coinbase USDC Wallet,,,,,,0,, +07/14/2024 20:42:00,SELL,019223e4-5add-7f6c-a635-7268a8e7bcbd,1.27779732,USD,,Coinbase Cash (USD),,,0.00872872,SOL,1.29,Coinbase SOL Wallet,,,0.00766678,USD,,-0.02,, +06/14/2024 17:02:39,TRANSFER,019223e4-5af9-7021-98b0-9340a3b43988,0.00037207,ETH,0,Coinbase Staked ETH,,"Staked ETH +on Coinbase",0.00037207,ETH,0,Coinbase ETH Wallet,,"Staked ETH +on Coinbase",,,,0,, +09/12/2024 23:50:41,TRADE,019223e4-5a41-754a-979e-c846f9672a62,0.00047354,ETH,1.12,Coinbase ETH Wallet,,,1.11954327,USDC,1.86,Coinbase USDC Wallet,,,0.01343452,USDC,0.01,-0.75,0, +09/18/2024 9:00:32,SEND,019223e4-5b0a-7259-bc2e-08db8d9e2634,,,,,,,0.00047647,ETH,1.13,Coinbase ETH Wallet,,,,,,-0.03,, +08/15/2024 7:42:23,TRADE,019223e4-58cb-7e74-b69e-2cca56a7d9e8,22.05558006,VET,1,Coinbase VET Wallet,,,0.5,USDC,0.5,Coinbase USDC Wallet,,,0.5,USDC,0.5,-0.5,0.5, +07/14/2024 10:06:22,TRADE,019223e4-5981-73e6-9cdb-8e95d1064842,0.00030471,ETH,1,Coinbase ETH Wallet,,,0.0068106,SOL,1.01,Coinbase SOL Wallet,,,,,,-0.01,, +06/14/2024 15:48:32,TRADE,019223e4-594b-702f-a6a7-80d9320e97de,0.00027949,ETH,1,Coinbase ETH Wallet,,,0.37844038,RON,1.03,Coinbase RONIN Wallet,,,0.00382262,RON,0.01,-0.04,0, +06/14/2024 15:37:41,TRADE,019223e4-57e9-76b6-bdd4-473073cd4e74,0.499634,USDC,1,Coinbase USDC Wallet,,,0.00000747,BTC,0.52,Coinbase BTC Wallet,,,0.00000748,BTC,0.52,-0.52,0.48, +06/14/2024 14:08:16,INCOME,019223e4-495d-7029-a2e8-909310695e63,0.36866359,RON,1,Coinbase RONIN Wallet,,,,,,,,,,,,,, +06/14/2024 14:07:34,INCOME,019223e4-495a-74d9-8aa7-e530d16419d7,0.36873156,RON,1,Coinbase RONIN Wallet,,,,,,,,,,,,,, +06/14/2024 14:06:51,INCOME,019223e4-4957-7ad7-8311-fc53cce23c10,0.36879955,RON,1,Coinbase RONIN Wallet,,,,,,,,,,,,,, +06/14/2024 14:06:17,INCOME,019223e4-4954-70bf-b2f4-40da7c6650d2,0.36920804,RON,1,Coinbase RONIN Wallet,,,,,,,,,,,,,, +06/14/2024 14:05:46,INCOME,019223e4-4951-7a60-9828-6f02a5c6f67a,0.36907178,RON,1,Coinbase RONIN Wallet,,,,,,,,,,,,,, +04/26/2024 11:11:54,INCOME,019223e4-493f-754a-ac4b-9b14920932b6,0.214477,AKT,1,Coinbase AKT Wallet,,,,,,,,,,,,,, +04/26/2024 11:11:13,INCOME,019223e4-493c-7e9a-9cea-8ca309e70e62,0.214523,AKT,1,Coinbase AKT Wallet,,,,,,,,,,,,,, +04/26/2024 11:10:41,INCOME,019223e4-4939-7809-a4f3-3db98beff6ef,0.214546,AKT,1,Coinbase AKT Wallet,,,,,,,,,,,,,, +04/26/2024 11:09:13,INCOME,019223e4-4936-7f2e-8169-eb635261ee7d,0.13931457,NEAR,1,Coinbase NEAR Wallet,,,,,,,,,,,,,, +04/26/2024 11:08:15,INCOME,019223e4-4933-7a4b-b424-e56298b02f34,0.1394992,NEAR,1,Coinbase NEAR Wallet,,,,,,,,,,,,,, +04/26/2024 11:06:56,INCOME,019223e4-4930-759f-9403-8484401ab24d,0.13963555,NEAR,1,Coinbase NEAR Wallet,,,,,,,,,,,,,, +04/26/2024 11:05:07,INCOME,019223e4-492a-74f3-9fe3-fdf3124f2cba,25.52648372,VET,1,Coinbase VET Wallet,,,,,,,,,,,,,, +04/26/2024 11:04:03,INCOME,019223e4-4927-7768-9d9a-7c54b5efeb1b,25.52322613,,1,Coinbase VET Wallet,,,,,,,,,,,,,, +07/14/2024 10:06:28,TRANSFER,019223e4-5b02-7e3f-b831-ceae448a72e3,0.00030471,,0,Coinbase Staked ETH,,"Staked ETH +on Coinbase",0.00030471,ETH,0,Coinbase ETH Wallet,,"Staked ETH +on Coinbase",,,,0,, +08/29/2024 2:00:10,TRANSFER,019223e4-5b41-7e23-85e8-02cee526b40d,0.00658079,,0,Coinbase SOL Wallet,,,0.00658079,SOL,0,Coinbase Staked SOL,,,,,,0,, +07/10/2024 2:09:04,TRADE,019223e4-597b-7e54-94f0-b32774083252,0.00614016,,0.89,Coinbase SOL Wallet,,,0.0002871,ETH,1.05,Coinbase ETH Wallet,,,0.00000327,ETH,0.01,-0.17,0, +09/03/2024 7:27:12,TRADE,019223e4-59c5-7546-9d2c-7ad39cee326a,1.67683609,,0.88,Coinbase ARB Wallet,,,0.00658079,SOL,0.97,Coinbase SOL Wallet,,,,,,-0.09,, +07/10/2024 6:02:19,SEND,019223e4-5b16-7d44-8253-b2a195e2f3fc,,,,,,,0.00604016,SOL,0.88,Coinbase SOL Wallet,,,0.0001,SOL,0.01,-0.01,0, +07/08/2024 6:00:38,TRANSFER,019223e4-5ae6-75f6-a5aa-3552d0b5cb82,0.00029037,,0,Coinbase ETH Wallet,,"Unstaked ETH +on Coinbase",0.00029037,ETH,0,Coinbase Staked ETH,,"Unstaked ETH +on Coinbase",,,,0,, +09/07/2024 20:45:29,TRADE,019223e4-58d7-7392-a5f0-d2de37652ce3,0.419424,,0.84,Coinbase USDC Wallet,,,0.83801045,ARB,0.44,Coinbase ARB Wallet,,,0.83882564,ARB,0.44,-0.44,0.4, +06/14/2024 16:33:42,TRADE,019223e4-587b-79ca-afe0-cf8ef23056e0,0.409043,,0.82,Coinbase USDC Wallet,,,0.15947103,RON,0.43,Coinbase RONIN Wallet,,,0.15947102,RON,0.43,-0.43,0.39, +08/27/2024 9:44:35,TRADE,019223e4-58d1-7550-ad6a-69f8d86a8802,0.39655,,0.79,Coinbase USDT Wallet,,,0.396558,USDC,0.4,Coinbase USDC Wallet,,,0.39,USDC,0.39,-0.39,0.39, +08/25/2024 21:50:54,BUY,019223e4-578d-7691-b997-37bbef23b324,0.77,,0.77,Coinbase USDC Wallet,,,0.77,USD,,Coinbase Cash (USD),,,,,,,, +09/18/2024 9:00:34,SEND,019223e4-5ae9-7e32-a9d9-b05638b459ec,,,,,,,0.00032511,ETH,1.09,Coinbase Staked ETH,,,,,,-0.34,, +08/22/2024 8:58:07,BUY,019223e4-5a4d-7f08-9472-801abf1d9594,1.4,,0.73,Coinbase MATIC Wallet,,,0.7301,USD,,Coinbase Cash (USD),,,0.0043806,USD,,,, +08/27/2024 9:24:11,TRADE,019223e4-593f-7e95-8fda-9d8704263bd8,28.61754567,,0.71,Coinbase VET Wallet,,,1.38036521,MATIC,0.72,Coinbase MATIC Wallet,,,0.01963479,MATIC,0.01,-0.02,0, +08/30/2024 2:00:04,TRANSFER,019223e4-5b57-7cbe-a1eb-9ca61e0588b9,1.58445143,,0,Coinbase MATIC Wallet,,,1.58445143,MATIC,0,Coinbase Staked MATIC,,,,,,0,, +08/29/2024 13:43:53,TRADE,019223e4-5945-746b-ade7-b2b553ed1872,0.00435755,,0.65,Coinbase SOL Wallet,,,28.18048274,VET,0.7,Coinbase VET Wallet,,,0.43706293,VET,0.01,-0.06,0, +08/29/2024 13:43:58,TRANSFER,019223e4-5b29-7a55-a1d3-df8e2f03655a,0.00435755,,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.00435755,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +09/07/2024 20:46:04,TRADE,019223e4-58dd-71e7-83e8-6c8154552abc,0.299572,USDC,0.59,Coinbase USDC Wallet,,,0.80530044,MATIC,0.43,Coinbase MATIC Wallet,,,0.77915099,MATIC,0.41,-0.41,0.16, +06/14/2024 16:52:06,TRADE,019223e4-5801-7f8c-8582-f44ce5643dcf,0.05374523,UNI,0.58,Coinbase UNI Wallet,,,0.00000871,BTC,0.72,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.15,0, +08/25/2024 21:37:37,TRADE,019223e4-586d-702f-8f7e-484ddd993e16,0.00018951,ETH,0.55,Coinbase ETH Wallet,,,0.00000835,BTC,0.49,Coinbase BTC Wallet,,,0.00000016,BTC,0.01,0.05,0, +08/15/2024 19:46:08,TRADE,019223e4-5867-780e-bc41-26ff54900330,0.00000848,BTC,0.5,Coinbase BTC Wallet,,,22.32714695,VET,1.01,Coinbase VET Wallet,,,0.45330915,VET,0.02,-0.52,-0.01, +06/14/2024 16:50:40,TRADE,019223e4-599b-7cc3-9b68-2dbe8bc2bf8f,0.00336497,SOL,0.5,Coinbase SOL Wallet,,,0.19132999,RON,0.52,Coinbase RONIN Wallet,,,0.00390625,RON,0.01,-0.03,0, +06/14/2024 16:30:05,TRADE,019223e4-57ef-7f35-b036-63fc4f0ec771,0.00000383,BTC,0.5,Coinbase BTC Wallet,,,0.249634,USDC,0.5,Coinbase USDC Wallet,,,0.25,USDC,0.5,-0.5,0, +06/14/2024 17:18:12,SELL,019223e4-57af-7aea-9bdc-b419b44ca998,0.48,USD,,Coinbase Cash (USD),,,0.19360096,RON,0.52,Coinbase RONIN Wallet,,,0.24,USD,,-0.28,, +06/14/2024 17:02:11,TRANSFER,019223e4-5b10-7696-ad01-c2716f0f94cc,0.00336497,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.00336497,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +08/08/2024 2:35:30,SELL,019223e4-5a71-7baa-9eee-484976d62c6e,,USD,,Coinbase Cash (USD),,,1.1,ZETA,0.49,Coinbase ZETA Wallet,,,0.00277794,USD,,-0.02,, +06/20/2024 6:00:06,TRANSFER,019223e4-5b38-7f14-a91e-1e76697fcf5c,0.00336746,SOL,0,Coinbase SOL Wallet,,,0.00336746,SOL,0,Coinbase Staked SOL,,,,,,0,, +08/15/2024 5:57:36,BUY,019223e4-5a65-76c1-bf2d-6c1d47ebb2ef,0.00133171,BCH,0.45,Coinbase BCH Wallet,,,0.44519065,USD,,Coinbase Cash (USD),,,0.00267114,USD,,,, +08/15/2024 6:59:23,TRADE,019223e4-5a5f-763d-9b62-45943558c270,0.44480446,USDC,0.44,Coinbase USDC Wallet,,,0.00133171,BCH,0.45,Coinbase BCH Wallet,,,0.00266883,USDC,0,-0.01,0, +07/14/2024 8:06:53,SELL,019223e4-57b5-7872-8dce-962b4579619c,0.44,USD,,Coinbase Cash (USD),,,0.00307851,SOL,0.47,Coinbase SOL Wallet,,,0.22,USD,,-0.25,, +06/14/2024 23:12:46,TRADE,019223e4-5807-7d63-8c1c-48fa660ad21e,0.00011872,ETH,0.43,Coinbase ETH Wallet,,,0.00000639,BTC,0.45,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.03,0, +09/14/2024 12:10:02,RECEIVE,019223e4-490c-7a58-b3dc-e33cb9abb017,0.396142,USDC,0.4,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/07/2024 20:46:45,TRADE,019223e4-58e3-7466-be4f-101d5afa42bb,0.39651,USDC,0.4,Coinbase USDC Wallet,,,0.39655,USDT,0.79,Coinbase USDT Wallet,,,,,,-0.39,, +06/14/2024 16:41:02,TRADE,019223e4-57f5-7b84-987b-e63c200cb34b,0.00000306,BTC,0.4,Coinbase BTC Wallet,,,0.2,USDC,0.4,Coinbase USDC Wallet,,,0.2,USDC,0.4,-0.4,0, +08/25/2024 21:44:19,SEND,019223e4-5b05-736a-b97e-9239ccd8679d,,,,,,,0.00012651,ETH,0.37,Coinbase ETH Wallet,,,0.000063,ETH,0.18,-0.19,-0.01, +06/14/2024 16:45:50,TRADE,019223e4-57fb-76fc-bdab-713664047504,0.00009258,ETH,0.33,Coinbase ETH Wallet,,,0.00000492,BTC,0.64,Coinbase BTC Wallet,,,0.00000015,BTC,0.02,-0.32,-0.01, +06/17/2024 6:46:47,TRADE,019223e4-5779-7fc6-a47f-c495856dde5d,0.00008365,CBETH,0.32,Coinbase CBETH Wallet,,ETH2/CBETH wrap/unwrap,0.00008985,ETH,0.32,Coinbase Staked ETH,,ETH2/CBETH wrap/unwrap,,,,0,, +07/15/2024 3:12:02,SELL,019223e4-57a5-7302-b1a5-470394278e4e,0.31,USD,,Coinbase Cash (USD),,,0.00081366,BCH,0.31,Coinbase BCH Wallet,,,,,,0,, +07/15/2024 0:46:29,TRADE,019223e4-58f5-7a04-b259-fcfd9c2bf438,0.00081366,BCH,0.31,Coinbase BCH Wallet,,,9.89485992,VET,0.3,Coinbase VET Wallet,,,,,,0.01,, +09/14/2024 12:12:54,RECEIVE,019223e4-4915-7269-9a4c-01a99cbdfd8c,0.297131,USDC,0.3,Coinbase USDC Wallet,,,,,,,,,,,,,, +07/14/2024 8:10:12,TRADE,019223e4-592f-719d-9a80-04878534eecc,9.89485992,VET,0.3,Coinbase VET Wallet,,,0.00199972,SOL,0.3,Coinbase SOL Wallet,,,0.00006896,SOL,0.01,-0.01,0, +06/19/2024 8:05:52,TRADE,019223e4-582b-7ac5-9777-23b08feac258,0.15263,USDC,0.3,Coinbase USDC Wallet,,,0.00000234,BTC,0.18,Coinbase BTC Wallet,,,0.0000023,BTC,0.16,-0.17,0.13, +06/14/2024 17:08:24,TRADE,019223e4-59a1-75ce-8728-c2f9454179b1,0.00202142,SOL,0.3,Coinbase SOL Wallet,,,0.02802932,UNI,0.3,Coinbase UNI Wallet,,,0.00096459,UNI,0.01,-0.01,0, +06/14/2024 17:09:31,TRANSFER,019223e4-5b13-7ed1-98bd-19307d6efcb0,0.00202142,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.00202142,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +09/15/2024 8:35:53,RECEIVE,019223e4-491b-7ff9-befd-19514947ad10,0.268039,USDC,0.27,Coinbase USDC Wallet,,,,,,,,,,,,,, +07/14/2024 8:09:06,TRADE,019223e4-59bf-76f5-b52c-e022827e3de7,0.02813202,UNI,0.25,Coinbase UNI Wallet,,,0.00165472,SOL,0.25,Coinbase SOL Wallet,,,0.00006895,SOL,0.01,-0.01,0, +07/15/2024 15:50:41,TRANSFER,019223e4-5b26-7f08-be8c-9d727689f8dc,0.00154665,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.00154665,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +07/15/2024 15:50:36,TRADE,019223e4-5985-7508-b99b-20526f3349e3,0.00154665,SOL,0.24,Coinbase SOL Wallet,,,0.00007158,ETH,0.23,Coinbase ETH Wallet,,,,,,0.01,, +06/20/2024 12:36:58,TRADE,019223e4-5855-7d09-8094-b1a75baf4bf4,0.00005977,ETH,0.23,Coinbase ETH Wallet,,,0.00000332,BTC,0.25,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.03,0, +06/20/2024 12:26:18,TRADE,019223e4-584f-7766-aed4-564f70877bbe,0.00000324,BTC,0.23,Coinbase BTC Wallet,,,0.00157327,SOL,0.23,Coinbase SOL Wallet,,,0.00007207,SOL,0.01,-0.01,0, +06/15/2024 12:58:19,TRADE,019223e4-580d-7f83-ae2c-54d6887f298b,0.00000325,BTC,0.23,Coinbase BTC Wallet,,,0.00006176,ETH,0.29,Coinbase ETH Wallet,,,0.0000028,ETH,0.01,-0.07,0, +06/20/2024 12:41:04,TRADE,019223e4-59b3-7f6f-b097-40eca54ab038,0.0000031,WBTC,0.22,Coinbase WBTC Wallet,,,0.00150841,SOL,0.23,Coinbase SOL Wallet,,,0.00007218,SOL,0.01,-0.02,0, +06/17/2024 7:03:48,TRADE,019223e4-5825-7815-ad1e-604d345baebb,0.0000031,BTC,0.22,Coinbase BTC Wallet,,,0.00005486,CBETH,0.21,Coinbase CBETH Wallet,,,0.00000262,CBETH,0.01,0,0, +06/15/2024 13:00:58,TRADE,019223e4-5813-7948-ae10-aecea288854e,0.419469,XRP,0.22,Coinbase XRP Wallet,,,0.0000031,BTC,0.22,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.01,0, +07/15/2024 3:09:39,SELL,019223e4-57c1-7f05-b0b5-b981f67aa71e,0.21,USD,,Coinbase Cash (USD),,,0.02505351,UNI,0.22,Coinbase UNI Wallet,,,,,,-0.01,, +06/20/2024 12:40:26,TRADE,019223e4-5975-7c61-af5d-86b26c512bd3,0.00144546,SOL,0.21,Coinbase SOL Wallet,,,0.00005699,ETH,0.22,Coinbase ETH Wallet,,,0.00000278,ETH,0.01,-0.02,0, +06/19/2024 6:39:19,TRADE,019223e4-58ab-7d37-bfae-2785fa6bbde1,0.104864,USDC,0.21,Coinbase USDC Wallet,,,0.00074504,SOL,0.12,Coinbase SOL Wallet,,,0.00078142,SOL,0.12,-0.12,0.1, +06/24/2024 4:33:15,TRADE,019223e4-59e1-7bf0-a9b1-606525bef3ba,0.23238996,ZETA,0.2,Coinbase ZETA Wallet,,,0.13359585,SAFE,0.21,Coinbase SAFE Wallet,,,0.00703135,SAFE,0.01,-0.02,0, +06/20/2024 11:55:48,TRADE,019223e4-5969-7d4c-b2cf-76c7bb514aaf,0.00005173,ETH,0.2,Coinbase ETH Wallet,,,0.00136328,SOL,0.2,Coinbase SOL Wallet,,,0.00007175,SOL,0.01,-0.01,0, +06/18/2024 18:00:04,TRANSFER,019223e4-5b35-78ae-ba7f-308ad09cf600,0.00152645,SOL,0,Coinbase SOL Wallet,,,0.00152645,SOL,0,Coinbase Staked SOL,,,,,,0,, +06/15/2024 13:02:40,TRADE,019223e4-5893-77e5-b902-55338a8bb3d3,0.101366,USDC,0.2,Coinbase USDC Wallet,,,0.211179,XRP,0.11,Coinbase XRP Wallet,,,0.20829,XRP,0.11,-0.11,0.09, +06/14/2024 16:54:40,TRADE,019223e4-590b-7744-8924-0273f3aa9334,6.55946573,VET,0.2,Coinbase VET Wallet,,,0.01835749,UNI,0.2,Coinbase UNI Wallet,,,0.00096618,UNI,0.01,-0.01,0, +06/30/2024 10:15:14,TRADE,019223e4-5905-7a02-bef3-c5ae85b0d1c9,0.00233498,LTC,0.19,Coinbase LTC Wallet,,,0.22012003,ZETA,0.19,Coinbase ZETA Wallet,,,0.01226993,ZETA,0.01,-0.01,0, +07/01/2024 0:08:53,TRADE,019223e4-585b-79b3-a8bc-e242bd34e8bc,0.00000259,BTC,0.18,Coinbase BTC Wallet,,,0.00220198,LTC,0.18,Coinbase LTC Wallet,,,0.000133,LTC,0.01,-0.01,0, +06/14/2024 17:20:59,TRADE,019223e4-5887-7348-9c3f-9b1c1547ff32,0.094878,USDC,0.18,Coinbase USDC Wallet,,,3.36684424,VET,0.1,Coinbase VET Wallet,,,3.19262149,VET,0.1,-0.09,0.07, +07/01/2024 0:12:49,TRADE,019223e4-5861-74c5-a92f-da41fa336a38,0.00004288,ETH,0.16,Coinbase ETH Wallet,,,0.0000024,BTC,0.17,Coinbase BTC Wallet,,,0.00000016,BTC,0.01,-0.02,0, +06/23/2024 17:31:10,TRADE,019223e4-58f9-7379-9f3a-c1bd85f974fa,0.00191297,LTC,0.16,Coinbase LTC Wallet,,,0.17724414,ZETA,0.21,Coinbase ZETA Wallet,,,0.01212856,ZETA,0.01,-0.06,0, +06/19/2024 8:06:55,TRADE,019223e4-58b7-76c3-a09a-d17d684dc139,0.00002189,ETH,0.16,Coinbase ETH Wallet,,,0.077494,USDC,0.16,Coinbase USDC Wallet,,,0.08,USDC,0.16,-0.16,0.01, +08/09/2024 22:24:29,TRADE,019223e4-598f-7fbc-b41f-ee186c08b09f,0.32688576,MATIC,0.15,Coinbase MATIC Wallet,,,0.28005187,ZETA,0.12,Coinbase ZETA Wallet,,,0.01994813,ZETA,0.01,0.02,0, +08/15/2024 4:51:00,TRADE,019223e4-5995-7590-8459-83f22ab30a03,0.20591719,ZETA,0.14,Coinbase ZETA Wallet,,,0.30569138,MATIC,0.14,Coinbase MATIC Wallet,,,0.02351281,MATIC,0.01,-0.01,0, +06/23/2024 21:40:01,TRADE,019223e4-58ff-7a5e-9b87-6efa66265789,0.01301949,UNI,0.14,Coinbase UNI Wallet,,,0.00177765,LTC,0.15,Coinbase LTC Wallet,,,0.00013532,LTC,0.01,-0.02,0, +07/10/2024 6:10:36,TRADE,019223e4-5923-722b-b7e0-953e5816475a,0.00081067,SOL,0.13,Coinbase SOL Wallet,,,4.61225282,VET,0.12,Coinbase VET Wallet,,,0.38774718,VET,0.01,0,0, +07/06/2024 7:32:06,TRADE,019223e4-591d-7b60-a3b5-ebe9cdccb1af,4.9468588,VET,0.13,Coinbase VET Wallet,,,0.00003956,ETH,0.15,Coinbase ETH Wallet,,,0.00000332,ETH,0.01,-0.03,0, +06/23/2024 21:41:12,TRADE,019223e4-59c9-7a2e-9f2f-d7b8e8dee1bf,0.08192718,SAFE,0.13,Coinbase SAFE Wallet,,,0.01200653,UNI,0.13,Coinbase UNI Wallet,,,0.00101296,UNI,0.01,-0.01,0, +06/19/2024 8:07:35,TRADE,019223e4-5957-70e3-9206-a2439711c7af,0.00082307,SOL,0.13,Coinbase SOL Wallet,,,0.00003312,ETH,0.24,Coinbase ETH Wallet,,,0.00000282,ETH,0.02,-0.12,-0.01, +06/14/2024 23:16:20,TRADE,019223e4-588d-79de-be36-7d0009e25723,0.00001742,ETH,0.13,Coinbase ETH Wallet,,,0.060469,USDC,0.15,Coinbase USDC Wallet,,,0.07,USDC,0.13,-0.15,0.02, +07/10/2024 6:00:31,SEND,019223e4-5aef-7747-87d1-6ea029550377,,,,,,,4.87065194,VET,0.13,Coinbase VET Wallet,,,0.07620686,VET,0,0,0, +07/10/2024 6:17:40,TRANSFER,019223e4-5b1e-7806-b51a-9eba36655663,0.00081067,SOL,0,Coinbase Staked SOL,,"Staked SOL +on Coinbase",0.00081067,SOL,0,Coinbase SOL Wallet,,"Staked SOL +on Coinbase",,,,0,, +06/15/2024 13:30:38,TRADE,019223e4-5911-7ac7-9cfe-53d9c6c053ca,3.72043121,VET,0.12,Coinbase VET Wallet,,,0.00971927,UNI,0.22,Coinbase UNI Wallet,,,0.00088425,UNI,0.02,-0.11,-0.01, +06/15/2024 13:29:13,BUY,019223e4-57bb-7766-9df7-8c965ea4b4a2,0.01060352,UNI,0.24,Coinbase UNI Wallet,,,0.12,USD,,Coinbase Cash (USD),,,0.12,USD,,,, +06/19/2024 8:11:56,TRADE,019223e4-5831-74eb-a5f4-bcb28509af35,0.00000157,BTC,0.11,Coinbase BTC Wallet,,,0.00075139,SOL,0.12,Coinbase SOL Wallet,,,0.00007168,SOL,0.01,-0.02,0, +06/15/2024 13:32:27,TRADE,019223e4-5917-777e-866b-27981ecb4821,0.013395,ATOM,0.11,Coinbase ATOM Wallet,,,3.37500807,VET,0.11,Coinbase VET Wallet,,,0.34542314,VET,0.01,-0.01,0, +06/23/2024 17:32:59,TRADE,019223e4-59db-72e7-b958-876c28953f78,0.06177853,SAFE,0.1,Coinbase SAFE Wallet,,,0.0000014,WBTC,0.1,Coinbase WBTC Wallet,,,0.00000016,WBTC,0.01,-0.01,0, +06/20/2024 17:18:04,TRADE,019223e4-59d5-748a-aec6-53b19e368ca8,0.10228126,ZETA,0.1,Coinbase ZETA Wallet,,,0.00000139,WBTC,0.1,Coinbase WBTC Wallet,,,0.00000015,WBTC,0.01,-0.01,0, +06/20/2024 11:57:19,SELL,019223e4-57a9-7edd-b91c-5cc87717f7a8,0.1,USD,,Coinbase Cash (USD),,,0.00002778,ETH,0.11,Coinbase ETH Wallet,,,0.05,USD,,-0.06,, +06/19/2024 6:41:26,TRADE,019223e4-58b1-7585-b092-6137da7d63b8,0.00001405,ETH,0.1,Coinbase ETH Wallet,,,0.05,USDC,0.1,Coinbase USDC Wallet,,,0.05,USDC,0.1,-0.1,0, +06/17/2024 6:47:29,TRADE,019223e4-581f-7cdf-bb67-737a34dc02d4,0.00000133,BTC,0.1,Coinbase BTC Wallet,,,0.00002356,CBETH,0.09,Coinbase CBETH Wallet,,,0.00000261,CBETH,0.01,0,0, +06/15/2024 13:33:34,TRADE,019223e4-5951-7635-b865-67bf2f673d78,0.00002358,ETH,0.1,Coinbase ETH Wallet,,,0.011996,ATOM,0.1,Coinbase ATOM Wallet,,,0.001399,ATOM,0.01,-0.01,0, +06/15/2024 13:04:08,TRADE,019223e4-5899-714d-b70e-301f66af7a8d,0.00000077,WBTC,0.1,Coinbase WBTC Wallet,,,0.051366,USDC,0.1,Coinbase USDC Wallet,,,0.05,USDC,0.1,-0.1,0, +06/19/2024 8:19:00,TRADE,019223e4-5837-7e15-a066-9a3a1230bf07,0.00056301,SOL,0.09,Coinbase SOL Wallet,,,0.00000123,BTC,0.09,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.01,0, +09/23/2024 11:22:26,STAKING_REWARD,019223e4-4972-719c-a776-0e46b7a0c3c3,0.00058071,SOL,0.08,Coinbase SOL Wallet,,,,,,,,,,,,,, +09/13/2024 21:05:36,RECEIVE,019223e4-4903-7202-951a-5624388e06d7,0.07712,USDC,0.08,Coinbase USDC Wallet,,,,,,,,,,,,,, +06/19/2024 8:26:19,TRADE,019223e4-5843-797a-9263-e4be7f6bde42,0.00001927,ETH,0.08,Coinbase ETH Wallet,,,0.00000107,BTC,0.08,Coinbase BTC Wallet,,,0.00000015,BTC,0.01,-0.01,0, +06/19/2024 8:23:55,TRADE,019223e4-583d-757a-9c95-de0a8499344a,0.00000103,BTC,0.08,Coinbase BTC Wallet,,,0.00049107,SOL,0.08,Coinbase SOL Wallet,,,0.00007194,SOL,0.01,-0.01,0, +06/15/2024 13:37:11,TRADE,019223e4-589f-7dbc-bb94-d6e33869e5d1,0.043926,USDC,0.08,Coinbase USDC Wallet,,,0.00001235,ETH,0.05,Coinbase ETH Wallet,,,0.00001123,ETH,0.05,-0.05,0.03, +09/15/2024 8:35:51,TRADE,019223e4-59e7-74ec-a86d-e8c686ec1c6e,0.0152971,TIA,0.07,Coinbase TIA Wallet,,,0.07315075,USDC,0.07,Coinbase USDC Wallet,,,0.00087781,USDC,0,0,0, +06/23/2024 10:31:42,TRADE,019223e4-59b9-7d59-bc1d-2a2d35633341,0.06385994,ZETA,0.07,Coinbase ZETA Wallet,,,0.00041796,SOL,0.06,Coinbase SOL Wallet,,,0.00007453,SOL,0.01,0,0, +06/22/2024 18:00:12,TRANSFER,019223e4-5b3b-7663-89e4-0a9ab1a5622b,0.00049249,SOL,0,Coinbase SOL Wallet,,,0.00049249,SOL,0,Coinbase Staked SOL,,,,,,0,, +06/19/2024 10:14:31,TRADE,019223e4-595d-7269-9989-545e70a59873,0.00041099,SOL,0.07,Coinbase SOL Wallet,,,0.00001644,ETH,0.07,Coinbase ETH Wallet,,,0.00000283,ETH,0.01,-0.01,0, +08/15/2024 13:05:08,SELL,019223e4-5a59-70d5-94c9-dd3d521707fa,0.0613,USD,,Coinbase Cash (USD),,,0.1,ZETA,0.07,Coinbase ZETA Wallet,,,0.0003678,USD,,-0.01,, +06/19/2024 10:19:06,TRADE,019223e4-5963-7588-ad75-67e39bf4e1e7,0.00001301,ETH,0.06,Coinbase ETH Wallet,,,0.00033876,SOL,0.06,Coinbase SOL Wallet,,,0.00007223,SOL,0.01,-0.01,0, +06/14/2024 17:16:05,TRADE,019223e4-5881-7124-8e5f-71bdeb2b572e,0.026548,USDC,0.06,Coinbase USDC Wallet,,,0.0025483,UNI,0.04,Coinbase UNI Wallet,,,0.00287935,UNI,0.03,-0.04,0.04, +09/07/2024 20:47:36,TRADE,019223e4-58e7-70b7-bd4e-519def4ddad0,0.028133,USDC,0.05,Coinbase USDC Wallet,,,0.06191279,ZETA,0.04,Coinbase ZETA Wallet,,,0.0440044,ZETA,0.03,-0.03,0.01, +06/20/2024 11:58:24,TRANSFER,019223e4-5aff-7ea5-87b0-dc5a8e3545f8,0.00001389,ETH,0,Coinbase Staked ETH,,"Staked ETH +on Coinbase",0.00001389,ETH,0,Coinbase ETH Wallet,,"Staked ETH +on Coinbase",,,,0,, +06/19/2024 10:21:55,TRANSFER,019223e4-5afc-7193-8f71-5a94e7e6fb8a,0.00001301,ETH,0,Coinbase Staked ETH,,"Staked ETH +on Coinbase",0.00001301,ETH,0,Coinbase ETH Wallet,,"Staked ETH +on Coinbase",,,,0,, +09/14/2024 12:10:01,BUY,019223e4-5a11-7761-9d3c-f7d5abee6414,0.00036455,SOL,0.05,Coinbase SOL Wallet,,,0.0499798,USD,,Coinbase Cash (USD),,,0.00059976,USD,,,, +06/15/2024 13:06:01,SEND,019223e4-5b4a-7f4c-89b8-d78d6e58061b,,,,,,,0.00000075,WBTC,0.1,Coinbase WBTC Wallet,,,0.00000002,WBTC,0,-0.05,0, +09/14/2024 12:12:53,TRADE,019223e4-59ff-76c3-a7c8-f3e9c3b61d33,0.067685,XRP,0.04,Coinbase XRP Wallet,,,0.03968372,USDC,0.04,Coinbase USDC Wallet,,,0.0004762,USDC,0,0,0, +06/20/2024 12:02:39,TRADE,019223e4-596f-775d-8973-0f50d459575e,0.00253764,UNI,0.04,Coinbase UNI Wallet,,,0.00000728,ETH,0.03,Coinbase ETH Wallet,,,0.00000278,ETH,0.01,0,0, +06/20/2024 12:01:25,TRADE,019223e4-59a7-7a03-ac85-fd9196c0b31e,0.00338145,ICP,0.04,Coinbase ICP Wallet,,,0.00021532,SOL,0.03,Coinbase SOL Wallet,,,0.00007177,SOL,0.01,-0.01,0, +06/15/2024 13:38:54,TRADE,019223e4-58a5-7df8-82ed-2937cb69c2a6,0.00211342,UNI,0.04,Coinbase UNI Wallet,,,0.023926,USDC,0.04,Coinbase USDC Wallet,,,0.02,USDC,0.04,-0.04,0, +09/15/2024 8:35:54,RECEIVE,019223e4-4921-70b7-a48a-644f87f0ebe5,0.028549,USDC,0.03,Coinbase USDC Wallet,,,,,,,,,,,,,, +08/07/2024 6:43:43,TRADE,019223e4-59cf-738b-b1e1-c74908b94804,0.00271764,UNI,0.03,Coinbase UNI Wallet,,,0.024848,XTZ,0.02,Coinbase XTZ Wallet,,,0.015152,XTZ,0.01,0,0.01, +08/06/2024 23:17:57,TRADE,019223e4-5939-7744-a3a9-6bec1873e0ad,0.72487604,VET,0.03,Coinbase VET Wallet,,,0.04021332,ZETA,0.02,Coinbase ZETA Wallet,,,0.02397506,ZETA,0.01,-0.01,0.01, +07/15/2024 3:04:22,TRADE,019223e4-5935-73cd-949c-53b515f098c1,0.81229717,VET,0.03,Coinbase VET Wallet,,,0.00307851,UNI,0.03,Coinbase UNI Wallet,,,,,,0,, +06/20/2024 12:39:11,TRADE,019223e4-59ad-7a3a-b2cd-4c55e72260ff,0.00013513,SOL,0.03,Coinbase SOL Wallet,,,0.00222122,ICP,0.03,Coinbase ICP Wallet,,,0.00116023,ICP,0.01,-0.01,0, +06/20/2024 12:24:08,TRADE,019223e4-5849-7219-be39-b0cbd0716b6b,0.00000023,BTC,0.03,Coinbase BTC Wallet,,,0.00154173,UNI,0.02,Coinbase UNI Wallet,,,0.00099591,UNI,0.02,-0.01,0, +09/13/2024 15:36:19,BUY,019223e4-5a2f-7004-a41b-9762938e2cd4,0.0264384,USDT,0.03,Coinbase USDT Wallet,,,0.02643998,USD,,Coinbase Cash (USD),,,0.00000026,USD,,,, +08/27/2024 9:42:34,TRADE,019223e4-5a47-7ebd-ad4c-b57a08103e1c,0.01675846,USDC,0.02,Coinbase USDC Wallet,,,0.002717,UNI,0.03,Coinbase UNI Wallet,,,0.0002011,USDC,0,-0.01,0, +08/01/2024 11:06:33,TRADE,019223e4-58c5-7afe-8465-ccb8f3f4e22d,0.00000019,WBTC,0.02,Coinbase WBTC Wallet,,,0.012392,USDC,0.02,Coinbase USDC Wallet,,,0.01,USDC,0.01,-0.01,0.01, +07/31/2024 17:14:08,TRADE,019223e4-58c1-7abe-8c72-3930d35450c8,0.021956,USDC,0.02,Coinbase USDC Wallet,,,0.81229717,VET,0.03,Coinbase VET Wallet,,,,,,-0.01,, +06/20/2024 17:16:31,BUY,019223e4-57c5-776e-a442-6897d53a0d7c,0.0232315,ZETA,0.05,Coinbase ZETA Wallet,,,0.02,USD,,Coinbase Cash (USD),,,0.03,USD,,,, +06/16/2024 1:41:51,TRADE,019223e4-5819-7c46-81d3-4bc60e3bfd42,0.00000021,BTC,0.02,Coinbase BTC Wallet,,,0.0012468,UNI,0.02,Coinbase UNI Wallet,,,0.00086662,UNI,0.02,-0.02,0, +08/15/2024 13:12:27,SELL,019223e4-5a53-7cc3-9513-943a6953bc90,0.01961568,USD,,Coinbase Cash (USD),,,0.00013622,SOL,0.02,Coinbase SOL Wallet,,,0.00011769,USD,,0,, +08/05/2024 1:06:30,BUY,019223e4-5aa1-745d-9c10-eee3befa8f83,0.03,XTZ,0.02,Coinbase XTZ Wallet,,,0.01875,USD,,Coinbase Cash (USD),,,0.0001125,USD,,,, +09/12/2024 23:50:41,TRADE,019223e4-5a3b-7853-a705-263b01da8871,0.00000294,ETH,0.01,Coinbase ETH Wallet,,,0.00693895,USDC,0.01,Coinbase USDC Wallet,,,0.00008327,USDC,0,0,0, +08/01/2024 14:31:10,TRADE,019223e4-5ad1-723b-b850-6f88fa2eb936,0.00004358,SOL,0.01,Coinbase SOL Wallet,,,0.00729573,USDC,0,Coinbase USDC Wallet,,,0.00004377,USDC,0,0,0, +07/20/2024 9:20:07,STAKING_REWARD,019223e4-4987-70f6-b14a-0d254acc758a,0.00004142,SOL,0.01,Coinbase Staked SOL,,,,,,,,,,,,,, +07/15/2024 10:50:50,RECEIVE,019223e4-48fd-7b32-8bd2-36fb5ee9401d,0.005903,USDC,0.01,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/13/2024 21:05:35,BUY,019223e4-5a23-7ce9-b4ce-307cecceecbb,0.00225135,DOT,0.01,Coinbase DOT Wallet,,,0.00999599,USD,,Coinbase Cash (USD),,,0.00011995,USD,,,, +08/06/2024 19:04:36,BUY,019223e4-5a89-74c9-a13f-83bc4c23a1a5,0.00006802,SOL,0.01,Coinbase SOL Wallet,,,0.0098799,USD,,Coinbase Cash (USD),,,0.00005928,USD,,,, +08/05/2024 5:04:42,BUY,019223e4-5a95-7570-9525-59a4d9bec1f0,0.00008083,SOL,0.01,Coinbase SOL Wallet,,,0.00987985,USD,,Coinbase Cash (USD),,,0.00005928,USD,,,, +08/05/2024 0:34:20,BUY,019223e4-5abf-719c-82af-b3fdd8d71044,0.0000723,SOL,0.01,Coinbase SOL Wallet,,,0.0098798,USD,,Coinbase Cash (USD),,,0.00005928,USD,,,, +08/25/2024 21:47:29,SEND,019223e4-5b4f-7cca-8556-08aad8542ae1,,,,,,,0.00000018,WBTC,0.02,Coinbase WBTC Wallet,,,0.00000001,WBTC,0,-0.01,0, +09/14/2024 12:10:01,BUY,019223e4-5a0b-7a15-814a-ec7afe7bf103,0.00005531,SOL,0.01,Coinbase SOL Wallet,,,0.00758241,USD,,Coinbase Cash (USD),,,0.00009099,USD,,,, +08/05/2024 0:38:54,BUY,019223e4-5ab9-760f-a05e-bba0a9bcac50,0.01,XTZ,0.01,Coinbase XTZ Wallet,,,0.00651,USD,,Coinbase Cash (USD),,,0.00003906,USD,,,, +08/05/2024 0:40:21,SELL,019223e4-5aa7-7eb8-a68d-fd6511bc7ccc,0.00412346,USD,,Coinbase Cash (USD),,,0.00003056,SOL,0,Coinbase SOL Wallet,,,0.00004948,USD,,0,, +08/05/2024 3:36:00,SELL,019223e4-5a9b-717a-b163-ae4a8044effc,0.00293848,USD,,Coinbase Cash (USD),,,0.00002293,SOL,0,Coinbase SOL Wallet,,,0.00003526,USD,,0,, +08/05/2024 0:39:43,SELL,019223e4-5aad-763b-98c0-c8fbc917af8d,0.00274078,USD,,Coinbase Cash (USD),,,0.00002037,SOL,0,Coinbase SOL Wallet,,,0.00003289,USD,,0,, +08/05/2024 0:32:17,SELL,019223e4-5ac5-7515-9563-47bee05da4c0,0.00167386,USD,,Coinbase Cash (USD),,,0.00001226,SOL,0,Coinbase SOL Wallet,,,0.00002009,USD,,0,, +08/05/2024 0:38:55,SELL,019223e4-5ab3-7d28-a5bf-a5527516b763,0.00146917,USD,,Coinbase Cash (USD),,,0.00001089,SOL,0,Coinbase SOL Wallet,,,0.00001763,USD,,0,, +08/07/2024 2:31:35,TRADE,019223e4-5a77-7648-a19c-940a9f6cfa51,0.00114458,USDC,0,Coinbase USDC Wallet,,,0.00000758,SOL,0,Coinbase SOL Wallet,,,0.00000687,USDC,0,0,0, +08/05/2024 0:31:41,SELL,019223e4-5acb-7d5a-a47b-e5dd6c1586c6,0.00111831,USD,,Coinbase Cash (USD),,,0.00000817,SOL,0,Coinbase SOL Wallet,,,0.00001342,USD,,0,, +08/05/2024 16:25:11,SELL,019223e4-5a8f-7042-b6b1-6aff9d0c1fe1,0.0010298,USD,,Coinbase Cash (USD),,,0.00000764,SOL,0,Coinbase SOL Wallet,,,0.00000618,USD,,0,, +08/07/2024 2:26:43,TRADE,019223e4-5a83-7ff1-9aae-45ba817b4071,0.00075715,USDC,0,Coinbase USDC Wallet,,,0.00000505,SOL,0,Coinbase SOL Wallet,,,0.00000909,USDC,0,0,0,0 +09/13/2024 21:05:35,BUY,019223e4-5a1d-7ee6-9355-898ab1a7e22c,0.00015271,DOT,0,Coinbase DOT Wallet,,,0.00067803,USD,,Coinbase Cash (USD),,,0.00000814,USD,,,, +08/07/2024 2:27:54,SELL,019223e4-5a7d-7280-ae94-740e0c51a5f3,0.00046056,USD,,Coinbase Cash (USD),,,0.00000306,SOL,0,Coinbase SOL Wallet,,,0.00000276,USD,,0,, +09/14/2024 12:12:53,TRADE,019223e4-59f9-7d90-80e2-17c6d0f7501c,0.00005636,XRP,0,Coinbase XRP Wallet,,,0.00003304,USDC,0,Coinbase USDC Wallet,,,0.0000004,USDC,0,0,0,0 +09/22/2024 14:29:14,STAKING_REWARD,019223e4-494e-7f9f-b583-385b38e9831d,0.00000071,MATIC,0,Coinbase MATIC Wallet,,,348259.1795,,,,,,,17.72804807,,1.01,1,1 +09/21/2024 6:32:12,STAKING_REWARD,019223e4-48f7-7ccc-a22d-5873417c6e20,0.00000003,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,1, +09/19/2024 22:30:18,STAKING_REWARD,019223e4-4945-7568-be99-501f522de5d4,0.00000001,ETH,0,Coinbase ETH Wallet,,,,,,,,,,,-10.08,,, +09/19/2024 15:23:06,STAKING_REWARD,019223e4-49b1-795b-b9cd-9f9addb25499,0.0000048,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +09/18/2024 12:28:56,STAKING_REWARD,019223e4-48f4-7437-b610-cc56b256c78f,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,0.5, +09/17/2024 10:45:46,STAKING_REWARD,019223e4-49e1-7b20-8669-1481c05e2ed2,0.0000009,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,-25.04,-25.05, +09/15/2024 18:15:39,STAKING_REWARD,019223e4-48f1-70b3-be73-84cb4c4e7af6,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,#N/A, +09/15/2024 8:35:54,RECEIVE,019223e4-491e-78f5-b9b3-162ea8340ea4,0.000219,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/14/2024 12:12:55,RECEIVE,019223e4-4918-7ce9-b234-54bb9478c259,0.000119,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/14/2024 12:10:04,RECEIVE,019223e4-4912-76c9-a175-63d69931a95f,0.000023,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/14/2024 12:10:03,RECEIVE,019223e4-490f-7ec0-be0c-e73feb44e4bb,0.00015,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/13/2024 21:05:37,RECEIVE,019223e4-4909-7dad-80f2-eaf8899bfa1f,0.000002,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/13/2024 21:05:36,RECEIVE,019223e4-4906-787c-a9e1-e7946d50c862,0.00003,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/13/2024 15:36:30,RECEIVE,019223e4-4900-703e-840b-8baf386b98b1,0.001466,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +09/13/2024 4:54:35,STAKING_REWARD,019223e4-49de-7fb1-8955-783e4d409c52,0.00014588,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +09/13/2024 1:06:44,STAKING_REWARD,019223e4-49db-79f7-8f7d-aa2239ad95c9,0.00000026,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +09/11/2024 4:31:31,STAKING_REWARD,019223e4-48ee-734c-844e-1a4058caaedc,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +09/09/2024 8:26:44,STAKING_REWARD,019223e4-48eb-7f00-a541-3fc3cb49c851,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +09/09/2024 8:20:45,STAKING_REWARD,019223e4-49ab-7b44-b220-54b72a564c0e,0.00000368,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +09/07/2024 12:08:28,STAKING_REWARD,019223e4-49d8-75b1-b1c9-8970abac4f38,0.00091731,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +09/06/2024 0:30:31,STAKING_REWARD,019223e4-48e8-7673-bcac-68edebc22c59,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +09/03/2024 10:50:45,STAKING_REWARD,019223e4-48e5-7177-9d70-58a0ba405fa6,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +09/02/2024 23:39:47,STAKING_REWARD,019223e4-49a8-746a-b4fd-dd1392986336,0.00000375,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +09/02/2024 17:16:21,STAKING_REWARD,019223e4-49d5-7c90-ad8e-daf8e84f6365,0.00040327,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/31/2024 11:07:29,STAKING_REWARD,019223e4-49a5-75b3-899d-cb7224485aad,0.00000376,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/31/2024 2:30:16,STAKING_REWARD,019223e4-48e2-7b84-94ad-fa886ec26d61,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/28/2024 20:17:36,STAKING_REWARD,019223e4-49d2-7e39-acb1-bf50d5ce504d,0.00090379,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/28/2024 17:35:20,STAKING_REWARD,019223e4-49cf-7355-b46c-cd65d79ce9a3,0.00000761,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/26/2024 17:09:26,STAKING_REWARD,019223e4-48df-7f32-ab94-94303c73b1ab,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/25/2024 18:20:00,STAKING_REWARD,019223e4-499f-7eb9-96a4-918bf0672f16,0.00000579,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/25/2024 3:59:55,STAKING_REWARD,019223e4-48dc-7c5a-8257-13a2caa79e25,0.00000004,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/23/2024 22:02:28,STAKING_REWARD,019223e4-49cc-7ce6-ada6-610d60929cb0,0.00075879,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/23/2024 14:51:30,STAKING_REWARD,019223e4-49c9-773e-b102-9f9d52819c3a,0.00022167,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/21/2024 7:26:33,STAKING_REWARD,019223e4-499c-7fbf-9351-79fac55f7fb0,0.0000041,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/20/2024 15:48:19,STAKING_REWARD,019223e4-48d9-7295-a8e4-6ce906dbd7f0,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/18/2024 12:35:47,STAKING_REWARD,019223e4-49c6-79b4-a059-1f2b0de763db,0.0005875,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/18/2024 3:31:51,STAKING_REWARD,019223e4-48d6-7183-8acf-167a4cbdb3a9,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/14/2024 22:11:48,STAKING_REWARD,019223e4-48d3-7bbc-ab40-75fa0c0d5b2b,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/14/2024 12:08:40,STAKING_REWARD,019223e4-4999-7334-bb13-5edd9ab49f43,0.00000627,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/13/2024 15:26:51,STAKING_REWARD,019223e4-49c3-77c1-96ea-a528ddd5c270,0.00289599,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/11/2024 20:35:02,STAKING_REWARD,019223e4-48d0-701f-8b82-6d15cadd947c,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/10/2024 4:44:37,STAKING_REWARD,019223e4-4996-71e9-8fc0-95c9b0427090,0.00000416,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/09/2024 13:33:51,STAKING_REWARD,019223e4-48cd-7670-a06c-fb6c36a4d4c9,0.00000007,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/09/2024 2:59:07,STAKING_REWARD,019223e4-49c0-7fd7-bd42-a8e0c340b90b,0.00004777,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/08/2024 16:15:04,STAKING_REWARD,019223e4-49bd-7071-9310-eaafaf698aef,0.0034198,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/06/2024 23:46:33,STAKING_REWARD,019223e4-48ca-7e24-90b4-94c1b06238db,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/06/2024 9:29:44,STAKING_REWARD,019223e4-4993-7990-989b-1929fa8ef34a,0.00000437,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/04/2024 9:02:27,STAKING_REWARD,019223e4-48c7-7775-b451-4bbaee93eb39,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/04/2024 3:20:06,STAKING_REWARD,019223e4-4990-7cb1-a010-111685828b77,0.00000398,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +08/03/2024 14:31:44,STAKING_REWARD,019223e4-49ba-76fb-b484-0c247467f81d,0.00316953,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +08/02/2024 7:04:20,STAKING_REWARD,019223e4-48c4-7f7c-8bc4-0c0012ff811e,0.00000004,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +08/01/2024 15:45:22,STAKING_REWARD,019223e4-498d-7038-a521-50cc35b9d8cd,0.00000379,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +07/30/2024 14:51:06,STAKING_REWARD,019223e4-48c1-7ae3-80c3-2b61bfad37f6,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/29/2024 9:25:11,STAKING_REWARD,019223e4-49b7-7191-8006-8fd583f93260,0.00255465,MATIC,0,Coinbase Staked MATIC,,,,,,,,,,,,,, +07/29/2024 5:29:57,STAKING_REWARD,019223e4-48be-78fb-a995-bcc1b355596b,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/27/2024 12:54:28,STAKING_REWARD,019223e4-48bb-7465-821f-32e1659b00ad,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/23/2024 20:05:40,STAKING_REWARD,019223e4-498a-7782-a6e9-555b618f2a67,0.00000198,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +07/23/2024 9:24:52,STAKING_REWARD,019223e4-48b8-7d4a-914f-6f2554816fe8,0.00000003,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/14/2024 20:42:01,RECEIVE,019223e4-48fa-7bf9-91a5-b9a592a2f193,0.001917,USDC,0,Coinbase USDC Wallet,,,,,,,,,,,,,, +07/14/2024 1:05:44,STAKING_REWARD,019223e4-48b2-7465-99da-c2d71e4d8b3d,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/12/2024 20:46:20,STAKING_REWARD,019223e4-48af-7e10-bc69-5e15745b730b,0.00000007,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/09/2024 23:15:34,STAKING_REWARD,019223e4-48ac-76a6-aeb2-a83101678729,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/05/2024 15:56:57,STAKING_REWARD,019223e4-48a9-7be1-8089-a62a32054084,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/04/2024 1:27:41,STAKING_REWARD,019223e4-48a6-7a2b-a3eb-cc0677fd44ce,0.00000007,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +07/01/2024 6:11:34,STAKING_REWARD,019223e4-48a3-781b-97ad-2ee69dc7811d,0.00000006,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +06/28/2024 20:13:38,STAKING_REWARD,019223e4-48a0-7ec4-8388-e893dcfe1c29,0.00000005,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +06/25/2024 5:45:03,STAKING_REWARD,019223e4-489d-77d6-a8c9-3e9a3c897e72,0.00000008,ETH,0,Coinbase Staked ETH,,,,,,,,,,,,,, +06/25/2024 0:09:40,STAKING_REWARD,019223e4-497b-785d-a6ed-d382b5023d5a,0.00000327,SOL,0,Coinbase Staked SOL,,,,,,,,,,,,,, +,,,,,471.1533333=,,,,,,,,,,,,,,, +,,,,,427.9033333,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/examples/testapp/package.json b/examples/testapp/package.json index ac737058e..9e39f0bfe 100644 --- a/examples/testapp/package.json +++ b/examples/testapp/package.json @@ -24,6 +24,7 @@ "acorn": "^8.15.0", "framer-motion": "^10.13.1", "next": "^14.2.10", + "qrcode.react": "^4.2.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "7.45.2", @@ -31,6 +32,7 @@ }, "devDependencies": { "@testing-library/react": "^16.2.0", + "@types/qrcode.react": "^3.0.0", "@types/react": "18.2.15", "typescript": "^5.1.6", "vitest": "^3.0.4" diff --git a/examples/testapp/src/components/Layout.tsx b/examples/testapp/src/components/Layout.tsx index 29a3b102e..3fef44b1f 100644 --- a/examples/testapp/src/components/Layout.tsx +++ b/examples/testapp/src/components/Layout.tsx @@ -33,8 +33,11 @@ const PAGES = [ '/add-sub-account', '/import-sub-account', '/auto-sub-account', + '/spend-permission', '/payment', '/pay-playground', + '/subscribe-playground', + '/prolink-playground', ]; export function Layout({ children }: LayoutProps) { diff --git a/examples/testapp/src/components/RpcMethods/RpcMethodCard.tsx b/examples/testapp/src/components/RpcMethods/RpcMethodCard.tsx index 05ebc8cb8..8817d1b9b 100644 --- a/examples/testapp/src/components/RpcMethods/RpcMethodCard.tsx +++ b/examples/testapp/src/components/RpcMethods/RpcMethodCard.tsx @@ -76,6 +76,34 @@ export function RpcMethodCard({ format, method, params, shortcuts }) { (shortcut) => Number(shortcut.data.chainId) === hexToNumber(chainId) )?.data.chain ?? mainnet; + if (method.includes('wallet_sign')) { + const type = data.type || (data.request as any).type; + const walletSignData = data.data || (data.request as any).data; + let result: string | null = null; + if (type === '0x01') { + result = await verifySignMsg({ + method: 'eth_signTypedData_v4', + from: data.address?.toLowerCase(), + sign: response, + message: walletSignData, + chain: chain as Chain, + }); + } + if (type === '0x45') { + result = await verifySignMsg({ + method: 'personal_sign', + from: data.address?.toLowerCase(), + sign: response, + message: walletSignData.message, + chain: chain as Chain, + }); + } + if (result) { + setVerifyResult(result); + return; + } + } + const verifyResult = await verifySignMsg({ method, from: data.address?.toLowerCase(), @@ -83,6 +111,7 @@ export function RpcMethodCard({ format, method, params, shortcuts }) { message: data.message, chain: chain as Chain, }); + if (verifyResult) { setVerifyResult(verifyResult); return; @@ -118,7 +147,7 @@ export function RpcMethodCard({ format, method, params, shortcuts }) { } try { const response = (await provider.request({ - method, + method: method.split('#')[0], // so we can use # to add a description in method name params: values, // biome-ignore lint/suspicious/noExplicitAny: old code, refactor soon })) as any; diff --git a/examples/testapp/src/components/RpcMethods/method/ephemeralMethods.ts b/examples/testapp/src/components/RpcMethods/method/ephemeralMethods.ts index 8bb9a75bb..8b98290bd 100644 --- a/examples/testapp/src/components/RpcMethods/method/ephemeralMethods.ts +++ b/examples/testapp/src/components/RpcMethods/method/ephemeralMethods.ts @@ -1,3 +1,4 @@ +import { parseMessage } from '../shortcut/ShortcutType'; import { RpcRequestInput } from './RpcRequestInput'; const walletSendCallsEphemeral: RpcRequestInput = { @@ -16,12 +17,50 @@ const walletSendCallsEphemeral: RpcRequestInput = { ], }; -const walletSignEphemeral: RpcRequestInput = { - method: 'wallet_sign', - params: [{ key: 'message', required: true }], +const walletSignOldSpecEphemeral: RpcRequestInput = { + method: 'wallet_sign#old', + params: [ + { key: 'version', required: true }, + { key: 'type', required: true }, + { key: 'address', required: false }, + { key: 'data', required: true }, + { key: 'capabilities', required: false }, + { key: 'mutableData', required: false }, + ], + format: (data: Record) => [ + { + version: data.version, + type: data.type, + address: data.address, + data: parseMessage(data.data), + capabilities: data.capabilities, + mutableData: data.mutableData, + }, + ], +}; + +const walletSignNewSpecEphemeral: RpcRequestInput = { + method: 'wallet_sign#new', + params: [ + { key: 'version', required: true }, + { key: 'request', required: true }, + { key: 'address', required: false }, + { key: 'capabilities', required: false }, + { key: 'mutableData', required: false }, + ], format: (data: Record) => [ - `0x${Buffer.from(data.message, 'utf8').toString('hex')}`, + { + version: data.version, + request: parseMessage(data.request), + address: data.address, + capabilities: data.capabilities, + mutableData: data.mutableData, + }, ], }; -export const ephemeralMethods = [walletSendCallsEphemeral, walletSignEphemeral]; +export const ephemeralMethods = [ + walletSendCallsEphemeral, + walletSignOldSpecEphemeral, + walletSignNewSpecEphemeral, +]; diff --git a/examples/testapp/src/components/RpcMethods/method/experimentalMethods.ts b/examples/testapp/src/components/RpcMethods/method/experimentalMethods.ts new file mode 100644 index 000000000..168e022e2 --- /dev/null +++ b/examples/testapp/src/components/RpcMethods/method/experimentalMethods.ts @@ -0,0 +1,18 @@ +import { RpcRequestInput } from './RpcRequestInput'; + +const baseRequestInfo: RpcRequestInput = { + method: 'experimental_requestInfo', + params: [ + { + key: 'requests', + required: true, + }, + ], + format: (data: Record) => [ + { + requests: data.requests, + }, + ], +}; + +export const experimentalMethods = [baseRequestInfo]; diff --git a/examples/testapp/src/components/RpcMethods/method/signMessageMethods.ts b/examples/testapp/src/components/RpcMethods/method/signMessageMethods.ts index ee76e6def..564dfb657 100644 --- a/examples/testapp/src/components/RpcMethods/method/signMessageMethods.ts +++ b/examples/testapp/src/components/RpcMethods/method/signMessageMethods.ts @@ -1,4 +1,4 @@ -import { Chain, createPublicClient, http, TypedDataDomain } from 'viem'; +import { Chain, TypedDataDomain, createPublicClient, http } from 'viem'; import { parseMessage } from '../shortcut/ShortcutType'; import { RpcRequestInput } from './RpcRequestInput'; @@ -54,12 +54,54 @@ const ethSignTypedDataV4: RpcRequestInput = { format: (data: Record) => [data.address, parseMessage(data.message)], }; +const walletSignOldSpec: RpcRequestInput = { + method: 'wallet_sign#old', + params: [ + { key: 'version', required: true }, + { key: 'type', required: true }, + { key: 'address', required: false }, + { key: 'data', required: true }, + { key: 'capabilities', required: false }, + ], + format: (data: Record) => [ + { + version: data.version, + type: data.type, + address: data.address, + data: parseMessage(data.data), + capabilities: data.capabilities, + }, + ], +}; + +const walletSignNewSpec: RpcRequestInput = { + method: 'wallet_sign#new', + params: [ + { key: 'version', required: true }, + { key: 'request', required: true }, + { key: 'address', required: false }, + { key: 'capabilities', required: false }, + { key: 'mutableData', required: false }, + ], + format: (data: Record) => [ + { + version: data.version, + request: parseMessage(data.request), + address: data.address, + mutableData: data.mutableData, + capabilities: data.capabilities, + }, + ], +}; + export const signMessageMethods = [ ethSign, personalSign, ethSignTypedDataV1, ethSignTypedDataV3, ethSignTypedDataV4, + walletSignOldSpec, + walletSignNewSpec, ]; export const verifySignMsg = async ({ diff --git a/examples/testapp/src/components/RpcMethods/shortcut/connectionMethodShortcuts.ts b/examples/testapp/src/components/RpcMethods/shortcut/connectionMethodShortcuts.ts index 32c45d21f..92a86d1cd 100644 --- a/examples/testapp/src/components/RpcMethods/shortcut/connectionMethodShortcuts.ts +++ b/examples/testapp/src/components/RpcMethods/shortcut/connectionMethodShortcuts.ts @@ -1,3 +1,4 @@ +import { toHex } from 'viem'; import { ShortcutType } from './ShortcutType'; const walletConnectShortcuts: ShortcutType[] = [ @@ -7,7 +8,7 @@ const walletConnectShortcuts: ShortcutType[] = [ version: '1', capabilities: { signInWithEthereum: { - chainId: 84532, + chainId: toHex(84532), nonce: Math.random().toString(36).substring(2, 15), }, }, diff --git a/examples/testapp/src/components/RpcMethods/shortcut/ephemeralMethodShortcuts.ts b/examples/testapp/src/components/RpcMethods/shortcut/ephemeralMethodShortcuts.ts index bf5ad79ff..f2bf72f65 100644 --- a/examples/testapp/src/components/RpcMethods/shortcut/ephemeralMethodShortcuts.ts +++ b/examples/testapp/src/components/RpcMethods/shortcut/ephemeralMethodShortcuts.ts @@ -1,5 +1,87 @@ import { ShortcutType } from './ShortcutType'; +const PLACEHOLDER_ADDRESS = '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; + +const BASE_PAY_DATA = { + domain: { + chainId: 8453, + name: 'USDC', + verifyingContract: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', + version: '2', + }, + message: { + from: PLACEHOLDER_ADDRESS, + nonce: '0xbda37619d3004dba4ac2491022bc82b7df64c2f68e8a349422c71983a80d16ca', + to: '0xbc4c0191af73c4953b54f21ae0c74b31fc6cb21b', + validAfter: '0', + validBefore: '1914749767655', + value: '10000', + }, + primaryType: 'ReceiveWithAuthorization', + types: { + ReceiveWithAuthorization: [ + { + name: 'from', + type: 'address', + }, + { + name: 'to', + type: 'address', + }, + { + name: 'value', + type: 'uint256', + }, + { + name: 'validAfter', + type: 'uint256', + }, + { + name: 'validBefore', + type: 'uint256', + }, + { + name: 'nonce', + type: 'bytes32', + }, + ], + }, +}; + +const SUBSCRIPTION_DATA = { + domain: { + name: 'Spend Permission Manager', + version: '1', + chainId: 8453, + verifyingContract: '0xf85210B21cC50302F477BA56686d2019dC9b67Ad', + }, + types: { + SpendPermission: [ + { name: 'account', type: 'address' }, + { name: 'spender', type: 'address' }, + { name: 'token', type: 'address' }, + { name: 'allowance', type: 'uint160' }, + { name: 'period', type: 'uint48' }, + { name: 'start', type: 'uint48' }, + { name: 'end', type: 'uint48' }, + { name: 'salt', type: 'uint256' }, + { name: 'extraData', type: 'bytes' }, + ], + }, + primaryType: 'SpendPermission', + message: { + account: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', // Placeholder + spender: '0xd4e17478581878A967aA22d45a5158A9fE96AA08', + token: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', + allowance: '1000000', + period: 86400, + start: 1724264802, + end: 17242884802, + salt: '0x1', + extraData: '0x', + }, +}; + const walletSendCallsEphemeralShortcuts: ShortcutType[] = [ { key: 'wallet_sendCalls', @@ -11,16 +93,62 @@ const walletSendCallsEphemeralShortcuts: ShortcutType[] = [ }, ]; -const walletSignEphemeralShortcuts: ShortcutType[] = [ +const walletSignOldSpecEphemeralShortcuts: ShortcutType[] = [ + { + key: 'Base Pay', + data: { + version: '1.0', + type: '0x01', + data: BASE_PAY_DATA, + mutableData: { + fields: ['message.from'], + }, + }, + }, + { + key: 'Subscription', + data: { + version: '1.0', + type: '0x01', + data: SUBSCRIPTION_DATA, + mutableData: { + fields: ['message.account'], + }, + }, + }, +]; + +const walletSignNewSpecEphemeralShortcuts: ShortcutType[] = [ + { + key: 'Base Pay', + data: { + version: '1.0', + request: { + type: '0x01', + data: BASE_PAY_DATA, + }, + mutableData: { + fields: ['message.from'], + }, + }, + }, { - key: 'wallet_sign', + key: 'Subscription', data: { - message: 'Hello, world!', + version: '1.0', + request: { + type: '0x01', + data: SUBSCRIPTION_DATA, + }, + mutableData: { + fields: ['message.account'], + }, }, }, ]; export const ephemeralMethodShortcutsMap = { wallet_sendCalls: walletSendCallsEphemeralShortcuts, - wallet_sign: walletSignEphemeralShortcuts, + ['wallet_sign#old']: walletSignOldSpecEphemeralShortcuts, + ['wallet_sign#new']: walletSignNewSpecEphemeralShortcuts, }; diff --git a/examples/testapp/src/components/RpcMethods/shortcut/experimentalShortcuts.ts b/examples/testapp/src/components/RpcMethods/shortcut/experimentalShortcuts.ts new file mode 100644 index 000000000..692e5a229 --- /dev/null +++ b/examples/testapp/src/components/RpcMethods/shortcut/experimentalShortcuts.ts @@ -0,0 +1,29 @@ +import { ShortcutType } from './ShortcutType'; + +const experimentalRequestInfoShortcut: ShortcutType = { + key: 'Experimental Request Info', + data: { + requests: [ + { + type: 'email' as const, + optional: true, + }, + { + type: 'physicalAddress' as const, + optional: true, + }, + { + type: 'name' as const, + optional: false, + }, + { + type: 'phoneNumber' as const, + optional: false, + }, + ], + }, +}; + +export const baseProfileShortcutsMap: Record = { + experimental_requestInfo: [experimentalRequestInfoShortcut], +}; diff --git a/examples/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts b/examples/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts index 8bb571fc4..294c96865 100644 --- a/examples/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts +++ b/examples/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts @@ -1,5 +1,102 @@ -import { ADDR_TO_FILL, EXAMPLE_MESSAGE } from './const'; import { ShortcutType } from './ShortcutType'; +import { ADDR_TO_FILL, EXAMPLE_MESSAGE } from './const'; + +const TYPED_DATA_V4_DATA = { + domain: { + chainId: '84532', + name: 'Ether Mail', + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + version: '1', + }, + message: { + contents: 'Hello, Bob!', + from: { + name: 'Cow', + wallets: [ + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF', + ], + }, + to: [ + { + name: 'Bob', + wallets: [ + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + '0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57', + '0xB0B0b0b0b0b0B000000000000000000000000000', + ], + }, + ], + }, + primaryType: 'Mail', + types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' }, + ], + Group: [ + { name: 'name', type: 'string' }, + { name: 'members', type: 'Person[]' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person[]' }, + { name: 'contents', type: 'string' }, + ], + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallets', type: 'address[]' }, + ], + }, +}; + +const BASE_PAY_DATA = { + domain: { + chainId: 8453, + name: 'USDC', + verifyingContract: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', + version: '2', + }, + message: { + from: ADDR_TO_FILL, + nonce: '0xbda37619d3004dba4ac2491022bc82b7df64c2f68e8a349422c71983a80d16ca', + to: '0xbc4c0191af73c4953b54f21ae0c74b31fc6cb21b', + validAfter: '0', + validBefore: '1914749767655', + value: '10000', + }, + primaryType: 'ReceiveWithAuthorization', + types: { + ReceiveWithAuthorization: [ + { + name: 'from', + type: 'address', + }, + { + name: 'to', + type: 'address', + }, + { + name: 'value', + type: 'uint256', + }, + { + name: 'validAfter', + type: 'uint256', + }, + { + name: 'validBefore', + type: 'uint256', + }, + { + name: 'nonce', + type: 'bytes32', + }, + ], + }, +}; const personalSignShortcuts: ShortcutType[] = [ { @@ -77,56 +174,7 @@ const ethSignTypedDataV4Shortcuts: (chainId: number) => ShortcutType[] = (chainI { key: EXAMPLE_MESSAGE, data: { - message: { - domain: { - chainId, - name: 'Ether Mail', - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - version: '1', - }, - message: { - contents: 'Hello, Bob!', - from: { - name: 'Cow', - wallets: [ - '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - '0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF', - ], - }, - to: [ - { - name: 'Bob', - wallets: [ - '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - '0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57', - '0xB0B0b0b0b0b0B000000000000000000000000000', - ], - }, - ], - }, - primaryType: 'Mail', - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'chainId', type: 'uint256' }, - { name: 'verifyingContract', type: 'address' }, - ], - Group: [ - { name: 'name', type: 'string' }, - { name: 'members', type: 'Person[]' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person[]' }, - { name: 'contents', type: 'string' }, - ], - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallets', type: 'address[]' }, - ], - }, - }, + message: TYPED_DATA_V4_DATA, address: ADDR_TO_FILL, }, }, @@ -171,9 +219,81 @@ const ethSignTypedDataV4Shortcuts: (chainId: number) => ShortcutType[] = (chainI }, ]; +const walletSignOldSpecShortcuts: ShortcutType[] = [ + { + key: 'Base Pay', + data: { + version: '1.0', + type: '0x01', + address: ADDR_TO_FILL, + data: BASE_PAY_DATA, + }, + }, + { + key: 'Typed Data', + data: { + version: '1.0', + type: '0x01', + address: ADDR_TO_FILL, + data: TYPED_DATA_V4_DATA, + }, + }, + { + key: 'Personal Sign', + data: { + version: '1.0', + type: '0x45', + address: ADDR_TO_FILL, + data: { + message: 'Hello, World!', + }, + }, + }, +]; + +const walletSignNewSpecShortcuts: ShortcutType[] = [ + { + key: 'Base Pay', + data: { + version: '1.0', + request: { + type: '0x01', + data: BASE_PAY_DATA, + }, + address: ADDR_TO_FILL, + }, + }, + { + key: 'Typed Data', + data: { + version: '1.0', + request: { + type: '0x01', + data: TYPED_DATA_V4_DATA, + }, + address: ADDR_TO_FILL, + }, + }, + { + key: 'Personal Sign', + data: { + version: '1.0', + request: { + type: '0x45', + data: { + message: 'Hello, World!', + }, + }, + address: ADDR_TO_FILL, + }, + }, +]; + export const signMessageShortcutsMap = (chainId: number) => ({ personal_sign: personalSignShortcuts, eth_signTypedData_v1: ethSignTypedDataV1Shortcuts, eth_signTypedData_v3: ethSignTypedDataV3Shortcuts(chainId), eth_signTypedData_v4: ethSignTypedDataV4Shortcuts(chainId), + ['wallet_sign#old']: walletSignOldSpecShortcuts, + ['wallet_sign#new']: walletSignNewSpecShortcuts, }); diff --git a/examples/testapp/src/components/RpcMethods/shortcut/walletTxShortcuts.ts b/examples/testapp/src/components/RpcMethods/shortcut/walletTxShortcuts.ts index f5aba0ce5..81601cde6 100644 --- a/examples/testapp/src/components/RpcMethods/shortcut/walletTxShortcuts.ts +++ b/examples/testapp/src/components/RpcMethods/shortcut/walletTxShortcuts.ts @@ -16,6 +16,39 @@ const walletSendCallsShortcuts: ShortcutType[] = [ }, }, }, + { + key: 'data_callback', + data: { + chainId: CHAIN_ID_TO_FILL, + from: ADDR_TO_FILL, + calls: [], + version: '1', + capabilities: { + paymaster: { + url: 'https://paymaster.base.org', + }, + dataCallback: { + requests: [ + { + type: 'email' as const, + optional: false, + }, + { + type: 'physicalAddress' as const, + optional: true, + }, + { + type: 'phoneNumber' as const, + optional: false, + }, + { + type: 'name' as const, + }, + ], + }, + }, + }, + }, ]; export const walletTxShortcutsMap = { diff --git a/examples/testapp/src/context/EIP1193ProviderContextProvider.test.tsx b/examples/testapp/src/context/EIP1193ProviderContextProvider.test.tsx index aaa43effc..20ba1296e 100644 --- a/examples/testapp/src/context/EIP1193ProviderContextProvider.test.tsx +++ b/examples/testapp/src/context/EIP1193ProviderContextProvider.test.tsx @@ -49,7 +49,9 @@ describe('EIP1193ProviderContextProvider', () => { setScwUrlAndSave: vi.fn(), setConfig: vi.fn(), subAccountsConfig: { - enableAutoSubAccounts: true, + creation: 'on-connect', + defaultAccount: 'sub', + funding: 'spend-permissions', }, setSubAccountsConfig: vi.fn(), }); @@ -88,7 +90,9 @@ describe('EIP1193ProviderContextProvider', () => { walletUrl: 'https://keys-dev.coinbase.com/connect', }, subAccounts: { - enableAutoSubAccounts: true, + creation: 'on-connect', + defaultAccount: 'sub', + funding: 'spend-permissions', }, }); expect(screen.getByTestId('sdk-exists')).toBeTruthy(); @@ -103,7 +107,9 @@ describe('EIP1193ProviderContextProvider', () => { scwUrl: 'https://keys-dev.coinbase.com/connect', config: { attribution: { dataSuffix: '0xtestattribution' } }, subAccountsConfig: { - enableAutoSubAccounts: true, + creation: 'on-connect', + defaultAccount: 'sub', + funding: 'spend-permissions', }, setSDKVersion: vi.fn(), setScwUrlAndSave: vi.fn(), @@ -125,7 +131,9 @@ describe('EIP1193ProviderContextProvider', () => { walletUrl: 'https://keys-dev.coinbase.com/connect', }, subAccounts: { - enableAutoSubAccounts: true, + creation: 'on-connect', + defaultAccount: 'sub', + funding: 'spend-permissions', }, }); }); diff --git a/examples/testapp/src/pages/add-sub-account/components/AddSubAccount.tsx b/examples/testapp/src/pages/add-sub-account/components/AddSubAccount.tsx index a9377bae8..589277fd5 100644 --- a/examples/testapp/src/pages/add-sub-account/components/AddSubAccount.tsx +++ b/examples/testapp/src/pages/add-sub-account/components/AddSubAccount.tsx @@ -1,5 +1,6 @@ import { createBaseAccountSDK, getCryptoKeyAccount } from '@base-org/account'; -import { Box, Button } from '@chakra-ui/react'; +import { ExternalLinkIcon } from '@chakra-ui/icons'; +import { Box, Button, HStack, Link, Text } from '@chakra-ui/react'; import { useCallback, useState } from 'react'; import { numberToHex } from 'viem'; @@ -62,6 +63,17 @@ export function AddSubAccount({ sdk, onAddSubAccount, signerFn }: AddSubAccountP return ( <> + + wallet_addSubAccount + + Docs + + + + + Send Method + setSendMethod(value)}> + + eth_sendTransaction + wallet_sendCalls (with paymaster) + + + Send @@ -587,12 +932,12 @@ export default function AutoSubAccount() { Send USDC - {['0.01', '0.1', '1'].map((amount) => ( + {['0.001', '0.01', '0.1', '1'].map((amount) => ( + + + {accounts.length === 0 ? ( + + + No test accounts yet. Click "Generate New Account" to create one. + + + ) : ( + accounts.map((account, index) => ( + + + + + + Account #{index + 1} + + + {account.isDeployed ? 'Deployed' : 'Undeployed'} + + + } + size="sm" + colorScheme="red" + variant="ghost" + onClick={() => onRemoveAccount(account.stored.id)} + /> + + + + + Address + + + + {truncateAddress(account.smartAccount.address)} + + } + size="xs" + variant="ghost" + onClick={() => handleCopyAddress(account.smartAccount.address)} + /> + + + + + + Chain + + + + Base Sepolia + + + {baseSepolia.id} + + + + + + + + handleLabelChange(account.stored.id, e.target.value)} + bg="gray.50" + _dark={{ bg: 'gray.800' }} + /> + + {!account.isDeployed && ( + onAccountDeployed(account.stored.id)} + /> + )} + + {account.isDeployed && !ownershipStatus[account.stored.id] && ( + <> + + + ⚠️ Connected address is not an owner. Add yourself as an owner first. + + + handleOwnerAdded(account.stored.id)} + /> + + )} + + + + + + )) + )} + + ); +} diff --git a/examples/testapp/src/pages/import-sub-account/components/AddGlobalOwner.tsx b/examples/testapp/src/pages/import-sub-account/components/AddGlobalOwner.tsx index 938b3e066..e0cf78d72 100644 --- a/examples/testapp/src/pages/import-sub-account/components/AddGlobalOwner.tsx +++ b/examples/testapp/src/pages/import-sub-account/components/AddGlobalOwner.tsx @@ -9,26 +9,31 @@ import { abi } from '../../../constants'; export function AddGlobalOwner({ sdk, subAccount, + onOwnerAdded, }: { sdk: ReturnType; subAccount: SmartAccount; + onOwnerAdded?: () => void; }) { const [state, setState] = useState(); + const [isAdding, setIsAdding] = useState(false); const handleAddGlobalOwner = useCallback(async () => { - if (!sdk) { + if (!sdk || isAdding) { return; } - const provider = sdk.getProvider(); - const accounts = await provider.request({ - method: 'eth_accounts', - }); - - // biome-ignore lint/suspicious/noConsole: internal logging - console.log('customlogs: accounts', accounts); + setIsAdding(true); try { + const provider = sdk.getProvider(); + const accounts = await provider.request({ + method: 'eth_accounts', + }); + + // biome-ignore lint/suspicious/noConsole: internal logging + console.log('customlogs: accounts', accounts); + const client = createPublicClient({ chain: baseSepolia, transport: http(), @@ -46,7 +51,7 @@ export function AddGlobalOwner({ ), paymaster: paymasterClient, }); - // @ts-expect-error + // @ts-ignore const hash = await bundlerClient.sendUserOperation({ calls: [ { @@ -62,26 +67,37 @@ export function AddGlobalOwner({ }); console.info('response', hash); - setState(hash as string); + setState(`Adding owner... UserOp: ${hash as string}`); + + // Wait a bit for the transaction to be processed + setTimeout(() => { + setState(`Owner added! UserOp: ${hash as string}`); + onOwnerAdded?.(); + }, 2000); } catch (e) { console.error('error', e); + setState(`Error: ${e instanceof Error ? e.message : 'Unknown error'}`); + } finally { + setIsAdding(false); } - }, [sdk, subAccount]); + }, [sdk, subAccount, onOwnerAdded, isAdding]); return ( <> )} diff --git a/examples/testapp/src/pages/index.page.tsx b/examples/testapp/src/pages/index.page.tsx index 9eb4ddc51..2b1aa68ec 100644 --- a/examples/testapp/src/pages/index.page.tsx +++ b/examples/testapp/src/pages/index.page.tsx @@ -6,6 +6,7 @@ import { WIDTH_2XL } from '../components/Layout'; import { MethodsSection } from '../components/MethodsSection/MethodsSection'; import { connectionMethods } from '../components/RpcMethods/method/connectionMethods'; import { ephemeralMethods } from '../components/RpcMethods/method/ephemeralMethods'; +import { experimentalMethods } from '../components/RpcMethods/method/experimentalMethods'; import { multiChainMethods } from '../components/RpcMethods/method/multiChainMethods'; import { readonlyJsonRpcMethods } from '../components/RpcMethods/method/readonlyJsonRpcMethods'; import { sendMethods } from '../components/RpcMethods/method/sendMethods'; @@ -13,6 +14,7 @@ import { signMessageMethods } from '../components/RpcMethods/method/signMessageM import { walletTxMethods } from '../components/RpcMethods/method/walletTxMethods'; import { connectionMethodShortcutsMap } from '../components/RpcMethods/shortcut/connectionMethodShortcuts'; import { ephemeralMethodShortcutsMap } from '../components/RpcMethods/shortcut/ephemeralMethodShortcuts'; +import { baseProfileShortcutsMap } from '../components/RpcMethods/shortcut/experimentalShortcuts'; import { multiChainShortcutsMap } from '../components/RpcMethods/shortcut/multipleChainShortcuts'; import { readonlyJsonRpcShortcutsMap } from '../components/RpcMethods/shortcut/readonlyJsonRpcShortcuts'; import { sendShortcutsMap } from '../components/RpcMethods/shortcut/sendShortcuts'; @@ -23,8 +25,7 @@ import { useEIP1193Provider } from '../context/EIP1193ProviderContextProvider'; export default function Home() { const { provider } = useEIP1193Provider(); - // @ts-expect-error refactor soon - const [connected, setConnected] = React.useState(Boolean(provider?.connected)); + const [connected, setConnected] = React.useState(false); const [chainId, setChainId] = React.useState(undefined); // This is for Extension compatibility, Extension with SDK3.9 does not emit connect event // correctly, so we manually check if the extension is connected, and set the connected state @@ -40,21 +41,19 @@ export default function Home() { setConnected(true); }); provider?.on('chainChanged', (newChainId) => { - // @ts-expect-error refactor soon - setChainId(newChainId); + setChainId(Number.parseInt(newChainId as string, 16)); }); }, [provider]); useEffect(() => { if (connected) { provider?.request({ method: 'eth_chainId' }).then((chainId) => { - // @ts-expect-error refactor soon - setChainId(Number.parseInt(chainId, 16)); + setChainId(Number.parseInt(chainId as string, 16)); }); } // Injected provider does not emit a 'connect' event - // @ts-expect-error refactor soon + // @ts-expect-error isCoinbaseBrowser only exists on injected providers if (provider?.isCoinbaseBrowser) { setConnected(true); } @@ -86,6 +85,11 @@ export default function Home() { methods={ephemeralMethods} shortcutsMap={ephemeralMethodShortcutsMap} /> + {shouldShowMethodsRequiringConnection && ( <> {/* pay Section */}
-

pay Function

+
+

pay Function

+ + Docs ↗ + +

Send USDC payments on Base

@@ -109,7 +119,17 @@ try { {/* getPaymentStatus Section */}
-

getPaymentStatus Function

+
+

getPaymentStatus Function

+ + Docs ↗ + +

Check the status of a payment

diff --git a/examples/testapp/src/pages/pay-playground/styles/Home.module.css b/examples/testapp/src/pages/pay-playground/styles/Home.module.css index 6b77a8335..e6a0fe494 100644 --- a/examples/testapp/src/pages/pay-playground/styles/Home.module.css +++ b/examples/testapp/src/pages/pay-playground/styles/Home.module.css @@ -16,6 +16,12 @@ margin-bottom: 4rem; } +.sectionHeader { + display: flex; + align-items: center; + gap: 1rem; +} + .sectionTitle { font-size: 2rem; font-weight: 700; @@ -23,6 +29,18 @@ margin-bottom: 0.5rem; } +.docsLink { + color: #3b82f6; + text-decoration: none; + font-size: 0.875rem; + transition: color 0.2s ease; +} + +.docsLink:hover { + color: #2563eb; + text-decoration: underline; +} + .sectionDescription { font-size: 1.125rem; color: #64748b; diff --git a/examples/testapp/src/pages/payment/index.page.tsx b/examples/testapp/src/pages/payment/index.page.tsx index 7dd38af9a..a8cf6e00b 100644 --- a/examples/testapp/src/pages/payment/index.page.tsx +++ b/examples/testapp/src/pages/payment/index.page.tsx @@ -1,4 +1,5 @@ import { type PaymentResult, type PaymentStatus, getPaymentStatus, pay } from '@base-org/account'; +import { ExternalLinkIcon } from '@chakra-ui/icons'; import { Accordion, AccordionButton, @@ -16,6 +17,7 @@ import { HStack, Heading, Input, + Link, Select, Switch, Text, @@ -228,7 +230,17 @@ export default function Payment() { {/* Pay Section */} - Send Payment + + Send Payment + + Docs + + @@ -451,7 +463,17 @@ export default function Payment() { {/* Status Check Section */} - Check Payment Status + + Check Payment Status + + Docs + + Use Testnet diff --git a/examples/testapp/src/pages/prolink-playground/index.page.tsx b/examples/testapp/src/pages/prolink-playground/index.page.tsx new file mode 100644 index 000000000..815f5afac --- /dev/null +++ b/examples/testapp/src/pages/prolink-playground/index.page.tsx @@ -0,0 +1,943 @@ +import { createProlinkUrl, decodeProlink, encodeProlink } from '@base-org/account'; +import { ExternalLinkIcon } from '@chakra-ui/icons'; +import { + Box, + Button, + Code, + Container, + Divider, + FormControl, + FormLabel, + HStack, + Heading, + Input, + Link, + Select, + Switch, + Tab, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, + Textarea, + VStack, + useColorModeValue, + useToast, +} from '@chakra-ui/react'; +import { QRCodeSVG } from 'qrcode.react'; +import { useEffect, useState } from 'react'; +import { encodeFunctionData, type Address } from 'viem'; + +// Token configuration +const TOKENS = { + USDC: { + name: 'USDC', + decimals: 6, + addresses: { + '8453': '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // Base mainnet + '84532': '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Base Sepolia + '1': '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // Ethereum mainnet + }, + }, + ETH: { + name: 'ETH', + decimals: 18, + addresses: { + '8453': '0x0000000000000000000000000000000000000000', + '84532': '0x0000000000000000000000000000000000000000', + '1': '0x0000000000000000000000000000000000000000', + }, + }, +} as const; + +// ERC20 transfer ABI +const ERC20_TRANSFER_ABI = [ + { + name: 'transfer', + type: 'function', + stateMutability: 'nonpayable', + inputs: [ + { name: 'to', type: 'address' }, + { name: 'amount', type: 'uint256' }, + ], + outputs: [{ name: '', type: 'bool' }], + }, +] as const; + +export default function ProlinkPlayground() { + const toast = useToast(); + + // Color mode values + const bgColor = useColorModeValue('white', 'gray.800'); + const borderColor = useColorModeValue('gray.200', 'gray.600'); + const codeBgColor = useColorModeValue('gray.50', 'gray.900'); + const simpleModeBgColor = useColorModeValue('blue.50', 'blue.900'); + const simpleModeBorderColor = useColorModeValue('blue.200', 'blue.700'); + + // Method selection + const [methodType, setMethodType] = useState<'wallet_sendCalls' | 'generic'>('wallet_sendCalls'); + + // Common fields + const [chainId, setChainId] = useState('84532'); // Base Sepolia (testnet) + + // wallet_sendCalls fields + const [callsTo, setCallsTo] = useState('0x036CbD53842c5426634e7929541eC2318f3dCF7e'); // USDC on Base Sepolia + const [callsData, setCallsData] = useState( + '0xa9059cbb000000000000000000000000fe21034794a5a574b94fe4fdfd16e005f1c96e5100000000000000000000000000000000000000000000000000000000004c4b40' + ); // ERC20 transfer + const [callsValue, setCallsValue] = useState('0x0'); + const [callsVersion, setCallsVersion] = useState('1.0'); + + // Simple mode for wallet_sendCalls + const [useSimpleMode, setUseSimpleMode] = useState(true); + const [selectedToken, setSelectedToken] = useState<'USDC' | 'ETH'>('USDC'); + const [tokenAmount, setTokenAmount] = useState('10000'); // 1 cent USDC in wei (6 decimals) + const [recipientAddress, setRecipientAddress] = useState( + '0xfe21034794a5a574b94fe4fdfd16e005f1c96e51' + ); + + // Generic JSON-RPC fields + const [genericMethod, setGenericMethod] = useState('eth_sendTransaction'); + const [genericParams, setGenericParams] = useState( + JSON.stringify( + [ + { + from: '0x1111111111111111111111111111111111111111', + to: '0x2222222222222222222222222222222222222222', + value: '0x100', + data: '0x', + }, + ], + null, + 2 + ) + ); + + // Capabilities + const [useCapabilities, setUseCapabilities] = useState(false); + const [capabilitiesJson, setCapabilitiesJson] = useState( + JSON.stringify( + { + dataCallback: { + callbackURL: 'https://example.com/callback', + events: [ + { type: 'initiated', context: { orderId: '123' } }, + { type: 'preSign', context: { shippingTier: 'express' } }, + { type: 'postSign', context: { webhookTag: 'after' } }, + ], + }, + }, + null, + 2 + ) + ); + + // Results + const [loading, setLoading] = useState(false); + const [encodedPayload, setEncodedPayload] = useState(''); + const [error, setError] = useState(null); + const [decodedResult, setDecodedResult] = useState(null); + const [webhookUuid, setWebhookUuid] = useState(null); + + // Decode section + const [decodeInput, setDecodeInput] = useState(''); + const [decodeLoading, setDecodeLoading] = useState(false); + const [decodeError, setDecodeError] = useState(null); + const [decodeResult, setDecodeResult] = useState(null); + + // Compute base deeplink from encoded payload + const baseDeeplink = encodedPayload ? createProlinkUrl(encodedPayload) : null; + + // Auto-update calldata when simple mode fields change + useEffect(() => { + if (!useSimpleMode || !methodType || methodType !== 'wallet_sendCalls') return; + + try { + const token = TOKENS[selectedToken]; + const tokenAddress = + token.addresses[chainId as keyof typeof token.addresses] || token.addresses['8453']; + + if (selectedToken === 'ETH') { + // For ETH, set value and empty calldata + setCallsTo(recipientAddress); + setCallsData('0x'); + const amountInWei = BigInt(tokenAmount || '0'); + setCallsValue(`0x${amountInWei.toString(16)}`); + } else { + // For ERC20 (USDC), encode transfer calldata using wei amount directly + setCallsTo(tokenAddress); + setCallsValue('0x0'); + const amountInWei = BigInt(tokenAmount || '0'); + const calldata = encodeFunctionData({ + abi: ERC20_TRANSFER_ABI, + functionName: 'transfer', + args: [recipientAddress as Address, amountInWei], + }); + setCallsData(calldata); + } + } catch (error) { + // Invalid input, don't update + console.error('Error encoding calldata:', error); + } + }, [useSimpleMode, selectedToken, tokenAmount, recipientAddress, chainId, methodType]); + + // Auto-generate webhook.site URL when capabilities are enabled + useEffect(() => { + if (!useCapabilities) return; + + const generateWebhook = async () => { + try { + // Use CORS proxy to avoid CORS issues in the browser + const response = await fetch('https://corsproxy.io/?https://webhook.site/token', { + method: 'POST', + }); + const data = await response.json(); + + if (data.uuid) { + setWebhookUuid(data.uuid); + + // Update capabilities JSON with the webhook URL + const capabilities = { + dataCallback: { + callbackURL: `https://webhook.site/${data.uuid}`, + events: [ + { type: 'initiated', context: { orderId: '123' } }, + { type: 'preSign', context: { shippingTier: 'express' } }, + { type: 'postSign', context: { webhookTag: 'after' } }, + ], + }, + }; + setCapabilitiesJson(JSON.stringify(capabilities, null, 2)); + + toast({ + title: 'Webhook generated!', + description: 'A temporary webhook.site URL has been created', + status: 'success', + duration: 3000, + }); + } + } catch (error) { + console.error('Error generating webhook:', error); + toast({ + title: 'Failed to generate webhook', + description: 'Could not create webhook.site URL', + status: 'error', + duration: 3000, + }); + } + }; + + generateWebhook(); + }, [useCapabilities, toast]); + + const generateProlink = async () => { + setLoading(true); + setError(null); + setEncodedPayload(''); + setDecodedResult(null); + + try { + let request: { + method: string; + params: unknown; + chainId?: number; + capabilities?: Record; + }; + + if (methodType === 'wallet_sendCalls') { + request = { + method: 'wallet_sendCalls', + params: [ + { + version: callsVersion, + chainId: `0x${Number.parseInt(chainId).toString(16)}`, + calls: [ + { + to: callsTo, + data: callsData, + value: callsValue, + }, + ], + }, + ], + }; + } else { + // generic + request = { + method: genericMethod, + params: JSON.parse(genericParams), + chainId: Number.parseInt(chainId), + }; + } + + // Add capabilities if enabled + if (useCapabilities) { + try { + request.capabilities = JSON.parse(capabilitiesJson); + } catch (e) { + throw new Error( + `Invalid capabilities JSON: ${e instanceof Error ? e.message : 'unknown'}` + ); + } + } + + // Encode the prolink + const payload = await encodeProlink(request); + setEncodedPayload(payload); + + // Decode to verify + const decoded = await decodeProlink(payload); + setDecodedResult(decoded); + + toast({ + title: 'Prolink generated!', + description: `Payload size: ${payload.length} characters`, + status: 'success', + duration: 3000, + }); + } catch (e) { + const errorMessage = e instanceof Error ? e.message : 'Unknown error'; + setError(errorMessage); + toast({ + title: 'Error generating prolink', + description: errorMessage, + status: 'error', + duration: 5000, + }); + } finally { + setLoading(false); + } + }; + + const copyToClipboard = async () => { + try { + await navigator.clipboard.writeText(encodedPayload); + toast({ + title: 'Copied!', + description: 'Payload copied to clipboard', + status: 'success', + duration: 2000, + }); + } catch (_error) { + toast({ + title: 'Failed to copy', + description: 'Please copy the payload manually', + status: 'error', + duration: 3000, + }); + } + }; + + const copyDeeplinkToClipboard = async () => { + if (baseDeeplink) { + try { + await navigator.clipboard.writeText(baseDeeplink); + toast({ + title: 'Copied!', + description: 'Base deeplink copied to clipboard', + status: 'success', + duration: 2000, + }); + } catch (_error) { + toast({ + title: 'Failed to copy', + description: 'Please copy the link manually', + status: 'error', + duration: 3000, + }); + } + } + }; + + const decodePayload = async () => { + setDecodeLoading(true); + setDecodeError(null); + setDecodeResult(null); + + try { + const decoded = await decodeProlink(decodeInput.trim()); + setDecodeResult(decoded); + + toast({ + title: 'Prolink decoded!', + description: `Method: ${decoded.method}`, + status: 'success', + duration: 3000, + }); + } catch (e) { + const errorMessage = e instanceof Error ? e.message : 'Unknown error'; + setDecodeError(errorMessage); + toast({ + title: 'Error decoding prolink', + description: errorMessage, + status: 'error', + duration: 5000, + }); + } finally { + setDecodeLoading(false); + } + }; + + const copyDecodedToClipboard = async () => { + try { + await navigator.clipboard.writeText(JSON.stringify(decodeResult, null, 2)); + toast({ + title: 'Copied!', + description: 'Decoded result copied to clipboard', + status: 'success', + duration: 2000, + }); + } catch (_error) { + toast({ + title: 'Failed to copy', + description: 'Please copy the result manually', + status: 'error', + duration: 3000, + }); + } + }; + + return ( + + + Prolink Playground + + Encode and decode compressed, URL-safe payloads for wallet_sendCalls and generic JSON-RPC + requests + + + + + Encode + Decode + + + + {/* Encode Tab */} + + + encodeProlink + + Docs + + + {/* Method Selection */} + + + + Method Type + + + + + + {/* Method-specific fields */} + {methodType === 'wallet_sendCalls' && ( + + + wallet_sendCalls Parameters + + + Advanced Mode + + setUseSimpleMode(!e.target.checked)} + colorScheme="blue" + /> + + + + + Chain ID + + + + Version + setCallsVersion(e.target.value)} + /> + + + {useSimpleMode ? ( + <> + {/* Simple Mode: Token selector and amount */} + + + + Token + + + + Amount (wei) + setTokenAmount(e.target.value)} + placeholder="10000" + bg={bgColor} + /> + + {selectedToken === 'USDC' + ? '10000 = $0.01 (USDC has 6 decimals)' + : '1000 = 0.000000000000001 ETH (dust)'} + + + + Recipient Address + setRecipientAddress(e.target.value)} + placeholder="0x..." + bg={bgColor} + /> + + + Calldata will be automatically encoded based on your selection + + + + + {/* Show computed values */} + + + + Generated Calldata + + + To Address + + + + Data (hex) +