@cowprotocol/hook-dapp-lib 1.0.0-RC0

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.
@@ -0,0 +1,15 @@
1
+ import { IframeTransport } from '@cowprotocol/iframe-transport';
2
+ import { CowHookCreation, CowHookDetails, HookDappContext } from './types';
3
+ export declare enum CoWHookDappEvents {
4
+ ACTIVATE = "ACTIVATE",
5
+ CONTEXT_UPDATE = "CONTEXT_UPDATE",
6
+ ADD_HOOK = "ADD_HOOK",
7
+ EDIT_HOOK = "EDIT_HOOK"
8
+ }
9
+ export interface HookDappEventsPayloadMap {
10
+ [CoWHookDappEvents.ACTIVATE]: void;
11
+ [CoWHookDappEvents.CONTEXT_UPDATE]: HookDappContext;
12
+ [CoWHookDappEvents.ADD_HOOK]: CowHookCreation;
13
+ [CoWHookDappEvents.EDIT_HOOK]: CowHookDetails;
14
+ }
15
+ export declare const hookDappIframeTransport: IframeTransport<HookDappEventsPayloadMap>;
package/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { initCoWHookDapp } from './initCoWHookDapp';
2
+ export * from './hookDappIframeTransport';
3
+ export * from './types';
package/index.iife.js ADDED
@@ -0,0 +1 @@
1
+ var cowSwapWidget=function(v){"use strict";var H=Object.defineProperty;var U=(v,_,T)=>_ in v?H(v,_,{enumerable:!0,configurable:!0,writable:!0,value:T}):v[_]=T;var g=(v,_,T)=>(U(v,typeof _!="symbol"?_+"":_,T),T);class _{constructor(p){this.key=p}postMessageToWindow(p,e,t){const l=typeof t=="object"?t:{},f={key:this.key,method:e,...l};p.postMessage(f,"*")}listenToMessageFromWindow(p,e,t){const l=f=>{!T(f.data)||f.data.key!==this.key||f.data.method!==e||t(f.data)};return p.addEventListener("message",l),l}stopListeningToMessageFromWindow(p,e,t){p.removeEventListener("message",t)}stopListeningWindowListener(p,e){p.removeEventListener("message",e)}}function T(o){return typeof o=="object"&&o!==null&&"key"in o&&"method"in o&&typeof o.key=="string"&&typeof o.method=="string"}var b=(o=>(o.PROVIDER_RPC_REQUEST="PROVIDER_RPC_REQUEST",o.PROVIDER_RPC_RESPONSE="PROVIDER_RPC_RESPONSE",o.PROVIDER_ON_EVENT="PROVIDER_ON_EVENT",o))(b||{});const k=new _("cowSwapIframeRpcProviderTransport");var D={exports:{}};(function(o){var p=Object.prototype.hasOwnProperty,e="~";function t(){}Object.create&&(t.prototype=Object.create(null),new t().__proto__||(e=!1));function l(a,r,s){this.fn=a,this.context=r,this.once=s||!1}function f(a,r,s,i,m){if(typeof s!="function")throw new TypeError("The listener must be a function");var d=new l(s,i||a,m),c=e?e+r:r;return a._events[c]?a._events[c].fn?a._events[c]=[a._events[c],d]:a._events[c].push(d):(a._events[c]=d,a._eventsCount++),a}function E(a,r){--a._eventsCount===0?a._events=new t:delete a._events[r]}function h(){this._events=new t,this._eventsCount=0}h.prototype.eventNames=function(){var r=[],s,i;if(this._eventsCount===0)return r;for(i in s=this._events)p.call(s,i)&&r.push(e?i.slice(1):i);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(s)):r},h.prototype.listeners=function(r){var s=e?e+r:r,i=this._events[s];if(!i)return[];if(i.fn)return[i.fn];for(var m=0,d=i.length,c=new Array(d);m<d;m++)c[m]=i[m].fn;return c},h.prototype.listenerCount=function(r){var s=e?e+r:r,i=this._events[s];return i?i.fn?1:i.length:0},h.prototype.emit=function(r,s,i,m,d,c){var w=e?e+r:r;if(!this._events[w])return!1;var n=this._events[w],y=arguments.length,O,u;if(n.fn){switch(n.once&&this.removeListener(r,n.fn,void 0,!0),y){case 1:return n.fn.call(n.context),!0;case 2:return n.fn.call(n.context,s),!0;case 3:return n.fn.call(n.context,s,i),!0;case 4:return n.fn.call(n.context,s,i,m),!0;case 5:return n.fn.call(n.context,s,i,m,d),!0;case 6:return n.fn.call(n.context,s,i,m,d,c),!0}for(u=1,O=new Array(y-1);u<y;u++)O[u-1]=arguments[u];n.fn.apply(n.context,O)}else{var W=n.length,R;for(u=0;u<W;u++)switch(n[u].once&&this.removeListener(r,n[u].fn,void 0,!0),y){case 1:n[u].fn.call(n[u].context);break;case 2:n[u].fn.call(n[u].context,s);break;case 3:n[u].fn.call(n[u].context,s,i);break;case 4:n[u].fn.call(n[u].context,s,i,m);break;default:if(!O)for(R=1,O=new Array(y-1);R<y;R++)O[R-1]=arguments[R];n[u].fn.apply(n[u].context,O)}}return!0},h.prototype.on=function(r,s,i){return f(this,r,s,i,!1)},h.prototype.once=function(r,s,i){return f(this,r,s,i,!0)},h.prototype.removeListener=function(r,s,i,m){var d=e?e+r:r;if(!this._events[d])return this;if(!s)return E(this,d),this;var c=this._events[d];if(c.fn)c.fn===s&&(!m||c.once)&&(!i||c.context===i)&&E(this,d);else{for(var w=0,n=[],y=c.length;w<y;w++)(c[w].fn!==s||m&&!c[w].once||i&&c[w].context!==i)&&n.push(c[w]);n.length?this._events[d]=n.length===1?n[0]:n:E(this,d)}return this},h.prototype.removeAllListeners=function(r){var s;return r?(s=e?e+r:r,this._events[s]&&E(this,s)):(this._events=new t,this._eventsCount=0),this},h.prototype.off=h.prototype.removeListener,h.prototype.addListener=h.prototype.on,h.prefixed=e,h.EventEmitter=h,o.exports=h})(D);var A=D.exports;const S=6e5,I="2.0";function N(){return Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)}class M extends Error{constructor(e,t){super(`${e}: ${t}`);g(this,"isRpcError",!0);g(this,"code");g(this,"reason");this.code=e,this.reason=t}}class x extends A.EventEmitter{constructor({timeoutMilliseconds:e=S,eventSource:t=window,eventTarget:l=window.parent}={}){super();g(this,"enabled",null);g(this,"timeoutMilliseconds");g(this,"eventSource");g(this,"eventTarget");g(this,"completers",{});g(this,"handleRpcRequests",({rpcResponse:e})=>{if(e.id===void 0||e.id===null)return;const t=this.completers[""+e.id];t&&("error"in e||"result"in e?t.resolve(e):t.reject(new Error("Response from provider did not have error or result key")),delete this.completers[e.id])});this.timeoutMilliseconds=e,this.eventSource=t,this.eventTarget=l,k.listenToMessageFromWindow(this.eventSource,b.PROVIDER_RPC_RESPONSE,f=>{this.handleRpcRequests(f)}),k.listenToMessageFromWindow(this.eventSource,b.PROVIDER_ON_EVENT,f=>{this.handleOnEvent(f)})}request({method:e,params:t}){return this.send(e,t)}isConnected(){return!0}get isIFrame(){return!0}get currentProvider(){return this}async execute(e,t){const l=N(),f={jsonrpc:I,id:l,method:e,params:t},E=new Promise((h,a)=>this.completers[l]={resolve:h,reject:a});return k.postMessageToWindow(this.eventTarget,b.PROVIDER_RPC_REQUEST,{rpcRequest:f}),setTimeout(()=>{this.completers[l]&&(this.completers[l].reject(new Error("Request timed out. Please try again and submit it faster.")),delete this.completers[l])},this.timeoutMilliseconds),E}async send(e,t){const{method:l,params:f}=typeof e=="string"?{method:e,params:t}:{method:e.method,params:e.params},E=await this.execute(l,f);if("error"in E)throw new M(E.error.code,E.error.message);return E.result}async enable(){if(this.enabled===null){const e=this.enabled=this.send("enable",[]).catch(t=>{throw this.enabled===e&&(this.enabled=null),t})}return this.enabled}async sendAsync(e,t){try{const l=await this.execute(e.method,e.params);t(null,l)}catch(l){t(l,null)}}handleOnEvent(e){const t=e.params;switch(e.event){case"notification":this.emitNotification(t);break;case"connect":this.emitConnect(t);break;case"disconnect":this.emitDisconnect(t);break;case"chainChanged":this.emitChainChanged(t);break;case"accountsChanged":this.emitAccountsChanged(t);break;case"message":this.emitMessage(t);break;case"networkChanged":this.emitNetworkChanged(t);break;case"close":this.emitClose(t);break;default:console.warn(`[WidgetEthereumProvider] Unknown event type: ${e.event}`);break}}emitNotification(e){this.emit("notification",e)}emitConnect(e){this.enabled===null&&(this.enabled=Promise.resolve([])),this.emit("connect",e)}emitClose(e){Array.isArray(e)&&e.length===2?this.emit("close",e[0],e[1]):this.emit("close")}emitDisconnect(e){this.emit("disconnect",e)}emitChainChanged(e){this.emit("chainChanged",e)}emitNetworkChanged(e){this.emit("networkChanged",e)}emitAccountsChanged(e){this.enabled=Promise.resolve(e),this.emit("accountsChanged",e)}emitMessage(e){this.emit("message",e)}}var C=(o=>(o.ACTIVATE="ACTIVATE",o.CONTEXT_UPDATE="CONTEXT_UPDATE",o.ADD_HOOK="ADD_HOOK",o.EDIT_HOOK="EDIT_HOOK",o))(C||{});const P=new _("cowSwapHookDapp");function L({onContext:o}){const p=window.parent,e=new x,t=V();return P.listenToMessageFromWindow(window,C.CONTEXT_UPDATE,o),P.postMessageToWindow(p,C.ACTIVATE,void 0),{actions:t,provider:e}}function V(){return{addHook(o){P.postMessageToWindow(parent,C.ADD_HOOK,o)},editHook(o){P.postMessageToWindow(parent,C.EDIT_HOOK,o)}}}return v.CoWHookDappEvents=C,v.hookDappIframeTransport=P,v.initCoWHookDapp=L,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"}),v}({});
package/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var D=Object.defineProperty;var A=(r,c,e)=>c in r?D(r,c,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[c]=e;var E=(r,c,e)=>(A(r,typeof c!="symbol"?c+"":c,e),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class R{constructor(c){this.key=c}postMessageToWindow(c,e,t){const h=typeof t=="object"?t:{},d={key:this.key,method:e,...h};c.postMessage(d,"*")}listenToMessageFromWindow(c,e,t){const h=d=>{!I(d.data)||d.data.key!==this.key||d.data.method!==e||t(d.data)};return c.addEventListener("message",h),h}stopListeningToMessageFromWindow(c,e,t){c.removeEventListener("message",t)}stopListeningWindowListener(c,e){c.removeEventListener("message",e)}}function I(r){return typeof r=="object"&&r!==null&&"key"in r&&"method"in r&&typeof r.key=="string"&&typeof r.method=="string"}var C=(r=>(r.PROVIDER_RPC_REQUEST="PROVIDER_RPC_REQUEST",r.PROVIDER_RPC_RESPONSE="PROVIDER_RPC_RESPONSE",r.PROVIDER_ON_EVENT="PROVIDER_ON_EVENT",r))(C||{});const P=new R("cowSwapIframeRpcProviderTransport");var b={exports:{}};(function(r){var c=Object.prototype.hasOwnProperty,e="~";function t(){}Object.create&&(t.prototype=Object.create(null),new t().__proto__||(e=!1));function h(a,s,o){this.fn=a,this.context=s,this.once=o||!1}function d(a,s,o,i,m){if(typeof o!="function")throw new TypeError("The listener must be a function");var p=new h(o,i||a,m),l=e?e+s:s;return a._events[l]?a._events[l].fn?a._events[l]=[a._events[l],p]:a._events[l].push(p):(a._events[l]=p,a._eventsCount++),a}function v(a,s){--a._eventsCount===0?a._events=new t:delete a._events[s]}function f(){this._events=new t,this._eventsCount=0}f.prototype.eventNames=function(){var s=[],o,i;if(this._eventsCount===0)return s;for(i in o=this._events)c.call(o,i)&&s.push(e?i.slice(1):i);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(o)):s},f.prototype.listeners=function(s){var o=e?e+s:s,i=this._events[o];if(!i)return[];if(i.fn)return[i.fn];for(var m=0,p=i.length,l=new Array(p);m<p;m++)l[m]=i[m].fn;return l},f.prototype.listenerCount=function(s){var o=e?e+s:s,i=this._events[o];return i?i.fn?1:i.length:0},f.prototype.emit=function(s,o,i,m,p,l){var _=e?e+s:s;if(!this._events[_])return!1;var n=this._events[_],g=arguments.length,w,u;if(n.fn){switch(n.once&&this.removeListener(s,n.fn,void 0,!0),g){case 1:return n.fn.call(n.context),!0;case 2:return n.fn.call(n.context,o),!0;case 3:return n.fn.call(n.context,o,i),!0;case 4:return n.fn.call(n.context,o,i,m),!0;case 5:return n.fn.call(n.context,o,i,m,p),!0;case 6:return n.fn.call(n.context,o,i,m,p,l),!0}for(u=1,w=new Array(g-1);u<g;u++)w[u-1]=arguments[u];n.fn.apply(n.context,w)}else{var k=n.length,T;for(u=0;u<k;u++)switch(n[u].once&&this.removeListener(s,n[u].fn,void 0,!0),g){case 1:n[u].fn.call(n[u].context);break;case 2:n[u].fn.call(n[u].context,o);break;case 3:n[u].fn.call(n[u].context,o,i);break;case 4:n[u].fn.call(n[u].context,o,i,m);break;default:if(!w)for(T=1,w=new Array(g-1);T<g;T++)w[T-1]=arguments[T];n[u].fn.apply(n[u].context,w)}}return!0},f.prototype.on=function(s,o,i){return d(this,s,o,i,!1)},f.prototype.once=function(s,o,i){return d(this,s,o,i,!0)},f.prototype.removeListener=function(s,o,i,m){var p=e?e+s:s;if(!this._events[p])return this;if(!o)return v(this,p),this;var l=this._events[p];if(l.fn)l.fn===o&&(!m||l.once)&&(!i||l.context===i)&&v(this,p);else{for(var _=0,n=[],g=l.length;_<g;_++)(l[_].fn!==o||m&&!l[_].once||i&&l[_].context!==i)&&n.push(l[_]);n.length?this._events[p]=n.length===1?n[0]:n:v(this,p)}return this},f.prototype.removeAllListeners=function(s){var o;return s?(o=e?e+s:s,this._events[o]&&v(this,o)):(this._events=new t,this._eventsCount=0),this},f.prototype.off=f.prototype.removeListener,f.prototype.addListener=f.prototype.on,f.prefixed=e,f.EventEmitter=f,r.exports=f})(b);var S=b.exports;const x=6e5,N="2.0";function M(){return Math.floor(Math.random()*Number.MAX_SAFE_INTEGER)}class L extends Error{constructor(e,t){super(`${e}: ${t}`);E(this,"isRpcError",!0);E(this,"code");E(this,"reason");this.code=e,this.reason=t}}class V extends S.EventEmitter{constructor({timeoutMilliseconds:e=x,eventSource:t=window,eventTarget:h=window.parent}={}){super();E(this,"enabled",null);E(this,"timeoutMilliseconds");E(this,"eventSource");E(this,"eventTarget");E(this,"completers",{});E(this,"handleRpcRequests",({rpcResponse:e})=>{if(e.id===void 0||e.id===null)return;const t=this.completers[""+e.id];t&&("error"in e||"result"in e?t.resolve(e):t.reject(new Error("Response from provider did not have error or result key")),delete this.completers[e.id])});this.timeoutMilliseconds=e,this.eventSource=t,this.eventTarget=h,P.listenToMessageFromWindow(this.eventSource,C.PROVIDER_RPC_RESPONSE,d=>{this.handleRpcRequests(d)}),P.listenToMessageFromWindow(this.eventSource,C.PROVIDER_ON_EVENT,d=>{this.handleOnEvent(d)})}request({method:e,params:t}){return this.send(e,t)}isConnected(){return!0}get isIFrame(){return!0}get currentProvider(){return this}async execute(e,t){const h=M(),d={jsonrpc:N,id:h,method:e,params:t},v=new Promise((f,a)=>this.completers[h]={resolve:f,reject:a});return P.postMessageToWindow(this.eventTarget,C.PROVIDER_RPC_REQUEST,{rpcRequest:d}),setTimeout(()=>{this.completers[h]&&(this.completers[h].reject(new Error("Request timed out. Please try again and submit it faster.")),delete this.completers[h])},this.timeoutMilliseconds),v}async send(e,t){const{method:h,params:d}=typeof e=="string"?{method:e,params:t}:{method:e.method,params:e.params},v=await this.execute(h,d);if("error"in v)throw new L(v.error.code,v.error.message);return v.result}async enable(){if(this.enabled===null){const e=this.enabled=this.send("enable",[]).catch(t=>{throw this.enabled===e&&(this.enabled=null),t})}return this.enabled}async sendAsync(e,t){try{const h=await this.execute(e.method,e.params);t(null,h)}catch(h){t(h,null)}}handleOnEvent(e){const t=e.params;switch(e.event){case"notification":this.emitNotification(t);break;case"connect":this.emitConnect(t);break;case"disconnect":this.emitDisconnect(t);break;case"chainChanged":this.emitChainChanged(t);break;case"accountsChanged":this.emitAccountsChanged(t);break;case"message":this.emitMessage(t);break;case"networkChanged":this.emitNetworkChanged(t);break;case"close":this.emitClose(t);break;default:console.warn(`[WidgetEthereumProvider] Unknown event type: ${e.event}`);break}}emitNotification(e){this.emit("notification",e)}emitConnect(e){this.enabled===null&&(this.enabled=Promise.resolve([])),this.emit("connect",e)}emitClose(e){Array.isArray(e)&&e.length===2?this.emit("close",e[0],e[1]):this.emit("close")}emitDisconnect(e){this.emit("disconnect",e)}emitChainChanged(e){this.emit("chainChanged",e)}emitNetworkChanged(e){this.emit("networkChanged",e)}emitAccountsChanged(e){this.enabled=Promise.resolve(e),this.emit("accountsChanged",e)}emitMessage(e){this.emit("message",e)}}var y=(r=>(r.ACTIVATE="ACTIVATE",r.CONTEXT_UPDATE="CONTEXT_UPDATE",r.ADD_HOOK="ADD_HOOK",r.EDIT_HOOK="EDIT_HOOK",r))(y||{});const O=new R("cowSwapHookDapp");function W({onContext:r}){const c=window.parent,e=new V,t=H();return O.listenToMessageFromWindow(window,y.CONTEXT_UPDATE,r),O.postMessageToWindow(c,y.ACTIVATE,void 0),{actions:t,provider:e}}function H(){return{addHook(r){O.postMessageToWindow(parent,y.ADD_HOOK,r)},editHook(r){O.postMessageToWindow(parent,y.EDIT_HOOK,r)}}}exports.CoWHookDappEvents=y;exports.hookDappIframeTransport=O;exports.initCoWHookDapp=W;
package/index.mjs ADDED
@@ -0,0 +1,351 @@
1
+ var D = Object.defineProperty;
2
+ var A = (s, c, e) => c in s ? D(s, c, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[c] = e;
3
+ var E = (s, c, e) => (A(s, typeof c != "symbol" ? c + "" : c, e), e);
4
+ class R {
5
+ constructor(c) {
6
+ this.key = c;
7
+ }
8
+ postMessageToWindow(c, e, t) {
9
+ const h = typeof t == "object" ? t : {}, d = {
10
+ key: this.key,
11
+ method: e,
12
+ ...h
13
+ };
14
+ c.postMessage(
15
+ d,
16
+ "*"
17
+ // TODO: Change to CoW specific origin in production. https://github.com/cowprotocol/cowswap/issues/3828
18
+ );
19
+ }
20
+ listenToMessageFromWindow(c, e, t) {
21
+ const h = (d) => {
22
+ !x(d.data) || d.data.key !== this.key || d.data.method !== e || t(d.data);
23
+ };
24
+ return c.addEventListener("message", h), h;
25
+ }
26
+ stopListeningToMessageFromWindow(c, e, t) {
27
+ c.removeEventListener("message", t);
28
+ }
29
+ stopListeningWindowListener(c, e) {
30
+ c.removeEventListener("message", e);
31
+ }
32
+ }
33
+ function x(s) {
34
+ return typeof s == "object" && s !== null && "key" in s && "method" in s && typeof s.key == "string" && typeof s.method == "string";
35
+ }
36
+ var O = /* @__PURE__ */ ((s) => (s.PROVIDER_RPC_REQUEST = "PROVIDER_RPC_REQUEST", s.PROVIDER_RPC_RESPONSE = "PROVIDER_RPC_RESPONSE", s.PROVIDER_ON_EVENT = "PROVIDER_ON_EVENT", s))(O || {});
37
+ const P = new R(
38
+ "cowSwapIframeRpcProviderTransport"
39
+ );
40
+ var b = { exports: {} };
41
+ (function(s) {
42
+ var c = Object.prototype.hasOwnProperty, e = "~";
43
+ function t() {
44
+ }
45
+ Object.create && (t.prototype = /* @__PURE__ */ Object.create(null), new t().__proto__ || (e = !1));
46
+ function h(a, r, i) {
47
+ this.fn = a, this.context = r, this.once = i || !1;
48
+ }
49
+ function d(a, r, i, o, m) {
50
+ if (typeof i != "function")
51
+ throw new TypeError("The listener must be a function");
52
+ var p = new h(i, o || a, m), l = e ? e + r : r;
53
+ return a._events[l] ? a._events[l].fn ? a._events[l] = [a._events[l], p] : a._events[l].push(p) : (a._events[l] = p, a._eventsCount++), a;
54
+ }
55
+ function v(a, r) {
56
+ --a._eventsCount === 0 ? a._events = new t() : delete a._events[r];
57
+ }
58
+ function f() {
59
+ this._events = new t(), this._eventsCount = 0;
60
+ }
61
+ f.prototype.eventNames = function() {
62
+ var r = [], i, o;
63
+ if (this._eventsCount === 0)
64
+ return r;
65
+ for (o in i = this._events)
66
+ c.call(i, o) && r.push(e ? o.slice(1) : o);
67
+ return Object.getOwnPropertySymbols ? r.concat(Object.getOwnPropertySymbols(i)) : r;
68
+ }, f.prototype.listeners = function(r) {
69
+ var i = e ? e + r : r, o = this._events[i];
70
+ if (!o)
71
+ return [];
72
+ if (o.fn)
73
+ return [o.fn];
74
+ for (var m = 0, p = o.length, l = new Array(p); m < p; m++)
75
+ l[m] = o[m].fn;
76
+ return l;
77
+ }, f.prototype.listenerCount = function(r) {
78
+ var i = e ? e + r : r, o = this._events[i];
79
+ return o ? o.fn ? 1 : o.length : 0;
80
+ }, f.prototype.emit = function(r, i, o, m, p, l) {
81
+ var _ = e ? e + r : r;
82
+ if (!this._events[_])
83
+ return !1;
84
+ var n = this._events[_], g = arguments.length, w, u;
85
+ if (n.fn) {
86
+ switch (n.once && this.removeListener(r, n.fn, void 0, !0), g) {
87
+ case 1:
88
+ return n.fn.call(n.context), !0;
89
+ case 2:
90
+ return n.fn.call(n.context, i), !0;
91
+ case 3:
92
+ return n.fn.call(n.context, i, o), !0;
93
+ case 4:
94
+ return n.fn.call(n.context, i, o, m), !0;
95
+ case 5:
96
+ return n.fn.call(n.context, i, o, m, p), !0;
97
+ case 6:
98
+ return n.fn.call(n.context, i, o, m, p, l), !0;
99
+ }
100
+ for (u = 1, w = new Array(g - 1); u < g; u++)
101
+ w[u - 1] = arguments[u];
102
+ n.fn.apply(n.context, w);
103
+ } else {
104
+ var k = n.length, y;
105
+ for (u = 0; u < k; u++)
106
+ switch (n[u].once && this.removeListener(r, n[u].fn, void 0, !0), g) {
107
+ case 1:
108
+ n[u].fn.call(n[u].context);
109
+ break;
110
+ case 2:
111
+ n[u].fn.call(n[u].context, i);
112
+ break;
113
+ case 3:
114
+ n[u].fn.call(n[u].context, i, o);
115
+ break;
116
+ case 4:
117
+ n[u].fn.call(n[u].context, i, o, m);
118
+ break;
119
+ default:
120
+ if (!w)
121
+ for (y = 1, w = new Array(g - 1); y < g; y++)
122
+ w[y - 1] = arguments[y];
123
+ n[u].fn.apply(n[u].context, w);
124
+ }
125
+ }
126
+ return !0;
127
+ }, f.prototype.on = function(r, i, o) {
128
+ return d(this, r, i, o, !1);
129
+ }, f.prototype.once = function(r, i, o) {
130
+ return d(this, r, i, o, !0);
131
+ }, f.prototype.removeListener = function(r, i, o, m) {
132
+ var p = e ? e + r : r;
133
+ if (!this._events[p])
134
+ return this;
135
+ if (!i)
136
+ return v(this, p), this;
137
+ var l = this._events[p];
138
+ if (l.fn)
139
+ l.fn === i && (!m || l.once) && (!o || l.context === o) && v(this, p);
140
+ else {
141
+ for (var _ = 0, n = [], g = l.length; _ < g; _++)
142
+ (l[_].fn !== i || m && !l[_].once || o && l[_].context !== o) && n.push(l[_]);
143
+ n.length ? this._events[p] = n.length === 1 ? n[0] : n : v(this, p);
144
+ }
145
+ return this;
146
+ }, f.prototype.removeAllListeners = function(r) {
147
+ var i;
148
+ return r ? (i = e ? e + r : r, this._events[i] && v(this, i)) : (this._events = new t(), this._eventsCount = 0), this;
149
+ }, f.prototype.off = f.prototype.removeListener, f.prototype.addListener = f.prototype.on, f.prefixed = e, f.EventEmitter = f, s.exports = f;
150
+ })(b);
151
+ var I = b.exports;
152
+ const N = 6e5, S = "2.0";
153
+ function M() {
154
+ return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
155
+ }
156
+ class L extends Error {
157
+ constructor(e, t) {
158
+ super(`${e}: ${t}`);
159
+ E(this, "isRpcError", !0);
160
+ E(this, "code");
161
+ E(this, "reason");
162
+ this.code = e, this.reason = t;
163
+ }
164
+ }
165
+ class V extends I.EventEmitter {
166
+ constructor({
167
+ timeoutMilliseconds: e = N,
168
+ eventSource: t = window,
169
+ eventTarget: h = window.parent
170
+ } = {}) {
171
+ super();
172
+ E(this, "enabled", null);
173
+ E(this, "timeoutMilliseconds");
174
+ E(this, "eventSource");
175
+ E(this, "eventTarget");
176
+ E(this, "completers", {});
177
+ /**
178
+ * Handle a Rpc Request
179
+ */
180
+ E(this, "handleRpcRequests", ({ rpcResponse: e }) => {
181
+ if (e.id === void 0 || e.id === null)
182
+ return;
183
+ const t = this.completers["" + e.id];
184
+ t && ("error" in e || "result" in e ? t.resolve(e) : t.reject(new Error("Response from provider did not have error or result key")), delete this.completers[e.id]);
185
+ });
186
+ this.timeoutMilliseconds = e, this.eventSource = t, this.eventTarget = h, P.listenToMessageFromWindow(
187
+ this.eventSource,
188
+ O.PROVIDER_RPC_RESPONSE,
189
+ (d) => {
190
+ this.handleRpcRequests(d);
191
+ }
192
+ ), P.listenToMessageFromWindow(
193
+ this.eventSource,
194
+ O.PROVIDER_ON_EVENT,
195
+ (d) => {
196
+ this.handleOnEvent(d);
197
+ }
198
+ );
199
+ }
200
+ request({ method: e, params: t }) {
201
+ return this.send(e, t);
202
+ }
203
+ isConnected() {
204
+ return !0;
205
+ }
206
+ /**
207
+ * Differentiate this provider from other providers by providing an isIFrame property that always returns true.
208
+ */
209
+ get isIFrame() {
210
+ return !0;
211
+ }
212
+ /**
213
+ * Always return this for currentProvider.
214
+ */
215
+ get currentProvider() {
216
+ return this;
217
+ }
218
+ /**
219
+ * Helper method that handles transport and request wrapping
220
+ * @param method method to execute
221
+ * @param params params to pass the method
222
+ */
223
+ async execute(e, t) {
224
+ const h = M(), d = {
225
+ jsonrpc: S,
226
+ id: h,
227
+ method: e,
228
+ params: t
229
+ }, v = new Promise(
230
+ (f, a) => this.completers[h] = { resolve: f, reject: a }
231
+ );
232
+ return P.postMessageToWindow(this.eventTarget, O.PROVIDER_RPC_REQUEST, {
233
+ rpcRequest: d
234
+ }), setTimeout(() => {
235
+ this.completers[h] && (this.completers[h].reject(new Error("Request timed out. Please try again and submit it faster.")), delete this.completers[h]);
236
+ }, this.timeoutMilliseconds), v;
237
+ }
238
+ async send(e, t) {
239
+ const { method: h, params: d } = typeof e == "string" ? { method: e, params: t } : { method: e.method, params: e.params }, v = await this.execute(h, d);
240
+ if ("error" in v)
241
+ throw new L(v.error.code, v.error.message);
242
+ return v.result;
243
+ }
244
+ /**
245
+ * Request the parent window to enable access to the user's web3 provider. Return accounts list immediately if already enabled.
246
+ */
247
+ async enable() {
248
+ if (this.enabled === null) {
249
+ const e = this.enabled = this.send("enable", []).catch((t) => {
250
+ throw this.enabled === e && (this.enabled = null), t;
251
+ });
252
+ }
253
+ return this.enabled;
254
+ }
255
+ /**
256
+ * Backwards compatibility method for web3.
257
+ * @param payload payload to send to the provider
258
+ * @param callback callback to be called when the provider resolves
259
+ */
260
+ async sendAsync(e, t) {
261
+ try {
262
+ const h = await this.execute(e.method, e.params);
263
+ t(null, h);
264
+ } catch (h) {
265
+ t(h, null);
266
+ }
267
+ }
268
+ handleOnEvent(e) {
269
+ const t = e.params;
270
+ switch (e.event) {
271
+ case "notification":
272
+ this.emitNotification(t);
273
+ break;
274
+ case "connect":
275
+ this.emitConnect(t);
276
+ break;
277
+ case "disconnect":
278
+ this.emitDisconnect(t);
279
+ break;
280
+ case "chainChanged":
281
+ this.emitChainChanged(t);
282
+ break;
283
+ case "accountsChanged":
284
+ this.emitAccountsChanged(t);
285
+ break;
286
+ case "message":
287
+ this.emitMessage(t);
288
+ break;
289
+ case "networkChanged":
290
+ this.emitNetworkChanged(t);
291
+ break;
292
+ case "close":
293
+ this.emitClose(t);
294
+ break;
295
+ default:
296
+ console.warn(`[WidgetEthereumProvider] Unknown event type: ${e.event}`);
297
+ break;
298
+ }
299
+ }
300
+ emitNotification(e) {
301
+ this.emit("notification", e);
302
+ }
303
+ emitConnect(e) {
304
+ this.enabled === null && (this.enabled = Promise.resolve([])), this.emit("connect", e);
305
+ }
306
+ /**
307
+ * @deprecated See https://eips.ethereum.org/EIPS/eip-1193
308
+ */
309
+ emitClose(e) {
310
+ Array.isArray(e) && e.length === 2 ? this.emit("close", e[0], e[1]) : this.emit("close");
311
+ }
312
+ emitDisconnect(e) {
313
+ this.emit("disconnect", e);
314
+ }
315
+ emitChainChanged(e) {
316
+ this.emit("chainChanged", e);
317
+ }
318
+ /**
319
+ * @deprecated See https://eips.ethereum.org/EIPS/eip-1193
320
+ */
321
+ emitNetworkChanged(e) {
322
+ this.emit("networkChanged", e);
323
+ }
324
+ emitAccountsChanged(e) {
325
+ this.enabled = Promise.resolve(e), this.emit("accountsChanged", e);
326
+ }
327
+ emitMessage(e) {
328
+ this.emit("message", e);
329
+ }
330
+ }
331
+ var T = /* @__PURE__ */ ((s) => (s.ACTIVATE = "ACTIVATE", s.CONTEXT_UPDATE = "CONTEXT_UPDATE", s.ADD_HOOK = "ADD_HOOK", s.EDIT_HOOK = "EDIT_HOOK", s))(T || {});
332
+ const C = new R("cowSwapHookDapp");
333
+ function F({ onContext: s }) {
334
+ const c = window.parent, e = new V(), t = W();
335
+ return C.listenToMessageFromWindow(window, T.CONTEXT_UPDATE, s), C.postMessageToWindow(c, T.ACTIVATE, void 0), { actions: t, provider: e };
336
+ }
337
+ function W() {
338
+ return {
339
+ addHook(s) {
340
+ C.postMessageToWindow(parent, T.ADD_HOOK, s);
341
+ },
342
+ editHook(s) {
343
+ C.postMessageToWindow(parent, T.EDIT_HOOK, s);
344
+ }
345
+ };
346
+ }
347
+ export {
348
+ T as CoWHookDappEvents,
349
+ C as hookDappIframeTransport,
350
+ F as initCoWHookDapp
351
+ };
@@ -0,0 +1,11 @@
1
+ import { WidgetEthereumProvider } from '@cowprotocol/iframe-transport';
2
+ import { CoWHookDappActions, HookDappContext } from './types';
3
+ interface CoWHookDappInit {
4
+ onContext(context: HookDappContext): void;
5
+ }
6
+ export interface CoWHookDappHandler {
7
+ actions: CoWHookDappActions;
8
+ provider: WidgetEthereumProvider;
9
+ }
10
+ export declare function initCoWHookDapp({ onContext }: CoWHookDappInit): CoWHookDappHandler;
11
+ export {};
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@cowprotocol/hook-dapp-lib",
3
+ "version": "1.0.0-RC0",
4
+ "type": "commonjs",
5
+ "description": "CoW Swap Hook Dapp Library. Allows you to develop pre/post hooks dapps for CoW Protocol.",
6
+ "main": "index.js",
7
+ "exports": {
8
+ "import": "./index.js",
9
+ "require": "./index.mjs"
10
+ },
11
+ "license": "ISC",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/cowprotocol/cowswap"
15
+ },
16
+ "keywords": [
17
+ "cowprotocol",
18
+ "hooks",
19
+ "cowswap",
20
+ "dex",
21
+ "hook-dapp-lib"
22
+ ],
23
+ "dependencies": {
24
+ "@cowprotocol/cow-sdk": "^5.4.1",
25
+ "@cowprotocol/iframe-transport": "^1.0.0"
26
+ }
27
+ }
package/types.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { SupportedChainId } from '@cowprotocol/cow-sdk';
2
+ export interface CowHook {
3
+ target: string;
4
+ callData: string;
5
+ gasLimit: string;
6
+ }
7
+ export interface CowHookCreation {
8
+ hook: CowHook;
9
+ recipientOverride?: string;
10
+ }
11
+ export interface CowHookDetails extends CowHookCreation {
12
+ uuid: string;
13
+ }
14
+ export interface CoWHookDappActions {
15
+ addHook(payload: CowHookCreation): void;
16
+ editHook(payload: CowHookDetails): void;
17
+ }
18
+ export interface HookDappOrderParams {
19
+ validTo: number;
20
+ sellTokenAddress: string;
21
+ buyTokenAddress: string;
22
+ }
23
+ export interface HookDappContext {
24
+ chainId: SupportedChainId;
25
+ account?: string;
26
+ orderParams: HookDappOrderParams | null;
27
+ hookToEdit?: CowHookDetails;
28
+ isSmartContract: boolean | undefined;
29
+ }