thirdweb 5.111.9 → 5.111.11-nightly-eb1a9c3c3e670290e28ad86e14ddae4c7cf7455d-20251112000353

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cjs/bridge/Webhook.js +62 -1
  2. package/dist/cjs/bridge/Webhook.js.map +1 -1
  3. package/dist/cjs/cli/commands/stylus/create.js +48 -0
  4. package/dist/cjs/cli/commands/stylus/create.js.map +1 -1
  5. package/dist/cjs/extensions/modules/common/installPublishedModule.js +26 -9
  6. package/dist/cjs/extensions/modules/common/installPublishedModule.js.map +1 -1
  7. package/dist/cjs/extensions/prebuilts/deploy-published.js +1 -1
  8. package/dist/cjs/extensions/prebuilts/deploy-published.js.map +1 -1
  9. package/dist/cjs/react/web/ui/Bridge/TransactionPayment.js +1 -1
  10. package/dist/cjs/react/web/ui/Bridge/common/TokenAndChain.js +1 -1
  11. package/dist/cjs/react/web/ui/Bridge/common/TokenBalanceRow.js +2 -2
  12. package/dist/cjs/react/web/ui/Bridge/common/TokenBalanceRow.js.map +1 -1
  13. package/dist/cjs/react/web/ui/Bridge/common/selected-token-button.js +7 -2
  14. package/dist/cjs/react/web/ui/Bridge/common/selected-token-button.js.map +1 -1
  15. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentOverview.js +5 -5
  16. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentOverview.js.map +1 -1
  17. package/dist/cjs/react/web/ui/Bridge/payment-selection/TokenSelection.js +1 -1
  18. package/dist/cjs/react/web/ui/Bridge/payment-success/PaymentReceipt.js +20 -44
  19. package/dist/cjs/react/web/ui/Bridge/payment-success/PaymentReceipt.js.map +1 -1
  20. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js +3 -3
  21. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  22. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js +10 -2
  23. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -1
  24. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js +94 -48
  25. package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
  26. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.js +2 -1
  27. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.js.map +1 -1
  28. package/dist/cjs/react/web/ui/components/CopyIcon.js +6 -8
  29. package/dist/cjs/react/web/ui/components/CopyIcon.js.map +1 -1
  30. package/dist/cjs/react/web/ui/components/Spacer.js +1 -0
  31. package/dist/cjs/react/web/ui/components/Spacer.js.map +1 -1
  32. package/dist/cjs/version.js +1 -1
  33. package/dist/cjs/version.js.map +1 -1
  34. package/dist/esm/bridge/Webhook.js +62 -1
  35. package/dist/esm/bridge/Webhook.js.map +1 -1
  36. package/dist/esm/cli/commands/stylus/create.js +48 -0
  37. package/dist/esm/cli/commands/stylus/create.js.map +1 -1
  38. package/dist/esm/extensions/modules/common/installPublishedModule.js +26 -9
  39. package/dist/esm/extensions/modules/common/installPublishedModule.js.map +1 -1
  40. package/dist/esm/extensions/prebuilts/deploy-published.js +1 -1
  41. package/dist/esm/extensions/prebuilts/deploy-published.js.map +1 -1
  42. package/dist/esm/react/web/ui/Bridge/TransactionPayment.js +1 -1
  43. package/dist/esm/react/web/ui/Bridge/common/TokenAndChain.js +1 -1
  44. package/dist/esm/react/web/ui/Bridge/common/TokenBalanceRow.js +2 -2
  45. package/dist/esm/react/web/ui/Bridge/common/TokenBalanceRow.js.map +1 -1
  46. package/dist/esm/react/web/ui/Bridge/common/selected-token-button.js +7 -2
  47. package/dist/esm/react/web/ui/Bridge/common/selected-token-button.js.map +1 -1
  48. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentOverview.js +5 -5
  49. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentOverview.js.map +1 -1
  50. package/dist/esm/react/web/ui/Bridge/payment-selection/TokenSelection.js +1 -1
  51. package/dist/esm/react/web/ui/Bridge/payment-success/PaymentReceipt.js +23 -47
  52. package/dist/esm/react/web/ui/Bridge/payment-success/PaymentReceipt.js.map +1 -1
  53. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js +4 -4
  54. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  55. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js +10 -2
  56. package/dist/esm/react/web/ui/Bridge/swap-widget/select-chain.js.map +1 -1
  57. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js +95 -49
  58. package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
  59. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.js +2 -1
  60. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.js.map +1 -1
  61. package/dist/esm/react/web/ui/components/CopyIcon.js +6 -8
  62. package/dist/esm/react/web/ui/components/CopyIcon.js.map +1 -1
  63. package/dist/esm/react/web/ui/components/Spacer.js +1 -0
  64. package/dist/esm/react/web/ui/components/Spacer.js.map +1 -1
  65. package/dist/esm/version.js +1 -1
  66. package/dist/esm/version.js.map +1 -1
  67. package/dist/scripts/bridge-widget.js +100 -100
  68. package/dist/types/bridge/Webhook.d.ts +22 -1
  69. package/dist/types/bridge/Webhook.d.ts.map +1 -1
  70. package/dist/types/cli/commands/stylus/create.d.ts.map +1 -1
  71. package/dist/types/extensions/modules/common/installPublishedModule.d.ts.map +1 -1
  72. package/dist/types/react/web/ui/Bridge/common/TokenBalanceRow.d.ts.map +1 -1
  73. package/dist/types/react/web/ui/Bridge/common/selected-token-button.d.ts.map +1 -1
  74. package/dist/types/react/web/ui/Bridge/payment-details/PaymentOverview.d.ts.map +1 -1
  75. package/dist/types/react/web/ui/Bridge/payment-success/PaymentReceipt.d.ts.map +1 -1
  76. package/dist/types/react/web/ui/Bridge/payment-success/SuccessScreen.d.ts.map +1 -1
  77. package/dist/types/react/web/ui/Bridge/swap-widget/select-chain.d.ts.map +1 -1
  78. package/dist/types/react/web/ui/Bridge/swap-widget/select-token-ui.d.ts.map +1 -1
  79. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.d.ts.map +1 -1
  80. package/dist/types/react/web/ui/components/CopyIcon.d.ts.map +1 -1
  81. package/dist/types/react/web/ui/components/Spacer.d.ts.map +1 -1
  82. package/dist/types/version.d.ts +1 -1
  83. package/dist/types/version.d.ts.map +1 -1
  84. package/package.json +6 -6
  85. package/src/bridge/Webhook.test.ts +157 -0
  86. package/src/bridge/Webhook.ts +107 -0
  87. package/src/cli/commands/stylus/create.ts +49 -0
  88. package/src/contract/deployment/deploy-dynamic.test.ts +35 -39
  89. package/src/extensions/dynamic-contracts/write/installPublishedExtension.test.ts +40 -44
  90. package/src/extensions/dynamic-contracts/write/uninstallExtension.test.ts +1 -2
  91. package/src/extensions/modules/common/installPublishedModule.ts +28 -9
  92. package/src/extensions/prebuilts/deploy-published.ts +1 -1
  93. package/src/react/web/ui/Bridge/TransactionPayment.tsx +1 -1
  94. package/src/react/web/ui/Bridge/common/TokenAndChain.tsx +1 -1
  95. package/src/react/web/ui/Bridge/common/TokenBalanceRow.tsx +11 -10
  96. package/src/react/web/ui/Bridge/common/selected-token-button.tsx +11 -1
  97. package/src/react/web/ui/Bridge/payment-details/PaymentOverview.tsx +9 -7
  98. package/src/react/web/ui/Bridge/payment-selection/TokenSelection.tsx +1 -1
  99. package/src/react/web/ui/Bridge/payment-success/PaymentReceipt.tsx +92 -115
  100. package/src/react/web/ui/Bridge/payment-success/SuccessScreen.tsx +4 -6
  101. package/src/react/web/ui/Bridge/swap-widget/select-chain.tsx +18 -3
  102. package/src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx +186 -118
  103. package/src/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.tsx +5 -3
  104. package/src/react/web/ui/components/CopyIcon.tsx +8 -9
  105. package/src/react/web/ui/components/Spacer.tsx +1 -0
  106. package/src/version.ts +1 -1
@@ -113,6 +113,27 @@ secret: string,
113
113
  /**
114
114
  * The tolerance in seconds for the timestamp verification.
115
115
  */
116
- tolerance?: number): Promise<WebhookPayload>;
116
+ tolerance?: number, // Default to 5 minutes if not specified
117
+ /**
118
+ * Add various validations to the parsed payload to ensure it matches the expected values. Throws error if any validation fails.
119
+ */
120
+ verify?: {
121
+ /**
122
+ * Verify that the payload's the destination token amount (in wei) is greater than `minDestinationAmount` value
123
+ */
124
+ minDestinationAmount?: bigint;
125
+ /**
126
+ * Verify that the payload's destination token address is the same as `destinationTokenAddress` value
127
+ */
128
+ destinationTokenAddress?: string;
129
+ /**
130
+ * Verify that the payload's destination chain id is the same as `destinationChainId` value
131
+ */
132
+ destinationChainId?: number;
133
+ /**
134
+ * Verify that the payload's receiver address is the same as `receiverAddress` value.
135
+ */
136
+ receiverAddress?: string;
137
+ }): Promise<WebhookPayload>;
117
138
  export {};
118
139
  //# sourceMappingURL=Webhook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Webhook.d.ts","sourceRoot":"","sources":["../../../src/bridge/Webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAkFhC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAGjB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,EAC7B;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CACf,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,KAAK;AACzB;;GAEG;AACH,OAAO,EAAE,MAAM;AAEf;;GAEG;AACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,EAAE,MAAM;AAEd;;GAEG;AACH,SAAS,SAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAkEzB"}
1
+ {"version":3,"file":"Webhook.d.ts","sourceRoot":"","sources":["../../../src/bridge/Webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAkFhC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAGjB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,EAC7B;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CACf,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,KAAK;AACzB;;GAEG;AACH,OAAO,EAAE,MAAM;AAEf;;GAEG;AACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,EAAE,MAAM;AAEd;;GAEG;AACH,SAAS,SAAM,EAAE,wCAAwC;AAEzD;;GAEG;AACH,MAAM,CAAC,EAAE;IACP;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,cAAc,CAAC,CAuJzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/stylus/create.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,kBA2IxC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/stylus/create.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,kBA4LxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"installPublishedModule.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/modules/common/installPublishedModule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAGrE;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,kMA+B5E"}
1
+ {"version":3,"file":"installPublishedModule.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/modules/common/installPublishedModule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAC;AAIrE;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,kMAiD5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"TokenBalanceRow.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/common/TokenBalanceRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAShF,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,2CAsEA"}
1
+ {"version":3,"file":"TokenBalanceRow.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/common/TokenBalanceRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAShF,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,2CAuEA"}
@@ -1 +1 @@
1
- {"version":3,"file":"selected-token-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/common/selected-token-button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAetE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,aAAa,EACT;QACE,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;KAClB,GACD,SAAS,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;CAChC,2CA2IA"}
1
+ {"version":3,"file":"selected-token-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/common/selected-token-button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAetE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,aAAa,EACT;QACE,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;KAClB,GACD,SAAS,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;CAChC,2CAqJA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentOverview.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-details/PaymentOverview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAYhF,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;KACjC,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;CACpB,2CAiLA"}
1
+ {"version":3,"file":"PaymentOverview.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-details/PaymentOverview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAYhF,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;KACjC,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;CACpB,2CAmLA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PaymentReceipt.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-success/PaymentReceipt.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAOhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AA+SvF,UAAU,kBAAkB;IAC1B;;OAEG;IACH,aAAa,EAAE,mBAAmB,CAAC;IAEnC;;OAEG;IACH,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAE3C;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,aAAa,GACd,EAAE,kBAAkB,2CAsCpB"}
1
+ {"version":3,"file":"PaymentReceipt.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-success/PaymentReceipt.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAGhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAySvF,UAAU,kBAAkB;IAC1B;;OAEG;IACH,aAAa,EAAE,mBAAmB,CAAC;IAEnC;;OAEG;IACH,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAE3C;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,aAAa,GACd,EAAE,kBAAkB,2CA4BpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SuccessScreen.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-success/SuccessScreen.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAGhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAOvF,KAAK,kBAAkB,GAAG;IACxB;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,aAAa,EAAE,mBAAmB,CAAC;IAEnC;;OAEG;IACH,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAE3C;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAIF,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,aAAa,EACb,MAAM,EACN,YAAoB,EACpB,kBAAkB,GACnB,EAAE,kBAAkB,2CA0IpB"}
1
+ {"version":3,"file":"SuccessScreen.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/payment-success/SuccessScreen.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAGhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAOvF,KAAK,kBAAkB,GAAG;IACxB;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,aAAa,EAAE,mBAAmB,CAAC;IAEnC;;OAEG;IACH,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAE3C;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAIF,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,aAAa,EACb,MAAM,EACN,YAAoB,EACpB,kBAAkB,GACnB,EAAE,kBAAkB,2CAwIpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-chain.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-chain.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAiBtE,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,2CAW3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;CACxC,2CA+FF"}
1
+ {"version":3,"file":"select-chain.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-chain.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAkBtE,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,2CAW3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,GAAG;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;CACxC,2CA+FF"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-token-ui.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAwBtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASnE;;GAEG;AACH,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,cAAc,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,CAAC;AASF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,2CAsEpD"}
1
+ {"version":3,"file":"select-token-ui.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAsBtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASnE;;GAEG;AACH,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,cAAc,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,CAAC;AAYF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,2CAoFpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"WalletRow.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAI5E,OAAO,EACL,QAAQ,EACR,QAAQ,EACT,MAAM,+CAA+C,CAAC;AAavD,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,2CAsDA"}
1
+ {"version":3,"file":"WalletRow.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/react/web/ui/ConnectWallet/screens/Buy/swap/WalletRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAI5E,OAAO,EACL,QAAQ,EACR,QAAQ,EACT,MAAM,+CAA+C,CAAC;AAavD,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,2CAwDA"}
@@ -1 +1 @@
1
- {"version":3,"file":"CopyIcon.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/components/CopyIcon.tsx"],"names":[],"mappings":"AAMA;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CA4CA,CAAC"}
1
+ {"version":3,"file":"CopyIcon.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/components/CopyIcon.tsx"],"names":[],"mappings":"AAQA;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAyCA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Spacer.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/components/Spacer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,CAAC,EAAE,MAAM,OAAO,OAAO,CAAA;CAAE,CAQxD,CAAC"}
1
+ {"version":3,"file":"Spacer.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/components/Spacer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,CAAC,EAAE,MAAM,OAAO,OAAO,CAAA;CAAE,CASxD,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "5.111.9";
1
+ export declare const version = "5.111.11-nightly-eb1a9c3c3e670290e28ad86e14ddae4c7cf7455d-20251112000353";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAY,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,6EAA6E,CAAC"}
package/package.json CHANGED
@@ -73,8 +73,8 @@
73
73
  "dotenv-mono": "^1.3.14",
74
74
  "ethers5": "npm:ethers@5",
75
75
  "ethers6": "npm:ethers@6",
76
- "expo-linking": "7.0.5",
77
- "expo-web-browser": "14.0.2",
76
+ "expo-linking": "8.0.8",
77
+ "expo-web-browser": "15.0.9",
78
78
  "happy-dom": "17.4.4",
79
79
  "knip": "5.60.2",
80
80
  "msw": "2.7.5",
@@ -256,10 +256,10 @@
256
256
  "@aws-sdk/credential-providers": "^3",
257
257
  "@coinbase/wallet-mobile-sdk": "^1",
258
258
  "@mobile-wallet-protocol/client": "^1",
259
- "@react-native-async-storage/async-storage": "^1 || ^2",
259
+ "@react-native-async-storage/async-storage": "*",
260
260
  "ethers": "^5 || ^6",
261
- "expo-linking": "^6 || ^7",
262
- "expo-web-browser": "^13 || ^14",
261
+ "expo-linking": "*",
262
+ "expo-web-browser": "*",
263
263
  "react": "^18 || ^19",
264
264
  "react-native": "*",
265
265
  "react-native-aes-gcm-crypto": "^0.2",
@@ -399,7 +399,7 @@
399
399
  }
400
400
  },
401
401
  "typings": "./dist/types/exports/thirdweb.d.ts",
402
- "version": "5.111.9",
402
+ "version": "5.111.11-nightly-eb1a9c3c3e670290e28ad86e14ddae4c7cf7455d-20251112000353",
403
403
  "scripts": {
404
404
  "bench": "vitest -c ./test/vitest.config.ts bench",
405
405
  "bench:compare": "bun run ./benchmarks/run.ts",
@@ -619,4 +619,161 @@ describe("parseIncomingWebhook", () => {
619
619
  "$ZodError",
620
620
  );
621
621
  });
622
+
623
+ describe("verify", () => {
624
+ type VerifyOptions = Parameters<typeof parse>[4];
625
+
626
+ async function stringifyAndParse(
627
+ payload: unknown,
628
+ verify?: VerifyOptions,
629
+ ): Promise<WebhookPayload> {
630
+ const timestamp = Math.floor(Date.now() / 1000).toString();
631
+ const payloadString =
632
+ typeof payload === "string" ? payload : JSON.stringify(payload);
633
+ const signature = await generateSignature(timestamp, payloadString);
634
+ const headers = {
635
+ "x-payload-signature": signature,
636
+ "x-timestamp": timestamp,
637
+ };
638
+ return parse(payloadString, headers, secret, 300, verify);
639
+ }
640
+
641
+ async function expectVerifyFailure(
642
+ payload: unknown,
643
+ verify: VerifyOptions,
644
+ message: string,
645
+ ): Promise<void> {
646
+ await expect(stringifyAndParse(payload, verify)).rejects.toThrow(message);
647
+ }
648
+
649
+ describe("onchain tx", () => {
650
+ it("should pass when all verification values match", async () => {
651
+ const result = await stringifyAndParse(validPayload, {
652
+ receiverAddress: validWebhook.data.receiver,
653
+ destinationTokenAddress: validWebhook.data.destinationToken.address,
654
+ destinationChainId: validWebhook.data.destinationToken.chainId,
655
+ minDestinationAmount: validWebhook.data.destinationAmount,
656
+ });
657
+ expect(result).toEqual(validWebhook);
658
+ });
659
+
660
+ it("should fail if receiverAddress does not match", async () => {
661
+ const expected = "0x0000000000000000000000000000000000000000";
662
+ await expectVerifyFailure(
663
+ validPayload,
664
+ { receiverAddress: expected },
665
+ `Verification Failed: receiverAddress mismatch, Expected: ${expected}, Received: ${validWebhook.data.receiver}`,
666
+ );
667
+ });
668
+
669
+ it("should fail if destinationTokenAddress does not match", async () => {
670
+ const expected = "0x0000000000000000000000000000000000000001";
671
+ await expectVerifyFailure(
672
+ validPayload,
673
+ { destinationTokenAddress: expected },
674
+ `Verification Failed: destinationTokenAddress mismatch, Expected: ${expected}, Received: ${validWebhook.data.destinationToken.address}`,
675
+ );
676
+ });
677
+
678
+ it("should fail if destinationChainId does not match", async () => {
679
+ const expected = 137;
680
+ await expectVerifyFailure(
681
+ validPayload,
682
+ { destinationChainId: expected },
683
+ `Verification Failed: destinationChainId mismatch, Expected: ${expected}, Received: ${validWebhook.data.destinationToken.chainId}`,
684
+ );
685
+ });
686
+
687
+ it("should fail if minDestinationAmount is greater than actual", async () => {
688
+ const expectedMin = validWebhook.data.destinationAmount + 1n;
689
+ await expectVerifyFailure(
690
+ validPayload,
691
+ { minDestinationAmount: expectedMin },
692
+ `Verification Failed: minDestinationAmount, Expected minimum amount to be ${expectedMin}, Received: ${validWebhook.data.destinationAmount}`,
693
+ );
694
+ });
695
+ });
696
+
697
+ describe("onramp tx", () => {
698
+ const onrampWebhook: WebhookPayload = {
699
+ data: {
700
+ amount: 100n,
701
+ currency: "USD",
702
+ currencyAmount: 100,
703
+ id: "onramp123",
704
+ onramp: "moonpay",
705
+ paymentLinkId: "plink_123",
706
+ purchaseData: {},
707
+ receiver: "0x1234567890123456789012345678901234567890",
708
+ sender: "0x1234567890123456789012345678901234567890",
709
+ status: "COMPLETED",
710
+ token: {
711
+ address: "0x1234567890123456789012345678901234567890",
712
+ chainId: 1,
713
+ decimals: 18,
714
+ iconUri: "https://example.com/icon.png",
715
+ name: "Token",
716
+ priceUsd: 1.0,
717
+ symbol: "TKN",
718
+ },
719
+ transactionHash: "0x1234567890123456789012345678901234567890",
720
+ },
721
+ type: "pay.onramp-transaction",
722
+ version: 2,
723
+ };
724
+ const onrampPayload = {
725
+ ...onrampWebhook,
726
+ data: {
727
+ ...onrampWebhook.data,
728
+ amount: onrampWebhook.data.amount.toString(),
729
+ },
730
+ };
731
+
732
+ it("should pass when all verification values match ", async () => {
733
+ const result = await stringifyAndParse(onrampPayload, {
734
+ receiverAddress: onrampWebhook.data.receiver,
735
+ destinationTokenAddress: onrampWebhook.data.token.address,
736
+ destinationChainId: onrampWebhook.data.token.chainId,
737
+ minDestinationAmount: onrampWebhook.data.amount,
738
+ });
739
+ expect(result).toEqual(onrampWebhook);
740
+ });
741
+
742
+ it("should fail if destinationTokenAddress does not match ", async () => {
743
+ const expected = "0x0000000000000000000000000000000000000002";
744
+ await expectVerifyFailure(
745
+ onrampPayload,
746
+ { destinationTokenAddress: expected },
747
+ `Verification Failed: destinationTokenAddress mismatch, Expected: ${expected}, Received: ${onrampWebhook.data.token.address}`,
748
+ );
749
+ });
750
+
751
+ it("should fail if destinationChainId does not match ", async () => {
752
+ const expected = 8453;
753
+ await expectVerifyFailure(
754
+ onrampPayload,
755
+ { destinationChainId: expected },
756
+ `Verification Failed: destinationChainId mismatch, Expected: ${expected}, Received: ${onrampWebhook.data.token.chainId}`,
757
+ );
758
+ });
759
+
760
+ it("should fail if minDestinationAmount is greater than actual ", async () => {
761
+ const expectedMin = onrampWebhook.data.amount + 1n;
762
+ await expectVerifyFailure(
763
+ onrampPayload,
764
+ { minDestinationAmount: expectedMin },
765
+ `Verification Failed: minDestinationAmount, Expected minimum amount to be ${expectedMin}, Received: ${onrampWebhook.data.amount}`,
766
+ );
767
+ });
768
+
769
+ it("should fail if receiverAddress does not match", async () => {
770
+ const expected = "0x0000000000000000000000000000000000000003";
771
+ await expectVerifyFailure(
772
+ onrampPayload,
773
+ { receiverAddress: expected },
774
+ `Verification Failed: receiverAddress mismatch, Expected: ${expected}, Received: ${onrampWebhook.data.receiver}`,
775
+ );
776
+ });
777
+ });
778
+ });
622
779
  });
@@ -118,6 +118,28 @@ export async function parse(
118
118
  * The tolerance in seconds for the timestamp verification.
119
119
  */
120
120
  tolerance = 300, // Default to 5 minutes if not specified
121
+
122
+ /**
123
+ * Add various validations to the parsed payload to ensure it matches the expected values. Throws error if any validation fails.
124
+ */
125
+ verify?: {
126
+ /**
127
+ * Verify that the payload's the destination token amount (in wei) is greater than `minDestinationAmount` value
128
+ */
129
+ minDestinationAmount?: bigint;
130
+ /**
131
+ * Verify that the payload's destination token address is the same as `destinationTokenAddress` value
132
+ */
133
+ destinationTokenAddress?: string;
134
+ /**
135
+ * Verify that the payload's destination chain id is the same as `destinationChainId` value
136
+ */
137
+ destinationChainId?: number;
138
+ /**
139
+ * Verify that the payload's receiver address is the same as `receiverAddress` value.
140
+ */
141
+ receiverAddress?: string;
142
+ },
121
143
  ): Promise<WebhookPayload> {
122
144
  // Get the signature and timestamp from headers
123
145
  const receivedSignature =
@@ -183,5 +205,90 @@ export async function parse(
183
205
  );
184
206
  }
185
207
 
208
+ if (verify) {
209
+ // verify receiver address
210
+ if (verify.receiverAddress) {
211
+ if (
212
+ parsedPayload.data.receiver.toLowerCase() !==
213
+ verify.receiverAddress.toLowerCase()
214
+ ) {
215
+ throw new Error(
216
+ `Verification Failed: receiverAddress mismatch, Expected: ${verify.receiverAddress}, Received: ${parsedPayload.data.receiver}`,
217
+ );
218
+ }
219
+ }
220
+
221
+ // verify destination token address
222
+ if (verify.destinationTokenAddress) {
223
+ // onchain transaction
224
+ if ("destinationToken" in parsedPayload.data) {
225
+ if (
226
+ parsedPayload.data.destinationToken.address.toLowerCase() !==
227
+ verify.destinationTokenAddress.toLowerCase()
228
+ ) {
229
+ throw new Error(
230
+ `Verification Failed: destinationTokenAddress mismatch, Expected: ${verify.destinationTokenAddress}, Received: ${parsedPayload.data.destinationToken.address}`,
231
+ );
232
+ }
233
+ }
234
+ // onramp transaction
235
+ else if ("onramp" in parsedPayload.data) {
236
+ if (
237
+ parsedPayload.data.token.address.toLowerCase() !==
238
+ verify.destinationTokenAddress.toLowerCase()
239
+ ) {
240
+ throw new Error(
241
+ `Verification Failed: destinationTokenAddress mismatch, Expected: ${verify.destinationTokenAddress}, Received: ${parsedPayload.data.token.address}`,
242
+ );
243
+ }
244
+ }
245
+ }
246
+
247
+ // verify destination chain id
248
+ if (verify.destinationChainId) {
249
+ // onchain tx
250
+ if ("destinationToken" in parsedPayload.data) {
251
+ if (
252
+ parsedPayload.data.destinationToken.chainId !==
253
+ verify.destinationChainId
254
+ ) {
255
+ throw new Error(
256
+ `Verification Failed: destinationChainId mismatch, Expected: ${verify.destinationChainId}, Received: ${parsedPayload.data.destinationToken.chainId}`,
257
+ );
258
+ }
259
+ }
260
+ // onramp tx
261
+ else if ("onramp" in parsedPayload.data) {
262
+ if (parsedPayload.data.token.chainId !== verify.destinationChainId) {
263
+ throw new Error(
264
+ `Verification Failed: destinationChainId mismatch, Expected: ${verify.destinationChainId}, Received: ${parsedPayload.data.token.chainId}`,
265
+ );
266
+ }
267
+ }
268
+ }
269
+
270
+ // verify amount
271
+ if (verify.minDestinationAmount) {
272
+ // onchain tx
273
+ if ("destinationAmount" in parsedPayload.data) {
274
+ if (
275
+ parsedPayload.data.destinationAmount < verify.minDestinationAmount
276
+ ) {
277
+ throw new Error(
278
+ `Verification Failed: minDestinationAmount, Expected minimum amount to be ${verify.minDestinationAmount}, Received: ${parsedPayload.data.destinationAmount}`,
279
+ );
280
+ }
281
+ }
282
+ // onramp tx
283
+ else if ("onramp" in parsedPayload.data) {
284
+ if (parsedPayload.data.amount < verify.minDestinationAmount) {
285
+ throw new Error(
286
+ `Verification Failed: minDestinationAmount, Expected minimum amount to be ${verify.minDestinationAmount}, Received: ${parsedPayload.data.amount}`,
287
+ );
288
+ }
289
+ }
290
+ }
291
+ }
292
+
186
293
  return parsedPayload satisfies WebhookPayload;
187
294
  }
@@ -60,6 +60,12 @@ export async function createStylusProject() {
60
60
  { title: "Airdrop ERC1155", value: "airdrop1155" },
61
61
  { title: "ZK ERC721", value: "zk-erc721" },
62
62
  { title: "ZK ERC20", value: "zk-erc20" },
63
+ { title: "Mint module - ERC20", value: "mintable20" },
64
+ { title: "Transfer module - ERC20", value: "transferable20" },
65
+ { title: "Mint module - ERC721", value: "mintable721" },
66
+ { title: "Transfer module - ERC721", value: "transferable721" },
67
+ { title: "Mint module - ERC1155", value: "mintable1155" },
68
+ { title: "Transfer module - ERC1155", value: "transferable1155" },
63
69
  ],
64
70
  message: "Select a template:",
65
71
  name: "projectType",
@@ -133,6 +139,49 @@ export async function createStylusProject() {
133
139
  newProject = spawnSync("git", ["clone", repoUrl, projectName], {
134
140
  stdio: "inherit",
135
141
  });
142
+ } else if (projectType === "mintable20") {
143
+ const repoUrl = "git@github.com:thirdweb-example/stylus-mintable-erc20.git";
144
+ spinner.start(`Creating new ERC20 Mintable module: ${projectName}...`);
145
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
146
+ stdio: "inherit",
147
+ });
148
+ } else if (projectType === "transferable20") {
149
+ const repoUrl =
150
+ "git@github.com:thirdweb-example/stylus-transferable-erc20.git";
151
+ spinner.start(`Creating new ERC20 Transferable module: ${projectName}...`);
152
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
153
+ stdio: "inherit",
154
+ });
155
+ } else if (projectType === "mintable721") {
156
+ const repoUrl =
157
+ "git@github.com:thirdweb-example/stylus-mintable-erc721.git";
158
+ spinner.start(`Creating new ERC721 Mintable module: ${projectName}...`);
159
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
160
+ stdio: "inherit",
161
+ });
162
+ } else if (projectType === "transferable721") {
163
+ const repoUrl =
164
+ "git@github.com:thirdweb-example/stylus-transferable-erc721.git";
165
+ spinner.start(`Creating new ERC721 Transferable module: ${projectName}...`);
166
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
167
+ stdio: "inherit",
168
+ });
169
+ } else if (projectType === "mintable1155") {
170
+ const repoUrl =
171
+ "git@github.com:thirdweb-example/stylus-mintable-erc1155.git";
172
+ spinner.start(`Creating new ERC1155 Mintable module: ${projectName}...`);
173
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
174
+ stdio: "inherit",
175
+ });
176
+ } else if (projectType === "transferable1155") {
177
+ const repoUrl =
178
+ "git@github.com:thirdweb-example/stylus-transferable-erc1155.git";
179
+ spinner.start(
180
+ `Creating new ERC1155 Transferable module: ${projectName}...`,
181
+ );
182
+ newProject = spawnSync("git", ["clone", repoUrl, projectName], {
183
+ stdio: "inherit",
184
+ });
136
185
  }
137
186
 
138
187
  if (!newProject || newProject.status !== 0) {
@@ -9,48 +9,44 @@ import { getContract } from "../contract.js";
9
9
  import { deployCloneFactory } from "./utils/bootstrap.js";
10
10
 
11
11
  describe.runIf(process.env.TW_SECRET_KEY)("deploy dynamic", () => {
12
- // TODO: Fix this test
13
- it.skip.sequential(
14
- "should deploy dynamic contract with extensions",
15
- async () => {
16
- await deployCloneFactory({
17
- account: TEST_ACCOUNT_A,
18
- chain: ANVIL_CHAIN,
19
- client: TEST_CLIENT,
20
- });
12
+ it.sequential("should deploy dynamic contract with extensions", async () => {
13
+ await deployCloneFactory({
14
+ account: TEST_ACCOUNT_A,
15
+ chain: ANVIL_CHAIN,
16
+ client: TEST_CLIENT,
17
+ });
21
18
 
22
- const deployed = await deployPublishedContract({
23
- account: TEST_ACCOUNT_A,
24
- chain: ANVIL_CHAIN,
25
- client: TEST_CLIENT,
26
- contractId: "EvolvingNFT",
27
- contractParams: {
28
- contractURI: "",
29
- defaultAdmin: TEST_ACCOUNT_A.address,
30
- name: "Evolving nft",
31
- royaltyBps: 0n,
32
- royaltyRecipient: TEST_ACCOUNT_A.address,
33
- saleRecipient: TEST_ACCOUNT_A.address,
34
- symbol: "ENFT",
35
- trustedForwarders: [],
36
- },
37
- });
19
+ const deployed = await deployPublishedContract({
20
+ account: TEST_ACCOUNT_A,
21
+ chain: ANVIL_CHAIN,
22
+ client: TEST_CLIENT,
23
+ contractId: "EvolvingNFT",
24
+ contractParams: {
25
+ contractURI: "",
26
+ defaultAdmin: TEST_ACCOUNT_A.address,
27
+ name: "Evolving nft",
28
+ royaltyBps: 0n,
29
+ royaltyRecipient: TEST_ACCOUNT_A.address,
30
+ saleRecipient: TEST_ACCOUNT_A.address,
31
+ symbol: "ENFT",
32
+ trustedForwarders: [],
33
+ },
34
+ });
38
35
 
39
- expect(deployed).toBeDefined();
36
+ expect(deployed).toBeDefined();
40
37
 
41
- const contract = getContract({
42
- address: deployed,
43
- chain: ANVIL_CHAIN,
44
- client: TEST_CLIENT,
45
- });
38
+ const contract = getContract({
39
+ address: deployed,
40
+ chain: ANVIL_CHAIN,
41
+ client: TEST_CLIENT,
42
+ });
46
43
 
47
- const extensions = await readContract({
48
- contract,
49
- method: resolveMethod("getAllExtensions"),
50
- params: [],
51
- });
44
+ const extensions = await readContract({
45
+ contract,
46
+ method: resolveMethod("getAllExtensions"),
47
+ params: [],
48
+ });
52
49
 
53
- expect(extensions.length).toEqual(3);
54
- },
55
- );
50
+ expect(extensions.length).toEqual(3);
51
+ });
56
52
  });