11import { BigNumber , ethers } from 'ethers' ;
2+ import { ETH_ADDRESS_AS_ERC20 } from '../../src/sdk' ;
23import { NftSwapV4 } from '../../src/sdk/v4/NftSwapV4' ;
34
45import { SwappableAssetV4 } from '../../src/sdk/v4/types' ;
56import { SignedERC721OrderStruct } from '../../src/sdk/v4/types' ;
6- import { NULL_ADDRESS } from '../../src/utils/eth' ;
77
88jest . setTimeout ( 90 * 1000 ) ;
99
1010const MAKER_WALLET_ADDRESS = '0xabc23F70Df4F45dD3Df4EC6DA6827CB05853eC9b' ;
1111const MAKER_PRIVATE_KEY =
1212 'fc5db508b0a52da8fbcac3ab698088715595f8de9cccf2467d51952eec564ec9' ;
13- // NOTE(johnrjj) - NEVER use these private keys for anything of value, testnets only!
1413
15- const WETH_TOKEN_ADDRESS_TESTNET = '0xc778417e063141139fce010982780140aa0cd5ab' ;
1614const DAI_TOKEN_ADDRESS_TESTNET = '0x31f42841c2db5173425b5223809cf3a38fede360' ;
1715const TEST_NFT_CONTRACT_ADDRESS = '0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b' ; // https://ropsten.etherscan.io/token/0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b?a=0xabc23F70Df4F45dD3Df4EC6DA6827CB05853eC9b
1816
1917const RPC_TESTNET =
2018 'https://eth-ropsten.alchemyapi.io/v2/is1WqyAFM1nNFFx2aCozhTep7IxHVNGo' ;
2119
2220const MAKER_WALLET = new ethers . Wallet ( MAKER_PRIVATE_KEY ) ;
23- // const TAKER_WALLET = new ethers.Wallet(TAKER_PRIVATE_KEY);
2421
2522const PROVIDER = new ethers . providers . StaticJsonRpcProvider ( RPC_TESTNET ) ;
2623
2724const MAKER_SIGNER = MAKER_WALLET . connect ( PROVIDER ) ;
28- // const TAKER_PROVIDER = TAKER_WALLET.connect(PROVIDER);
2925
3026const ROPSTEN_CHAIN_ID = 3 ;
3127
@@ -34,26 +30,31 @@ const nftSwapperMaker = new NftSwapV4(
3430 MAKER_SIGNER ,
3531 ROPSTEN_CHAIN_ID
3632) ;
37- // const nftSwapperTaker = new NftSwap(TAKER_PROVIDER as any, 4);
3833
39- const MAKER_ASSET : SwappableAssetV4 = {
34+ const DAI_ASSET : SwappableAssetV4 = {
4035 type : 'ERC20' ,
4136 tokenAddress : DAI_TOKEN_ADDRESS_TESTNET ,
4237 amount : '420000000000000' , // 1 USDC
4338} ;
4439
45- const TAKER_ASSET : SwappableAssetV4 = {
40+ const ETH_ASSET : SwappableAssetV4 = {
41+ type : 'ERC20' ,
42+ tokenAddress : ETH_ADDRESS_AS_ERC20 ,
43+ amount : '420000000000000' , // 1 USDC
44+ } ;
45+
46+ const NFT_ASSET : SwappableAssetV4 = {
4647 type : 'ERC721' ,
4748 tokenAddress : TEST_NFT_CONTRACT_ADDRESS ,
4849 tokenId : '11045' ,
4950} ;
5051
5152describe ( 'NFTSwapV4' , ( ) => {
52- it ( 'fees ' , async ( ) => {
53+ it ( 'erc20 fee ' , async ( ) => {
5354 // NOTE(johnrjj) - Assumes USDC and DAI are already approved w/ the ExchangeProxy
5455 const v4Erc721Order = nftSwapperMaker . buildOrder (
55- TAKER_ASSET ,
56- MAKER_ASSET ,
56+ NFT_ASSET ,
57+ DAI_ASSET ,
5758 MAKER_WALLET_ADDRESS ,
5859 {
5960 fees : [
@@ -63,30 +64,47 @@ describe('NFTSwapV4', () => {
6364 } ,
6465 ] ,
6566 }
66- // {
67- // // Fix dates and salt so we have reproducible tests
68- // expiration: new Date(3000, 10, 1),
69- // }
7067 ) ;
7168
72- // console.log('v4Erc721Order.nonce', v4Erc721Order.nonce.toString());
69+ const signedOrder = ( await nftSwapperMaker . signOrder (
70+ v4Erc721Order
71+ ) ) as SignedERC721OrderStruct ;
7372
74- // expect(v4Erc721Order.nonce.toString()./includes('-')).toBeFalsy();
73+ expect ( signedOrder . fees [ 0 ] . recipient ) . toEqual (
74+ '0xaaa1388cD71e88Ae3D8432f16bed3c603a58aD34' . toLowerCase ( )
75+ ) ;
7576
76- // const makerapprovalTx = await nftSwapperMaker.approveTokenOrNftByAsset(
77- // MAKER_ASSET,
78- // MAKER_WALLET_ADDRESS,
79- // )
80- // const makerApprovalTxHash = await (await makerapprovalTx.wait()).transactionHash
81- // console.log('maker approval tx hash', makerApprovalTxHash)
77+ // Ensure getErc20TotalIncludingFees helper function works properly w/ fees.
78+ const total = nftSwapperMaker
79+ . getErc20TotalIncludingFees ( signedOrder )
80+ . toString ( ) ;
81+ const handCountedTotal = BigNumber . from ( signedOrder . erc20TokenAmount ) . add (
82+ BigNumber . from ( signedOrder . fees [ 0 ] . amount )
83+ ) ;
84+ expect ( total ) . toBe ( handCountedTotal . toString ( ) ) ;
8285
83- // const takerApprovalTx = await nftSwapperMaker.approveTokenOrNftByAsset(
84- // TAKER_ASSET,
85- // MAKER_WALLET_ADDRESS,
86- // )
86+ // // Uncomment to actually fill order
87+ // const tx = await nftSwapperMaker.fillSignedOrder(signedOrder);
88+ // const txReceipt = await tx.wait();
89+ // expect(txReceipt.transactionHash).toBeTruthy();
90+ // console.log(`Swapped tx with fees on Ropsten (txHAsh: ${txReceipt.transactionHash})`);
91+ } ) ;
8792
88- // const takerApprovalTxHash = await (await takerApprovalTx.wait()).transactionHash
89- // console.log('taker approval tx hash', takerApprovalTxHash)
93+ it ( 'eth w/ fee' , async ( ) => {
94+ // NOTE(johnrjj) - Assumes USDC and DAI are already approved w/ the ExchangeProxy
95+ const v4Erc721Order = nftSwapperMaker . buildOrder (
96+ NFT_ASSET ,
97+ ETH_ASSET ,
98+ MAKER_WALLET_ADDRESS ,
99+ {
100+ fees : [
101+ {
102+ amount : '6900000000000' ,
103+ recipient : '0xaaa1388cD71e88Ae3D8432f16bed3c603a58aD34' ,
104+ } ,
105+ ] ,
106+ }
107+ ) ;
90108
91109 const signedOrder = ( await nftSwapperMaker . signOrder (
92110 v4Erc721Order
@@ -105,41 +123,66 @@ describe('NFTSwapV4', () => {
105123 ) ;
106124 expect ( total ) . toBe ( handCountedTotal . toString ( ) ) ;
107125
108- // console.log('erc721 signatuee', signedOrder.signature);
109- // expect(signedOrder.signature.signatureType.toString()).toEqual('2');
110-
111- // const fillTx = await nftSwapperMaker.fillSignedCollectionOrder(
112- // signedOrder,
113- // '11045',
114- // {
115- // fillOrderWithNativeTokenInsteadOfWrappedToken: false,
116- // tokenIdToSellForCollectionOrder: '11045',
117- // },
118- // { gasLimit: '500000' }
126+ // Uncomment to actually fill order
127+ // const tx = await nftSwapperMaker.fillSignedOrder(signedOrder);
128+ // const txReceipt = await tx.wait();
129+ // expect(txReceipt.transactionHash).toBeTruthy();
130+ // console.log(
131+ // `Swapped tx eth with fees on Ropsten (txHAsh: ${txReceipt.transactionHash})`
119132 // );
120- // const txReceipt = await fillTx.wait();
121- // console.log('erc721 fill tx', txReceipt.transactionHash);
133+ } ) ;
122134
123- // expect(txReceipt.transactionHash).toBeTruthy();
135+ it ( 'eth w/ multiple fees' , async ( ) => {
136+ // NOTE(johnrjj) - Assumes USDC and DAI are already approved w/ the ExchangeProxy
137+ const v4Erc721Order = nftSwapperMaker . buildOrder (
138+ NFT_ASSET ,
139+ ETH_ASSET ,
140+ MAKER_WALLET_ADDRESS ,
141+ {
142+ fees : [
143+ {
144+ amount : '6900000000000' ,
145+ recipient : '0xaaa1388cD71e88Ae3D8432f16bed3c603a58aD34' ,
146+ } ,
147+ {
148+ amount : '7000000000000' ,
149+ recipient : '0xbbb5A0ceB2344B6566a8e945872D2Ba8Fb04E58E' ,
150+ } ,
151+ ] ,
152+ }
153+ ) ;
124154
125- // const normalizedOrder = normalizeOrder(order);
126- // const signedOrder = await nftSwapperMaker.signOrder(
127- // normalizedOrder,
128- // );
155+ const signedOrder = ( await nftSwapperMaker . signOrder (
156+ v4Erc721Order
157+ ) ) as SignedERC721OrderStruct ;
129158
130- // const normalizedSignedOrder = normalizeOrder(signedOrder);
159+ expect ( signedOrder . fees [ 0 ] . recipient ) . toEqual (
160+ '0xaaa1388cD71e88Ae3D8432f16bed3c603a58aD34' . toLowerCase ( )
161+ ) ;
162+ expect ( signedOrder . fees [ 1 ] . recipient ) . toEqual (
163+ '0xbbb5A0ceB2344B6566a8e945872D2Ba8Fb04E58E' . toLowerCase ( )
164+ ) ;
131165
132- // expect(normalizedSignedOrder.makerAddress.toLowerCase()).toBe(
133- // MAKER_WALLET_ADDRESS.toLowerCase()
134- // );
166+ // Ensure getErc20TotalIncludingFees helper function works properly w/ fees.
167+ const computedTotal = nftSwapperMaker
168+ . getErc20TotalIncludingFees ( signedOrder )
169+ . toString ( ) ;
135170
136- // Uncomment to actually fill order
137- // const tx = await nftSwapperMaker.fillSignedOrder(signedOrder); //, undefined, { gasLimit: '500000'})
171+ expect ( computedTotal ) . toBe ( '433900000000000' ) ;
172+
173+ const handCountedTotal = BigNumber . from ( signedOrder . erc20TokenAmount )
174+ . add ( BigNumber . from ( signedOrder . fees [ 0 ] . amount ) )
175+ . add ( BigNumber . from ( signedOrder . fees [ 1 ] . amount ) )
176+ . toString ( ) ;
138177
178+ expect ( handCountedTotal ) . toBe ( '433900000000000' ) ;
179+
180+ // Uncomment to actually fill order
181+ // const tx = await nftSwapperMaker.fillSignedOrder(signedOrder);
139182 // const txReceipt = await tx.wait();
140183 // expect(txReceipt.transactionHash).toBeTruthy();
141- // console.log(`Swapped on Rinkeby (txHAsh: ${txReceipt.transactionHash})`);
184+ // console.log(
185+ // `Swapped tx eth with multiple fees on Ropsten (txHAsh: ${txReceipt.transactionHash})`
186+ // );
142187 } ) ;
143188} ) ;
144-
145- // https://polygon-mumbai.g.alchemy.com/v2/VMBpFqjMYv2w-MWnc9df92w3R2TpMvSG
0 commit comments