@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.
- package/dist/cjs/erc20/handler.d.ts +73 -0
- package/dist/cjs/erc20/handler.d.ts.map +1 -1
- package/dist/cjs/erc20/handler.js +198 -0
- package/dist/cjs/erc20/handler.js.map +1 -1
- package/dist/cjs/erc20/mixin.d.ts +76 -1
- package/dist/cjs/erc20/mixin.d.ts.map +1 -1
- package/dist/cjs/erc20/mixin.js +67 -0
- package/dist/cjs/erc20/mixin.js.map +1 -1
- package/dist/cjs/exchanges/handler.d.ts +6 -0
- package/dist/cjs/exchanges/handler.d.ts.map +1 -1
- package/dist/cjs/exchanges/handler.js +1 -0
- package/dist/cjs/exchanges/handler.js.map +1 -1
- package/dist/cjs/meta-tx/handler.d.ts +32 -0
- package/dist/cjs/meta-tx/handler.d.ts.map +1 -1
- package/dist/cjs/meta-tx/handler.js +68 -19
- package/dist/cjs/meta-tx/handler.js.map +1 -1
- package/dist/cjs/meta-tx/mixin.d.ts +38 -0
- package/dist/cjs/meta-tx/mixin.d.ts.map +1 -1
- package/dist/cjs/meta-tx/mixin.js +29 -1
- package/dist/cjs/meta-tx/mixin.js.map +1 -1
- package/dist/cjs/native-meta-tx/handler.d.ts +1 -1
- package/dist/cjs/native-meta-tx/handler.d.ts.map +1 -1
- package/dist/cjs/orchestration/handler.d.ts +59 -1
- package/dist/cjs/orchestration/handler.d.ts.map +1 -1
- package/dist/cjs/orchestration/handler.js +114 -0
- package/dist/cjs/orchestration/handler.js.map +1 -1
- package/dist/cjs/orchestration/interface.d.ts +4 -1
- package/dist/cjs/orchestration/interface.d.ts.map +1 -1
- package/dist/cjs/orchestration/interface.js +23 -5
- package/dist/cjs/orchestration/interface.js.map +1 -1
- package/dist/cjs/orchestration/mixin.d.ts +49 -1
- package/dist/cjs/orchestration/mixin.d.ts.map +1 -1
- package/dist/cjs/orchestration/mixin.js +62 -0
- package/dist/cjs/orchestration/mixin.js.map +1 -1
- package/dist/cjs/utils/signature.d.ts +9 -0
- package/dist/cjs/utils/signature.d.ts.map +1 -1
- package/dist/cjs/utils/signature.js.map +1 -1
- package/dist/esm/erc20/handler.d.ts +73 -0
- package/dist/esm/erc20/handler.d.ts.map +1 -1
- package/dist/esm/erc20/handler.js +217 -0
- package/dist/esm/erc20/handler.js.map +1 -1
- package/dist/esm/erc20/mixin.d.ts +76 -1
- package/dist/esm/erc20/mixin.d.ts.map +1 -1
- package/dist/esm/erc20/mixin.js +79 -1
- package/dist/esm/erc20/mixin.js.map +1 -1
- package/dist/esm/exchanges/handler.d.ts +6 -0
- package/dist/esm/exchanges/handler.d.ts.map +1 -1
- package/dist/esm/exchanges/handler.js +1 -1
- package/dist/esm/exchanges/handler.js.map +1 -1
- package/dist/esm/meta-tx/handler.d.ts +32 -0
- package/dist/esm/meta-tx/handler.d.ts.map +1 -1
- package/dist/esm/meta-tx/handler.js +66 -12
- package/dist/esm/meta-tx/handler.js.map +1 -1
- package/dist/esm/meta-tx/mixin.d.ts +38 -0
- package/dist/esm/meta-tx/mixin.d.ts.map +1 -1
- package/dist/esm/meta-tx/mixin.js +63 -1
- package/dist/esm/meta-tx/mixin.js.map +1 -1
- package/dist/esm/native-meta-tx/handler.d.ts +1 -1
- package/dist/esm/native-meta-tx/handler.d.ts.map +1 -1
- package/dist/esm/orchestration/handler.d.ts +59 -1
- package/dist/esm/orchestration/handler.d.ts.map +1 -1
- package/dist/esm/orchestration/handler.js +126 -2
- package/dist/esm/orchestration/handler.js.map +1 -1
- package/dist/esm/orchestration/interface.d.ts +4 -1
- package/dist/esm/orchestration/interface.d.ts.map +1 -1
- package/dist/esm/orchestration/interface.js +15 -0
- package/dist/esm/orchestration/interface.js.map +1 -1
- package/dist/esm/orchestration/mixin.d.ts +49 -1
- package/dist/esm/orchestration/mixin.d.ts.map +1 -1
- package/dist/esm/orchestration/mixin.js +74 -0
- package/dist/esm/orchestration/mixin.js.map +1 -1
- package/dist/esm/utils/signature.d.ts +9 -0
- package/dist/esm/utils/signature.d.ts.map +1 -1
- package/dist/esm/utils/signature.js.map +1 -1
- package/package.json +3 -3
- package/src/erc20/handler.ts +354 -0
- package/src/erc20/mixin.ts +206 -1
- package/src/exchanges/handler.ts +1 -1
- package/src/meta-tx/handler.ts +157 -12
- package/src/meta-tx/mixin.ts +149 -1
- package/src/native-meta-tx/handler.ts +1 -1
- package/src/orchestration/handler.ts +267 -1
- package/src/orchestration/interface.ts +31 -1
- package/src/orchestration/mixin.ts +187 -0
- package/src/utils/signature.ts +18 -6
package/src/meta-tx/handler.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
package/src/meta-tx/mixin.ts
CHANGED
|
@@ -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
|
});
|
|
@@ -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;
|