Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

PR: claim permit in gift cards #226

Merged
merged 101 commits into from
Jun 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
90ee27f
feat: claim permit in gift cards
EresDev Apr 23, 2024
5426f77
refactor: move addresses to constants from env
EresDev May 13, 2024
e0a787b
fix: compares owner address case insensitive
EresDev May 13, 2024
7a61714
fix: deduct fee from reward amount
EresDev May 13, 2024
abf145f
fix: show unavailable range cards price correctly
EresDev May 13, 2024
2aada64
refactor: rename func to clear its effect
EresDev May 13, 2024
52c0979
fix: use correct pricing for gift card
EresDev May 16, 2024
f1d58c3
refactor: move pricing & duplicatre code to proper files/vars
EresDev May 16, 2024
9ebe8f0
fix: offer only visa & mastercard
EresDev May 16, 2024
47e644e
fix: add disclaimer below gift cards list
EresDev May 16, 2024
56cba03
docs: add info about API base url
EresDev May 16, 2024
cf21902
fix: allow only ERC20 permit to claim card
EresDev May 16, 2024
f056b9d
fix: prevent large prices to take second line on cards list
EresDev May 16, 2024
ed6c28e
chore: run missing yarn install from previous merge
EresDev May 16, 2024
afe5f9e
chore: handle cspell warnings by listing & fixing words
EresDev May 16, 2024
84763f3
refactor: replace word usage product with gift-card
EresDev May 16, 2024
8d18bba
fix: check permit transfers correct erc20 token on claim gift card
EresDev May 17, 2024
7cc3fc5
fix: check permit token owner is correct on claim gift card
EresDev May 17, 2024
8fe9b2b
fix: validate correct token transfer on different chains
EresDev May 17, 2024
83b816a
refactor: allow tests to generate permits without CLI
EresDev May 21, 2024
bd17ddb
fix: show price/value upto 2 decimals in title
EresDev May 21, 2024
eff0545
test: add tests for claiming gift cards
EresDev May 21, 2024
d12b9bb
fix: add date filter to retrieve old order
EresDev May 22, 2024
0e909ec
test: ignore balance because it changes with tests
EresDev May 22, 2024
082f52b
chore: fix spell
EresDev May 22, 2024
678ca44
fix: run wrangler in workflow for backend in tests
EresDev May 23, 2024
e28ac13
fix: use reloadly sandbox by default
EresDev May 23, 2024
5dee0f7
fix: log if using reloadly sandbox or not
EresDev May 23, 2024
c16253d
fix: change anvil RPC to fork for tests
EresDev May 23, 2024
530f3d1
fix: start wrangler in action for tests backend
EresDev May 23, 2024
fa20756
fix: only show visa & mastercard
EresDev May 23, 2024
878d7cb
test: buy minimum available visa or mastercard
EresDev May 23, 2024
ae9b341
test: reveal code of already claimed visa
EresDev May 23, 2024
d4f8be2
fix: remove fixed chainId from test for gift card claim
EresDev May 23, 2024
926e9f1
fix: wait 2 sec for page to laod in test
EresDev May 23, 2024
3212a26
fix: remove invalid expectation from test
EresDev May 23, 2024
9f770ae
test: extract interceptors to remove duplication
EresDev May 24, 2024
cf608e5
refactor: rename var
EresDev May 24, 2024
e695cac
test: make claim gift card test more reliable
EresDev May 24, 2024
238aae3
fix: return 404 if order not found insteaf of 500
EresDev May 24, 2024
0ed7b52
refactor: change types to interfaces
EresDev May 25, 2024
4de57e0
refactor: rename interface
EresDev May 25, 2024
20c830d
refactor: replace types with interfaces
EresDev May 25, 2024
2e3d5e9
fix: align gift cards to center when less than 3
EresDev May 25, 2024
1963c65
fix: remove unnecessary text
EresDev May 25, 2024
1bd43f1
fix: inform properly when gift card unavailable
EresDev May 25, 2024
d5503a0
refactor: load visa & mastercard concurrently
EresDev May 25, 2024
2cfabc9
fix: reload gift cards when next/prev permit loads
EresDev May 25, 2024
b09fb16
fix: use websocket rpc for faster & reliable tests
EresDev May 25, 2024
1bb6211
fix: improve light mode support for gift cards
EresDev May 25, 2024
344befd
fix: separate matching & available price
EresDev May 25, 2024
8736d1a
refactor: rename function
EresDev May 25, 2024
376c9f2
fix: show gift card loader on page load
EresDev May 25, 2024
56d7a95
fix: await before printing in erc20 permit gen
EresDev May 25, 2024
f9b16c0
chore: use wrangler to server UI & backend
EresDev May 25, 2024
8fa0b09
chore: add gnosischain to accepted words in cspell
EresDev May 25, 2024
c0e71f7
chore: remove tenderly rpc
EresDev May 27, 2024
3c056ca
chore: show mastercard before visa cards
EresDev May 27, 2024
de33f42
fix: prevent exception on zero value
EresDev May 27, 2024
acec598
fix: reuse existing permit health check
EresDev May 27, 2024
1d89eea
fix: make the height of card img fixed to align
EresDev May 27, 2024
8cce139
fix: check of negative status to fail an order
EresDev May 27, 2024
ec7292a
fix: make redeem code visible as case sensitive & wrapped
EresDev May 27, 2024
4fb3568
fix: improve order processing messages
EresDev May 27, 2024
76916a3
test: update gift card order msgs assertions
EresDev May 27, 2024
77c1cbf
Merge branch 'development' of https://github.com/ubiquity/pay.ubq.fi …
EresDev May 27, 2024
1135a4f
chore: run missed yarn install from previous merge
EresDev May 31, 2024
214f730
refactor: change arrow functions to named functions
EresDev May 31, 2024
ae48f8a
refactor: reduce function complexity
EresDev May 31, 2024
7732866
refactor: replace string concatination with array push
EresDev May 31, 2024
70381cc
refactor: move disclaimer to static html
EresDev May 31, 2024
2a2325a
refactor: utilize run-s to run seq start scripts
EresDev May 31, 2024
5ae08db
refactor: shorten the variable name
EresDev May 31, 2024
4ec8c66
fix: use fastest rpc from @ubiquity-dao/rpc-handler
EresDev Jun 3, 2024
c4b1d6b
fix: fork anvil network from fastest rpc
EresDev Jun 3, 2024
76daaba
fix: prevent nonce collision on fund
EresDev Jun 3, 2024
222bd0c
refactor: remove unnecessary & error-prone code
EresDev Jun 3, 2024
68dfa23
fix: use new cloudflare deploy action
EresDev Jun 8, 2024
4d32dac
fix: readme
Keyrxng Jun 10, 2024
135951a
chore: readme what to expect
Keyrxng Jun 10, 2024
1d197c6
chore: readme remove cloudflare steps
Keyrxng Jun 10, 2024
049eae5
fix: barely english
Keyrxng Jun 10, 2024
9992a62
chore: readme title, desc and rearrange
Keyrxng Jun 10, 2024
77e6fb4
fix: readme typo
Keyrxng Jun 10, 2024
614e678
fix: move controls into sight
Keyrxng Jun 10, 2024
3c45c07
fix: use pixels and remove large on ERC20
Keyrxng Jun 11, 2024
33d2148
chore: more concise readme
Keyrxng Jun 12, 2024
692064b
chore: readme additional error
Keyrxng Jun 12, 2024
d1caf1a
fix: link after claim
Keyrxng Jun 13, 2024
f36fdb8
fix: view claim test
Keyrxng Jun 13, 2024
f703fb6
chore: use blockscan explorer
Keyrxng Jun 15, 2024
4a2b8d1
chore: move add. details up
Keyrxng Jun 16, 2024
b7dd348
Merge pull request #248 from ubq-testing/nft-table-fix
0x4007 Jun 17, 2024
114e59a
Merge pull request #246 from ubq-testing/refactor/readme
0x4007 Jun 17, 2024
aa003e2
Merge pull request #251 from ubq-testing/fix/view-claim
0x4007 Jun 17, 2024
a29fe52
Merge branch 'development' of https://github.com/ubiquity/pay.ubq.fi …
EresDev Jun 17, 2024
d41e510
fix: show purchased gift card without page reload
EresDev Jun 17, 2024
54d5bb9
fix: add 'blockscan' to cspell words list
EresDev Jun 17, 2024
c7d44c9
fix: use correct env vars
EresDev Jun 17, 2024
0495045
fix: update test expected message
EresDev Jun 17, 2024
c275979
fix: remove permit signer check
EresDev Jun 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@
"Funder",
"binkey",
"binsec",
"blockscan",
"chainlist",
"cirip",
"Claimability",
"dataurl",
"devpool",
"ethersproject",
"fract",
"giftcards",
"gnosischain",
"gnosisscan",
"godb",
"greyscale",
Expand All @@ -25,6 +28,8 @@
"libsodium",
"Numberish",
"outdir",
"pageable",
"Reloadly",
"Rpcs",
"scalarmult",
"servedir",
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,10 @@ jobs:
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: static
path: static
name: full-stack-app
path: |
static
functions
shared
package.json
yarn.lock
10 changes: 7 additions & 3 deletions .github/workflows/cypress-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,17 @@ jobs:
sleep 1
done || exit 1

- name: Fund test accounts
run: yarn test:fund
- name: Start Cloudflare Wrangler
run: npx wrangler pages dev static --port 8080 --binding USE_RELOADLY_SANDBOX=true RELOADLY_API_CLIENT_ID="$RELOADLY_SANDBOX_API_CLIENT_ID" RELOADLY_API_CLIENT_SECRET="$RELOADLY_SANDBOX_API_CLIENT_SECRET" &
env:
RELOADLY_SANDBOX_API_CLIENT_ID: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_ID }}
RELOADLY_SANDBOX_API_CLIENT_SECRET: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_SECRET }}

- name: Cypress run
uses: cypress-io/github-action@v6
with:
build: yarn run build
start: yarn start
start: yarn test:fund

env:
SUPABASE_URL: "https://wfzpewmlyiozupulbuur.supabase.co"
Expand All @@ -65,6 +68,7 @@ jobs:
PAYMENT_TOKEN_ADDRESS: "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"
RPC_PROVIDER_URL: "http://localhost:8545"
UBIQUIBOT_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"

- uses: actions/upload-artifact@v4
if: failure()
with:
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@ jobs:
with:
repository: ${{ github.repository }}
production_branch: ${{ github.event.repository.default_branch }}
build_artifact_name: "static"
output_directory: "static"
build_artifact_name: "full-stack-app"
output_directory: "full-stack-app"
current_branch: ${{ github.event.workflow_run.head_branch }}
cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
commit_sha: ${{ github.event.workflow_run.head_sha }}
workflow_run_id: ${{ github.event.workflow_run.id }}
statics_directory: "static"

- name: Check out repository
uses: actions/checkout@v4
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ commit.txt
static/dist

cypress/screenshots
cypress/videos
cypress/videos
.wrangler
119 changes: 61 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,85 +1,88 @@
# Generate Permit
# [pay.ubq.fi](https://pay.ubq.fi)

Tool for generating offline permits for bounty hunters to withdraw their payments.
A vanilla Typescript dApp for claiming Ubiquity Rewards. It also includes tools for generating and invalidating permits and can be used to claim both ERC20 and ERC721 tokens.

## How to set up
## Setup Local Testing Environment

Create a `.env` file in the project root:
1. Install [Foundry](https://book.getfoundry.sh/getting-started/installation).
2. Create a `.env` file in the project root with the following settings:
- These are the suggested default test environment variables that allow for local setup using the supplied yarn commands. If you want to produce or invalidate real on-chain permits you must change the below values to reflect the real permit information such as address, chain ID, private key and so on.

```
# common variables
CHAIN_ID="" # mainnet: 1, goerli: 5
FRONTEND_URL=""
UBIQUIBOT_PRIVATE_KEY=""
RPC_PROVIDER_URL=""
PAYMENT_TOKEN_ADDRESS="" # // DAI address, mainnet: 0x6b175474e89094c44da98b954eedeac495271d0f, goerli: 0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844
# variables depending on spender (bounty hunter)
AMOUNT_IN_ETH="1" # amount in ether, 1 AMOUNT_IN_ETH = 1000000000000000000 WEI
BENEFICIARY_ADDRESS=""
```
```env
# Common variables
CHAIN_ID="31337"
FRONTEND_URL="http://localhost:8080"
UBIQUIBOT_PRIVATE_KEY="0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
RPC_PROVIDER_URL="http://127.0.0.1:8545"
PAYMENT_TOKEN_ADDRESS="0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"

# Variables depending on spender (bounty hunter)
AMOUNT_IN_ETH="1"
BENEFICIARY_ADDRESS="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
```

## How it works
## Local Testing

1. Admin sets `env.AMOUNT_IN_ETH` and `env.BENEFICIARY_ADDRESS` depending on a bounty hunter's reward and address
2. Admin generates an offline permit URL via `npx tsx generate-permit2-url.ts`. Permit URL example:
1. Set `.env` variables.
2. Run `yarn test:anvil` in terminal A and `yarn test:fund` in terminal B.
3. In terminal B, run `yarn start`.
4. A permit URL for both ERC20 and ERC721 will be generated.
5. Open the generated permit URL from the console.
6. Connect your wallet (import anvil accounts [0] & [1] into your wallet).
7. Depending on your connected account, either the claim or invalidate button will be visible.
8. To test ERC721 permits, deploy the `nft-rewards` contract from the [repository](https://github.com/ubiquity/nft-rewards).

```
http://localhost:8080?claim=eyJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHgxMWZFNEI2QUUxM2QyYTYwNTVDOEQ5Y0Y2NWM1NWJhYzMyQjVkODQ0IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjQ0NTUxMjc4NTQwNTU0MzM1MDQ2NzU2NDQ3MzM2MjI1ODg5OTE4OTY5MTczODQwNTU0Nzk2NzQ3MzQzMzAwOTg0NzU4MDIyMzY1ODczIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhjODZhMDU5NzgwMThlMDRkNmVGMmFhNzNFNjlhNzMzQzA2ZDFmODllIiwicmVxdWVzdGVkQW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NTRmNGEzNjQyMkRjOTZkMDg0OTY3NWMxZjBkZDJCOTZEMjc1NThFMiIsInNpZ25hdHVyZSI6IjB4NWI0OTE5MjhmYzI4MzBlMjZiNTViMWUxOWQ3YzVhMmVjNGE2ZmRhYWI1OGFiYjgyOWMwNmYzYzlkNGE4YTc5YjAzYmE2NjlkMDM4YjFmYzg5NjgzYzMyYjBiYTA5MzU2MDRjMGU1MDNjYWE3ZmY2ZWM2MDg2ZWZlYjY2MTY5MjQxYyJ9
```
### Importing Anvil Accounts

3. Admin posts offline permit URL in issue comments
4. Bounty hunter opens permit URL, connects wallet and clicks a "withdraw" button to get a payment
1. Open your wallet provider and select `import wallet` or `import account`.
2. Obtain the private keys by running `anvil` or using the yarn command.
3. Copy and paste the private keys into your wallet provider.

## How to test locally
### Expected Behavior

1. Set `.env` variables.
2. Run `anvil --chain-id 31337 --fork-url https://rpc.gnosis.gateway.fm` in a separate terminal.
3. Run the Anvil commands (uses the Anvil default wallets).
4. In the project root run `yarn start`.
5. A permit URL for both ERC20 and ERC721 is generated in the terminal.
6. Open the generated permit URL defaulting to the variable values in the `.env` file.
7. Connect the bounty hunter's address.
8. Click the "withdraw" button to get a reward.
9. Testing the ERC721 permit is easiest deploying the `nft-rewards` contract from the [repository](https://github.com/ubiquity/nft-rewards)
#### Setup

#### Anvil commands
- A local blockchain instance will be created for testing.
- The permit URL will be generated in the console. Ensure your console has enough space for the full URL.
- Imported anvil accounts [0] & [1] can claim and invalidate permits.

###### Using any other `--chain-id` will hit real RPC endpoints.
#### Claiming

```shell
cast rpc anvil_impersonateAccount 0xba12222222228d8ba445958a75a0704d566bf2c8 &
cast send 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xba12222222228d8ba445958a75a0704d566bf2c8 "transfer(address,uint256)(bool)" 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 337888400000000000000000 &
cast send 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 "approve(address,uint256)(bool)" 0x000000000022D473030F116dDEE9F6B43aC78BA3 9999999999999991111111119999999999999999 &
cast send 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 "approve(address,uint256)(bool)" 0x000000000022D473030F116dDEE9F6B43aC78BA3 999999999999999111119999999999999999
- Uses chain id `31337` and RPC provider `http://localhost:8545`.
- Claiming involves transferring tokens from the signer's account to the beneficiary's account.
- Signer must have signed a permit and have enough balance approved for the permit2 contract.

```
#### Invalidating

## CloudFlare Setup (GitHub Secrets)
- Only the permit signer can invalidate it.
- Invalidating calls `invalidateUnorderedNonces` on the `Permit2` smart contract.

##### CLOUDFLARE_ACCOUNT_ID =
### Considerations

https://dash.cloudflare.com/***/pages
https://dash.cloudflare.com/abcd1234/pages
(Here `abcd1234` is your account ID)
- MetaMask is considered the default wallet provider.
- Ensure correct network selection in your wallet (`http://localhost:8545` with chain id `31337`).
- Use MetaMask Mobile Wallet Browser for mobile testing.

##### CLOUDFLARE_API_TOKEN =
### Errors

https://dash.cloudflare.com/profile/api-tokens > Create Token > API token templates > Edit Cloudflare Workers > Use Template
Account Resources = All Accounts or Target Account
Zone Resources = All Zones
(Detailed Instructions: https://developers.cloudflare.com/workers/wrangler/ci-cd/)
- Clear transaction history in MetaMask if transactions hang after restarting the Anvil instance.
- The test suite may show error toasts due to MetaMask spoofing.
- Ensure `.env` is correctly configured and wallet provider network is correct if `Allowance` or `Balance` is `0.00`.
- Always start the Anvil instance before using `yarn start` as permit generation requires an on-chain call to `token.decimals()`.

##### CLOUDFLARE_ASSET_DIRECTORY =
## How to generate a permit2 URL using the script

static
1. Admin sets `env.AMOUNT_IN_ETH` and `env.BENEFICIARY_ADDRESS` depending on a bounty hunter's reward and address
2. Admin generates an offline permit URL via `npx tsx generate-permit2-url.ts`. Permit URL example:

##### CLOUDFLARE_PROJECT_NAME =
```
http://localhost:8080?claim=eyJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHgxMWZFNEI2QUUxM2QyYTYwNTVDOEQ5Y0Y2NWM1NWJhYzMyQjVkODQ0IiwiYW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjQ0NTUxMjc4NTQwNTU0MzM1MDQ2NzU2NDQ3MzM2MjI1ODg5OTE4OTY5MTczODQwNTU0Nzk2NzQ3MzQzMzAwOTg0NzU4MDIyMzY1ODczIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhjODZhMDU5NzgwMThlMDRkNmVGMmFhNzNFNjlhNzMzQzA2ZDFmODllIiwicmVxdWVzdGVkQW1vdW50IjoiMTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NTRmNGEzNjQyMkRjOTZkMDg0OTY3NWMxZjBkZDJCOTZEMjc1NThFMiIsInNpZ25hdHVyZSI6IjB4NWI0OTE5MjhmYzI4MzBlMjZiNTViMWUxOWQ3YzVhMmVjNGE2ZmRhYWI1OGFiYjgyOWMwNmYzYzlkNGE4YTc5YjAzYmE2NjlkMDM4YjFmYzg5NjgzYzMyYjBiYTA5MzU2MDRjMGU1MDNjYWE3ZmY2ZWM2MDg2ZWZlYjY2MTY5MjQxYyJ9
```

npm install -g wrangler
wrangler login
wrangler pages project create
3. Admin posts offline permit URL in issue comments (with the payment portal domain name)
4. Bounty hunter opens permit URL, connects wallet and clicks a "withdraw" button to get a payment

## How to invalidate a permit2 nonce by example
## How to invalidate a permit2 nonce using the script

This section describes how to invalidate the following [permit](https://github.com/ubiquity/ubiquity-dollar/issues/643#issuecomment-1607152588) (i.e. invalidate a permit2 nonce)

Expand Down
3 changes: 3 additions & 0 deletions cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ export default defineConfig({
setupNodeEvents() {},
baseUrl: "http://localhost:8080",
experimentalStudio: true,
env: {
permitConfig: { ...process.env },
},
},
viewportHeight: 900,
viewportWidth: 1440,
Expand Down
Loading
Loading