11import { ZERO_ADDRESS } from "./../../packages/core-sdk/tests/mocks" ;
22import { BigNumberish } from "@ethersproject/bignumber" ;
3+ import { parseEther } from "@ethersproject/units" ;
34import { Wallet , BigNumber , constants } from "ethers" ;
45import { OfferFieldsFragment } from "../../packages/core-sdk/src/subgraph" ;
56import { mockCreateOfferArgs } from "../../packages/common/tests/mocks" ;
@@ -26,12 +27,19 @@ import {
2627 createOfferWithCondition ,
2728 getCollectionMetadataUri ,
2829 createRandomWallet ,
29- META_TX_API_ID_VOUCHER
30+ META_TX_API_ID_VOUCHER ,
31+ createDisputeResolver ,
32+ deployerWallet ,
33+ initSellerAndBuyerSDKs
3034} from "./utils" ;
3135import { CoreSDK , forwarder } from "../../packages/core-sdk/src" ;
3236import EvaluationMethod from "../../contracts/protocol-contracts/scripts/domain/EvaluationMethod" ;
3337import TokenType from "../../contracts/protocol-contracts/scripts/domain/TokenType" ;
34- import { AuthTokenType , GatingType } from "../../packages/common" ;
38+ import { AuthTokenType , GatingType , OfferCreator } from "../../packages/common" ;
39+ import {
40+ MSEC_PER_DAY ,
41+ MSEC_PER_SEC
42+ } from "./../../packages/common/src/utils/timestamp" ;
3543
3644const sellerWallet = seedWallet7 ; // be sure the seedWallet is not used by another test (to allow concurrent run)
3745const sellerAddress = sellerWallet . address ;
@@ -724,6 +732,98 @@ describe("meta-tx", () => {
724732 } ) ;
725733 } ) ;
726734
735+ describe ( "#signMetaTxCommitToBuyerOffer()" , ( ) => {
736+ test ( "native exchange token buyer-initiated offer" , async ( ) => {
737+ const exchangeToken = constants . AddressZero ;
738+ const drFeeAmount = parseEther ( "0.005" ) ;
739+
740+ // Create a dispute resolver with a fee amount
741+ const { fundedWallet : drFundedWallet } =
742+ await initCoreSDKWithFundedWallet ( sellerWallet ) ;
743+ const drAddress = drFundedWallet . address . toLowerCase ( ) ;
744+ const { disputeResolver } = await createDisputeResolver (
745+ drFundedWallet ,
746+ deployerWallet ,
747+ {
748+ assistant : drAddress ,
749+ admin : drAddress ,
750+ treasury : drAddress ,
751+ metadataUri : "" ,
752+ escalationResponsePeriodInMS :
753+ 90 * MSEC_PER_DAY - 1 * MSEC_PER_SEC ,
754+ fees : [
755+ {
756+ feeAmount : drFeeAmount ,
757+ tokenAddress : exchangeToken ,
758+ tokenName : "Native"
759+ }
760+ ] ,
761+ sellerAllowList : [ ]
762+ }
763+ ) ;
764+
765+ // Create fresh buyer/seller wallets
766+ const {
767+ sellerCoreSDK : sellerCoreSDKBuyer ,
768+ buyerCoreSDK : buyerCoreSDKBuyer ,
769+ sellerWallet : sellerFundedWallet
770+ } = await initSellerAndBuyerSDKs ( sellerWallet ) ;
771+
772+ // Buyer creates a buyer-initiated offer
773+ const buyerInitiatedOffer = await createOffer ( buyerCoreSDKBuyer , {
774+ creator : OfferCreator . Buyer ,
775+ quantityAvailable : 1 ,
776+ disputeResolverId : disputeResolver . id ,
777+ exchangeToken
778+ } ) ;
779+
780+ // Buyer deposits offer.price to allow the seller to commit
781+ const buyerDepositTx = await buyerCoreSDKBuyer . depositFunds (
782+ buyerInitiatedOffer . buyerId ,
783+ buyerInitiatedOffer . price ,
784+ exchangeToken
785+ ) ;
786+ await buyerCoreSDKBuyer . waitForGraphNodeIndexing ( buyerDepositTx ) ;
787+
788+ // Seller creates a seller account
789+ const seller = await createSeller (
790+ sellerCoreSDKBuyer ,
791+ sellerFundedWallet . address
792+ ) ;
793+
794+ // Seller deposits DR fee amount
795+ const sellerDepositTx = await sellerCoreSDKBuyer . depositFunds (
796+ seller . id ,
797+ drFeeAmount ,
798+ exchangeToken
799+ ) ;
800+ await sellerCoreSDKBuyer . waitForGraphNodeIndexing ( sellerDepositTx ) ;
801+
802+ const nonce = Date . now ( ) ;
803+
804+ // Seller signs meta tx for commitToBuyerOffer
805+ const { r, s, v, functionName, functionSignature } =
806+ await sellerCoreSDKBuyer . signMetaTxCommitToBuyerOffer ( {
807+ offerId : buyerInitiatedOffer . id ,
808+ sellerParams : { } ,
809+ nonce
810+ } ) ;
811+
812+ // Relayer executes meta tx on behalf of seller
813+ const metaTx = await sellerCoreSDKBuyer . relayMetaTransaction ( {
814+ functionName,
815+ functionSignature,
816+ nonce,
817+ sigR : r ,
818+ sigS : s ,
819+ sigV : v
820+ } ) ;
821+ const metaTxReceipt = await metaTx . wait ( ) ;
822+ expect ( metaTxReceipt . transactionHash ) . toBeTruthy ( ) ;
823+ expect ( BigNumber . from ( metaTxReceipt . effectiveGasPrice ) . gt ( 0 ) ) . toBe ( true ) ;
824+ } ) ;
825+ } ) ;
826+
727827 describe ( "#signMetaTxRedeemVoucher()" , ( ) => {
728828 test ( "non-native exchange token offer" , async ( ) => {
729829 const commitTx = await buyerCoreSDK . commitToOffer ( offerToCommit . id ) ;
0 commit comments