@dimes-dot-fi/sdk 1.2.0 → 1.3.0

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.
@@ -464,6 +464,189 @@ function buildRequestCloseTx(vaultAddress, positionKey) {
464
464
  };
465
465
  }
466
466
 
467
+ // src/contract/deposit-wallet.ts
468
+
469
+ var depositWalletFactoryAddress = "0x00000000000Fb5C9ADea0298D729A0CB3823Cc07";
470
+ var polymarketRelayerBaseUrl = "https://relayer-v2.polymarket.com";
471
+ var depositWalletBatchTypes = {
472
+ Batch: [
473
+ { name: "wallet", type: "address" },
474
+ { name: "nonce", type: "uint256" },
475
+ { name: "deadline", type: "uint256" },
476
+ { name: "calls", type: "Call[]" }
477
+ ],
478
+ Call: [
479
+ { name: "target", type: "address" },
480
+ { name: "value", type: "uint256" },
481
+ { name: "data", type: "bytes" }
482
+ ]
483
+ };
484
+ var reserveDepositAbi = [
485
+ {
486
+ type: "function",
487
+ name: "reserveDeposit",
488
+ stateMutability: "nonpayable",
489
+ inputs: [{ name: "expectedAmountUsdcUnits", type: "uint256" }],
490
+ outputs: []
491
+ }
492
+ ];
493
+ var createPositionPushFundedAbi = [
494
+ {
495
+ type: "function",
496
+ name: "createPositionPushFunded",
497
+ stateMutability: "nonpayable",
498
+ inputs: [
499
+ { name: "positionSeed", type: "bytes16" },
500
+ { name: "marketId", type: "bytes32" },
501
+ { name: "tokenId", type: "uint256" },
502
+ { name: "collateralUsdcUnits", type: "uint256" },
503
+ { name: "leverageBps", type: "uint32" },
504
+ { name: "notionalUsdcUnits", type: "uint256" },
505
+ { name: "originationFeeBps", type: "uint16" },
506
+ { name: "lifetimeFeeAprBps", type: "uint16" },
507
+ { name: "liquidationFeeBps", type: "uint16" },
508
+ { name: "venueFeeUsdcUnits", type: "uint256" },
509
+ { name: "signature", type: "bytes" },
510
+ { name: "signatureExpiry", type: "uint256" }
511
+ ],
512
+ outputs: []
513
+ }
514
+ ];
515
+ var erc20TransferAbi = [
516
+ {
517
+ type: "function",
518
+ name: "transfer",
519
+ stateMutability: "nonpayable",
520
+ inputs: [
521
+ { name: "to", type: "address" },
522
+ { name: "amount", type: "uint256" }
523
+ ],
524
+ outputs: [{ name: "", type: "bool" }]
525
+ }
526
+ ];
527
+ function buildPushFundedCreateCalls(offer, pUsdAddress) {
528
+ const vaultAddress = toAddress(offer.polygonVaultContractAddress);
529
+ const totalUserAmountUsdcUnits = BigInt(offer.totalUserAmountUsdcUnits);
530
+ const reserveDepositData = _viem.encodeFunctionData.call(void 0, {
531
+ abi: reserveDepositAbi,
532
+ functionName: "reserveDeposit",
533
+ args: [totalUserAmountUsdcUnits]
534
+ });
535
+ const transferData = _viem.encodeFunctionData.call(void 0, {
536
+ abi: erc20TransferAbi,
537
+ functionName: "transfer",
538
+ args: [vaultAddress, totalUserAmountUsdcUnits]
539
+ });
540
+ const createPositionData = _viem.encodeFunctionData.call(void 0, {
541
+ abi: createPositionPushFundedAbi,
542
+ functionName: "createPositionPushFunded",
543
+ args: [
544
+ toHex(offer.positionSeedHex),
545
+ toHex(offer.polymarketMarketId),
546
+ BigInt(offer.polymarketTokenId),
547
+ BigInt(offer.collateralUsdcUnits),
548
+ offer.leverageBps,
549
+ BigInt(offer.notionalUsdcUnits),
550
+ offer.originationFeeBps,
551
+ offer.lifetimeFeeAprBps,
552
+ offer.liquidationFeeBps,
553
+ BigInt(offer.expectedOpenTradingFeeUsdcUnits),
554
+ toHex(offer.contractSignature),
555
+ BigInt(offer.signatureExpiry)
556
+ ]
557
+ });
558
+ return [
559
+ { target: vaultAddress, value: 0n, data: reserveDepositData },
560
+ { target: toAddress(pUsdAddress), value: 0n, data: transferData },
561
+ { target: vaultAddress, value: 0n, data: createPositionData }
562
+ ];
563
+ }
564
+ function buildRequestCloseCalls(vaultAddress, positionKey) {
565
+ const closeData = _viem.encodeFunctionData.call(void 0, {
566
+ abi: vaultAbi,
567
+ functionName: "requestClose",
568
+ args: [toHex(positionKey)]
569
+ });
570
+ return [{ target: toAddress(vaultAddress), value: 0n, data: closeData }];
571
+ }
572
+ function buildDepositWalletBatch(params) {
573
+ return {
574
+ wallet: toAddress(params.depositWalletAddress),
575
+ nonce: params.nonce,
576
+ deadline: params.deadline,
577
+ calls: params.calls
578
+ };
579
+ }
580
+ function getDepositWalletBatchTypedData(batch) {
581
+ return {
582
+ domain: {
583
+ name: "DepositWallet",
584
+ version: "1",
585
+ chainId: 137,
586
+ verifyingContract: batch.wallet
587
+ },
588
+ types: depositWalletBatchTypes,
589
+ primaryType: "Batch",
590
+ message: batch
591
+ };
592
+ }
593
+ function buildRelayerSubmitPayload(params) {
594
+ return {
595
+ type: "WALLET",
596
+ from: toAddress(params.ownerAddress),
597
+ to: depositWalletFactoryAddress,
598
+ nonce: params.batch.nonce.toString(),
599
+ signature: params.signature,
600
+ depositWalletParams: {
601
+ depositWallet: params.batch.wallet,
602
+ deadline: params.batch.deadline.toString(),
603
+ calls: params.batch.calls.map((call) => ({
604
+ target: call.target,
605
+ value: call.value.toString(),
606
+ data: call.data
607
+ }))
608
+ }
609
+ };
610
+ }
611
+ function base64ToBytes(value) {
612
+ const binary = atob(value);
613
+ const buffer = new ArrayBuffer(binary.length);
614
+ const bytes = new Uint8Array(buffer);
615
+ for (let i = 0; i < binary.length; i++) {
616
+ bytes[i] = binary.charCodeAt(i);
617
+ }
618
+ return buffer;
619
+ }
620
+ function bytesToBase64Url(bytes) {
621
+ let binary = "";
622
+ const view = new Uint8Array(bytes);
623
+ for (const byte of view) {
624
+ binary += String.fromCharCode(byte);
625
+ }
626
+ return btoa(binary).replaceAll("+", "-").replaceAll("/", "_");
627
+ }
628
+ async function buildRelayerAuthHeaders(params) {
629
+ const msPerSecond = 1e3;
630
+ const timestamp = _nullishCoalesce(params.timestamp, () => ( Math.floor(Date.now() / msPerSecond).toString()));
631
+ const key = await crypto.subtle.importKey(
632
+ "raw",
633
+ base64ToBytes(params.apiSecret),
634
+ { name: "HMAC", hash: "SHA-256" },
635
+ false,
636
+ ["sign"]
637
+ );
638
+ const encoded = new TextEncoder().encode(`${timestamp}POST/submit${params.body}`);
639
+ const message = new Uint8Array(encoded).buffer;
640
+ const signature = await crypto.subtle.sign("HMAC", key, message);
641
+ return {
642
+ "Content-Type": "application/json",
643
+ POLY_BUILDER_API_KEY: params.apiKey,
644
+ POLY_BUILDER_TIMESTAMP: timestamp,
645
+ POLY_BUILDER_PASSPHRASE: params.apiPassphrase,
646
+ POLY_BUILDER_SIGNATURE: bytesToBase64Url(signature)
647
+ };
648
+ }
649
+
467
650
  // src/contract/verify-signature.ts
468
651
 
469
652
  var createPositionTypes = {
@@ -666,5 +849,14 @@ function formatContractError(err) {
666
849
 
667
850
 
668
851
 
669
- exports.buildApproveTx = buildApproveTx; exports.buildCreatePositionTx = buildCreatePositionTx; exports.buildRequestCloseTx = buildRequestCloseTx; exports.erc20Abi = erc20Abi; exports.formatContractError = formatContractError; exports.recoverCreatePositionSigner = recoverCreatePositionSigner; exports.resolveExpectedSigner = resolveExpectedSigner; exports.toAddress = toAddress; exports.toHex = toHex; exports.vaultAbi = vaultAbi; exports.verifyOfferSignature = verifyOfferSignature;
852
+
853
+
854
+
855
+
856
+
857
+
858
+
859
+
860
+
861
+ exports.buildApproveTx = buildApproveTx; exports.buildCreatePositionTx = buildCreatePositionTx; exports.buildDepositWalletBatch = buildDepositWalletBatch; exports.buildPushFundedCreateCalls = buildPushFundedCreateCalls; exports.buildRelayerAuthHeaders = buildRelayerAuthHeaders; exports.buildRelayerSubmitPayload = buildRelayerSubmitPayload; exports.buildRequestCloseCalls = buildRequestCloseCalls; exports.buildRequestCloseTx = buildRequestCloseTx; exports.depositWalletBatchTypes = depositWalletBatchTypes; exports.depositWalletFactoryAddress = depositWalletFactoryAddress; exports.erc20Abi = erc20Abi; exports.formatContractError = formatContractError; exports.getDepositWalletBatchTypedData = getDepositWalletBatchTypedData; exports.polymarketRelayerBaseUrl = polymarketRelayerBaseUrl; exports.recoverCreatePositionSigner = recoverCreatePositionSigner; exports.resolveExpectedSigner = resolveExpectedSigner; exports.toAddress = toAddress; exports.toHex = toHex; exports.vaultAbi = vaultAbi; exports.verifyOfferSignature = verifyOfferSignature;
670
862
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/contract/index.cjs","../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B;AACA;ACLA,IAAA,kBAAA,EAAA;AAAA,EACE,GAAA,EAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAQ,UAAA;AAAA,MACR,IAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,cAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,qBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAQ,OAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,iBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAW,CAAC,CAAA;AAAA,MACZ,eAAA,EAAmB;AAAA,IACrB,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,UAAA;AAAA,MACR,IAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAW,CAAC,CAAA;AAAA,MACZ,eAAA,EAAmB;AAAA,IACrB,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,cAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,IAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,qBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,yBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,mBAAA;AAAA,UACR,IAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB,CAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAW,KAAA;AAAA,UACX,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,uBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,wBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,uBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,6BAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,QAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,wBAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,mBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,uBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,qBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,sBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,kBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,uBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,oBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,kBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,uBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,kBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,0BAAA;AAAA,MACR,MAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAQ,SAAA;AAAA,UACR,YAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,kBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,sBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,sBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,mBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,qBAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF,CAAA;ADOA;AACA;AE5XO,IAAM,SAAA,EAAY,iBAAA,CAA8B,GAAA;AAEhD,IAAM,SAAA,EAAW;AAAA,EACtB;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,eAAA,EAAiB,YAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAA,MACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,UAAU;AAAA,IACpC,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,OAAO,CAAC;AAAA,EACtC,CAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,eAAA,EAAiB,MAAA;AAAA,IACjB,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAA,MACjC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,UAAU;AAAA,IACrC,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,UAAU,CAAC;AAAA,EACzC;AACF,CAAA;AF6XA;AACA;AGxZA,4BAAqE;AAK9D,SAAS,KAAA,CAAM,KAAA,EAAoB;AACxC,EAAA,GAAA,CAAI,CAAC,yBAAA,KAAW,CAAA,EAAG;AACjB,IAAA,MAAM,mBAAA,EAAqB,EAAA;AAC3B,IAAA,MAAM,IAAI,iCAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,2CAAA,EAA8C,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,IAAA;AAClF,EAAA;AAGF,EAAA;AACF;AAEO;AACL,EAAA;AACE,IAAA;AAAuE,EAAA;AAGzE,EAAA;AACF;AHmZA;AACA;AIpYO;AACL,EAAA;AAAO,IAAA;AAC+C,IAAA;AAC/C,IAAA;AACS,IAAA;AACR,MAAA;AACuB,MAAA;AACG,MAAA;AACA,MAAA;AACE,MAAA;AAC1B,MAAA;AACwB,MAAA;AACxB,MAAA;AACA,MAAA;AACA,MAAA;AACsC,MAAA;AACf,MAAA;AACD,IAAA;AAC9B,EAAA;AAEJ;AAEO;AACL,EAAA;AAAO,IAAA;AACI,IAAA;AACJ,IAAA;AACS,IAAA;AACQ,EAAA;AAE1B;AAEO;AACL,EAAA;AAAO,IAAA;AACI,IAAA;AACJ,IAAA;AACS,IAAA;AACI,EAAA;AAEtB;AJoYA;AACA;AKldA;AAMA;AAA4B,EAAA;AACV,IAAA;AAC0B,IAAA;AACR,IAAA;AACI,IAAA;AACD,IAAA;AACY,IAAA;AACT,IAAA;AACO,IAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AACC,IAAA;AACF,EAAA;AAE/C;AAEA;AACE,EAAA;AAA+B,IAAA;AACrB,MAAA;AACA,MAAA;AACG,MAAA;AACuB,MAAA;AAC8B,IAAA;AAChE,IAAA;AACO,IAAA;AACM,IAAA;AACJ,MAAA;AACkC,MAAA;AACnC,MAAA;AACkC,MAAA;AACD,MAAA;AACc,MAAA;AAClC,MAAA;AAC8B,MAAA;AACxB,MAAA;AACA,MAAA;AACA,MAAA;AACsC,MAAA;AAClB,IAAA;AAC/C,IAAA;AACwC,EAAA;AAE5C;AAEO;AACL,EAAA;AACF;AAEA;AAEA;AAKE,EAAA;AACA,EAAA;AACE,IAAA;AACA,IAAA;AAAkC,EAAA;AAGpC,EAAA;AACA,EAAA;AAEA,EAAA;AACE,IAAA;AAAU,MAAA;AACR,MAAA;AACuF,IAAA;AACzF,EAAA;AAEJ;ALqcA;AACA;AMnhBA;AAAA;AACE;AACA;AACA;AACA;AACA;AAIF;AACA;AAEA;AAEA;AAEA;AACE,EAAA;AACE,IAAA;AAA+D,EAAA;AAEjE,EAAA;AACE,IAAA;AAAuD,EAAA;AAEzD,EAAA;AACF;AAKA;AAAuD,EAAA;AAC7B,EAAA;AACA,EAAA;AACD,EAAA;AAEI,EAAA;AAIrB,EAAA;AAIA,EAAA;AAIA,EAAA;AACsB,EAAA;AAE0D,EAAA;AAIhF,EAAA;AAEmE,EAAA;AACc,EAAA;AACrE,EAAA;AACC,EAAA;AAEU,EAAA;AACL,EAAA;AACQ,EAAA;AACJ,EAAA;AACJ,EAAA;AAEE,EAAA;AACD,EAAA;AACA,EAAA;AACL,EAAA;AAEG,EAAA;AACA,EAAA;AACK,EAAA;AACD,EAAA;AACE,EAAA;AAEA,EAAA;AACH,EAAA;AAEM,EAAA;AACD,EAAA;AACK,EAAA;AAEJ,EAAA;AAElC;AAGA;AAAmD,EAAA;AACnC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAEhB;AAEA;AAEA;AACE,EAAA;AACA,EAAA;AACF;AAEA;AACE,EAAA;AACA,EAAA;AACF;AAGO;AACL,EAAA;AACE,IAAA;AAA8D,EAAA;AAGhE,EAAA;AACE,IAAA;AACA,IAAA;AACE,MAAA;AAA+E,IAAA;AAGjF,IAAA;AAAqB,MAAA;AACC,IAAA;AAEtB,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AAAgD,MAAA;AAElD,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAAW,yBAAA;AACG;AAAA,0CAAA;AAEgC,MAAA;AAC9C,IAAA;AAGF,IAAA;AACA,IAAA;AACE,MAAA;AAA6E,IAAA;AAG/E,IAAA;AACE,MAAA;AAAuE,IAAA;AAEzE,IAAA;AAAkE,EAAA;AAGpE,EAAA;AACE,IAAA;AAA6D,EAAA;AAE/D,EAAA;AACF;AN2eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/alexemery/bl/dimes-sdk/dist/contract/index.cjs","sourcesContent":[null,"{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"]}
1
+ {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/contract/index.cjs","../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/deposit-wallet.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"names":[],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/contract/index.cjs","sourcesContent":[null,"{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi } from \"./abi\";\nimport { toAddress, toHex, type Address, type Hex } from \"./evm\";\n\n/**\n * Helpers for opening and closing positions from a Polymarket **deposit wallet** (DW).\n *\n * Deposit wallets cannot use the legacy `approve` + `createPosition` path: the Polymarket\n * relayer blocks `approve` to non-whitelisted spenders. Instead the DW submits an atomic\n * batch through Polymarket's deposit-wallet factory:\n *\n * 1. `vault.reserveDeposit(totalUserAmount)` — snapshot the vault pUSD balance\n * 2. `pUSD.transfer(vault, totalUserAmount)` — push the funds directly\n * 3. `vault.createPositionPushFunded(...)` — verify the balance delta + create\n *\n * Closing follows the same batch mechanics with a single inner call, `requestClose`.\n */\n\n/** Polymarket deposit-wallet factory (the `proxy` entrypoint), Polygon mainnet. */\nexport const depositWalletFactoryAddress: Address = \"0x00000000000Fb5C9ADea0298D729A0CB3823Cc07\";\n\n/** Base URL of Polymarket's v2 relayer. */\nexport const polymarketRelayerBaseUrl = \"https://relayer-v2.polymarket.com\";\n\n/** A single inner call inside a deposit-wallet batch. */\nexport interface DepositWalletCall {\n target: Address;\n value: bigint;\n data: Hex;\n}\n\n/** The EIP-712 `Batch` struct signed by the deposit-wallet owner. */\nexport interface DepositWalletBatch {\n wallet: Address;\n nonce: bigint;\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** EIP-712 type definitions for the deposit-wallet `Batch` signature. */\nexport const depositWalletBatchTypes = {\n Batch: [\n { name: \"wallet\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"calls\", type: \"Call[]\" },\n ],\n Call: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n} as const;\n\nconst reserveDepositAbi = [\n {\n type: \"function\",\n name: \"reserveDeposit\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"expectedAmountUsdcUnits\", type: \"uint256\" }],\n outputs: [],\n },\n] as const;\n\nconst createPositionPushFundedAbi = [\n {\n type: \"function\",\n name: \"createPositionPushFunded\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n outputs: [],\n },\n] as const;\n\nconst erc20TransferAbi = [\n {\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\n/**\n * Build the three inner calls for a push-funded `createPosition`.\n *\n * The relayer submits these atomically; `offer.totalUserAmountUsdcUnits` is the\n * contract-ready amount (collateral + fees) used for both the reservation and the transfer.\n *\n * @param offer - the signed offer returned by the quote endpoint\n * @param pUsdAddress - the pUSD (USDC) token address (from `GET /contract-info`)\n */\nexport function buildPushFundedCreateCalls(offer: Offer, pUsdAddress: string): DepositWalletCall[] {\n const vaultAddress = toAddress(offer.polygonVaultContractAddress);\n const totalUserAmountUsdcUnits = BigInt(offer.totalUserAmountUsdcUnits);\n\n const reserveDepositData = encodeFunctionData({\n abi: reserveDepositAbi,\n functionName: \"reserveDeposit\",\n args: [totalUserAmountUsdcUnits],\n });\n\n const transferData = encodeFunctionData({\n abi: erc20TransferAbi,\n functionName: \"transfer\",\n args: [vaultAddress, totalUserAmountUsdcUnits],\n });\n\n const createPositionData = encodeFunctionData({\n abi: createPositionPushFundedAbi,\n functionName: \"createPositionPushFunded\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n });\n\n return [\n { target: vaultAddress, value: 0n, data: reserveDepositData },\n { target: toAddress(pUsdAddress), value: 0n, data: transferData },\n { target: vaultAddress, value: 0n, data: createPositionData },\n ];\n}\n\n/**\n * Build the single inner call for a deposit-wallet `requestClose`.\n *\n * @param vaultAddress - the vault contract address\n * @param positionKey - the `on_chain_position_key` field from `GET /positions`\n */\nexport function buildRequestCloseCalls(vaultAddress: string, positionKey: string): DepositWalletCall[] {\n const closeData = encodeFunctionData({\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [toHex(positionKey)],\n });\n\n return [{ target: toAddress(vaultAddress), value: 0n, data: closeData }];\n}\n\ninterface BuildBatchParams {\n depositWalletAddress: string;\n /** Current `nonce()` read from the deposit wallet. */\n nonce: bigint;\n /** Unix-seconds deadline after which the relayer may no longer submit the batch. */\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** Assemble a `DepositWalletBatch` ready for EIP-712 signing. */\nexport function buildDepositWalletBatch(params: BuildBatchParams): DepositWalletBatch {\n return {\n wallet: toAddress(params.depositWalletAddress),\n nonce: params.nonce,\n deadline: params.deadline,\n calls: params.calls,\n };\n}\n\n/** EIP-712 typed-data payload for a deposit-wallet `Batch` signature. */\nexport interface DepositWalletBatchTypedData {\n domain: { name: string; version: string; chainId: number; verifyingContract: Address };\n types: typeof depositWalletBatchTypes;\n primaryType: \"Batch\";\n message: DepositWalletBatch;\n}\n\n/**\n * Produce the EIP-712 typed-data object for a batch, ready to pass to a signer\n * (viem `signTypedData`, ethers `signTypedData`, etc.). The owner of the deposit\n * wallet must sign this.\n */\nexport function getDepositWalletBatchTypedData(batch: DepositWalletBatch): DepositWalletBatchTypedData {\n return {\n domain: {\n name: \"DepositWallet\",\n version: \"1\",\n chainId: 137,\n verifyingContract: batch.wallet,\n },\n types: depositWalletBatchTypes,\n primaryType: \"Batch\",\n message: batch,\n };\n}\n\ninterface RelayerSubmitPayload {\n type: \"WALLET\";\n from: Address;\n to: Address;\n nonce: string;\n signature: Hex;\n depositWalletParams: {\n depositWallet: Address;\n deadline: string;\n calls: { target: Address; value: string; data: Hex }[];\n };\n}\n\ninterface BuildRelayerPayloadParams {\n /** The deposit-wallet owner EOA that produced `signature`. */\n ownerAddress: string;\n batch: DepositWalletBatch;\n /** The EIP-712 signature over `getDepositWalletBatchTypedData(batch)`. */\n signature: Hex;\n}\n\n/**\n * Build the JSON body for `POST {polymarketRelayerBaseUrl}/submit`.\n *\n * Stringify the result and send it with headers from {@link buildRelayerAuthHeaders}.\n */\nexport function buildRelayerSubmitPayload(params: BuildRelayerPayloadParams): RelayerSubmitPayload {\n return {\n type: \"WALLET\",\n from: toAddress(params.ownerAddress),\n to: depositWalletFactoryAddress,\n nonce: params.batch.nonce.toString(),\n signature: params.signature,\n depositWalletParams: {\n depositWallet: params.batch.wallet,\n deadline: params.batch.deadline.toString(),\n calls: params.batch.calls.map((call) => ({\n target: call.target,\n value: call.value.toString(),\n data: call.data,\n })),\n },\n };\n}\n\ninterface BuildRelayerHeadersParams {\n /** Polymarket builder API key. */\n apiKey: string;\n /** Polymarket builder API secret (base64). */\n apiSecret: string;\n /** Polymarket builder API passphrase. */\n apiPassphrase: string;\n /** The exact request body string sent to `/submit` (the value passed to `fetch`). */\n body: string;\n /** Unix-seconds timestamp; defaults to now. Must match the request time. */\n timestamp?: string;\n}\n\nfunction base64ToBytes(value: string): ArrayBuffer {\n const binary = atob(value);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n\nfunction bytesToBase64Url(bytes: ArrayBuffer): string {\n let binary = \"\";\n const view = new Uint8Array(bytes);\n for (const byte of view) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\");\n}\n\n/**\n * Compute the HMAC-signed headers for a relayer `/submit` request.\n *\n * The relayer authenticates each call with an HMAC-SHA256 over\n * `timestamp + \"POST\" + \"/submit\" + body`, keyed by the base64-decoded API secret,\n * encoded as base64url. Uses the Web Crypto API (works in Node 20+ and browsers).\n */\nexport async function buildRelayerAuthHeaders(params: BuildRelayerHeadersParams): Promise<Record<string, string>> {\n const msPerSecond = 1000;\n const timestamp = params.timestamp ?? Math.floor(Date.now() / msPerSecond).toString();\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBytes(params.apiSecret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const encoded = new TextEncoder().encode(`${timestamp}POST/submit${params.body}`);\n const message = new Uint8Array(encoded).buffer;\n const signature = await crypto.subtle.sign(\"HMAC\", key, message);\n\n return {\n \"Content-Type\": \"application/json\",\n POLY_BUILDER_API_KEY: params.apiKey,\n POLY_BUILDER_TIMESTAMP: timestamp,\n POLY_BUILDER_PASSPHRASE: params.apiPassphrase,\n POLY_BUILDER_SIGNATURE: bytesToBase64Url(signature),\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"]}
@@ -75,10 +75,161 @@ declare function buildCreatePositionTx(offer: Offer): CreatePositionTxData;
75
75
  declare function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData;
76
76
  declare function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData;
77
77
 
78
+ /**
79
+ * Helpers for opening and closing positions from a Polymarket **deposit wallet** (DW).
80
+ *
81
+ * Deposit wallets cannot use the legacy `approve` + `createPosition` path: the Polymarket
82
+ * relayer blocks `approve` to non-whitelisted spenders. Instead the DW submits an atomic
83
+ * batch through Polymarket's deposit-wallet factory:
84
+ *
85
+ * 1. `vault.reserveDeposit(totalUserAmount)` — snapshot the vault pUSD balance
86
+ * 2. `pUSD.transfer(vault, totalUserAmount)` — push the funds directly
87
+ * 3. `vault.createPositionPushFunded(...)` — verify the balance delta + create
88
+ *
89
+ * Closing follows the same batch mechanics with a single inner call, `requestClose`.
90
+ */
91
+ /** Polymarket deposit-wallet factory (the `proxy` entrypoint), Polygon mainnet. */
92
+ declare const depositWalletFactoryAddress: Address;
93
+ /** Base URL of Polymarket's v2 relayer. */
94
+ declare const polymarketRelayerBaseUrl = "https://relayer-v2.polymarket.com";
95
+ /** A single inner call inside a deposit-wallet batch. */
96
+ interface DepositWalletCall {
97
+ target: Address;
98
+ value: bigint;
99
+ data: Hex;
100
+ }
101
+ /** The EIP-712 `Batch` struct signed by the deposit-wallet owner. */
102
+ interface DepositWalletBatch {
103
+ wallet: Address;
104
+ nonce: bigint;
105
+ deadline: bigint;
106
+ calls: DepositWalletCall[];
107
+ }
108
+ /** EIP-712 type definitions for the deposit-wallet `Batch` signature. */
109
+ declare const depositWalletBatchTypes: {
110
+ readonly Batch: readonly [{
111
+ readonly name: "wallet";
112
+ readonly type: "address";
113
+ }, {
114
+ readonly name: "nonce";
115
+ readonly type: "uint256";
116
+ }, {
117
+ readonly name: "deadline";
118
+ readonly type: "uint256";
119
+ }, {
120
+ readonly name: "calls";
121
+ readonly type: "Call[]";
122
+ }];
123
+ readonly Call: readonly [{
124
+ readonly name: "target";
125
+ readonly type: "address";
126
+ }, {
127
+ readonly name: "value";
128
+ readonly type: "uint256";
129
+ }, {
130
+ readonly name: "data";
131
+ readonly type: "bytes";
132
+ }];
133
+ };
134
+ /**
135
+ * Build the three inner calls for a push-funded `createPosition`.
136
+ *
137
+ * The relayer submits these atomically; `offer.totalUserAmountUsdcUnits` is the
138
+ * contract-ready amount (collateral + fees) used for both the reservation and the transfer.
139
+ *
140
+ * @param offer - the signed offer returned by the quote endpoint
141
+ * @param pUsdAddress - the pUSD (USDC) token address (from `GET /contract-info`)
142
+ */
143
+ declare function buildPushFundedCreateCalls(offer: Offer, pUsdAddress: string): DepositWalletCall[];
144
+ /**
145
+ * Build the single inner call for a deposit-wallet `requestClose`.
146
+ *
147
+ * @param vaultAddress - the vault contract address
148
+ * @param positionKey - the `on_chain_position_key` field from `GET /positions`
149
+ */
150
+ declare function buildRequestCloseCalls(vaultAddress: string, positionKey: string): DepositWalletCall[];
151
+ interface BuildBatchParams {
152
+ depositWalletAddress: string;
153
+ /** Current `nonce()` read from the deposit wallet. */
154
+ nonce: bigint;
155
+ /** Unix-seconds deadline after which the relayer may no longer submit the batch. */
156
+ deadline: bigint;
157
+ calls: DepositWalletCall[];
158
+ }
159
+ /** Assemble a `DepositWalletBatch` ready for EIP-712 signing. */
160
+ declare function buildDepositWalletBatch(params: BuildBatchParams): DepositWalletBatch;
161
+ /** EIP-712 typed-data payload for a deposit-wallet `Batch` signature. */
162
+ interface DepositWalletBatchTypedData {
163
+ domain: {
164
+ name: string;
165
+ version: string;
166
+ chainId: number;
167
+ verifyingContract: Address;
168
+ };
169
+ types: typeof depositWalletBatchTypes;
170
+ primaryType: "Batch";
171
+ message: DepositWalletBatch;
172
+ }
173
+ /**
174
+ * Produce the EIP-712 typed-data object for a batch, ready to pass to a signer
175
+ * (viem `signTypedData`, ethers `signTypedData`, etc.). The owner of the deposit
176
+ * wallet must sign this.
177
+ */
178
+ declare function getDepositWalletBatchTypedData(batch: DepositWalletBatch): DepositWalletBatchTypedData;
179
+ interface RelayerSubmitPayload {
180
+ type: "WALLET";
181
+ from: Address;
182
+ to: Address;
183
+ nonce: string;
184
+ signature: Hex;
185
+ depositWalletParams: {
186
+ depositWallet: Address;
187
+ deadline: string;
188
+ calls: {
189
+ target: Address;
190
+ value: string;
191
+ data: Hex;
192
+ }[];
193
+ };
194
+ }
195
+ interface BuildRelayerPayloadParams {
196
+ /** The deposit-wallet owner EOA that produced `signature`. */
197
+ ownerAddress: string;
198
+ batch: DepositWalletBatch;
199
+ /** The EIP-712 signature over `getDepositWalletBatchTypedData(batch)`. */
200
+ signature: Hex;
201
+ }
202
+ /**
203
+ * Build the JSON body for `POST {polymarketRelayerBaseUrl}/submit`.
204
+ *
205
+ * Stringify the result and send it with headers from {@link buildRelayerAuthHeaders}.
206
+ */
207
+ declare function buildRelayerSubmitPayload(params: BuildRelayerPayloadParams): RelayerSubmitPayload;
208
+ interface BuildRelayerHeadersParams {
209
+ /** Polymarket builder API key. */
210
+ apiKey: string;
211
+ /** Polymarket builder API secret (base64). */
212
+ apiSecret: string;
213
+ /** Polymarket builder API passphrase. */
214
+ apiPassphrase: string;
215
+ /** The exact request body string sent to `/submit` (the value passed to `fetch`). */
216
+ body: string;
217
+ /** Unix-seconds timestamp; defaults to now. Must match the request time. */
218
+ timestamp?: string;
219
+ }
220
+ /**
221
+ * Compute the HMAC-signed headers for a relayer `/submit` request.
222
+ *
223
+ * The relayer authenticates each call with an HMAC-SHA256 over
224
+ * `timestamp + "POST" + "/submit" + body`, keyed by the base64-decoded API secret,
225
+ * encoded as base64url. Uses the Web Crypto API (works in Node 20+ and browsers).
226
+ */
227
+ declare function buildRelayerAuthHeaders(params: BuildRelayerHeadersParams): Promise<Record<string, string>>;
228
+
78
229
  declare function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`>;
79
230
  declare function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined;
80
231
  declare function verifyOfferSignature(client: DimesClient, offer: Offer, userAddress: `0x${string}`): Promise<void>;
81
232
 
82
233
  declare function formatContractError(err: unknown): DimesContractError;
83
234
 
84
- export { type ApproveTxData, type CreatePositionTxData, type RequestCloseTxData, buildApproveTx, buildCreatePositionTx, buildRequestCloseTx, erc20Abi, formatContractError, recoverCreatePositionSigner, resolveExpectedSigner, toAddress, toHex, vaultAbi, verifyOfferSignature };
235
+ export { type ApproveTxData, type CreatePositionTxData, type DepositWalletBatch, type DepositWalletCall, type RequestCloseTxData, buildApproveTx, buildCreatePositionTx, buildDepositWalletBatch, buildPushFundedCreateCalls, buildRelayerAuthHeaders, buildRelayerSubmitPayload, buildRequestCloseCalls, buildRequestCloseTx, depositWalletBatchTypes, depositWalletFactoryAddress, erc20Abi, formatContractError, getDepositWalletBatchTypedData, polymarketRelayerBaseUrl, recoverCreatePositionSigner, resolveExpectedSigner, toAddress, toHex, vaultAbi, verifyOfferSignature };
@@ -75,10 +75,161 @@ declare function buildCreatePositionTx(offer: Offer): CreatePositionTxData;
75
75
  declare function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData;
76
76
  declare function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData;
77
77
 
78
+ /**
79
+ * Helpers for opening and closing positions from a Polymarket **deposit wallet** (DW).
80
+ *
81
+ * Deposit wallets cannot use the legacy `approve` + `createPosition` path: the Polymarket
82
+ * relayer blocks `approve` to non-whitelisted spenders. Instead the DW submits an atomic
83
+ * batch through Polymarket's deposit-wallet factory:
84
+ *
85
+ * 1. `vault.reserveDeposit(totalUserAmount)` — snapshot the vault pUSD balance
86
+ * 2. `pUSD.transfer(vault, totalUserAmount)` — push the funds directly
87
+ * 3. `vault.createPositionPushFunded(...)` — verify the balance delta + create
88
+ *
89
+ * Closing follows the same batch mechanics with a single inner call, `requestClose`.
90
+ */
91
+ /** Polymarket deposit-wallet factory (the `proxy` entrypoint), Polygon mainnet. */
92
+ declare const depositWalletFactoryAddress: Address;
93
+ /** Base URL of Polymarket's v2 relayer. */
94
+ declare const polymarketRelayerBaseUrl = "https://relayer-v2.polymarket.com";
95
+ /** A single inner call inside a deposit-wallet batch. */
96
+ interface DepositWalletCall {
97
+ target: Address;
98
+ value: bigint;
99
+ data: Hex;
100
+ }
101
+ /** The EIP-712 `Batch` struct signed by the deposit-wallet owner. */
102
+ interface DepositWalletBatch {
103
+ wallet: Address;
104
+ nonce: bigint;
105
+ deadline: bigint;
106
+ calls: DepositWalletCall[];
107
+ }
108
+ /** EIP-712 type definitions for the deposit-wallet `Batch` signature. */
109
+ declare const depositWalletBatchTypes: {
110
+ readonly Batch: readonly [{
111
+ readonly name: "wallet";
112
+ readonly type: "address";
113
+ }, {
114
+ readonly name: "nonce";
115
+ readonly type: "uint256";
116
+ }, {
117
+ readonly name: "deadline";
118
+ readonly type: "uint256";
119
+ }, {
120
+ readonly name: "calls";
121
+ readonly type: "Call[]";
122
+ }];
123
+ readonly Call: readonly [{
124
+ readonly name: "target";
125
+ readonly type: "address";
126
+ }, {
127
+ readonly name: "value";
128
+ readonly type: "uint256";
129
+ }, {
130
+ readonly name: "data";
131
+ readonly type: "bytes";
132
+ }];
133
+ };
134
+ /**
135
+ * Build the three inner calls for a push-funded `createPosition`.
136
+ *
137
+ * The relayer submits these atomically; `offer.totalUserAmountUsdcUnits` is the
138
+ * contract-ready amount (collateral + fees) used for both the reservation and the transfer.
139
+ *
140
+ * @param offer - the signed offer returned by the quote endpoint
141
+ * @param pUsdAddress - the pUSD (USDC) token address (from `GET /contract-info`)
142
+ */
143
+ declare function buildPushFundedCreateCalls(offer: Offer, pUsdAddress: string): DepositWalletCall[];
144
+ /**
145
+ * Build the single inner call for a deposit-wallet `requestClose`.
146
+ *
147
+ * @param vaultAddress - the vault contract address
148
+ * @param positionKey - the `on_chain_position_key` field from `GET /positions`
149
+ */
150
+ declare function buildRequestCloseCalls(vaultAddress: string, positionKey: string): DepositWalletCall[];
151
+ interface BuildBatchParams {
152
+ depositWalletAddress: string;
153
+ /** Current `nonce()` read from the deposit wallet. */
154
+ nonce: bigint;
155
+ /** Unix-seconds deadline after which the relayer may no longer submit the batch. */
156
+ deadline: bigint;
157
+ calls: DepositWalletCall[];
158
+ }
159
+ /** Assemble a `DepositWalletBatch` ready for EIP-712 signing. */
160
+ declare function buildDepositWalletBatch(params: BuildBatchParams): DepositWalletBatch;
161
+ /** EIP-712 typed-data payload for a deposit-wallet `Batch` signature. */
162
+ interface DepositWalletBatchTypedData {
163
+ domain: {
164
+ name: string;
165
+ version: string;
166
+ chainId: number;
167
+ verifyingContract: Address;
168
+ };
169
+ types: typeof depositWalletBatchTypes;
170
+ primaryType: "Batch";
171
+ message: DepositWalletBatch;
172
+ }
173
+ /**
174
+ * Produce the EIP-712 typed-data object for a batch, ready to pass to a signer
175
+ * (viem `signTypedData`, ethers `signTypedData`, etc.). The owner of the deposit
176
+ * wallet must sign this.
177
+ */
178
+ declare function getDepositWalletBatchTypedData(batch: DepositWalletBatch): DepositWalletBatchTypedData;
179
+ interface RelayerSubmitPayload {
180
+ type: "WALLET";
181
+ from: Address;
182
+ to: Address;
183
+ nonce: string;
184
+ signature: Hex;
185
+ depositWalletParams: {
186
+ depositWallet: Address;
187
+ deadline: string;
188
+ calls: {
189
+ target: Address;
190
+ value: string;
191
+ data: Hex;
192
+ }[];
193
+ };
194
+ }
195
+ interface BuildRelayerPayloadParams {
196
+ /** The deposit-wallet owner EOA that produced `signature`. */
197
+ ownerAddress: string;
198
+ batch: DepositWalletBatch;
199
+ /** The EIP-712 signature over `getDepositWalletBatchTypedData(batch)`. */
200
+ signature: Hex;
201
+ }
202
+ /**
203
+ * Build the JSON body for `POST {polymarketRelayerBaseUrl}/submit`.
204
+ *
205
+ * Stringify the result and send it with headers from {@link buildRelayerAuthHeaders}.
206
+ */
207
+ declare function buildRelayerSubmitPayload(params: BuildRelayerPayloadParams): RelayerSubmitPayload;
208
+ interface BuildRelayerHeadersParams {
209
+ /** Polymarket builder API key. */
210
+ apiKey: string;
211
+ /** Polymarket builder API secret (base64). */
212
+ apiSecret: string;
213
+ /** Polymarket builder API passphrase. */
214
+ apiPassphrase: string;
215
+ /** The exact request body string sent to `/submit` (the value passed to `fetch`). */
216
+ body: string;
217
+ /** Unix-seconds timestamp; defaults to now. Must match the request time. */
218
+ timestamp?: string;
219
+ }
220
+ /**
221
+ * Compute the HMAC-signed headers for a relayer `/submit` request.
222
+ *
223
+ * The relayer authenticates each call with an HMAC-SHA256 over
224
+ * `timestamp + "POST" + "/submit" + body`, keyed by the base64-decoded API secret,
225
+ * encoded as base64url. Uses the Web Crypto API (works in Node 20+ and browsers).
226
+ */
227
+ declare function buildRelayerAuthHeaders(params: BuildRelayerHeadersParams): Promise<Record<string, string>>;
228
+
78
229
  declare function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`>;
79
230
  declare function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined;
80
231
  declare function verifyOfferSignature(client: DimesClient, offer: Offer, userAddress: `0x${string}`): Promise<void>;
81
232
 
82
233
  declare function formatContractError(err: unknown): DimesContractError;
83
234
 
84
- export { type ApproveTxData, type CreatePositionTxData, type RequestCloseTxData, buildApproveTx, buildCreatePositionTx, buildRequestCloseTx, erc20Abi, formatContractError, recoverCreatePositionSigner, resolveExpectedSigner, toAddress, toHex, vaultAbi, verifyOfferSignature };
235
+ export { type ApproveTxData, type CreatePositionTxData, type DepositWalletBatch, type DepositWalletCall, type RequestCloseTxData, buildApproveTx, buildCreatePositionTx, buildDepositWalletBatch, buildPushFundedCreateCalls, buildRelayerAuthHeaders, buildRelayerSubmitPayload, buildRequestCloseCalls, buildRequestCloseTx, depositWalletBatchTypes, depositWalletFactoryAddress, erc20Abi, formatContractError, getDepositWalletBatchTypedData, polymarketRelayerBaseUrl, recoverCreatePositionSigner, resolveExpectedSigner, toAddress, toHex, vaultAbi, verifyOfferSignature };
@@ -464,6 +464,189 @@ function buildRequestCloseTx(vaultAddress, positionKey) {
464
464
  };
465
465
  }
466
466
 
467
+ // src/contract/deposit-wallet.ts
468
+ import { encodeFunctionData } from "viem";
469
+ var depositWalletFactoryAddress = "0x00000000000Fb5C9ADea0298D729A0CB3823Cc07";
470
+ var polymarketRelayerBaseUrl = "https://relayer-v2.polymarket.com";
471
+ var depositWalletBatchTypes = {
472
+ Batch: [
473
+ { name: "wallet", type: "address" },
474
+ { name: "nonce", type: "uint256" },
475
+ { name: "deadline", type: "uint256" },
476
+ { name: "calls", type: "Call[]" }
477
+ ],
478
+ Call: [
479
+ { name: "target", type: "address" },
480
+ { name: "value", type: "uint256" },
481
+ { name: "data", type: "bytes" }
482
+ ]
483
+ };
484
+ var reserveDepositAbi = [
485
+ {
486
+ type: "function",
487
+ name: "reserveDeposit",
488
+ stateMutability: "nonpayable",
489
+ inputs: [{ name: "expectedAmountUsdcUnits", type: "uint256" }],
490
+ outputs: []
491
+ }
492
+ ];
493
+ var createPositionPushFundedAbi = [
494
+ {
495
+ type: "function",
496
+ name: "createPositionPushFunded",
497
+ stateMutability: "nonpayable",
498
+ inputs: [
499
+ { name: "positionSeed", type: "bytes16" },
500
+ { name: "marketId", type: "bytes32" },
501
+ { name: "tokenId", type: "uint256" },
502
+ { name: "collateralUsdcUnits", type: "uint256" },
503
+ { name: "leverageBps", type: "uint32" },
504
+ { name: "notionalUsdcUnits", type: "uint256" },
505
+ { name: "originationFeeBps", type: "uint16" },
506
+ { name: "lifetimeFeeAprBps", type: "uint16" },
507
+ { name: "liquidationFeeBps", type: "uint16" },
508
+ { name: "venueFeeUsdcUnits", type: "uint256" },
509
+ { name: "signature", type: "bytes" },
510
+ { name: "signatureExpiry", type: "uint256" }
511
+ ],
512
+ outputs: []
513
+ }
514
+ ];
515
+ var erc20TransferAbi = [
516
+ {
517
+ type: "function",
518
+ name: "transfer",
519
+ stateMutability: "nonpayable",
520
+ inputs: [
521
+ { name: "to", type: "address" },
522
+ { name: "amount", type: "uint256" }
523
+ ],
524
+ outputs: [{ name: "", type: "bool" }]
525
+ }
526
+ ];
527
+ function buildPushFundedCreateCalls(offer, pUsdAddress) {
528
+ const vaultAddress = toAddress(offer.polygonVaultContractAddress);
529
+ const totalUserAmountUsdcUnits = BigInt(offer.totalUserAmountUsdcUnits);
530
+ const reserveDepositData = encodeFunctionData({
531
+ abi: reserveDepositAbi,
532
+ functionName: "reserveDeposit",
533
+ args: [totalUserAmountUsdcUnits]
534
+ });
535
+ const transferData = encodeFunctionData({
536
+ abi: erc20TransferAbi,
537
+ functionName: "transfer",
538
+ args: [vaultAddress, totalUserAmountUsdcUnits]
539
+ });
540
+ const createPositionData = encodeFunctionData({
541
+ abi: createPositionPushFundedAbi,
542
+ functionName: "createPositionPushFunded",
543
+ args: [
544
+ toHex(offer.positionSeedHex),
545
+ toHex(offer.polymarketMarketId),
546
+ BigInt(offer.polymarketTokenId),
547
+ BigInt(offer.collateralUsdcUnits),
548
+ offer.leverageBps,
549
+ BigInt(offer.notionalUsdcUnits),
550
+ offer.originationFeeBps,
551
+ offer.lifetimeFeeAprBps,
552
+ offer.liquidationFeeBps,
553
+ BigInt(offer.expectedOpenTradingFeeUsdcUnits),
554
+ toHex(offer.contractSignature),
555
+ BigInt(offer.signatureExpiry)
556
+ ]
557
+ });
558
+ return [
559
+ { target: vaultAddress, value: 0n, data: reserveDepositData },
560
+ { target: toAddress(pUsdAddress), value: 0n, data: transferData },
561
+ { target: vaultAddress, value: 0n, data: createPositionData }
562
+ ];
563
+ }
564
+ function buildRequestCloseCalls(vaultAddress, positionKey) {
565
+ const closeData = encodeFunctionData({
566
+ abi: vaultAbi,
567
+ functionName: "requestClose",
568
+ args: [toHex(positionKey)]
569
+ });
570
+ return [{ target: toAddress(vaultAddress), value: 0n, data: closeData }];
571
+ }
572
+ function buildDepositWalletBatch(params) {
573
+ return {
574
+ wallet: toAddress(params.depositWalletAddress),
575
+ nonce: params.nonce,
576
+ deadline: params.deadline,
577
+ calls: params.calls
578
+ };
579
+ }
580
+ function getDepositWalletBatchTypedData(batch) {
581
+ return {
582
+ domain: {
583
+ name: "DepositWallet",
584
+ version: "1",
585
+ chainId: 137,
586
+ verifyingContract: batch.wallet
587
+ },
588
+ types: depositWalletBatchTypes,
589
+ primaryType: "Batch",
590
+ message: batch
591
+ };
592
+ }
593
+ function buildRelayerSubmitPayload(params) {
594
+ return {
595
+ type: "WALLET",
596
+ from: toAddress(params.ownerAddress),
597
+ to: depositWalletFactoryAddress,
598
+ nonce: params.batch.nonce.toString(),
599
+ signature: params.signature,
600
+ depositWalletParams: {
601
+ depositWallet: params.batch.wallet,
602
+ deadline: params.batch.deadline.toString(),
603
+ calls: params.batch.calls.map((call) => ({
604
+ target: call.target,
605
+ value: call.value.toString(),
606
+ data: call.data
607
+ }))
608
+ }
609
+ };
610
+ }
611
+ function base64ToBytes(value) {
612
+ const binary = atob(value);
613
+ const buffer = new ArrayBuffer(binary.length);
614
+ const bytes = new Uint8Array(buffer);
615
+ for (let i = 0; i < binary.length; i++) {
616
+ bytes[i] = binary.charCodeAt(i);
617
+ }
618
+ return buffer;
619
+ }
620
+ function bytesToBase64Url(bytes) {
621
+ let binary = "";
622
+ const view = new Uint8Array(bytes);
623
+ for (const byte of view) {
624
+ binary += String.fromCharCode(byte);
625
+ }
626
+ return btoa(binary).replaceAll("+", "-").replaceAll("/", "_");
627
+ }
628
+ async function buildRelayerAuthHeaders(params) {
629
+ const msPerSecond = 1e3;
630
+ const timestamp = params.timestamp ?? Math.floor(Date.now() / msPerSecond).toString();
631
+ const key = await crypto.subtle.importKey(
632
+ "raw",
633
+ base64ToBytes(params.apiSecret),
634
+ { name: "HMAC", hash: "SHA-256" },
635
+ false,
636
+ ["sign"]
637
+ );
638
+ const encoded = new TextEncoder().encode(`${timestamp}POST/submit${params.body}`);
639
+ const message = new Uint8Array(encoded).buffer;
640
+ const signature = await crypto.subtle.sign("HMAC", key, message);
641
+ return {
642
+ "Content-Type": "application/json",
643
+ POLY_BUILDER_API_KEY: params.apiKey,
644
+ POLY_BUILDER_TIMESTAMP: timestamp,
645
+ POLY_BUILDER_PASSPHRASE: params.apiPassphrase,
646
+ POLY_BUILDER_SIGNATURE: bytesToBase64Url(signature)
647
+ };
648
+ }
649
+
467
650
  // src/contract/verify-signature.ts
468
651
  import { recoverTypedDataAddress, getAddress as getAddress2 } from "viem";
469
652
  var createPositionTypes = {
@@ -657,9 +840,18 @@ function formatContractError(err) {
657
840
  export {
658
841
  buildApproveTx,
659
842
  buildCreatePositionTx,
843
+ buildDepositWalletBatch,
844
+ buildPushFundedCreateCalls,
845
+ buildRelayerAuthHeaders,
846
+ buildRelayerSubmitPayload,
847
+ buildRequestCloseCalls,
660
848
  buildRequestCloseTx,
849
+ depositWalletBatchTypes,
850
+ depositWalletFactoryAddress,
661
851
  erc20Abi,
662
852
  formatContractError,
853
+ getDepositWalletBatchTypedData,
854
+ polymarketRelayerBaseUrl,
663
855
  recoverCreatePositionSigner,
664
856
  resolveExpectedSigner,
665
857
  toAddress,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"sourcesContent":["{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"],"mappings":"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","names":["getAddress","getAddress"]}
1
+ {"version":3,"sources":["../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/deposit-wallet.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"sourcesContent":["{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi } from \"./abi\";\nimport { toAddress, toHex, type Address, type Hex } from \"./evm\";\n\n/**\n * Helpers for opening and closing positions from a Polymarket **deposit wallet** (DW).\n *\n * Deposit wallets cannot use the legacy `approve` + `createPosition` path: the Polymarket\n * relayer blocks `approve` to non-whitelisted spenders. Instead the DW submits an atomic\n * batch through Polymarket's deposit-wallet factory:\n *\n * 1. `vault.reserveDeposit(totalUserAmount)` — snapshot the vault pUSD balance\n * 2. `pUSD.transfer(vault, totalUserAmount)` — push the funds directly\n * 3. `vault.createPositionPushFunded(...)` — verify the balance delta + create\n *\n * Closing follows the same batch mechanics with a single inner call, `requestClose`.\n */\n\n/** Polymarket deposit-wallet factory (the `proxy` entrypoint), Polygon mainnet. */\nexport const depositWalletFactoryAddress: Address = \"0x00000000000Fb5C9ADea0298D729A0CB3823Cc07\";\n\n/** Base URL of Polymarket's v2 relayer. */\nexport const polymarketRelayerBaseUrl = \"https://relayer-v2.polymarket.com\";\n\n/** A single inner call inside a deposit-wallet batch. */\nexport interface DepositWalletCall {\n target: Address;\n value: bigint;\n data: Hex;\n}\n\n/** The EIP-712 `Batch` struct signed by the deposit-wallet owner. */\nexport interface DepositWalletBatch {\n wallet: Address;\n nonce: bigint;\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** EIP-712 type definitions for the deposit-wallet `Batch` signature. */\nexport const depositWalletBatchTypes = {\n Batch: [\n { name: \"wallet\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"calls\", type: \"Call[]\" },\n ],\n Call: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n} as const;\n\nconst reserveDepositAbi = [\n {\n type: \"function\",\n name: \"reserveDeposit\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"expectedAmountUsdcUnits\", type: \"uint256\" }],\n outputs: [],\n },\n] as const;\n\nconst createPositionPushFundedAbi = [\n {\n type: \"function\",\n name: \"createPositionPushFunded\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n outputs: [],\n },\n] as const;\n\nconst erc20TransferAbi = [\n {\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\n/**\n * Build the three inner calls for a push-funded `createPosition`.\n *\n * The relayer submits these atomically; `offer.totalUserAmountUsdcUnits` is the\n * contract-ready amount (collateral + fees) used for both the reservation and the transfer.\n *\n * @param offer - the signed offer returned by the quote endpoint\n * @param pUsdAddress - the pUSD (USDC) token address (from `GET /contract-info`)\n */\nexport function buildPushFundedCreateCalls(offer: Offer, pUsdAddress: string): DepositWalletCall[] {\n const vaultAddress = toAddress(offer.polygonVaultContractAddress);\n const totalUserAmountUsdcUnits = BigInt(offer.totalUserAmountUsdcUnits);\n\n const reserveDepositData = encodeFunctionData({\n abi: reserveDepositAbi,\n functionName: \"reserveDeposit\",\n args: [totalUserAmountUsdcUnits],\n });\n\n const transferData = encodeFunctionData({\n abi: erc20TransferAbi,\n functionName: \"transfer\",\n args: [vaultAddress, totalUserAmountUsdcUnits],\n });\n\n const createPositionData = encodeFunctionData({\n abi: createPositionPushFundedAbi,\n functionName: \"createPositionPushFunded\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n });\n\n return [\n { target: vaultAddress, value: 0n, data: reserveDepositData },\n { target: toAddress(pUsdAddress), value: 0n, data: transferData },\n { target: vaultAddress, value: 0n, data: createPositionData },\n ];\n}\n\n/**\n * Build the single inner call for a deposit-wallet `requestClose`.\n *\n * @param vaultAddress - the vault contract address\n * @param positionKey - the `on_chain_position_key` field from `GET /positions`\n */\nexport function buildRequestCloseCalls(vaultAddress: string, positionKey: string): DepositWalletCall[] {\n const closeData = encodeFunctionData({\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [toHex(positionKey)],\n });\n\n return [{ target: toAddress(vaultAddress), value: 0n, data: closeData }];\n}\n\ninterface BuildBatchParams {\n depositWalletAddress: string;\n /** Current `nonce()` read from the deposit wallet. */\n nonce: bigint;\n /** Unix-seconds deadline after which the relayer may no longer submit the batch. */\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** Assemble a `DepositWalletBatch` ready for EIP-712 signing. */\nexport function buildDepositWalletBatch(params: BuildBatchParams): DepositWalletBatch {\n return {\n wallet: toAddress(params.depositWalletAddress),\n nonce: params.nonce,\n deadline: params.deadline,\n calls: params.calls,\n };\n}\n\n/** EIP-712 typed-data payload for a deposit-wallet `Batch` signature. */\nexport interface DepositWalletBatchTypedData {\n domain: { name: string; version: string; chainId: number; verifyingContract: Address };\n types: typeof depositWalletBatchTypes;\n primaryType: \"Batch\";\n message: DepositWalletBatch;\n}\n\n/**\n * Produce the EIP-712 typed-data object for a batch, ready to pass to a signer\n * (viem `signTypedData`, ethers `signTypedData`, etc.). The owner of the deposit\n * wallet must sign this.\n */\nexport function getDepositWalletBatchTypedData(batch: DepositWalletBatch): DepositWalletBatchTypedData {\n return {\n domain: {\n name: \"DepositWallet\",\n version: \"1\",\n chainId: 137,\n verifyingContract: batch.wallet,\n },\n types: depositWalletBatchTypes,\n primaryType: \"Batch\",\n message: batch,\n };\n}\n\ninterface RelayerSubmitPayload {\n type: \"WALLET\";\n from: Address;\n to: Address;\n nonce: string;\n signature: Hex;\n depositWalletParams: {\n depositWallet: Address;\n deadline: string;\n calls: { target: Address; value: string; data: Hex }[];\n };\n}\n\ninterface BuildRelayerPayloadParams {\n /** The deposit-wallet owner EOA that produced `signature`. */\n ownerAddress: string;\n batch: DepositWalletBatch;\n /** The EIP-712 signature over `getDepositWalletBatchTypedData(batch)`. */\n signature: Hex;\n}\n\n/**\n * Build the JSON body for `POST {polymarketRelayerBaseUrl}/submit`.\n *\n * Stringify the result and send it with headers from {@link buildRelayerAuthHeaders}.\n */\nexport function buildRelayerSubmitPayload(params: BuildRelayerPayloadParams): RelayerSubmitPayload {\n return {\n type: \"WALLET\",\n from: toAddress(params.ownerAddress),\n to: depositWalletFactoryAddress,\n nonce: params.batch.nonce.toString(),\n signature: params.signature,\n depositWalletParams: {\n depositWallet: params.batch.wallet,\n deadline: params.batch.deadline.toString(),\n calls: params.batch.calls.map((call) => ({\n target: call.target,\n value: call.value.toString(),\n data: call.data,\n })),\n },\n };\n}\n\ninterface BuildRelayerHeadersParams {\n /** Polymarket builder API key. */\n apiKey: string;\n /** Polymarket builder API secret (base64). */\n apiSecret: string;\n /** Polymarket builder API passphrase. */\n apiPassphrase: string;\n /** The exact request body string sent to `/submit` (the value passed to `fetch`). */\n body: string;\n /** Unix-seconds timestamp; defaults to now. Must match the request time. */\n timestamp?: string;\n}\n\nfunction base64ToBytes(value: string): ArrayBuffer {\n const binary = atob(value);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n\nfunction bytesToBase64Url(bytes: ArrayBuffer): string {\n let binary = \"\";\n const view = new Uint8Array(bytes);\n for (const byte of view) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\");\n}\n\n/**\n * Compute the HMAC-signed headers for a relayer `/submit` request.\n *\n * The relayer authenticates each call with an HMAC-SHA256 over\n * `timestamp + \"POST\" + \"/submit\" + body`, keyed by the base64-decoded API secret,\n * encoded as base64url. Uses the Web Crypto API (works in Node 20+ and browsers).\n */\nexport async function buildRelayerAuthHeaders(params: BuildRelayerHeadersParams): Promise<Record<string, string>> {\n const msPerSecond = 1000;\n const timestamp = params.timestamp ?? Math.floor(Date.now() / msPerSecond).toString();\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBytes(params.apiSecret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const encoded = new TextEncoder().encode(`${timestamp}POST/submit${params.body}`);\n const message = new Uint8Array(encoded).buffer;\n const signature = await crypto.subtle.sign(\"HMAC\", key, message);\n\n return {\n \"Content-Type\": \"application/json\",\n POLY_BUILDER_API_KEY: params.apiKey,\n POLY_BUILDER_TIMESTAMP: timestamp,\n POLY_BUILDER_PASSPHRASE: params.apiPassphrase,\n POLY_BUILDER_SIGNATURE: bytesToBase64Url(signature),\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"],"mappings":"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","names":["getAddress","getAddress"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dimes-dot-fi/sdk",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "TypeScript SDK for the Dimes prediction market API",
5
5
  "type": "module",
6
6
  "sideEffects": false,