@railblock/opencommodity-sdk 1.0.2 → 1.0.4

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/README.md CHANGED
@@ -26,92 +26,109 @@ npm install @railblock/opencommodity-sdk
26
26
  ## Quick start
27
27
 
28
28
  ```ts
29
- import { OpenCommodity } from "@railblock/opencommodity-sdk";
29
+ import { OpenCommodityClient } from "@railblock/opencommodity-sdk";
30
30
 
31
- const client = new OpenCommodity({
32
- apiKey: process.env.OPENCOMMODITY_API_KEY,
33
- endpoint: "https://api.opencommodity.pro",
31
+ const client = new OpenCommodityClient({
32
+ apiKey: process.env.OPENCOMMODITY_API_KEY ?? "",
33
+ baseUrl: "https://api.opencommodity.pro",
34
34
  });
35
35
  ```
36
36
 
37
37
  ## One-liner usage
38
38
 
39
39
  ```ts
40
- const client = new OpenCommodity({ apiKey: process.env.OPENCOMMODITY_API_KEY });
40
+ const client = new OpenCommodityClient({ apiKey: process.env.OPENCOMMODITY_API_KEY ?? "" });
41
41
  ```
42
42
 
43
43
  ## What this SDK does
44
44
 
45
45
  - Talks to the OpenCommodity API
46
- - Supports contract-backed commodity, listing, and marketplace flows
46
+ - Supports contract-backed commodity, listing, marketplace, and escrow lifecycle flows
47
47
  - Falls back to REST when no contract config is provided
48
- - Exposes contract ABIs for `CommodityRegistry`, `OpenCommodity`, and `MarketplaceRegistry`
48
+ - Exposes contract ABIs for `UniversalEscrow` and the current SDK client surface
49
49
 
50
- ## Contract-backed usage
50
+ ## Escrow lifecycle usage
51
51
 
52
- ### Commodity registration
52
+ The SDK now includes UniversalEscrow lifecycle methods for the `ship → receive → accept quality → dispute → auto-release` flow.
53
+
54
+ ### Create an escrow sale
53
55
 
54
56
  ```ts
55
- const client = new OpenCommodity({
56
- apiKey: process.env.OPENCOMMODITY_API_KEY,
57
- endpoint: "https://api.opencommodity.pro",
57
+ const client = new OpenCommodityClient({
58
+ apiKey: process.env.OPENCOMMODITY_API_KEY ?? "",
58
59
  provider: window.ethereum,
59
60
  contracts: {
60
- commodityRegistry: "0xYourCommodityRegistryAddress",
61
+ universalEscrow: "0xYourUniversalEscrowAddress",
61
62
  },
62
63
  });
63
64
 
64
- const result = await client.registerCommodity("ipfs://metadata-uri");
65
+ const saleId = await client.createUniversalEscrowSale({
66
+ tokenId: 1,
67
+ amount: 10,
68
+ price: 1000,
69
+ seller: "0xSellerAddress",
70
+ });
65
71
  ```
66
72
 
67
- ### Listing management
73
+ ### Confirm shipment
68
74
 
69
75
  ```ts
70
- const client = new OpenCommodity({
71
- apiKey: process.env.OPENCOMMODITY_API_KEY,
72
- endpoint: "https://api.opencommodity.pro",
73
- provider: window.ethereum,
74
- contracts: {
75
- listingManager: "0xYourListingManagerAddress",
76
- },
76
+ await client.confirmUniversalEscrowShipment({
77
+ saleId,
77
78
  });
79
+ ```
78
80
 
79
- await client.createListing(1, "1.5");
80
- await client.updatePrice(1, "2.0");
81
- await client.cancelListing(1);
81
+ ### Confirm receipt
82
+
83
+ ```ts
84
+ await client.confirmUniversalEscrowReceipt({
85
+ saleId,
86
+ });
82
87
  ```
83
88
 
84
- ### Marketplace registration
89
+ ### Accept quality
85
90
 
86
- Marketplace operators can configure their own marketplace fee percentage. Protocol, listing, and buy-side fees continue to route to the contract treasury.
91
+ ```ts
92
+ await client.acceptUniversalEscrowQuality({
93
+ saleId,
94
+ });
95
+ ```
96
+
97
+ ### Open a dispute
87
98
 
88
99
  ```ts
89
- const client = new OpenCommodity({
90
- apiKey: process.env.OPENCOMMODITY_API_KEY,
91
- endpoint: "https://api.opencommodity.pro",
92
- provider: window.ethereum,
93
- contracts: {
94
- marketplaceRegistry: "0xYourMarketplaceRegistryAddress",
95
- },
100
+ await client.initiateUniversalEscrowDispute({
101
+ saleId,
102
+ reason: "Item arrived damaged",
96
103
  });
104
+ ```
105
+
106
+ ### Resolve a dispute
97
107
 
98
- const marketplace = await client.registerMarketplace({
99
- fee_percent: 1.5,
108
+ ```ts
109
+ await client.resolveUniversalEscrowDispute({
110
+ saleId,
111
+ favorBuyer: true,
112
+ refundPercentage: 50,
100
113
  });
114
+ ```
115
+
116
+ ### Auto-release funds
101
117
 
102
- await client.updateMarketplaceFee(marketplace.marketplaceId, 2.0);
103
- await client.deactivateMarketplace(marketplace.marketplaceId);
118
+ ```ts
119
+ await client.autoReleaseUniversalEscrowFunds({
120
+ saleId,
121
+ });
104
122
  ```
105
123
 
106
124
  ## REST fallback
107
125
 
108
126
  ```ts
109
- const client = new OpenCommodity({
110
- apiKey: process.env.OPENCOMMODITY_API_KEY,
111
- endpoint: "https://api.opencommodity.pro",
127
+ const client = new OpenCommodityClient({
128
+ apiKey: process.env.OPENCOMMODITY_API_KEY ?? "",
112
129
  });
113
130
 
114
- const listings = await client.getListings();
131
+ const listings = await client.listListings();
115
132
  ```
116
133
 
117
134
  ## Why OpenCommodity
package/dist/index.d.mts CHANGED
@@ -117,6 +117,20 @@ interface CreateListingParams {
117
117
  price: number;
118
118
  gcid?: string;
119
119
  }
120
+ interface CreateEscrowSaleParams {
121
+ tokenId: number;
122
+ amount: number;
123
+ price: number;
124
+ seller: string;
125
+ }
126
+ interface ConfirmEscrowActionParams {
127
+ saleId: string | number;
128
+ }
129
+ interface ResolveEscrowDisputeParams {
130
+ saleId: string | number;
131
+ favorBuyer: boolean;
132
+ refundPercentage: number;
133
+ }
120
134
 
121
135
  declare class OpenCommodityError extends Error {
122
136
  status: number;
@@ -153,13 +167,15 @@ declare class OpenCommodityClient {
153
167
  getStats(): Promise<ProtocolStats>;
154
168
  createCommodity(params: CreateCommodityParams): Promise<Commodity>;
155
169
  createListing(params: CreateListingParams): Promise<Listing>;
156
- createUniversalEscrowSale(params: CreateSaleParams): Promise<Sale>;
157
- confirmUniversalEscrowShipment(saleId: string | number): Promise<Sale>;
158
- confirmUniversalEscrowReceipt(saleId: string | number): Promise<Sale>;
159
- acceptUniversalEscrowQuality(saleId: string | number): Promise<Sale>;
160
- initiateUniversalEscrowDispute(saleId: string | number, reason: string): Promise<Sale>;
161
- resolveUniversalEscrowDispute(saleId: string | number, favorBuyer: boolean, refundPercentage: number): Promise<Sale>;
162
- autoReleaseUniversalEscrowFunds(saleId: string | number): Promise<Sale>;
170
+ createUniversalEscrowSale(params: CreateEscrowSaleParams): Promise<string>;
171
+ confirmUniversalEscrowShipment(params: ConfirmEscrowActionParams): Promise<string>;
172
+ confirmUniversalEscrowReceipt(params: ConfirmEscrowActionParams): Promise<string>;
173
+ acceptUniversalEscrowQuality(params: ConfirmEscrowActionParams): Promise<string>;
174
+ initiateUniversalEscrowDispute(params: ConfirmEscrowActionParams & {
175
+ reason: string;
176
+ }): Promise<string>;
177
+ resolveUniversalEscrowDispute(params: ResolveEscrowDisputeParams): Promise<string>;
178
+ autoReleaseUniversalEscrowFunds(params: ConfirmEscrowActionParams): Promise<string>;
163
179
  private hasUniversalEscrowContract;
164
180
  private callUniversalEscrowContract;
165
181
  }
package/dist/index.d.ts CHANGED
@@ -117,6 +117,20 @@ interface CreateListingParams {
117
117
  price: number;
118
118
  gcid?: string;
119
119
  }
120
+ interface CreateEscrowSaleParams {
121
+ tokenId: number;
122
+ amount: number;
123
+ price: number;
124
+ seller: string;
125
+ }
126
+ interface ConfirmEscrowActionParams {
127
+ saleId: string | number;
128
+ }
129
+ interface ResolveEscrowDisputeParams {
130
+ saleId: string | number;
131
+ favorBuyer: boolean;
132
+ refundPercentage: number;
133
+ }
120
134
 
121
135
  declare class OpenCommodityError extends Error {
122
136
  status: number;
@@ -153,13 +167,15 @@ declare class OpenCommodityClient {
153
167
  getStats(): Promise<ProtocolStats>;
154
168
  createCommodity(params: CreateCommodityParams): Promise<Commodity>;
155
169
  createListing(params: CreateListingParams): Promise<Listing>;
156
- createUniversalEscrowSale(params: CreateSaleParams): Promise<Sale>;
157
- confirmUniversalEscrowShipment(saleId: string | number): Promise<Sale>;
158
- confirmUniversalEscrowReceipt(saleId: string | number): Promise<Sale>;
159
- acceptUniversalEscrowQuality(saleId: string | number): Promise<Sale>;
160
- initiateUniversalEscrowDispute(saleId: string | number, reason: string): Promise<Sale>;
161
- resolveUniversalEscrowDispute(saleId: string | number, favorBuyer: boolean, refundPercentage: number): Promise<Sale>;
162
- autoReleaseUniversalEscrowFunds(saleId: string | number): Promise<Sale>;
170
+ createUniversalEscrowSale(params: CreateEscrowSaleParams): Promise<string>;
171
+ confirmUniversalEscrowShipment(params: ConfirmEscrowActionParams): Promise<string>;
172
+ confirmUniversalEscrowReceipt(params: ConfirmEscrowActionParams): Promise<string>;
173
+ acceptUniversalEscrowQuality(params: ConfirmEscrowActionParams): Promise<string>;
174
+ initiateUniversalEscrowDispute(params: ConfirmEscrowActionParams & {
175
+ reason: string;
176
+ }): Promise<string>;
177
+ resolveUniversalEscrowDispute(params: ResolveEscrowDisputeParams): Promise<string>;
178
+ autoReleaseUniversalEscrowFunds(params: ConfirmEscrowActionParams): Promise<string>;
163
179
  private hasUniversalEscrowContract;
164
180
  private callUniversalEscrowContract;
165
181
  }
package/dist/index.js CHANGED
@@ -27548,55 +27548,39 @@ var OpenCommodityClient = class {
27548
27548
  });
27549
27549
  }
27550
27550
  async createUniversalEscrowSale(params) {
27551
- if (this.hasUniversalEscrowContract()) {
27552
- const saleId = await this.callUniversalEscrowContract("createSale", [
27553
- params.token_id,
27554
- params.amount,
27555
- params.price,
27556
- params.seller_wallet
27557
- ]);
27558
- return {
27559
- id: String(saleId),
27560
- commodity_id: params.commodity_id,
27561
- seller_wallet: params.seller_wallet,
27562
- buyer_wallet: params.buyer_wallet,
27563
- price: params.price,
27564
- amount: params.amount,
27565
- status: "FUNDED",
27566
- gcid: null,
27567
- created_at: (/* @__PURE__ */ new Date()).toISOString()
27568
- };
27551
+ if (!this.hasUniversalEscrowContract()) {
27552
+ throw new Error("universalEscrow contract configuration is required");
27569
27553
  }
27570
- return this.createSale(params);
27554
+ const saleId = await this.callUniversalEscrowContract("createSale", [
27555
+ params.tokenId,
27556
+ params.amount,
27557
+ params.price,
27558
+ params.seller
27559
+ ], "SaleCreated");
27560
+ return String(saleId);
27571
27561
  }
27572
- async confirmUniversalEscrowShipment(saleId) {
27573
- await this.callUniversalEscrowContract("confirmShipment", [saleId]);
27574
- return this.getSale(String(saleId));
27562
+ async confirmUniversalEscrowShipment(params) {
27563
+ return this.callUniversalEscrowContract("confirmShipment", [params.saleId], "Shipped");
27575
27564
  }
27576
- async confirmUniversalEscrowReceipt(saleId) {
27577
- await this.callUniversalEscrowContract("confirmReceipt", [saleId]);
27578
- return this.getSale(String(saleId));
27565
+ async confirmUniversalEscrowReceipt(params) {
27566
+ return this.callUniversalEscrowContract("confirmReceipt", [params.saleId], "ReceiptConfirmed");
27579
27567
  }
27580
- async acceptUniversalEscrowQuality(saleId) {
27581
- await this.callUniversalEscrowContract("acceptQuality", [saleId]);
27582
- return this.getSale(String(saleId));
27568
+ async acceptUniversalEscrowQuality(params) {
27569
+ return this.callUniversalEscrowContract("acceptQuality", [params.saleId], "QualityAccepted");
27583
27570
  }
27584
- async initiateUniversalEscrowDispute(saleId, reason) {
27585
- await this.callUniversalEscrowContract("initiateDispute", [saleId, reason]);
27586
- return this.getSale(String(saleId));
27571
+ async initiateUniversalEscrowDispute(params) {
27572
+ return this.callUniversalEscrowContract("initiateDispute", [params.saleId, params.reason], "DisputeInitiated");
27587
27573
  }
27588
- async resolveUniversalEscrowDispute(saleId, favorBuyer, refundPercentage) {
27589
- await this.callUniversalEscrowContract("resolveDispute", [saleId, favorBuyer, refundPercentage]);
27590
- return this.getSale(String(saleId));
27574
+ async resolveUniversalEscrowDispute(params) {
27575
+ return this.callUniversalEscrowContract("resolveDispute", [params.saleId, params.favorBuyer, params.refundPercentage], "DisputeResolved");
27591
27576
  }
27592
- async autoReleaseUniversalEscrowFunds(saleId) {
27593
- await this.callUniversalEscrowContract("autoReleaseFunds", [saleId]);
27594
- return this.getSale(String(saleId));
27577
+ async autoReleaseUniversalEscrowFunds(params) {
27578
+ return this.callUniversalEscrowContract("autoReleaseFunds", [params.saleId], "AutoReleased");
27595
27579
  }
27596
27580
  hasUniversalEscrowContract() {
27597
27581
  return !!(this.provider && this.contracts?.universalEscrow);
27598
27582
  }
27599
- async callUniversalEscrowContract(method, args) {
27583
+ async callUniversalEscrowContract(method, args, eventName) {
27600
27584
  if (!this.hasUniversalEscrowContract()) {
27601
27585
  throw new Error("universalEscrow contract configuration is required");
27602
27586
  }
@@ -27614,8 +27598,8 @@ var OpenCommodityClient = class {
27614
27598
  } catch {
27615
27599
  return null;
27616
27600
  }
27617
- }).find((e) => e?.name === "SaleCreated");
27618
- return event?.args?.saleId ?? receipt.hash;
27601
+ }).find((e) => e?.name === eventName);
27602
+ return String(event?.args?.saleId ?? receipt.hash);
27619
27603
  }
27620
27604
  };
27621
27605
 
package/dist/index.mjs CHANGED
@@ -27540,55 +27540,39 @@ var OpenCommodityClient = class {
27540
27540
  });
27541
27541
  }
27542
27542
  async createUniversalEscrowSale(params) {
27543
- if (this.hasUniversalEscrowContract()) {
27544
- const saleId = await this.callUniversalEscrowContract("createSale", [
27545
- params.token_id,
27546
- params.amount,
27547
- params.price,
27548
- params.seller_wallet
27549
- ]);
27550
- return {
27551
- id: String(saleId),
27552
- commodity_id: params.commodity_id,
27553
- seller_wallet: params.seller_wallet,
27554
- buyer_wallet: params.buyer_wallet,
27555
- price: params.price,
27556
- amount: params.amount,
27557
- status: "FUNDED",
27558
- gcid: null,
27559
- created_at: (/* @__PURE__ */ new Date()).toISOString()
27560
- };
27543
+ if (!this.hasUniversalEscrowContract()) {
27544
+ throw new Error("universalEscrow contract configuration is required");
27561
27545
  }
27562
- return this.createSale(params);
27546
+ const saleId = await this.callUniversalEscrowContract("createSale", [
27547
+ params.tokenId,
27548
+ params.amount,
27549
+ params.price,
27550
+ params.seller
27551
+ ], "SaleCreated");
27552
+ return String(saleId);
27563
27553
  }
27564
- async confirmUniversalEscrowShipment(saleId) {
27565
- await this.callUniversalEscrowContract("confirmShipment", [saleId]);
27566
- return this.getSale(String(saleId));
27554
+ async confirmUniversalEscrowShipment(params) {
27555
+ return this.callUniversalEscrowContract("confirmShipment", [params.saleId], "Shipped");
27567
27556
  }
27568
- async confirmUniversalEscrowReceipt(saleId) {
27569
- await this.callUniversalEscrowContract("confirmReceipt", [saleId]);
27570
- return this.getSale(String(saleId));
27557
+ async confirmUniversalEscrowReceipt(params) {
27558
+ return this.callUniversalEscrowContract("confirmReceipt", [params.saleId], "ReceiptConfirmed");
27571
27559
  }
27572
- async acceptUniversalEscrowQuality(saleId) {
27573
- await this.callUniversalEscrowContract("acceptQuality", [saleId]);
27574
- return this.getSale(String(saleId));
27560
+ async acceptUniversalEscrowQuality(params) {
27561
+ return this.callUniversalEscrowContract("acceptQuality", [params.saleId], "QualityAccepted");
27575
27562
  }
27576
- async initiateUniversalEscrowDispute(saleId, reason) {
27577
- await this.callUniversalEscrowContract("initiateDispute", [saleId, reason]);
27578
- return this.getSale(String(saleId));
27563
+ async initiateUniversalEscrowDispute(params) {
27564
+ return this.callUniversalEscrowContract("initiateDispute", [params.saleId, params.reason], "DisputeInitiated");
27579
27565
  }
27580
- async resolveUniversalEscrowDispute(saleId, favorBuyer, refundPercentage) {
27581
- await this.callUniversalEscrowContract("resolveDispute", [saleId, favorBuyer, refundPercentage]);
27582
- return this.getSale(String(saleId));
27566
+ async resolveUniversalEscrowDispute(params) {
27567
+ return this.callUniversalEscrowContract("resolveDispute", [params.saleId, params.favorBuyer, params.refundPercentage], "DisputeResolved");
27583
27568
  }
27584
- async autoReleaseUniversalEscrowFunds(saleId) {
27585
- await this.callUniversalEscrowContract("autoReleaseFunds", [saleId]);
27586
- return this.getSale(String(saleId));
27569
+ async autoReleaseUniversalEscrowFunds(params) {
27570
+ return this.callUniversalEscrowContract("autoReleaseFunds", [params.saleId], "AutoReleased");
27587
27571
  }
27588
27572
  hasUniversalEscrowContract() {
27589
27573
  return !!(this.provider && this.contracts?.universalEscrow);
27590
27574
  }
27591
- async callUniversalEscrowContract(method, args) {
27575
+ async callUniversalEscrowContract(method, args, eventName) {
27592
27576
  if (!this.hasUniversalEscrowContract()) {
27593
27577
  throw new Error("universalEscrow contract configuration is required");
27594
27578
  }
@@ -27606,8 +27590,8 @@ var OpenCommodityClient = class {
27606
27590
  } catch {
27607
27591
  return null;
27608
27592
  }
27609
- }).find((e) => e?.name === "SaleCreated");
27610
- return event?.args?.saleId ?? receipt.hash;
27593
+ }).find((e) => e?.name === eventName);
27594
+ return String(event?.args?.saleId ?? receipt.hash);
27611
27595
  }
27612
27596
  };
27613
27597
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@railblock/opencommodity-sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "TypeScript SDK for the OpenCommodity Protocol API",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",