@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.
- package/hookDappIframeTransport.d.ts +15 -0
- package/index.d.ts +3 -0
- package/index.iife.js +1 -0
- package/index.js +1 -0
- package/index.mjs +351 -0
- package/initCoWHookDapp.d.ts +11 -0
- package/package.json +27 -0
- package/types.d.ts +29 -0
|
@@ -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
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
|
+
}
|