1
- import { MaxUint256 , PermitTransferFrom , SignatureTransfer } from "@uniswap/permit2-sdk" ;
2
- import { randomBytes } from "crypto" ;
3
- import * as dotenv from "dotenv" ;
4
- import { BigNumber , ethers } from "ethers" ;
5
- import { log , verifyEnvironmentVariables } from "./utils" ;
6
- dotenv . config ( ) ;
7
-
8
- const PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3" ; // same on all chains
9
-
10
- generate ( ) . catch ( ( error ) => {
11
- console . error ( error ) ;
12
- verifyEnvironmentVariables ( ) ;
13
- process . exitCode = 1 ;
14
- } ) ;
15
-
16
- async function generate ( ) {
17
- const provider = new ethers . providers . JsonRpcProvider ( process . env . RPC_PROVIDER_URL ) ;
18
- const myWallet = new ethers . Wallet ( process . env . UBIQUIBOT_PRIVATE_KEY || "" , provider ) ;
19
-
20
- const erc721TransferFromData : PermitTransferFrom = {
21
- permitted : {
22
- token : process . env . NFT_TOKEN_ADDRESS || "0x5FbDB2315678afecb367f032d93F642f64180aa3" , // anvil no salt first acc NFT deployment
23
- amount : 1 , // this could be the tokenId if the permit is identified as an NFT via permitType
24
- } ,
25
- spender : process . env . BENEFICIARY_ADDRESS || "" ,
26
- nonce : BigNumber . from ( `0x${ randomBytes ( 32 ) . toString ( "hex" ) } ` ) ,
27
- deadline : MaxUint256 ,
28
- } ;
29
-
30
- const { domain : domain721 , types : types721 , values : values721 } = SignatureTransfer . getPermitData (
31
- erc721TransferFromData ,
32
- PERMIT2_ADDRESS ,
33
- process . env . CHAIN_ID ? Number ( process . env . CHAIN_ID ) : 1
34
- ) ;
35
-
36
- const signature721 = await myWallet . _signTypedData ( domain721 , types721 , values721 ) ;
37
-
38
- const GITHUB_CONTRIBUTION_TYPE = process . env . GITHUB_CONTRIBUTION_TYPE || "issue" ;
39
- const GITHUB_ISSUE_ID = process . env . GITHUB_ISSUE_ID || "1" ;
40
- const GITHUB_ORGANIZATION_NAME = process . env . GITHUB_ORGANIZATION_NAME || "ubiquity" ;
41
- const GITHUB_REPOSITORY_NAME = process . env . GITHUB_REPOSITORY_NAME || "pay.ubq.fi" ;
42
- const GITHUB_USERNAME = process . env . GITHUB_USERNAME || "keyrxng" ;
43
-
44
- const txData721 = [
45
- {
46
- type : "erc721-permit" ,
47
- permit : {
48
- permitted : {
49
- token : erc721TransferFromData . permitted . token ,
50
- amount : erc721TransferFromData . permitted . amount . toString ( ) ,
51
- } ,
52
- nonce : erc721TransferFromData . nonce . toString ( ) ,
53
- deadline : erc721TransferFromData . deadline . toString ( ) ,
54
- } ,
55
- transferDetails : {
56
- to : erc721TransferFromData . spender ,
57
- requestedAmount : erc721TransferFromData . permitted . amount . toString ( ) ,
58
- } ,
59
- owner : myWallet . address ,
60
- signature : signature721 ,
61
- networkId : Number ( process . env . CHAIN_ID ) ,
62
- nftMetadata : {
63
- GITHUB_ORGANIZATION_NAME ,
64
- GITHUB_REPOSITORY_NAME ,
65
- GITHUB_ISSUE_ID ,
66
- GITHUB_USERNAME ,
67
- GITHUB_CONTRIBUTION_TYPE
68
- } ,
69
- request : {
70
- beneficiary : process . env . BENEFICIARY_ADDRESS ?? "" ,
71
- deadline : erc721TransferFromData . deadline . toString ( ) ,
72
- keys : [ "GITHUB_ORGANIZATION_NAME" , "GITHUB_REPOSITORY_NAME" , "GITHUB_ISSUE_ID" , "GITHUB_USERNAME" , "GITHUB_CONTRIBUTION_TYPE" ] ,
73
- nonce : erc721TransferFromData . nonce . toString ( ) ,
74
- values : [ GITHUB_ORGANIZATION_NAME , GITHUB_REPOSITORY_NAME , GITHUB_ISSUE_ID , GITHUB_USERNAME , GITHUB_CONTRIBUTION_TYPE ] ,
75
- } ,
76
- } ,
77
- ] ;
78
-
79
- const base64encodedTxData721 = Buffer . from ( JSON . stringify ( txData721 ) ) . toString ( "base64" ) ;
80
- log . ok ( "Testing URL:" ) ;
81
- console . log ( `${ process . env . FRONTEND_URL } ?claim=${ base64encodedTxData721 } ` ) ;
82
- log . ok ( "Public URL:" ) ;
83
- console . log ( `https://pay.ubq.fi?claim=${ base64encodedTxData721 } ` ) ;
84
- console . log ( ) ;
85
-
86
- const permitTransferFromData : PermitTransferFrom = {
87
- permitted : {
88
- // token we are permitting to be transferred
89
- token : process . env . PAYMENT_TOKEN_ADDRESS || "" ,
90
- // amount we are permitting to be transferred
91
- amount : ethers . utils . parseUnits ( process . env . AMOUNT_IN_ETH || "" , 18 ) ,
92
- } ,
93
- // who can transfer the tokens
94
- spender : process . env . BENEFICIARY_ADDRESS || "" ,
95
- nonce : BigNumber . from ( `0x${ randomBytes ( 32 ) . toString ( "hex" ) } ` ) ,
96
- // signature deadline
97
- deadline : MaxUint256 ,
98
- } ;
99
-
100
- const { domain, types, values } = SignatureTransfer . getPermitData (
101
- permitTransferFromData ,
102
- PERMIT2_ADDRESS ,
103
- process . env . CHAIN_ID ? Number ( process . env . CHAIN_ID ) : 1
104
- ) ;
105
- const signature = await myWallet . _signTypedData ( domain , types , values ) ;
106
-
107
- const txData = [
108
- {
109
- type : "erc20-permit" ,
110
- permit : {
111
- permitted : {
112
- token : permitTransferFromData . permitted . token ,
113
- amount : permitTransferFromData . permitted . amount . toString ( ) ,
114
- } ,
115
- nonce : permitTransferFromData . nonce . toString ( ) ,
116
- deadline : permitTransferFromData . deadline . toString ( ) ,
117
- } ,
118
- transferDetails : {
119
- to : permitTransferFromData . spender ,
120
- requestedAmount : permitTransferFromData . permitted . amount . toString ( ) ,
121
- } ,
122
- owner : myWallet . address ,
123
- signature : signature ,
124
- networkId : Number ( process . env . CHAIN_ID ) ,
125
- } ,
126
- ] ;
127
-
128
- const base64encodedTxData = Buffer . from ( JSON . stringify ( txData ) ) . toString ( "base64" ) ;
129
- log . ok ( "Testing URL:" ) ;
130
- console . log ( `${ process . env . FRONTEND_URL } ?claim=${ base64encodedTxData } ` ) ;
131
- log . ok ( "Public URL:" ) ;
132
- console . log ( `https://pay.ubq.fi?claim=${ base64encodedTxData } ` ) ;
133
- console . log ( ) ;
134
- }
1
+ import { generateERC20Permit } from "./generate-erc20-permit-url" ;
2
+ import { generateERC721Permit } from "./generate-erc721-permit-url" ;
3
+ import { verifyEnvironmentVariables } from "./utils" ;
4
+
5
+ ( async ( ) => {
6
+
7
+ generateERC721Permit ( ) . catch ( ( error ) => {
8
+ console . error ( error ) ;
9
+ verifyEnvironmentVariables ( ) ;
10
+ process . exitCode = 1 ;
11
+ } ) ;
12
+
13
+ generateERC20Permit ( ) . catch ( ( error ) => {
14
+ console . error ( error ) ;
15
+ verifyEnvironmentVariables ( ) ;
16
+ process . exitCode = 1 ;
17
+ } ) ;
18
+ } ) ( ) . catch ( console . error ) ;
0 commit comments