@weblock-wallet/sdk 0.1.51 → 0.1.52
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/index.cjs +576 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +87 -1
- package/dist/index.d.ts +87 -1
- package/dist/index.js +576 -75
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -104971,21 +104971,19 @@ var UserClient = class {
|
|
|
104971
104971
|
* - { coin: CoinResponse }
|
|
104972
104972
|
* - { data: CoinResponse }
|
|
104973
104973
|
*/
|
|
104974
|
-
// UserClient 클래스 내부의 registerToken()을 아래로 교체
|
|
104975
104974
|
async registerToken(req) {
|
|
104976
|
-
const blockchainId = req.blockchainId
|
|
104977
|
-
const contractAddress =
|
|
104978
|
-
req.contractAddress ?? req.tokenAddress ?? req.address ?? ""
|
|
104979
|
-
).trim().toLowerCase();
|
|
104975
|
+
const blockchainId = req.blockchainId;
|
|
104976
|
+
const contractAddress = this.normalizeAddress(req.contractAddress);
|
|
104980
104977
|
const name2 = req.name;
|
|
104981
104978
|
const symbol = req.symbol;
|
|
104982
104979
|
const decimals = req.decimals;
|
|
104983
104980
|
const candidates = [
|
|
104984
|
-
// 1) 주소만 받는
|
|
104981
|
+
// 1) 최신 스펙으로 바뀌며 "주소만" 받는 경우
|
|
104985
104982
|
{ blockchainId, contractAddress },
|
|
104983
|
+
// 2) 필드명이 tokenAddress / address로 바뀐 경우
|
|
104986
104984
|
{ blockchainId, tokenAddress: contractAddress },
|
|
104987
104985
|
{ blockchainId, address: contractAddress },
|
|
104988
|
-
//
|
|
104986
|
+
// 3) 구 스펙(메타 포함) 유지/필요한 경우
|
|
104989
104987
|
...name2 && symbol && typeof decimals === "number" ? [
|
|
104990
104988
|
{ blockchainId, contractAddress, name: name2, symbol, decimals },
|
|
104991
104989
|
{
|
|
@@ -104997,32 +104995,45 @@ var UserClient = class {
|
|
|
104997
104995
|
},
|
|
104998
104996
|
{ blockchainId, address: contractAddress, name: name2, symbol, decimals }
|
|
104999
104997
|
] : [],
|
|
105000
|
-
//
|
|
105001
|
-
|
|
105002
|
-
|
|
104998
|
+
// 4) blockchainId가 networkId로 바뀐 경우
|
|
104999
|
+
...name2 && symbol && typeof decimals === "number" ? [
|
|
105000
|
+
{
|
|
105001
|
+
networkId: blockchainId,
|
|
105002
|
+
contractAddress,
|
|
105003
|
+
name: name2,
|
|
105004
|
+
symbol,
|
|
105005
|
+
decimals
|
|
105006
|
+
},
|
|
105007
|
+
{
|
|
105008
|
+
networkId: blockchainId,
|
|
105009
|
+
tokenAddress: contractAddress,
|
|
105010
|
+
name: name2,
|
|
105011
|
+
symbol,
|
|
105012
|
+
decimals
|
|
105013
|
+
}
|
|
105014
|
+
] : [{ networkId: blockchainId, contractAddress }]
|
|
105003
105015
|
];
|
|
105004
105016
|
let lastError = null;
|
|
105005
105017
|
for (const body of candidates) {
|
|
105006
105018
|
try {
|
|
105007
105019
|
const res = await this.client.post(
|
|
105008
|
-
|
|
105009
|
-
body
|
|
105010
|
-
{
|
|
105011
|
-
needsAccessToken: true
|
|
105012
|
-
}
|
|
105020
|
+
`${this.baseUrl}/register-token`,
|
|
105021
|
+
body
|
|
105013
105022
|
);
|
|
105014
|
-
const coin = res
|
|
105015
|
-
if (coin?.contractAddress) {
|
|
105016
|
-
|
|
105017
|
-
...coin,
|
|
105018
|
-
contractAddress: String(coin.contractAddress).trim().toLowerCase(),
|
|
105019
|
-
decimals: typeof coin.decimals === "number" ? coin.decimals : Number(coin.decimals)
|
|
105020
|
-
};
|
|
105023
|
+
const coin = this.unwrapCoin(res);
|
|
105024
|
+
if (!coin?.contractAddress) {
|
|
105025
|
+
continue;
|
|
105021
105026
|
}
|
|
105027
|
+
return {
|
|
105028
|
+
...coin,
|
|
105029
|
+
contractAddress: this.normalizeAddress(coin.contractAddress),
|
|
105030
|
+
decimals: Number(coin.decimals)
|
|
105031
|
+
};
|
|
105022
105032
|
} catch (e7) {
|
|
105023
105033
|
lastError = e7;
|
|
105024
|
-
const status = e7
|
|
105025
|
-
if (status === 400 || status ===
|
|
105034
|
+
const status = this.extractStatus(e7);
|
|
105035
|
+
if (status === 400 || status === 422) continue;
|
|
105036
|
+
if (status === 409) continue;
|
|
105026
105037
|
throw e7;
|
|
105027
105038
|
}
|
|
105028
105039
|
}
|
|
@@ -105046,32 +105057,6 @@ var UserClient = class {
|
|
|
105046
105057
|
{ needsAccessToken: true }
|
|
105047
105058
|
);
|
|
105048
105059
|
}
|
|
105049
|
-
// UserClient 클래스 내부에 추가
|
|
105050
|
-
async postAuthed(path, body) {
|
|
105051
|
-
const httpAny = this.client;
|
|
105052
|
-
const headers = (typeof httpAny.getAuthHeaders === "function" ? await httpAny.getAuthHeaders() : typeof httpAny.getHeaders === "function" ? await httpAny.getHeaders() : void 0) ?? void 0;
|
|
105053
|
-
const attempts = [];
|
|
105054
|
-
if (typeof httpAny.post === "function") {
|
|
105055
|
-
attempts.push(() => httpAny.post(path, body, headers));
|
|
105056
|
-
attempts.push(() => httpAny.post(path, body, { headers }));
|
|
105057
|
-
attempts.push(() => httpAny.post(path, body));
|
|
105058
|
-
}
|
|
105059
|
-
if (typeof httpAny.request === "function") {
|
|
105060
|
-
attempts.push(
|
|
105061
|
-
() => httpAny.request({ method: "POST", path, body, headers })
|
|
105062
|
-
);
|
|
105063
|
-
attempts.push(() => httpAny.request("POST", path, body, headers));
|
|
105064
|
-
}
|
|
105065
|
-
let lastError = null;
|
|
105066
|
-
for (const fn of attempts) {
|
|
105067
|
-
try {
|
|
105068
|
-
return await fn();
|
|
105069
|
-
} catch (e7) {
|
|
105070
|
-
lastError = e7;
|
|
105071
|
-
}
|
|
105072
|
-
}
|
|
105073
|
-
throw lastError ?? new Error(`POST ${path} failed`);
|
|
105074
|
-
}
|
|
105075
105060
|
};
|
|
105076
105061
|
|
|
105077
105062
|
// src/clients/api/wallets.ts
|
|
@@ -106198,17 +106183,14 @@ var AssetService = class extends EventEmitter {
|
|
|
106198
106183
|
params.spender,
|
|
106199
106184
|
params.amount
|
|
106200
106185
|
]);
|
|
106201
|
-
const
|
|
106202
|
-
|
|
106203
|
-
|
|
106204
|
-
|
|
106205
|
-
|
|
106206
|
-
to: params.tokenAddress,
|
|
106207
|
-
data
|
|
106208
|
-
}
|
|
106209
|
-
]
|
|
106186
|
+
const txHash = await this.walletService.sendTransaction({
|
|
106187
|
+
to: params.tokenAddress,
|
|
106188
|
+
value: "0",
|
|
106189
|
+
data,
|
|
106190
|
+
chainId
|
|
106210
106191
|
});
|
|
106211
|
-
|
|
106192
|
+
this.trackTransaction(txHash, chainId);
|
|
106193
|
+
return txHash;
|
|
106212
106194
|
} catch (error) {
|
|
106213
106195
|
throw new SDKError(
|
|
106214
106196
|
"Failed to approve token",
|
|
@@ -106291,6 +106273,402 @@ var AssetService = class extends EventEmitter {
|
|
|
106291
106273
|
// }
|
|
106292
106274
|
};
|
|
106293
106275
|
|
|
106276
|
+
// src/core/services/investment.ts
|
|
106277
|
+
import { Interface as Interface3 } from "ethers";
|
|
106278
|
+
|
|
106279
|
+
// src/contract/weblock.ts
|
|
106280
|
+
var RBT_PRIMARY_SALE_ROUTER_ABI = [
|
|
106281
|
+
{
|
|
106282
|
+
inputs: [{ name: "offeringId", type: "uint256" }],
|
|
106283
|
+
name: "offerings",
|
|
106284
|
+
outputs: [
|
|
106285
|
+
{ name: "asset", type: "address" },
|
|
106286
|
+
{ name: "seriesId", type: "uint256" },
|
|
106287
|
+
{ name: "unitPrice", type: "uint256" },
|
|
106288
|
+
{ name: "remainingUnits", type: "uint256" },
|
|
106289
|
+
{ name: "startAt", type: "uint64" },
|
|
106290
|
+
{ name: "endAt", type: "uint64" },
|
|
106291
|
+
{ name: "treasury", type: "address" },
|
|
106292
|
+
{ name: "enabled", type: "bool" }
|
|
106293
|
+
],
|
|
106294
|
+
stateMutability: "view",
|
|
106295
|
+
type: "function"
|
|
106296
|
+
},
|
|
106297
|
+
{
|
|
106298
|
+
inputs: [
|
|
106299
|
+
{ name: "offeringId", type: "uint256" },
|
|
106300
|
+
{ name: "units", type: "uint256" },
|
|
106301
|
+
{ name: "maxCost", type: "uint256" }
|
|
106302
|
+
],
|
|
106303
|
+
name: "buy",
|
|
106304
|
+
outputs: [],
|
|
106305
|
+
stateMutability: "nonpayable",
|
|
106306
|
+
type: "function"
|
|
106307
|
+
}
|
|
106308
|
+
];
|
|
106309
|
+
var RBT_PROPERTY_TOKEN_ABI = [
|
|
106310
|
+
{
|
|
106311
|
+
inputs: [
|
|
106312
|
+
{ name: "account", type: "address" },
|
|
106313
|
+
{ name: "id", type: "uint256" }
|
|
106314
|
+
],
|
|
106315
|
+
name: "balanceOf",
|
|
106316
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
106317
|
+
stateMutability: "view",
|
|
106318
|
+
type: "function"
|
|
106319
|
+
},
|
|
106320
|
+
{
|
|
106321
|
+
inputs: [{ name: "tokenId", type: "uint256" }],
|
|
106322
|
+
name: "claim",
|
|
106323
|
+
outputs: [],
|
|
106324
|
+
stateMutability: "nonpayable",
|
|
106325
|
+
type: "function"
|
|
106326
|
+
},
|
|
106327
|
+
{
|
|
106328
|
+
inputs: [
|
|
106329
|
+
{ name: "tokenId", type: "uint256" },
|
|
106330
|
+
{ name: "account", type: "address" }
|
|
106331
|
+
],
|
|
106332
|
+
name: "claimable",
|
|
106333
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
106334
|
+
stateMutability: "view",
|
|
106335
|
+
type: "function"
|
|
106336
|
+
}
|
|
106337
|
+
];
|
|
106338
|
+
|
|
106339
|
+
// src/core/services/investment.ts
|
|
106340
|
+
var MAX_UINT256 = 2n ** 256n - 1n;
|
|
106341
|
+
var InvestmentService = class extends EventEmitter {
|
|
106342
|
+
constructor(rpcClient, walletService, networkService) {
|
|
106343
|
+
super();
|
|
106344
|
+
this.rpcClient = rpcClient;
|
|
106345
|
+
this.walletService = walletService;
|
|
106346
|
+
this.networkService = networkService;
|
|
106347
|
+
this.chainIdCache = /* @__PURE__ */ new Map();
|
|
106348
|
+
this.erc20Interface = new Interface3(ERC20_ABI2);
|
|
106349
|
+
this.saleInterface = new Interface3(RBT_PRIMARY_SALE_ROUTER_ABI);
|
|
106350
|
+
this.rbtInterface = new Interface3(RBT_PROPERTY_TOKEN_ABI);
|
|
106351
|
+
}
|
|
106352
|
+
assertHexAddress(addr, field) {
|
|
106353
|
+
const a5 = (addr ?? "").trim();
|
|
106354
|
+
if (!a5.startsWith("0x") || a5.length !== 42) {
|
|
106355
|
+
throw new SDKError(`Invalid ${field}`, "INVALID_PARAMS" /* INVALID_PARAMS */);
|
|
106356
|
+
}
|
|
106357
|
+
}
|
|
106358
|
+
toBigInt(v5, field) {
|
|
106359
|
+
try {
|
|
106360
|
+
if (typeof v5 === "bigint") return v5;
|
|
106361
|
+
if (typeof v5 === "number") {
|
|
106362
|
+
if (!Number.isFinite(v5) || v5 < 0) throw new Error("invalid number");
|
|
106363
|
+
return BigInt(v5);
|
|
106364
|
+
}
|
|
106365
|
+
const s5 = (v5 ?? "").toString().trim();
|
|
106366
|
+
if (!s5) throw new Error("empty");
|
|
106367
|
+
return BigInt(s5);
|
|
106368
|
+
} catch {
|
|
106369
|
+
throw new SDKError(`Invalid ${field}`, "INVALID_PARAMS" /* INVALID_PARAMS */);
|
|
106370
|
+
}
|
|
106371
|
+
}
|
|
106372
|
+
/**
|
|
106373
|
+
* Resolve `networkId` (wallet backend blockchainId UUID) or chainId string -> EVM chainId
|
|
106374
|
+
*/
|
|
106375
|
+
async resolveChainId(networkId) {
|
|
106376
|
+
const trimmed = (networkId ?? "").trim();
|
|
106377
|
+
const cached = this.chainIdCache.get(trimmed);
|
|
106378
|
+
if (cached) return cached;
|
|
106379
|
+
const numeric = Number(trimmed);
|
|
106380
|
+
if (!Number.isNaN(numeric) && Number.isFinite(numeric) && numeric > 0) {
|
|
106381
|
+
this.chainIdCache.set(trimmed, numeric);
|
|
106382
|
+
return numeric;
|
|
106383
|
+
}
|
|
106384
|
+
try {
|
|
106385
|
+
const current = await this.networkService.getCurrentNetwork();
|
|
106386
|
+
if (current && current.id === trimmed) {
|
|
106387
|
+
this.chainIdCache.set(trimmed, current.chainId);
|
|
106388
|
+
return current.chainId;
|
|
106389
|
+
}
|
|
106390
|
+
if (current && String(current.chainId) === trimmed) {
|
|
106391
|
+
this.chainIdCache.set(trimmed, current.chainId);
|
|
106392
|
+
return current.chainId;
|
|
106393
|
+
}
|
|
106394
|
+
} catch {
|
|
106395
|
+
}
|
|
106396
|
+
const networks = await this.networkService.getRegisteredNetworks();
|
|
106397
|
+
const found = networks.find((n5) => n5.id === trimmed);
|
|
106398
|
+
if (found) {
|
|
106399
|
+
this.chainIdCache.set(trimmed, found.chainId);
|
|
106400
|
+
return found.chainId;
|
|
106401
|
+
}
|
|
106402
|
+
const foundByChainId = networks.find((n5) => String(n5.chainId) === trimmed);
|
|
106403
|
+
if (foundByChainId) {
|
|
106404
|
+
this.chainIdCache.set(trimmed, foundByChainId.chainId);
|
|
106405
|
+
return foundByChainId.chainId;
|
|
106406
|
+
}
|
|
106407
|
+
throw new SDKError("Invalid network", "INVALID_NETWORK" /* INVALID_NETWORK */);
|
|
106408
|
+
}
|
|
106409
|
+
async ethCall(chainId, to, data) {
|
|
106410
|
+
const res = await this.rpcClient.sendRpc({
|
|
106411
|
+
chainId,
|
|
106412
|
+
method: "eth_call" /* ETH_CALL */,
|
|
106413
|
+
params: [{ to, data }, "latest"]
|
|
106414
|
+
});
|
|
106415
|
+
if (res.error) {
|
|
106416
|
+
throw new SDKError(
|
|
106417
|
+
`ETH_CALL failed: ${res.error.message}`,
|
|
106418
|
+
"REQUEST_FAILED" /* REQUEST_FAILED */,
|
|
106419
|
+
res.error
|
|
106420
|
+
);
|
|
106421
|
+
}
|
|
106422
|
+
if (res.result === void 0) {
|
|
106423
|
+
throw new SDKError(
|
|
106424
|
+
"ETH_CALL returned empty result",
|
|
106425
|
+
"REQUEST_FAILED" /* REQUEST_FAILED */
|
|
106426
|
+
);
|
|
106427
|
+
}
|
|
106428
|
+
return res.result;
|
|
106429
|
+
}
|
|
106430
|
+
decodeU256(resultHex, method) {
|
|
106431
|
+
const decoded = this.erc20Interface.decodeFunctionResult(
|
|
106432
|
+
method,
|
|
106433
|
+
resultHex
|
|
106434
|
+
);
|
|
106435
|
+
return BigInt(decoded[0].toString());
|
|
106436
|
+
}
|
|
106437
|
+
async getOffering(params) {
|
|
106438
|
+
this.assertHexAddress(params.saleRouterAddress, "saleRouterAddress");
|
|
106439
|
+
const chainId = await this.resolveChainId(params.networkId);
|
|
106440
|
+
const offeringId = this.toBigInt(params.offeringId, "offeringId");
|
|
106441
|
+
const data = this.saleInterface.encodeFunctionData("offerings", [
|
|
106442
|
+
offeringId
|
|
106443
|
+
]);
|
|
106444
|
+
const result = await this.ethCall(chainId, params.saleRouterAddress, data);
|
|
106445
|
+
const decoded = this.saleInterface.decodeFunctionResult("offerings", result);
|
|
106446
|
+
const asset = decoded[0];
|
|
106447
|
+
const seriesId = BigInt(decoded[1].toString());
|
|
106448
|
+
const unitPrice = BigInt(decoded[2].toString());
|
|
106449
|
+
const remainingUnits = BigInt(decoded[3].toString());
|
|
106450
|
+
const startAt = BigInt(decoded[4].toString());
|
|
106451
|
+
const endAt = BigInt(decoded[5].toString());
|
|
106452
|
+
const treasury = decoded[6];
|
|
106453
|
+
const enabled = Boolean(decoded[7]);
|
|
106454
|
+
return {
|
|
106455
|
+
asset,
|
|
106456
|
+
seriesId,
|
|
106457
|
+
unitPrice,
|
|
106458
|
+
remainingUnits,
|
|
106459
|
+
startAt,
|
|
106460
|
+
endAt,
|
|
106461
|
+
treasury,
|
|
106462
|
+
enabled
|
|
106463
|
+
};
|
|
106464
|
+
}
|
|
106465
|
+
/**
|
|
106466
|
+
* USDR로 투자 (approve 필요. autoApprove 옵션 제공)
|
|
106467
|
+
* - Router.buy(offeringId, units, maxCost) 호출
|
|
106468
|
+
*/
|
|
106469
|
+
async investRbtWithUsdr(params) {
|
|
106470
|
+
this.assertHexAddress(params.usdrAddress, "usdrAddress");
|
|
106471
|
+
this.assertHexAddress(params.saleRouterAddress, "saleRouterAddress");
|
|
106472
|
+
const chainId = await this.resolveChainId(params.networkId);
|
|
106473
|
+
const offeringId = this.toBigInt(params.offeringId, "offeringId");
|
|
106474
|
+
const units = this.toBigInt(params.units, "units");
|
|
106475
|
+
if (units <= 0n) {
|
|
106476
|
+
throw new SDKError("Invalid units", "INVALID_PARAMS" /* INVALID_PARAMS */);
|
|
106477
|
+
}
|
|
106478
|
+
const offering = await this.getOffering({
|
|
106479
|
+
networkId: params.networkId,
|
|
106480
|
+
saleRouterAddress: params.saleRouterAddress,
|
|
106481
|
+
offeringId
|
|
106482
|
+
});
|
|
106483
|
+
if (!offering.enabled) {
|
|
106484
|
+
throw new SDKError("Offering is disabled", "REQUEST_FAILED" /* REQUEST_FAILED */);
|
|
106485
|
+
}
|
|
106486
|
+
const cost = units * offering.unitPrice;
|
|
106487
|
+
const maxCost = params.maxCostWei != null ? this.toBigInt(params.maxCostWei, "maxCostWei") : cost;
|
|
106488
|
+
if (maxCost < cost) {
|
|
106489
|
+
throw new SDKError(
|
|
106490
|
+
"maxCostWei is less than required cost",
|
|
106491
|
+
"INVALID_PARAMS" /* INVALID_PARAMS */
|
|
106492
|
+
);
|
|
106493
|
+
}
|
|
106494
|
+
const buyer = await this.walletService.getAddress();
|
|
106495
|
+
let approvalTxHash;
|
|
106496
|
+
const autoApprove = params.autoApprove ?? true;
|
|
106497
|
+
const approveMax = params.approveMax ?? true;
|
|
106498
|
+
const waitForApprovalReceipt = params.waitForApprovalReceipt ?? true;
|
|
106499
|
+
if (autoApprove) {
|
|
106500
|
+
const allowanceData = this.erc20Interface.encodeFunctionData(
|
|
106501
|
+
"allowance",
|
|
106502
|
+
[buyer, params.saleRouterAddress]
|
|
106503
|
+
);
|
|
106504
|
+
const allowanceHex = await this.ethCall(
|
|
106505
|
+
chainId,
|
|
106506
|
+
params.usdrAddress,
|
|
106507
|
+
allowanceData
|
|
106508
|
+
);
|
|
106509
|
+
const allowanceDecoded = this.erc20Interface.decodeFunctionResult(
|
|
106510
|
+
"allowance",
|
|
106511
|
+
allowanceHex
|
|
106512
|
+
);
|
|
106513
|
+
const allowance = BigInt(allowanceDecoded[0].toString());
|
|
106514
|
+
if (allowance < cost) {
|
|
106515
|
+
const approveAmount = approveMax ? MAX_UINT256 : cost;
|
|
106516
|
+
const approveData = this.erc20Interface.encodeFunctionData("approve", [
|
|
106517
|
+
params.saleRouterAddress,
|
|
106518
|
+
approveAmount.toString()
|
|
106519
|
+
]);
|
|
106520
|
+
approvalTxHash = await this.walletService.sendTransaction({
|
|
106521
|
+
to: params.usdrAddress,
|
|
106522
|
+
value: "0",
|
|
106523
|
+
data: approveData,
|
|
106524
|
+
chainId,
|
|
106525
|
+
gasLimit: params.gasLimitApprove
|
|
106526
|
+
});
|
|
106527
|
+
this.trackTransaction(approvalTxHash, chainId);
|
|
106528
|
+
if (waitForApprovalReceipt) {
|
|
106529
|
+
const ok = await this.waitForSuccessReceipt(approvalTxHash, chainId);
|
|
106530
|
+
if (!ok) {
|
|
106531
|
+
throw new SDKError(
|
|
106532
|
+
"Approve transaction failed",
|
|
106533
|
+
"TRANSACTION_FAILED" /* TRANSACTION_FAILED */
|
|
106534
|
+
);
|
|
106535
|
+
}
|
|
106536
|
+
}
|
|
106537
|
+
}
|
|
106538
|
+
}
|
|
106539
|
+
const buyData = this.saleInterface.encodeFunctionData("buy", [
|
|
106540
|
+
offeringId,
|
|
106541
|
+
units,
|
|
106542
|
+
maxCost
|
|
106543
|
+
]);
|
|
106544
|
+
const purchaseTxHash = await this.walletService.sendTransaction({
|
|
106545
|
+
to: params.saleRouterAddress,
|
|
106546
|
+
value: "0",
|
|
106547
|
+
data: buyData,
|
|
106548
|
+
chainId,
|
|
106549
|
+
gasLimit: params.gasLimitBuy
|
|
106550
|
+
});
|
|
106551
|
+
this.trackTransaction(purchaseTxHash, chainId);
|
|
106552
|
+
return {
|
|
106553
|
+
offering,
|
|
106554
|
+
costWei: cost.toString(),
|
|
106555
|
+
approvalTxHash,
|
|
106556
|
+
purchaseTxHash
|
|
106557
|
+
};
|
|
106558
|
+
}
|
|
106559
|
+
/**
|
|
106560
|
+
* RBT 수익(이자) claim
|
|
106561
|
+
* - RBTPropertyToken.claim(seriesId)
|
|
106562
|
+
*/
|
|
106563
|
+
async claimRbtRevenue(params) {
|
|
106564
|
+
this.assertHexAddress(params.rbtAssetAddress, "rbtAssetAddress");
|
|
106565
|
+
const chainId = await this.resolveChainId(params.networkId);
|
|
106566
|
+
const seriesId = this.toBigInt(params.seriesId, "seriesId");
|
|
106567
|
+
const claimData = this.rbtInterface.encodeFunctionData("claim", [seriesId]);
|
|
106568
|
+
const txHash = await this.walletService.sendTransaction({
|
|
106569
|
+
to: params.rbtAssetAddress,
|
|
106570
|
+
value: "0",
|
|
106571
|
+
data: claimData,
|
|
106572
|
+
chainId,
|
|
106573
|
+
gasLimit: params.gasLimit
|
|
106574
|
+
});
|
|
106575
|
+
this.trackTransaction(txHash, chainId);
|
|
106576
|
+
return { txHash };
|
|
106577
|
+
}
|
|
106578
|
+
/**
|
|
106579
|
+
* claimable 조회 (eth_call)
|
|
106580
|
+
*/
|
|
106581
|
+
async getClaimable(params) {
|
|
106582
|
+
this.assertHexAddress(params.rbtAssetAddress, "rbtAssetAddress");
|
|
106583
|
+
const chainId = await this.resolveChainId(params.networkId);
|
|
106584
|
+
const seriesId = this.toBigInt(params.seriesId, "seriesId");
|
|
106585
|
+
const account = params.account ?? await this.walletService.getAddress();
|
|
106586
|
+
this.assertHexAddress(account, "account");
|
|
106587
|
+
const data = this.rbtInterface.encodeFunctionData("claimable", [
|
|
106588
|
+
seriesId,
|
|
106589
|
+
account
|
|
106590
|
+
]);
|
|
106591
|
+
const result = await this.ethCall(chainId, params.rbtAssetAddress, data);
|
|
106592
|
+
const decoded = this.rbtInterface.decodeFunctionResult("claimable", result);
|
|
106593
|
+
return BigInt(decoded[0].toString()).toString();
|
|
106594
|
+
}
|
|
106595
|
+
/**
|
|
106596
|
+
* RBT balanceOf 조회 (eth_call)
|
|
106597
|
+
*/
|
|
106598
|
+
async getRbtBalance(params) {
|
|
106599
|
+
this.assertHexAddress(params.rbtAssetAddress, "rbtAssetAddress");
|
|
106600
|
+
const chainId = await this.resolveChainId(params.networkId);
|
|
106601
|
+
const seriesId = this.toBigInt(params.seriesId, "seriesId");
|
|
106602
|
+
const account = params.account ?? await this.walletService.getAddress();
|
|
106603
|
+
this.assertHexAddress(account, "account");
|
|
106604
|
+
const data = this.rbtInterface.encodeFunctionData("balanceOf", [
|
|
106605
|
+
account,
|
|
106606
|
+
seriesId
|
|
106607
|
+
]);
|
|
106608
|
+
const result = await this.ethCall(chainId, params.rbtAssetAddress, data);
|
|
106609
|
+
const decoded = this.rbtInterface.decodeFunctionResult("balanceOf", result);
|
|
106610
|
+
return BigInt(decoded[0].toString()).toString();
|
|
106611
|
+
}
|
|
106612
|
+
async waitForSuccessReceipt(txHash, chainId) {
|
|
106613
|
+
let retryCount = 0;
|
|
106614
|
+
const MAX_RETRIES = 20;
|
|
106615
|
+
while (retryCount < MAX_RETRIES) {
|
|
106616
|
+
const res = await this.rpcClient.sendRpc({
|
|
106617
|
+
chainId,
|
|
106618
|
+
method: "eth_getTransactionReceipt" /* ETH_GET_TRANSACTION_RECEIPT */,
|
|
106619
|
+
params: [txHash]
|
|
106620
|
+
});
|
|
106621
|
+
if (res.result) {
|
|
106622
|
+
return res.result.status === "0x1";
|
|
106623
|
+
}
|
|
106624
|
+
retryCount++;
|
|
106625
|
+
await new Promise((r5) => setTimeout$1(r5, 3e3));
|
|
106626
|
+
}
|
|
106627
|
+
return false;
|
|
106628
|
+
}
|
|
106629
|
+
trackTransaction(txHash, chainId) {
|
|
106630
|
+
let retryCount = 0;
|
|
106631
|
+
const MAX_RETRIES = 20;
|
|
106632
|
+
const checkStatus = async () => {
|
|
106633
|
+
try {
|
|
106634
|
+
const response = await this.rpcClient.sendRpc({
|
|
106635
|
+
chainId,
|
|
106636
|
+
method: "eth_getTransactionReceipt" /* ETH_GET_TRANSACTION_RECEIPT */,
|
|
106637
|
+
params: [txHash]
|
|
106638
|
+
});
|
|
106639
|
+
if (response.result) {
|
|
106640
|
+
const status = response.result.status === "0x1" ? "SUCCESS" /* SUCCESS */ : "FAILED" /* FAILED */;
|
|
106641
|
+
this.emit("transactionStatusChanged", {
|
|
106642
|
+
hash: txHash,
|
|
106643
|
+
status,
|
|
106644
|
+
timestamp: Date.now()
|
|
106645
|
+
});
|
|
106646
|
+
return;
|
|
106647
|
+
}
|
|
106648
|
+
retryCount++;
|
|
106649
|
+
if (retryCount < MAX_RETRIES) {
|
|
106650
|
+
setTimeout$1(checkStatus, 3e3);
|
|
106651
|
+
} else {
|
|
106652
|
+
this.emit("transactionStatusChanged", {
|
|
106653
|
+
hash: txHash,
|
|
106654
|
+
status: "FAILED" /* FAILED */,
|
|
106655
|
+
timestamp: Date.now(),
|
|
106656
|
+
error: "Transaction timeout"
|
|
106657
|
+
});
|
|
106658
|
+
}
|
|
106659
|
+
} catch (error) {
|
|
106660
|
+
this.emit("transactionStatusChanged", {
|
|
106661
|
+
hash: txHash,
|
|
106662
|
+
status: "FAILED" /* FAILED */,
|
|
106663
|
+
timestamp: Date.now(),
|
|
106664
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
106665
|
+
});
|
|
106666
|
+
}
|
|
106667
|
+
};
|
|
106668
|
+
checkStatus();
|
|
106669
|
+
}
|
|
106670
|
+
};
|
|
106671
|
+
|
|
106294
106672
|
// src/core/internal.ts
|
|
106295
106673
|
var InternalCoreImpl = class {
|
|
106296
106674
|
constructor(options) {
|
|
@@ -106332,16 +106710,7 @@ var InternalCoreImpl = class {
|
|
|
106332
106710
|
getTokenBalance: (params) => this.assetService.getTokenBalance(params),
|
|
106333
106711
|
approveToken: (params) => this.assetService.approveToken(params),
|
|
106334
106712
|
getAllowance: (params) => this.assetService.getAllowance(params),
|
|
106335
|
-
// getTokenInfo: (params: TokenInfoParams) =>
|
|
106336
|
-
// this.assetService.getTokenInfo(params),
|
|
106337
106713
|
addNFTCollection: (params) => this.assetService.addNFTCollection(params),
|
|
106338
|
-
// checkSecurityTokenCompliance: (params: {
|
|
106339
|
-
// networkId: string
|
|
106340
|
-
// tokenAddress: string
|
|
106341
|
-
// from: string
|
|
106342
|
-
// to: string
|
|
106343
|
-
// amount: string
|
|
106344
|
-
// }) => this.assetService.checkSecurityTokenCompliance(params),
|
|
106345
106714
|
on: (event, listener) => this.assetService.on(event, listener),
|
|
106346
106715
|
off: (event, listener) => this.assetService.off(event, listener),
|
|
106347
106716
|
getTokenInfo: (params) => this.assetService.getTokenInfo(params),
|
|
@@ -106349,6 +106718,15 @@ var InternalCoreImpl = class {
|
|
|
106349
106718
|
getTokenFullInfo: (params) => this.assetService.getTokenFullInfo(params),
|
|
106350
106719
|
getRegisteredCoins: (networkId) => this.assetService.getRegisteredCoins(networkId)
|
|
106351
106720
|
};
|
|
106721
|
+
this.investment = {
|
|
106722
|
+
getOffering: (params) => this.investmentService.getOffering(params),
|
|
106723
|
+
investRbtWithUsdr: (params) => this.investmentService.investRbtWithUsdr(params),
|
|
106724
|
+
claimRbtRevenue: (params) => this.investmentService.claimRbtRevenue(params),
|
|
106725
|
+
getClaimable: (params) => this.investmentService.getClaimable(params),
|
|
106726
|
+
getRbtBalance: (params) => this.investmentService.getRbtBalance(params),
|
|
106727
|
+
on: (event, listener) => this.investmentService.on(event, listener),
|
|
106728
|
+
off: (event, listener) => this.investmentService.off(event, listener)
|
|
106729
|
+
};
|
|
106352
106730
|
const httpClient = new HttpClient(options);
|
|
106353
106731
|
const firebase = new FirebaseAuth(options);
|
|
106354
106732
|
const userClient = new UserClient(httpClient);
|
|
@@ -106374,6 +106752,11 @@ var InternalCoreImpl = class {
|
|
|
106374
106752
|
userClient,
|
|
106375
106753
|
options.orgHost
|
|
106376
106754
|
);
|
|
106755
|
+
this.investmentService = new InvestmentService(
|
|
106756
|
+
rpcClient,
|
|
106757
|
+
this.walletService,
|
|
106758
|
+
this.networkService
|
|
106759
|
+
);
|
|
106377
106760
|
}
|
|
106378
106761
|
};
|
|
106379
106762
|
|
|
@@ -106649,6 +107032,35 @@ var AssetModule = class {
|
|
|
106649
107032
|
}
|
|
106650
107033
|
};
|
|
106651
107034
|
|
|
107035
|
+
// src/modules/Investment.ts
|
|
107036
|
+
var InvestmentModule = class {
|
|
107037
|
+
constructor(options, core) {
|
|
107038
|
+
this.options = options;
|
|
107039
|
+
this.core = core;
|
|
107040
|
+
}
|
|
107041
|
+
getOffering(params) {
|
|
107042
|
+
return this.core.investment.getOffering(params);
|
|
107043
|
+
}
|
|
107044
|
+
investRbtWithUsdr(params) {
|
|
107045
|
+
return this.core.investment.investRbtWithUsdr(params);
|
|
107046
|
+
}
|
|
107047
|
+
claimRbtRevenue(params) {
|
|
107048
|
+
return this.core.investment.claimRbtRevenue(params);
|
|
107049
|
+
}
|
|
107050
|
+
getClaimable(params) {
|
|
107051
|
+
return this.core.investment.getClaimable(params);
|
|
107052
|
+
}
|
|
107053
|
+
getRbtBalance(params) {
|
|
107054
|
+
return this.core.investment.getRbtBalance(params);
|
|
107055
|
+
}
|
|
107056
|
+
on(event, listener) {
|
|
107057
|
+
this.core.investment.on(event, listener);
|
|
107058
|
+
}
|
|
107059
|
+
off(event, listener) {
|
|
107060
|
+
this.core.investment.off(event, listener);
|
|
107061
|
+
}
|
|
107062
|
+
};
|
|
107063
|
+
|
|
106652
107064
|
// src/utils/network.ts
|
|
106653
107065
|
var KNOWN_NETWORKS = {
|
|
106654
107066
|
1: {
|
|
@@ -106716,92 +107128,178 @@ var WeBlockSDK = class {
|
|
|
106716
107128
|
this.initialized = false;
|
|
106717
107129
|
this.user = {
|
|
106718
107130
|
signIn: async (provider) => {
|
|
107131
|
+
this.ensureInitialized();
|
|
106719
107132
|
return this.userModule.signIn(provider);
|
|
106720
107133
|
},
|
|
106721
107134
|
createWallet: async (password) => {
|
|
107135
|
+
this.ensureInitialized();
|
|
106722
107136
|
return this.userModule.createWallet(password);
|
|
106723
107137
|
},
|
|
106724
107138
|
retrieveWallet: async (password) => {
|
|
107139
|
+
this.ensureInitialized();
|
|
106725
107140
|
return this.userModule.retrieveWallet(password);
|
|
106726
107141
|
},
|
|
106727
107142
|
/**
|
|
106728
107143
|
* ✅ 추가: PIN reset API 노출
|
|
106729
107144
|
*/
|
|
106730
107145
|
resetPin: async (newPassword) => {
|
|
107146
|
+
this.ensureInitialized();
|
|
106731
107147
|
return this.userModule.resetPin(newPassword);
|
|
106732
107148
|
},
|
|
106733
107149
|
signOut: async () => {
|
|
107150
|
+
this.ensureInitialized();
|
|
106734
107151
|
return this.userModule.signOut();
|
|
106735
107152
|
}
|
|
106736
107153
|
};
|
|
106737
107154
|
this.wallet = {
|
|
106738
107155
|
getInfo: async () => {
|
|
107156
|
+
this.ensureInitialized();
|
|
106739
107157
|
return this.walletModule.getInfo();
|
|
106740
107158
|
},
|
|
106741
107159
|
onWalletUpdate: (callback) => {
|
|
107160
|
+
this.ensureInitialized();
|
|
106742
107161
|
return this.walletModule.onWalletUpdate(callback);
|
|
106743
107162
|
},
|
|
106744
107163
|
onTransactionUpdate: (callback) => {
|
|
107164
|
+
this.ensureInitialized();
|
|
106745
107165
|
return this.walletModule.onTransactionUpdate(callback);
|
|
106746
107166
|
},
|
|
106747
107167
|
getBalance: (address, chainId) => {
|
|
107168
|
+
this.ensureInitialized();
|
|
106748
107169
|
return this.walletModule.getBalance(address, chainId);
|
|
106749
107170
|
},
|
|
106750
107171
|
getTransactionCount: (address, chainId) => {
|
|
107172
|
+
this.ensureInitialized();
|
|
106751
107173
|
return this.walletModule.getTransactionCount(address, chainId);
|
|
106752
107174
|
},
|
|
106753
107175
|
getBlockNumber: (chainId) => {
|
|
107176
|
+
this.ensureInitialized();
|
|
106754
107177
|
return this.walletModule.getBlockNumber(chainId);
|
|
106755
107178
|
},
|
|
106756
107179
|
sendRawTransaction: (signedTx, chainId) => {
|
|
107180
|
+
this.ensureInitialized();
|
|
106757
107181
|
return this.walletModule.sendRawTransaction(signedTx, chainId);
|
|
106758
107182
|
},
|
|
106759
107183
|
getTransactionReceipt: (txHash, chainId) => {
|
|
107184
|
+
this.ensureInitialized();
|
|
106760
107185
|
return this.walletModule.getTransactionReceipt(txHash, chainId);
|
|
106761
107186
|
},
|
|
106762
107187
|
getTransaction: (txHash, chainId) => {
|
|
107188
|
+
this.ensureInitialized();
|
|
106763
107189
|
return this.walletModule.getTransaction(txHash, chainId);
|
|
106764
107190
|
},
|
|
106765
107191
|
estimateGas: (txParams, chainId) => {
|
|
107192
|
+
this.ensureInitialized();
|
|
106766
107193
|
return this.walletModule.estimateGas(txParams, chainId);
|
|
106767
107194
|
},
|
|
106768
107195
|
getGasPrice: (chainId) => {
|
|
107196
|
+
this.ensureInitialized();
|
|
106769
107197
|
return this.walletModule.getGasPrice(chainId);
|
|
106770
107198
|
},
|
|
106771
107199
|
call: (txParams, blockParam, chainId) => {
|
|
107200
|
+
this.ensureInitialized();
|
|
106772
107201
|
return this.walletModule.call(txParams, blockParam, chainId);
|
|
106773
107202
|
}
|
|
106774
107203
|
};
|
|
106775
107204
|
this.network = {
|
|
106776
|
-
getAvailableNetworks: () =>
|
|
106777
|
-
|
|
106778
|
-
|
|
106779
|
-
|
|
107205
|
+
getAvailableNetworks: () => {
|
|
107206
|
+
this.ensureInitialized();
|
|
107207
|
+
return this.networkModule.getAvailableNetworks();
|
|
107208
|
+
},
|
|
107209
|
+
addNetwork: (request) => {
|
|
107210
|
+
this.ensureInitialized();
|
|
107211
|
+
return this.networkModule.addNetwork(request);
|
|
107212
|
+
},
|
|
107213
|
+
switchNetwork: (networkId) => {
|
|
107214
|
+
this.ensureInitialized();
|
|
107215
|
+
return this.networkModule.switchNetwork(networkId);
|
|
107216
|
+
},
|
|
107217
|
+
getCurrentNetwork: () => {
|
|
107218
|
+
this.ensureInitialized();
|
|
107219
|
+
return this.networkModule.getCurrentNetwork();
|
|
107220
|
+
}
|
|
106780
107221
|
};
|
|
106781
107222
|
this.asset = {
|
|
106782
107223
|
transfer: async (params) => {
|
|
107224
|
+
this.ensureInitialized();
|
|
106783
107225
|
return this.assetModule.transfer(params);
|
|
106784
107226
|
},
|
|
106785
107227
|
addToken: async (params) => {
|
|
107228
|
+
this.ensureInitialized();
|
|
106786
107229
|
return this.assetModule.addToken(params);
|
|
106787
107230
|
},
|
|
106788
107231
|
addNFTCollection: async (params) => {
|
|
107232
|
+
this.ensureInitialized();
|
|
106789
107233
|
return this.assetModule.addNFTCollection(params);
|
|
106790
107234
|
},
|
|
106791
107235
|
on: (event, listener) => {
|
|
107236
|
+
this.ensureInitialized();
|
|
106792
107237
|
this.assetModule.on(event, listener);
|
|
106793
107238
|
},
|
|
106794
107239
|
off: (event, listener) => {
|
|
107240
|
+
this.ensureInitialized();
|
|
106795
107241
|
this.assetModule.off(event, listener);
|
|
106796
107242
|
},
|
|
106797
107243
|
getTokenInfo: async (params) => {
|
|
107244
|
+
this.ensureInitialized();
|
|
106798
107245
|
return this.assetModule.getTokenInfo(params);
|
|
106799
107246
|
},
|
|
106800
107247
|
registerToken: async (params) => {
|
|
107248
|
+
this.ensureInitialized();
|
|
106801
107249
|
return this.assetModule.registerToken(params);
|
|
106802
107250
|
},
|
|
106803
107251
|
getTokenFullInfo: async (params) => {
|
|
107252
|
+
this.ensureInitialized();
|
|
106804
107253
|
return this.assetModule.getTokenFullInfo(params);
|
|
107254
|
+
},
|
|
107255
|
+
/**
|
|
107256
|
+
* ✅ ERC20 잔액 조회 (주의: 현재 AssetModule 구현은 raw balance string을 반환)
|
|
107257
|
+
* - TokenBalance(객체)가 아니라 string(wei) 입니다.
|
|
107258
|
+
*/
|
|
107259
|
+
getTokenBalance: async (params) => {
|
|
107260
|
+
this.ensureInitialized();
|
|
107261
|
+
return this.assetModule.getTokenBalance(params);
|
|
107262
|
+
},
|
|
107263
|
+
approveToken: async (params) => {
|
|
107264
|
+
this.ensureInitialized();
|
|
107265
|
+
return this.assetModule.approveToken(params);
|
|
107266
|
+
},
|
|
107267
|
+
getAllowance: async (params) => {
|
|
107268
|
+
this.ensureInitialized();
|
|
107269
|
+
return this.assetModule.getAllowance(params);
|
|
107270
|
+
}
|
|
107271
|
+
};
|
|
107272
|
+
/**
|
|
107273
|
+
* ✅ NEW: Investment API Surface
|
|
107274
|
+
*/
|
|
107275
|
+
this.invest = {
|
|
107276
|
+
getOffering: async (params) => {
|
|
107277
|
+
this.ensureInitialized();
|
|
107278
|
+
return this.investmentModule.getOffering(params);
|
|
107279
|
+
},
|
|
107280
|
+
investRbtWithUsdr: async (params) => {
|
|
107281
|
+
this.ensureInitialized();
|
|
107282
|
+
return this.investmentModule.investRbtWithUsdr(params);
|
|
107283
|
+
},
|
|
107284
|
+
claimRbtRevenue: async (params) => {
|
|
107285
|
+
this.ensureInitialized();
|
|
107286
|
+
return this.investmentModule.claimRbtRevenue(params);
|
|
107287
|
+
},
|
|
107288
|
+
getClaimable: async (params) => {
|
|
107289
|
+
this.ensureInitialized();
|
|
107290
|
+
return this.investmentModule.getClaimable(params);
|
|
107291
|
+
},
|
|
107292
|
+
getRbtBalance: async (params) => {
|
|
107293
|
+
this.ensureInitialized();
|
|
107294
|
+
return this.investmentModule.getRbtBalance(params);
|
|
107295
|
+
},
|
|
107296
|
+
on: (event, listener) => {
|
|
107297
|
+
this.ensureInitialized();
|
|
107298
|
+
this.investmentModule.on(event, listener);
|
|
107299
|
+
},
|
|
107300
|
+
off: (event, listener) => {
|
|
107301
|
+
this.ensureInitialized();
|
|
107302
|
+
this.investmentModule.off(event, listener);
|
|
106805
107303
|
}
|
|
106806
107304
|
};
|
|
106807
107305
|
this.validateOptions(options);
|
|
@@ -106811,6 +107309,7 @@ var WeBlockSDK = class {
|
|
|
106811
107309
|
this.userModule = new UserModule(options, internalCore, this.walletModule);
|
|
106812
107310
|
this.assetModule = new AssetModule(options, internalCore);
|
|
106813
107311
|
this.networkModule = new NetworkModule(options, internalCore);
|
|
107312
|
+
this.investmentModule = new InvestmentModule(options, internalCore);
|
|
106814
107313
|
this.initialized = true;
|
|
106815
107314
|
console.info("WeBlock SDK initialized successfully");
|
|
106816
107315
|
}
|
|
@@ -106819,13 +107318,15 @@ var WeBlockSDK = class {
|
|
|
106819
107318
|
if (!["local", "dev", "stage", "prod"].includes(environment)) {
|
|
106820
107319
|
throw new SDKError("Invalid environment", "INVALID_CONFIG" /* INVALID_CONFIG */);
|
|
106821
107320
|
}
|
|
106822
|
-
if (!apiKey)
|
|
107321
|
+
if (!apiKey) {
|
|
106823
107322
|
throw new SDKError("API key is required", "INVALID_CONFIG" /* INVALID_CONFIG */);
|
|
106824
|
-
|
|
107323
|
+
}
|
|
107324
|
+
if (!orgHost) {
|
|
106825
107325
|
throw new SDKError(
|
|
106826
107326
|
"Organization host is required",
|
|
106827
107327
|
"INVALID_CONFIG" /* INVALID_CONFIG */
|
|
106828
107328
|
);
|
|
107329
|
+
}
|
|
106829
107330
|
}
|
|
106830
107331
|
ensureInitialized() {
|
|
106831
107332
|
if (!this.initialized) {
|