@bosonprotocol/core-sdk 1.47.1-alpha.0 → 1.48.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cjs/erc20/handler.d.ts +73 -0
  2. package/dist/cjs/erc20/handler.d.ts.map +1 -1
  3. package/dist/cjs/erc20/handler.js +198 -0
  4. package/dist/cjs/erc20/handler.js.map +1 -1
  5. package/dist/cjs/erc20/mixin.d.ts +76 -1
  6. package/dist/cjs/erc20/mixin.d.ts.map +1 -1
  7. package/dist/cjs/erc20/mixin.js +67 -0
  8. package/dist/cjs/erc20/mixin.js.map +1 -1
  9. package/dist/cjs/exchanges/handler.d.ts +6 -0
  10. package/dist/cjs/exchanges/handler.d.ts.map +1 -1
  11. package/dist/cjs/exchanges/handler.js +1 -0
  12. package/dist/cjs/exchanges/handler.js.map +1 -1
  13. package/dist/cjs/meta-tx/handler.d.ts +32 -0
  14. package/dist/cjs/meta-tx/handler.d.ts.map +1 -1
  15. package/dist/cjs/meta-tx/handler.js +68 -19
  16. package/dist/cjs/meta-tx/handler.js.map +1 -1
  17. package/dist/cjs/meta-tx/mixin.d.ts +38 -0
  18. package/dist/cjs/meta-tx/mixin.d.ts.map +1 -1
  19. package/dist/cjs/meta-tx/mixin.js +29 -1
  20. package/dist/cjs/meta-tx/mixin.js.map +1 -1
  21. package/dist/cjs/native-meta-tx/handler.d.ts +1 -1
  22. package/dist/cjs/native-meta-tx/handler.d.ts.map +1 -1
  23. package/dist/cjs/orchestration/handler.d.ts +59 -1
  24. package/dist/cjs/orchestration/handler.d.ts.map +1 -1
  25. package/dist/cjs/orchestration/handler.js +114 -0
  26. package/dist/cjs/orchestration/handler.js.map +1 -1
  27. package/dist/cjs/orchestration/interface.d.ts +4 -1
  28. package/dist/cjs/orchestration/interface.d.ts.map +1 -1
  29. package/dist/cjs/orchestration/interface.js +23 -5
  30. package/dist/cjs/orchestration/interface.js.map +1 -1
  31. package/dist/cjs/orchestration/mixin.d.ts +49 -1
  32. package/dist/cjs/orchestration/mixin.d.ts.map +1 -1
  33. package/dist/cjs/orchestration/mixin.js +62 -0
  34. package/dist/cjs/orchestration/mixin.js.map +1 -1
  35. package/dist/cjs/utils/signature.d.ts +9 -0
  36. package/dist/cjs/utils/signature.d.ts.map +1 -1
  37. package/dist/cjs/utils/signature.js.map +1 -1
  38. package/dist/esm/erc20/handler.d.ts +73 -0
  39. package/dist/esm/erc20/handler.d.ts.map +1 -1
  40. package/dist/esm/erc20/handler.js +217 -0
  41. package/dist/esm/erc20/handler.js.map +1 -1
  42. package/dist/esm/erc20/mixin.d.ts +76 -1
  43. package/dist/esm/erc20/mixin.d.ts.map +1 -1
  44. package/dist/esm/erc20/mixin.js +79 -1
  45. package/dist/esm/erc20/mixin.js.map +1 -1
  46. package/dist/esm/exchanges/handler.d.ts +6 -0
  47. package/dist/esm/exchanges/handler.d.ts.map +1 -1
  48. package/dist/esm/exchanges/handler.js +1 -1
  49. package/dist/esm/exchanges/handler.js.map +1 -1
  50. package/dist/esm/meta-tx/handler.d.ts +32 -0
  51. package/dist/esm/meta-tx/handler.d.ts.map +1 -1
  52. package/dist/esm/meta-tx/handler.js +66 -12
  53. package/dist/esm/meta-tx/handler.js.map +1 -1
  54. package/dist/esm/meta-tx/mixin.d.ts +38 -0
  55. package/dist/esm/meta-tx/mixin.d.ts.map +1 -1
  56. package/dist/esm/meta-tx/mixin.js +63 -1
  57. package/dist/esm/meta-tx/mixin.js.map +1 -1
  58. package/dist/esm/native-meta-tx/handler.d.ts +1 -1
  59. package/dist/esm/native-meta-tx/handler.d.ts.map +1 -1
  60. package/dist/esm/orchestration/handler.d.ts +59 -1
  61. package/dist/esm/orchestration/handler.d.ts.map +1 -1
  62. package/dist/esm/orchestration/handler.js +126 -2
  63. package/dist/esm/orchestration/handler.js.map +1 -1
  64. package/dist/esm/orchestration/interface.d.ts +4 -1
  65. package/dist/esm/orchestration/interface.d.ts.map +1 -1
  66. package/dist/esm/orchestration/interface.js +15 -0
  67. package/dist/esm/orchestration/interface.js.map +1 -1
  68. package/dist/esm/orchestration/mixin.d.ts +49 -1
  69. package/dist/esm/orchestration/mixin.d.ts.map +1 -1
  70. package/dist/esm/orchestration/mixin.js +74 -0
  71. package/dist/esm/orchestration/mixin.js.map +1 -1
  72. package/dist/esm/utils/signature.d.ts +9 -0
  73. package/dist/esm/utils/signature.d.ts.map +1 -1
  74. package/dist/esm/utils/signature.js.map +1 -1
  75. package/package.json +3 -3
  76. package/src/erc20/handler.ts +354 -0
  77. package/src/erc20/mixin.ts +206 -1
  78. package/src/exchanges/handler.ts +1 -1
  79. package/src/meta-tx/handler.ts +157 -12
  80. package/src/meta-tx/mixin.ts +149 -1
  81. package/src/native-meta-tx/handler.ts +1 -1
  82. package/src/orchestration/handler.ts +267 -1
  83. package/src/orchestration/interface.ts +31 -1
  84. package/src/orchestration/mixin.ts +187 -0
  85. package/src/utils/signature.ts +18 -6
@@ -51,7 +51,12 @@ import { AddressZero } from "@ethersproject/constants";
51
51
  import { encodeDepositFunds, encodeWithdrawFunds } from "../funds/interface";
52
52
  import { bosonDisputeHandlerIface } from "../disputes/interface";
53
53
  import { encodeCreateGroup } from "../groups/interface";
54
- import { encodeCreateOfferWithCondition } from "../orchestration/interface";
54
+ import {
55
+ encodeCommitToConditionalOfferAndRedeemVoucher,
56
+ encodeCommitToOfferAndRedeemVoucher,
57
+ encodeCreateOfferCommitAndRedeem,
58
+ encodeCreateOfferWithCondition
59
+ } from "../orchestration/interface";
55
60
  import {
56
61
  encodeCallExternalContract,
57
62
  encodePreMint,
@@ -61,6 +66,10 @@ import {
61
66
  import { keccak256 } from "@ethersproject/keccak256";
62
67
  import { id } from "@ethersproject/hash";
63
68
  import { defaultAbiCoder } from "@ethersproject/abi";
69
+ import {
70
+ TransferAuthorization,
71
+ encodeTransferAuthorizationQueue
72
+ } from "../erc20/handler";
64
73
  import { ERC20ForwardRequest } from "../forwarder/biconomy-interface";
65
74
  import { getNonce, verifyEIP712 } from "../forwarder/handler";
66
75
  import { MockForwardRequest } from "../forwarder/mock-interface";
@@ -1473,6 +1482,133 @@ export async function signMetaTxCreateOfferAndCommit(
1473
1482
  return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: false });
1474
1483
  }
1475
1484
 
1485
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1486
+ export async function signMetaTxCommitToOfferAndRedeemVoucher(
1487
+ args: BaseMetaTxArgs & {
1488
+ offerId: BigNumberish;
1489
+ returnTypedDataToSign: true;
1490
+ }
1491
+ ): Promise<UnsignedMetaTx>;
1492
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1493
+ export async function signMetaTxCommitToOfferAndRedeemVoucher(
1494
+ args: BaseMetaTxArgs & {
1495
+ offerId: BigNumberish;
1496
+ returnTypedDataToSign?: false | undefined;
1497
+ }
1498
+ ): Promise<SignedMetaTx>;
1499
+ // Implementation
1500
+ export async function signMetaTxCommitToOfferAndRedeemVoucher(
1501
+ args: BaseMetaTxArgs & {
1502
+ offerId: BigNumberish;
1503
+ returnTypedDataToSign?: boolean;
1504
+ }
1505
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1506
+ const signMetaTxArgs = {
1507
+ ...args,
1508
+ functionName: "commitToOfferAndRedeemVoucher(uint256)",
1509
+ functionSignature: encodeCommitToOfferAndRedeemVoucher(args.offerId)
1510
+ };
1511
+ if (args.returnTypedDataToSign) {
1512
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: true });
1513
+ }
1514
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: false });
1515
+ }
1516
+
1517
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1518
+ export async function signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1519
+ args: BaseMetaTxArgs & {
1520
+ offerId: BigNumberish;
1521
+ tokenId: BigNumberish;
1522
+ returnTypedDataToSign: true;
1523
+ }
1524
+ ): Promise<UnsignedMetaTx>;
1525
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1526
+ export async function signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1527
+ args: BaseMetaTxArgs & {
1528
+ offerId: BigNumberish;
1529
+ tokenId: BigNumberish;
1530
+ returnTypedDataToSign?: false | undefined;
1531
+ }
1532
+ ): Promise<SignedMetaTx>;
1533
+ // Implementation
1534
+ export async function signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1535
+ args: BaseMetaTxArgs & {
1536
+ offerId: BigNumberish;
1537
+ tokenId: BigNumberish;
1538
+ returnTypedDataToSign?: boolean;
1539
+ }
1540
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1541
+ const signMetaTxArgs = {
1542
+ ...args,
1543
+ functionName: "commitToConditionalOfferAndRedeemVoucher(uint256,uint256)",
1544
+ functionSignature: encodeCommitToConditionalOfferAndRedeemVoucher(
1545
+ args.offerId,
1546
+ args.tokenId
1547
+ )
1548
+ };
1549
+ if (args.returnTypedDataToSign) {
1550
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: true });
1551
+ }
1552
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: false });
1553
+ }
1554
+
1555
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1556
+ export async function signMetaTxCreateOfferCommitAndRedeem(
1557
+ args: BaseMetaTxArgs & {
1558
+ createOfferAndCommitArgs: FullOfferArgs;
1559
+ metadataStorage?: MetadataStorage;
1560
+ theGraphStorage?: MetadataStorage;
1561
+ returnTypedDataToSign: true;
1562
+ }
1563
+ ): Promise<UnsignedMetaTx>;
1564
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1565
+ export async function signMetaTxCreateOfferCommitAndRedeem(
1566
+ args: BaseMetaTxArgs & {
1567
+ createOfferAndCommitArgs: FullOfferArgs;
1568
+ metadataStorage?: MetadataStorage;
1569
+ theGraphStorage?: MetadataStorage;
1570
+ returnTypedDataToSign?: false | undefined;
1571
+ }
1572
+ ): Promise<SignedMetaTx>;
1573
+ // Implementation
1574
+ export async function signMetaTxCreateOfferCommitAndRedeem(
1575
+ args: BaseMetaTxArgs & {
1576
+ createOfferAndCommitArgs: FullOfferArgs;
1577
+ metadataStorage?: MetadataStorage;
1578
+ theGraphStorage?: MetadataStorage;
1579
+ returnTypedDataToSign?: boolean;
1580
+ }
1581
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1582
+ utils.validation.createOfferAndCommitArgsSchema.validateSync(
1583
+ args.createOfferAndCommitArgs,
1584
+ { abortEarly: false }
1585
+ );
1586
+
1587
+ await storeMetadataOnTheGraph({
1588
+ metadataUriOrHash: args.createOfferAndCommitArgs.metadataUri,
1589
+ metadataStorage: args.metadataStorage,
1590
+ theGraphStorage: args.theGraphStorage
1591
+ });
1592
+
1593
+ await storeMetadataItems({
1594
+ ...args,
1595
+ createOffersArgs: [args.createOfferAndCommitArgs]
1596
+ });
1597
+
1598
+ const signMetaTxArgs = {
1599
+ ...args,
1600
+ functionName:
1601
+ "createOfferCommitAndRedeem(((uint256,uint256,uint256,uint256,uint256,uint256,address,uint8,uint8,string,string,bool,uint256,(address[],uint256[])[],uint256),(uint256,uint256,uint256,uint256),(uint256,uint256,uint256),(uint256,address),(uint8,uint8,address,uint8,uint256,uint256,uint256,uint256),uint256,uint256,bool),address,bytes,uint256)",
1602
+ functionSignature: encodeCreateOfferCommitAndRedeem(
1603
+ args.createOfferAndCommitArgs
1604
+ )
1605
+ };
1606
+ if (args.returnTypedDataToSign) {
1607
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: true });
1608
+ }
1609
+ return signMetaTx({ ...signMetaTxArgs, returnTypedDataToSign: false });
1610
+ }
1611
+
1476
1612
  // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1477
1613
  export async function signMetaTxCancelVoucher(
1478
1614
  args: BaseMetaTxArgs & {
@@ -2018,6 +2154,7 @@ export async function relayMetaTransaction(args: {
2018
2154
  sigR: BytesLike;
2019
2155
  sigS: BytesLike;
2020
2156
  sigV: BigNumberish;
2157
+ transferAuthorizations?: TransferAuthorization[];
2021
2158
  };
2022
2159
  };
2023
2160
  }): Promise<TransactionResponse> {
@@ -2029,19 +2166,27 @@ export async function relayMetaTransaction(args: {
2029
2166
  metaTx.config.apiId
2030
2167
  );
2031
2168
 
2169
+ const baseParams: unknown[] = [
2170
+ metaTx.params.userAddress,
2171
+ metaTx.params.functionName,
2172
+ metaTx.params.functionSignature,
2173
+ metaTx.params.nonce,
2174
+ rebuildSignature({
2175
+ r: metaTx.params.sigR.toString(),
2176
+ s: metaTx.params.sigS.toString(),
2177
+ v: Number(metaTx.params.sigV)
2178
+ })
2179
+ ];
2180
+ const params = metaTx.params.transferAuthorizations?.length
2181
+ ? [
2182
+ ...baseParams,
2183
+ encodeTransferAuthorizationQueue(metaTx.params.transferAuthorizations)
2184
+ ]
2185
+ : baseParams;
2186
+
2032
2187
  const relayTxResponse = await biconomy.relayTransaction({
2033
2188
  to: contractAddress,
2034
- params: [
2035
- metaTx.params.userAddress,
2036
- metaTx.params.functionName,
2037
- metaTx.params.functionSignature,
2038
- metaTx.params.nonce,
2039
- rebuildSignature({
2040
- r: metaTx.params.sigR.toString(),
2041
- s: metaTx.params.sigS.toString(),
2042
- v: Number(metaTx.params.sigV)
2043
- })
2044
- ],
2189
+ params,
2045
2190
  from: metaTx.params.userAddress
2046
2191
  });
2047
2192
 
@@ -14,6 +14,7 @@ import { accounts } from "..";
14
14
  import { AccountsMixin } from "../accounts/mixin";
15
15
  import { SellerFieldsFragment } from "../subgraph";
16
16
  import { SignedMetaTx, UnsignedMetaTx } from "./handler";
17
+ import { TransferAuthorization } from "../erc20/handler";
17
18
  export class MetaTxMixin<T extends Web3LibAdapter> extends BaseCoreSDK<T> {
18
19
  /* -------------------------------------------------------------------------- */
19
20
  /* Meta Tx related methods */
@@ -1174,6 +1175,151 @@ export class MetaTxMixin<T extends Web3LibAdapter> extends BaseCoreSDK<T> {
1174
1175
  });
1175
1176
  }
1176
1177
 
1178
+ /**
1179
+ * Encodes and signs a meta transaction for `commitToOfferAndRedeemVoucher`
1180
+ * that can be relayed.
1181
+ * @param args - Meta transaction args.
1182
+ * @returns Signature.
1183
+ */
1184
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1185
+ public async signMetaTxCommitToOfferAndRedeemVoucher(
1186
+ args: Omit<
1187
+ Parameters<typeof handler.signMetaTxCommitToOfferAndRedeemVoucher>[0],
1188
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1189
+ > & { returnTypedDataToSign: true }
1190
+ ): Promise<UnsignedMetaTx>;
1191
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1192
+ public async signMetaTxCommitToOfferAndRedeemVoucher(
1193
+ args: Omit<
1194
+ Parameters<typeof handler.signMetaTxCommitToOfferAndRedeemVoucher>[0],
1195
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1196
+ > & { returnTypedDataToSign?: false | undefined }
1197
+ ): Promise<SignedMetaTx>;
1198
+ // Implementation
1199
+ public async signMetaTxCommitToOfferAndRedeemVoucher(
1200
+ args: Omit<
1201
+ Parameters<typeof handler.signMetaTxCommitToOfferAndRedeemVoucher>[0],
1202
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1203
+ >
1204
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1205
+ if (args.returnTypedDataToSign) {
1206
+ return handler.signMetaTxCommitToOfferAndRedeemVoucher({
1207
+ web3Lib: this._web3Lib,
1208
+ metaTxHandlerAddress: this._protocolDiamond,
1209
+ chainId: this._chainId,
1210
+ ...args,
1211
+ returnTypedDataToSign: true
1212
+ });
1213
+ }
1214
+ return handler.signMetaTxCommitToOfferAndRedeemVoucher({
1215
+ web3Lib: this._web3Lib,
1216
+ metaTxHandlerAddress: this._protocolDiamond,
1217
+ chainId: this._chainId,
1218
+ ...args,
1219
+ returnTypedDataToSign: false
1220
+ });
1221
+ }
1222
+
1223
+ /**
1224
+ * Encodes and signs a meta transaction for
1225
+ * `commitToConditionalOfferAndRedeemVoucher` that can be relayed.
1226
+ * @param args - Meta transaction args.
1227
+ * @returns Signature.
1228
+ */
1229
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1230
+ public async signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1231
+ args: Omit<
1232
+ Parameters<
1233
+ typeof handler.signMetaTxCommitToConditionalOfferAndRedeemVoucher
1234
+ >[0],
1235
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1236
+ > & { returnTypedDataToSign: true }
1237
+ ): Promise<UnsignedMetaTx>;
1238
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1239
+ public async signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1240
+ args: Omit<
1241
+ Parameters<
1242
+ typeof handler.signMetaTxCommitToConditionalOfferAndRedeemVoucher
1243
+ >[0],
1244
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1245
+ > & { returnTypedDataToSign?: false | undefined }
1246
+ ): Promise<SignedMetaTx>;
1247
+ // Implementation
1248
+ public async signMetaTxCommitToConditionalOfferAndRedeemVoucher(
1249
+ args: Omit<
1250
+ Parameters<
1251
+ typeof handler.signMetaTxCommitToConditionalOfferAndRedeemVoucher
1252
+ >[0],
1253
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1254
+ >
1255
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1256
+ if (args.returnTypedDataToSign) {
1257
+ return handler.signMetaTxCommitToConditionalOfferAndRedeemVoucher({
1258
+ web3Lib: this._web3Lib,
1259
+ metaTxHandlerAddress: this._protocolDiamond,
1260
+ chainId: this._chainId,
1261
+ ...args,
1262
+ returnTypedDataToSign: true
1263
+ });
1264
+ }
1265
+ return handler.signMetaTxCommitToConditionalOfferAndRedeemVoucher({
1266
+ web3Lib: this._web3Lib,
1267
+ metaTxHandlerAddress: this._protocolDiamond,
1268
+ chainId: this._chainId,
1269
+ ...args,
1270
+ returnTypedDataToSign: false
1271
+ });
1272
+ }
1273
+
1274
+ /**
1275
+ * Encodes and signs a meta transaction for `createOfferCommitAndRedeem` that
1276
+ * can be relayed.
1277
+ * @param args - Meta transaction args.
1278
+ * @returns Signature.
1279
+ */
1280
+ // Overload: returnTypedDataToSign is true → returns UnsignedMetaTx
1281
+ public async signMetaTxCreateOfferCommitAndRedeem(
1282
+ args: Omit<
1283
+ Parameters<typeof handler.signMetaTxCreateOfferCommitAndRedeem>[0],
1284
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1285
+ > & { returnTypedDataToSign: true }
1286
+ ): Promise<UnsignedMetaTx>;
1287
+ // Overload: returnTypedDataToSign is false or undefined → returns SignedMetaTx
1288
+ public async signMetaTxCreateOfferCommitAndRedeem(
1289
+ args: Omit<
1290
+ Parameters<typeof handler.signMetaTxCreateOfferCommitAndRedeem>[0],
1291
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1292
+ > & { returnTypedDataToSign?: false | undefined }
1293
+ ): Promise<SignedMetaTx>;
1294
+ // Implementation
1295
+ public async signMetaTxCreateOfferCommitAndRedeem(
1296
+ args: Omit<
1297
+ Parameters<typeof handler.signMetaTxCreateOfferCommitAndRedeem>[0],
1298
+ "web3Lib" | "metaTxHandlerAddress" | "chainId"
1299
+ >
1300
+ ): Promise<SignedMetaTx | UnsignedMetaTx> {
1301
+ if (args.returnTypedDataToSign) {
1302
+ return handler.signMetaTxCreateOfferCommitAndRedeem({
1303
+ web3Lib: this._web3Lib,
1304
+ theGraphStorage: this._theGraphStorage,
1305
+ metadataStorage: this._metadataStorage,
1306
+ metaTxHandlerAddress: this._protocolDiamond,
1307
+ chainId: this._chainId,
1308
+ ...args,
1309
+ returnTypedDataToSign: true
1310
+ });
1311
+ }
1312
+ return handler.signMetaTxCreateOfferCommitAndRedeem({
1313
+ web3Lib: this._web3Lib,
1314
+ theGraphStorage: this._theGraphStorage,
1315
+ metadataStorage: this._metadataStorage,
1316
+ metaTxHandlerAddress: this._protocolDiamond,
1317
+ chainId: this._chainId,
1318
+ ...args,
1319
+ returnTypedDataToSign: false
1320
+ });
1321
+ }
1322
+
1177
1323
  /**
1178
1324
  * Encodes and signs a meta transaction for `cancelVoucher` that can be relayed.
1179
1325
  * @param args - Meta transaction args.
@@ -1672,6 +1818,7 @@ export class MetaTxMixin<T extends Web3LibAdapter> extends BaseCoreSDK<T> {
1672
1818
  sigR: BytesLike;
1673
1819
  sigS: BytesLike;
1674
1820
  sigV: BigNumberish;
1821
+ transferAuthorizations?: TransferAuthorization[];
1675
1822
  },
1676
1823
  overrides: Partial<{
1677
1824
  userAddress: string;
@@ -1701,7 +1848,8 @@ export class MetaTxMixin<T extends Web3LibAdapter> extends BaseCoreSDK<T> {
1701
1848
  nonce: metaTxParams.nonce,
1702
1849
  sigR: metaTxParams.sigR,
1703
1850
  sigS: metaTxParams.sigS,
1704
- sigV: metaTxParams.sigV
1851
+ sigV: metaTxParams.sigV,
1852
+ transferAuthorizations: metaTxParams.transferAuthorizations
1705
1853
  }
1706
1854
  }
1707
1855
  });
@@ -128,7 +128,7 @@ export async function signNativeMetaTx(
128
128
  };
129
129
  }
130
130
 
131
- type ApproveExchangeTokenBaseArgs = {
131
+ export type ApproveExchangeTokenBaseArgs = {
132
132
  web3Lib: Web3LibAdapter;
133
133
  chainId: number;
134
134
  user: string;
@@ -4,9 +4,14 @@ import {
4
4
  TransactionResponse,
5
5
  MetadataStorage,
6
6
  utils,
7
- ConditionStruct
7
+ ConditionStruct,
8
+ FullOfferArgs,
9
+ OfferCreator
8
10
  } from "@bosonprotocol/common";
9
11
  import {
12
+ encodeCommitToConditionalOfferAndRedeemVoucher,
13
+ encodeCommitToOfferAndRedeemVoucher,
14
+ encodeCreateOfferCommitAndRedeem,
10
15
  encodeCreateOfferWithCondition,
11
16
  encodeCreatePremintedOfferAddToGroup,
12
17
  encodeCreatePremintedOfferWithCondition,
@@ -17,6 +22,7 @@ import {
17
22
  encodeRaiseAndEscalateDispute
18
23
  } from "./interface";
19
24
  import { storeMetadataOnTheGraph } from "../offers/storage";
25
+ import { AddressZero } from "@ethersproject/constants";
20
26
 
21
27
  import { CreateOfferArgs } from "../offers/types";
22
28
  import { CreateSellerArgs } from "../accounts/types";
@@ -24,6 +30,13 @@ import { BigNumberish } from "@ethersproject/bignumber";
24
30
  import { findCollectionSalt } from "../accounts/handler";
25
31
  import { PremintParametersStruct } from "@bosonprotocol/common/src";
26
32
  import { storeMetadataItems } from "../metadata/storeMetadataItems";
33
+ import { getOfferById } from "../offers/subgraph";
34
+ import {
35
+ checkOfferIsCommittable,
36
+ isFullOfferVoided
37
+ } from "../exchanges/handler";
38
+ import { ensureAllowance } from "../erc20/handler";
39
+ import { getDisputeResolverById } from "../accounts/subgraph";
27
40
 
28
41
  // createOfferAndSeller overloads
29
42
  export async function createOfferAndSeller(args: {
@@ -510,6 +523,259 @@ export async function createSellerAndPremintedOfferWithCondition(args: {
510
523
  }
511
524
  }
512
525
 
526
+ // commitToOfferAndRedeemVoucher overloads
527
+ export async function commitToOfferAndRedeemVoucher(args: {
528
+ offerId: BigNumberish;
529
+ contractAddress: string;
530
+ subgraphUrl: string;
531
+ web3Lib: Web3LibAdapter;
532
+ metadataStorage?: MetadataStorage;
533
+ theGraphStorage?: MetadataStorage;
534
+ returnTxInfo: true;
535
+ }): Promise<TransactionRequest>;
536
+
537
+ export async function commitToOfferAndRedeemVoucher(args: {
538
+ offerId: BigNumberish;
539
+ contractAddress: string;
540
+ subgraphUrl: string;
541
+ web3Lib: Web3LibAdapter;
542
+ metadataStorage?: MetadataStorage;
543
+ theGraphStorage?: MetadataStorage;
544
+ returnTxInfo?: false | undefined;
545
+ }): Promise<TransactionResponse>;
546
+
547
+ export async function commitToOfferAndRedeemVoucher(args: {
548
+ offerId: BigNumberish;
549
+ contractAddress: string;
550
+ subgraphUrl: string;
551
+ web3Lib: Web3LibAdapter;
552
+ metadataStorage?: MetadataStorage;
553
+ theGraphStorage?: MetadataStorage;
554
+ returnTxInfo?: boolean;
555
+ }): Promise<TransactionRequest | TransactionResponse> {
556
+ const offer = await getOfferById(args.subgraphUrl, args.offerId);
557
+
558
+ await checkOfferIsCommittable(args.offerId, offer);
559
+
560
+ if (offer.creator !== OfferCreator.Seller) {
561
+ throw new Error(
562
+ `Offer with id ${args.offerId.toString()} is not seller initiated`
563
+ );
564
+ }
565
+
566
+ if (offer.condition) {
567
+ // keep compatibility with previous version
568
+ if (args.returnTxInfo) {
569
+ return commitToConditionalOfferAndRedeemVoucher({
570
+ ...args,
571
+ returnTxInfo: true,
572
+ tokenId: offer.condition.minTokenId
573
+ });
574
+ }
575
+ return commitToConditionalOfferAndRedeemVoucher({
576
+ ...args,
577
+ returnTxInfo: false,
578
+ tokenId: offer.condition.minTokenId
579
+ });
580
+ }
581
+
582
+ if (offer.exchangeToken.address !== AddressZero) {
583
+ const owner = await args.web3Lib.getSignerAddress();
584
+ await ensureAllowance({
585
+ owner,
586
+ spender: args.contractAddress,
587
+ contractAddress: offer.exchangeToken.address,
588
+ value: offer.price,
589
+ web3Lib: args.web3Lib
590
+ });
591
+ }
592
+
593
+ const transactionRequest = {
594
+ to: args.contractAddress,
595
+ data: encodeCommitToOfferAndRedeemVoucher(args.offerId),
596
+ value: offer.exchangeToken.address === AddressZero ? offer.price : "0"
597
+ } satisfies TransactionRequest;
598
+
599
+ if (args.returnTxInfo) {
600
+ return transactionRequest;
601
+ } else {
602
+ return args.web3Lib.sendTransaction(transactionRequest);
603
+ }
604
+ }
605
+
606
+ // commitToConditionalOfferAndRedeemVoucher overloads
607
+ export async function commitToConditionalOfferAndRedeemVoucher(args: {
608
+ offerId: BigNumberish;
609
+ tokenId: BigNumberish;
610
+ contractAddress: string;
611
+ subgraphUrl: string;
612
+ web3Lib: Web3LibAdapter;
613
+ metadataStorage?: MetadataStorage;
614
+ theGraphStorage?: MetadataStorage;
615
+ returnTxInfo: true;
616
+ }): Promise<TransactionRequest>;
617
+
618
+ export async function commitToConditionalOfferAndRedeemVoucher(args: {
619
+ offerId: BigNumberish;
620
+ tokenId: BigNumberish;
621
+ contractAddress: string;
622
+ subgraphUrl: string;
623
+ web3Lib: Web3LibAdapter;
624
+ metadataStorage?: MetadataStorage;
625
+ theGraphStorage?: MetadataStorage;
626
+ returnTxInfo?: false | undefined;
627
+ }): Promise<TransactionResponse>;
628
+
629
+ export async function commitToConditionalOfferAndRedeemVoucher(args: {
630
+ offerId: BigNumberish;
631
+ tokenId: BigNumberish;
632
+ contractAddress: string;
633
+ subgraphUrl: string;
634
+ web3Lib: Web3LibAdapter;
635
+ metadataStorage?: MetadataStorage;
636
+ theGraphStorage?: MetadataStorage;
637
+ returnTxInfo?: boolean;
638
+ }): Promise<TransactionRequest | TransactionResponse> {
639
+ const offer = await getOfferById(args.subgraphUrl, args.offerId);
640
+
641
+ await checkOfferIsCommittable(args.offerId, offer);
642
+
643
+ if (offer.exchangeToken.address !== AddressZero) {
644
+ const owner = await args.web3Lib.getSignerAddress();
645
+ await ensureAllowance({
646
+ owner,
647
+ spender: args.contractAddress,
648
+ contractAddress: offer.exchangeToken.address,
649
+ value: offer.price,
650
+ web3Lib: args.web3Lib
651
+ });
652
+ }
653
+
654
+ const transactionRequest = {
655
+ to: args.contractAddress,
656
+ data: encodeCommitToConditionalOfferAndRedeemVoucher(
657
+ args.offerId,
658
+ args.tokenId
659
+ ),
660
+ value: offer.exchangeToken.address === AddressZero ? offer.price : "0"
661
+ } satisfies TransactionRequest;
662
+
663
+ if (args.returnTxInfo) {
664
+ return transactionRequest;
665
+ } else {
666
+ return args.web3Lib.sendTransaction(transactionRequest);
667
+ }
668
+ }
669
+
670
+ // createOfferCommitAndRedeem overloads
671
+ export async function createOfferCommitAndRedeem(args: {
672
+ createOfferAndCommitArgs: FullOfferArgs;
673
+ contractAddress: string;
674
+ subgraphUrl: string;
675
+ web3Lib: Web3LibAdapter;
676
+ txRequest?: TransactionRequest;
677
+ metadataStorage?: MetadataStorage;
678
+ theGraphStorage?: MetadataStorage;
679
+ returnTxInfo: true;
680
+ }): Promise<TransactionRequest>;
681
+
682
+ export async function createOfferCommitAndRedeem(args: {
683
+ createOfferAndCommitArgs: FullOfferArgs;
684
+ contractAddress: string;
685
+ subgraphUrl: string;
686
+ web3Lib: Web3LibAdapter;
687
+ txRequest?: TransactionRequest;
688
+ metadataStorage?: MetadataStorage;
689
+ theGraphStorage?: MetadataStorage;
690
+ returnTxInfo?: false | undefined;
691
+ }): Promise<TransactionResponse>;
692
+
693
+ export async function createOfferCommitAndRedeem(args: {
694
+ createOfferAndCommitArgs: FullOfferArgs;
695
+ contractAddress: string;
696
+ subgraphUrl: string;
697
+ web3Lib: Web3LibAdapter;
698
+ txRequest?: TransactionRequest;
699
+ metadataStorage?: MetadataStorage;
700
+ theGraphStorage?: MetadataStorage;
701
+ returnTxInfo?: boolean;
702
+ }): Promise<TransactionRequest | TransactionResponse> {
703
+ utils.validation.createOfferAndCommitArgsSchema.validateSync(
704
+ args.createOfferAndCommitArgs,
705
+ {
706
+ abortEarly: false
707
+ }
708
+ );
709
+
710
+ const { disputeResolverId, exchangeToken, price, sellerDeposit, creator } =
711
+ args.createOfferAndCommitArgs;
712
+ const disputeResolver = await getDisputeResolverById(
713
+ args.subgraphUrl,
714
+ disputeResolverId
715
+ );
716
+ if (!disputeResolver) {
717
+ throw new Error(
718
+ `Dispute resolver with id "${disputeResolverId}" does not exist`
719
+ );
720
+ }
721
+ if (
722
+ !disputeResolver.fees.some(
723
+ (fee) => fee.token.address.toLowerCase() === exchangeToken.toLowerCase()
724
+ )
725
+ ) {
726
+ throw new Error(
727
+ `Dispute resolver with id "${disputeResolverId}" does not support exchange token "${exchangeToken}"`
728
+ );
729
+ }
730
+
731
+ if (
732
+ await isFullOfferVoided({
733
+ ...args,
734
+ fullOfferArgsUnsigned: args.createOfferAndCommitArgs
735
+ })
736
+ ) {
737
+ throw new Error(`The offer has been voided`);
738
+ }
739
+
740
+ await storeMetadataOnTheGraph({
741
+ metadataUriOrHash: args.createOfferAndCommitArgs.metadataUri,
742
+ metadataStorage: args.metadataStorage,
743
+ theGraphStorage: args.theGraphStorage
744
+ });
745
+
746
+ await storeMetadataItems({
747
+ ...args,
748
+ createOffersArgs: [args.createOfferAndCommitArgs]
749
+ });
750
+
751
+ const committerPayment =
752
+ creator === OfferCreator.Buyer ? sellerDeposit : price;
753
+
754
+ if (exchangeToken !== AddressZero) {
755
+ const owner = await args.web3Lib.getSignerAddress();
756
+ await ensureAllowance({
757
+ owner,
758
+ spender: args.contractAddress,
759
+ contractAddress: exchangeToken,
760
+ value: committerPayment,
761
+ web3Lib: args.web3Lib
762
+ });
763
+ }
764
+
765
+ const transactionRequest = {
766
+ ...args.txRequest,
767
+ to: args.contractAddress,
768
+ data: encodeCreateOfferCommitAndRedeem(args.createOfferAndCommitArgs),
769
+ value: exchangeToken === AddressZero ? committerPayment : "0"
770
+ } satisfies TransactionRequest;
771
+
772
+ if (args.returnTxInfo) {
773
+ return transactionRequest;
774
+ } else {
775
+ return args.web3Lib.sendTransaction(transactionRequest);
776
+ }
777
+ }
778
+
513
779
  // raiseAndEscalateDispute overloads
514
780
  export async function raiseAndEscalateDispute(args: {
515
781
  exchangeId: BigNumberish;