From 4065c4f37de873dae9f5a499ae2b86d61f35b289 Mon Sep 17 00:00:00 2001 From: armaniferrante Date: Mon, 4 Oct 2021 20:07:56 -0700 Subject: [PATCH] Updates --- asset-manifest.json | 6 +++--- index.html | 2 +- static/js/main.211be682.chunk.js | 2 -- static/js/main.211be682.chunk.js.map | 1 - static/js/main.c71aad46.chunk.js | 2 ++ static/js/main.c71aad46.chunk.js.map | 1 + 6 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 static/js/main.211be682.chunk.js delete mode 100644 static/js/main.211be682.chunk.js.map create mode 100644 static/js/main.c71aad46.chunk.js create mode 100644 static/js/main.c71aad46.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 9dddcbc..0a62c16 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "./static/css/main.6dea0f05.chunk.css", - "main.js": "./static/js/main.211be682.chunk.js", - "main.js.map": "./static/js/main.211be682.chunk.js.map", + "main.js": "./static/js/main.c71aad46.chunk.js", + "main.js.map": "./static/js/main.c71aad46.chunk.js.map", "runtime-main.js": "./static/js/runtime-main.0b9d04a7.js", "runtime-main.js.map": "./static/js/runtime-main.0b9d04a7.js.map", "static/js/2.7c26b8a6.chunk.js": "./static/js/2.7c26b8a6.chunk.js", @@ -17,6 +17,6 @@ "static/js/runtime-main.0b9d04a7.js", "static/js/2.7c26b8a6.chunk.js", "static/css/main.6dea0f05.chunk.css", - "static/js/main.211be682.chunk.js" + "static/js/main.c71aad46.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 34080ba..148f917 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Stake | Serum
\ No newline at end of file +Stake | Serum
\ No newline at end of file diff --git a/static/js/main.211be682.chunk.js b/static/js/main.211be682.chunk.js deleted file mode 100644 index 6e3cfca..0000000 --- a/static/js/main.211be682.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonp@project-serum/stake-ui"]=this["webpackJsonp@project-serum/stake-ui"]||[]).push([[0],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r={active:"#43a047",ready:"#3f51b5",notReady:"#ccc",inactive:"red",deactivating:"rgb(255, 121, 42)"};function a(){return r}},233:function(e,t,n){"use strict";(function(e){n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return o}));var r=n(7),a=n(47),c=Object(a.rustEnum)([Object(r.struct)([],"create"),Object(r.struct)([],"createBuffer"),Object(r.struct)([],"write"),Object(r.struct)([],"setBuffer"),Object(r.struct)([],"setAuthority")]);function i(t){var n=e.alloc(1e3),r=c.encode(t,n);return e.concat([o,n.slice(0,r)])}var o=e.from("0a69e9a778bcf440","hex").reverse()}).call(this,n(15).Buffer)},25:function(e,t,n){"use strict";var r;n.d(t,"a",(function(){return r})),function(e){e[e.CommonTriggerBootstrap=0]="CommonTriggerBootstrap",e[e.CommonAppWillBootstrap=1]="CommonAppWillBootstrap",e[e.CommonAppDidBootstrap=2]="CommonAppDidBootstrap",e[e.CommonTriggerShutdown=3]="CommonTriggerShutdown",e[e.CommonDidShutdown=4]="CommonDidShutdown",e[e.CommonWalletDidConnect=5]="CommonWalletDidConnect",e[e.CommonWalletDidDisconnect=6]="CommonWalletDidDisconnect",e[e.CommonWalletSetProvider=7]="CommonWalletSetProvider",e[e.CommonSetNetwork=8]="CommonSetNetwork",e[e.CommonOwnedTokenAccountsSet=9]="CommonOwnedTokenAccountsSet",e[e.CommonOwnedTokenAccountsUpdate=10]="CommonOwnedTokenAccountsUpdate",e[e.CommonWalletReset=11]="CommonWalletReset",e[e.LockupSetVestings=12]="LockupSetVestings",e[e.LockupUpdateVesting=13]="LockupUpdateVesting",e[e.LockupCreateVesting=14]="LockupCreateVesting",e[e.RegistrySetMember=15]="RegistrySetMember",e[e.RegistrySetRegistrar=16]="RegistrySetRegistrar",e[e.RegistrySetPendingWithdrawals=17]="RegistrySetPendingWithdrawals",e[e.RegistryCreatePendingWithdrawal=18]="RegistryCreatePendingWithdrawal",e[e.RegistryUpdatePendingWithdrawal=19]="RegistryUpdatePendingWithdrawal",e[e.AccountAdd=20]="AccountAdd",e[e.AccountUpdate=21]="AccountUpdate"}(r||(r={}))},296:function(e,t,n){"use strict";(function(e){n.d(t,"b",(function(){return A})),n.d(t,"a",(function(){return E}));var r=n(16),a=n(21),c=n(2),i=n.n(c),o=n(5),s=n(9),u=n(0),l=n(22),d=n(40),b=n(157),p=n(228),m=n.n(p),j=n(306),g=n(104),f=n(85),h=n(156),x=n(118),y=n.n(x),O=n(119),v=n.n(O),w=n(77),S=n(4),k=n(52),K=n(80),C=n(34),M=n(33),T=n(53),P=n(1);function A(e){var t=e.rewards,n=!1;return t.forEach((function(e){null===e&&(n=!0)})),Object(P.jsx)(j.a,{children:n?Object(P.jsx)(b.a,{style:{display:"block",marginLeft:"auto",marginRight:"auto"}}):t.length>0?t.filter((function(e){return!1===e.vendor.account.expired})).map((function(e){return Object(P.jsx)(R,{rli:e})})):Object(P.jsx)(g.a,{children:Object(P.jsx)(f.a,{primary:"No rewards found"})})})}function R(e){var t=e.rli,n=Object(u.useState)(!1),r=Object(s.a)(n,2),a=r[0],c=r[1],i=new Date(1e3*t.vendor.account.startTs.toNumber()).toLocaleString(),o="Dropped by ".concat(t.vendor.account.from.toString()," | ").concat(i);return Object(P.jsxs)(P.Fragment,{children:[Object(P.jsxs)(g.a,{button:!0,onClick:function(){return c((function(e){return!e}))},children:[Object(P.jsx)(m.a,{style:{visibility:t.reward.locked?"visible":"hidden",marginRight:"16px"}}),Object(P.jsx)(f.a,{primary:Object(P.jsx)("div",{style:{display:"flex",justifyContent:"space-between",color:t.needsClaim?"#54a15e":""},children:Object(P.jsx)("div",{children:"".concat(Object(M.c)(t.vendor.account.total,t.mint.account.decimals)," ").concat(t.mint.publicKey)})}),secondary:o}),a?Object(P.jsx)(y.a,{}):Object(P.jsx)(v.a,{})]}),Object(P.jsx)(h.a,{in:a,timeout:"auto",unmountOnExit:!0,children:void 0===t.vendor?Object(P.jsx)(b.a,{}):Object(P.jsx)(W,{vendor:t.vendor})})]})}function W(t){var n=t.vendor,r=Object(C.b)().registryClient,a=Object(d.b)(),c=a.enqueueSnackbar,b=a.closeSnackbar,p=Object(l.c)((function(e){return{registrar:e.registry.registrar,vendorMint:e.accounts[n.account.mint.toString()]}})),m=p.vendorMint,j=p.registrar,g=Object(u.useState)(null),f=Object(s.a)(g,2),h=f[0],x=f[1],y=function(){var t=Object(o.a)(i.a.mark((function t(){var a,o;return i.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return c("Expiring reward",{variant:"info"}),t.next=3,S.PublicKey.createProgramAddress([j.toBuffer(),n.publicKey.toBuffer(),e.from([n.account.nonce])],r.programId);case 3:return a=t.sent,t.next=6,r.rpc.expireReward({accounts:{registrar:j,vendor:n.publicKey,vault:n.account.vault,vendorSigner:a,expiryReceiver:n.account.expiryReceiver,expiryReceiverToken:h,tokenProgram:k.TokenInstructions.TOKEN_PROGRAM_ID,clock:S.SYSVAR_CLOCK_PUBKEY}});case 6:o=t.sent,b(),c("Reward expired",{variant:"success",action:Object(P.jsx)(T.a,{signature:o})});case 9:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();return Object(P.jsxs)("div",{style:{marginLeft:"56px"},children:[Object(P.jsx)("div",{children:"Vendor"}),Object(P.jsxs)("ul",{children:[Object(P.jsxs)("li",{children:["Address ",n.publicKey.toString()]}),Object(P.jsxs)("li",{children:["Vault: ",n.account.vault.toString()]}),Object(P.jsxs)("li",{children:["Mint: ",n.account.mint.toString()]}),Object(P.jsxs)("li",{children:["Pool token supply snapshot:"," ",n.account.poolTokenSupply.toString()]}),Object(P.jsxs)("li",{children:["Expiry:"," ",new Date(1e3*n.account.expiryTs.toNumber()).toLocaleDateString()," (".concat(n.account.expiryTs.toNumber(),")")]}),Object(P.jsxs)("li",{children:["Expiry receiver: ",n.account.expiryReceiver.toString()]}),Object(P.jsxs)("li",{children:["Expired: ",n.account.expired.toString()]}),Object(P.jsxs)("li",{children:["Reward queue cursor: ",n.account.rewardEventQCursor.toString()]})]}),n.account.expiryTs.toNumber()<=Date.now()/1e3&&r.provider.wallet.publicKey.equals(n.account.expiryReceiver)&&Object(P.jsxs)("div",{style:{display:"flex",flexDirection:"row-reverse"},children:[Object(P.jsx)(w.a,{color:"primary",variant:"outlined",onClick:y,style:{marginRight:"24px"},children:"Expire"}),Object(P.jsx)("div",{style:{flex:1,marginRight:"24px"},children:Object(P.jsx)(K.a,{variant:"outlined",decimals:m.decimals,mint:n.account.mint,onChange:function(e){x(e)}})})]})]})}var E=function(){function e(t,n,a,c,i){Object(r.a)(this,e),this.reward=t,this.cursor=n,this.needsClaim=a,this.mint=c,this.vendor=i}return Object(a.a)(e,null,[{key:"fromMessage",value:function(t,n){var r=!1,a=t.accounts[n.vendor.toString()];if(void 0===a)return null;var c={publicKey:a.mint,account:t.accounts[a.mint.toString()]};if(void 0!==t.member){var i=t.accounts[t.member.account.balances.spt.toString()],o=t.accounts[t.member.account.balancesLocked.spt.toString()],s=i.amount+o.amount>0,u=a.rewardEventQCursor>=t.member.account.rewardsCursor,l=t.member.account.lastStakeTs0&&j(t,n).catch((function(e){console.error(e),d("Error staking: ".concat(e.toString()),{variant:"error"})}));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),h=function(){var e=Object(o.a)(i.a.mark((function e(t,n){return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t>0&&g(t,n).catch((function(e){console.error(e),d("Error unstaking: ".concat(e.toString()),{variant:"error"})}));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();return Object(U.jsxs)("div",{style:{width:"100%"},children:[Object(U.jsxs)("div",{style:{display:"flex",width:"100%"},children:[Object(U.jsx)("div",{style:{flex:1,marginTop:"24px",marginBottom:"24px"},children:Object(U.jsx)(_,{title:"Stake Pool",create:f,redeem:h})}),Object(U.jsx)(q,{style:{marginBottom:"24px"}})]}),Object(U.jsx)(F,{})]})}function _(e){var t=e.title,n=e.create,r=e.redeem,c=Object(s.useState)(null),i=Object(a.a)(c,2),o=i[0],l=i[1],b=Object(s.useState)(!1),p=Object(a.a)(b,2),m=p[0],j=p[1],g=Object(u.c)((function(e){var t=e.accounts[e.registry.registrar.toString()];return{poolTokenMint:{publicKey:t.poolMint,account:e.accounts[t.poolMint.toString()]},member:e.registry.member,registrarAccount:t,mint:{publicKey:t.mint,account:e.accounts[t.mint.toString()]}}})),f=g.poolTokenMint,h=g.member,x=g.registrarAccount,S=g.mint,k=Object(D.c)(x.stakeRate,S.account.decimals),K=o?Object(D.c)(x.stakeRate.mul(new d.a(o)),S.account.decimals):0;return Object(U.jsxs)(C.a,{style:{marginBottom:"24px"},children:[Object(U.jsxs)("div",{style:{display:"flex",justifyContent:"space-between"},children:[Object(U.jsx)(T.a,{title:t,subheader:f.publicKey.toString()}),Object(U.jsx)("div",{style:{paddingRight:"16px",display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(U.jsx)(A.a,{color:"textSecondary"})})]}),Object(U.jsxs)(M.a,{children:[Object(U.jsxs)("div",{style:{marginBottom:"16px"},children:[Object(U.jsxs)(A.a,{children:["Please enter the amount of pool tokens you would like to purchase in the form below. Upon pressing ",Object(U.jsx)("b",{children:"stake"})," you will create new pool tokens at a fixed price, adding to the amount of pool tokens outstanding."]}),Object(U.jsx)("br",{}),Object(U.jsx)(A.a,{children:"Unstaking works similarly, except one must incur an unbonding period where funds will not be able to be retrieved until the unbonding period ends. At the end of the unbonding period, click the blue checkbox next to your pending transfer. If the checkbox is grey, your unbonding period has not yet completed."}),Object(U.jsx)("br",{}),Object(U.jsx)(A.a,{style:{fontWeight:"bold"},children:"Total pool tokens outstanding"}),Object(U.jsx)(A.a,{children:f.account.supply.toString()}),Object(U.jsx)(A.a,{style:{fontWeight:"bold"},children:"Price per pool token"}),Object(U.jsx)(A.a,{children:k.toString()}),Object(U.jsx)(A.a,{style:{fontWeight:"bold"},children:"Your total cost"}),Object(U.jsxs)(A.a,{children:[K," ",Object(D.d)(S.publicKey)]}),Object(U.jsx)(A.a,{style:{fontWeight:"bold"},children:"Unbonding period (days)"}),Object(U.jsx)(A.a,{children:(x.withdrawalTimelock/86400).toString()})]}),Object(U.jsxs)("div",{children:[Object(U.jsx)("div",{style:{marginBottom:"10px"},children:Object(U.jsx)(P.a,{children:Object(U.jsx)(w.a,{style:{width:"100%"},label:"Pool tokens",type:"number",variant:"outlined",onChange:function(e){return l(parseInt(e.target.value))}})})}),Object(U.jsxs)("div",{style:{display:"flex",justifyContent:"space-between"},children:[Object(U.jsxs)("div",{children:[Object(U.jsx)(v.a,{disabled:void 0===h,color:"primary",variant:"contained",onClick:function(){return n(o,m)},children:"Stake"}),Object(U.jsx)(v.a,{disabled:void 0===h,color:"secondary",variant:"contained",style:{marginLeft:"10px"},onClick:function(){return r(o,m)},children:"Unstake"})]}),Object(U.jsx)("div",{children:Object(U.jsx)(y.a,{control:Object(U.jsx)(O.a,{checked:m,onChange:function(){return j(!m)}}),labelPlacement:"start",label:"Locked balances"})})]})]})]})]})}function q(t){var n=Object(E.b)().registryClient,r=Object(u.b)(),a=Object(u.c)((function(e){var t=e.registry.member?{publicKey:e.registry.member,account:e.accounts[e.registry.member.toString()]}:void 0,n={publicKey:e.registry.registrar,account:e.accounts[e.registry.registrar.toString()]},r={publicKey:n.account.mint,account:e.accounts[n.account.mint.toString()]};return{member:t,registrar:n,mint:r,pendingWithdrawals:null===e.registry.pendingWithdrawals?null:e.registry.pendingWithdrawals.map((function(t){return{publicKey:t,account:e.accounts[t.toString()]}}))}})),c=a.member,i=a.registrar,o=a.mint,l=a.pendingWithdrawals;return Object(s.useEffect)((function(){if(c&&null===l){var t=e.concat([i.publicKey.toBuffer(),c.publicKey.toBuffer()]);n.account.pendingWithdrawal.all(t).then((function(e){r({type:L.a.RegistrySetPendingWithdrawals,item:{pendingWithdrawals:e}})}))}}),[r,i,c,l,n.account.pendingWithdrawal]),Object(U.jsx)("div",{style:t.style,children:Object(U.jsx)(C.a,{style:{marginLeft:"20px",marginTop:"24px",width:"294px"},children:Object(U.jsxs)(M.a,{style:{paddingLeft:0,paddingRight:0,paddingBottom:0,paddingTop:0},children:[Object(U.jsxs)("div",{style:{marginLeft:"24px",marginTop:"24px",marginRight:"24px",borderBottom:"solid 1pt #ccc",paddingBottom:"12px"},children:[Object(U.jsx)(A.a,{style:{},children:"Your Pending Transfers"}),Object(U.jsx)(A.a,{style:{fontSize:"12px"},color:"textSecondary",children:'Click the checkmark to complete a transfer on or after the "end" date.'})]}),Object(U.jsx)("div",{style:{paddingLeft:"24px",paddingRight:"24px"},children:c&&null===l?Object(U.jsx)("div",{style:{paddingTop:"24px",marginBottom:"24px"},children:Object(U.jsx)(x.a,{style:{display:"block",marginLeft:"auto",marginRight:"auto"}})}):null!==l&&l.length>0?l.map((function(e,t){return Object(U.jsx)(z,{isLast:t===l.length-1,registrar:i,pw:e,member:c,mint:o},e.publicKey.toString())})):Object(U.jsx)("div",{style:{paddingBottom:"24px",paddingTop:"12px"},children:Object(U.jsx)(A.a,{color:"textSecondary",style:{fontSize:"14px"},children:"None found"})})})]})})})}function z(e){var t=e.isLast,n=e.pw,r=e.member,a=e.registrar,c=e.mint,i=function(){var e=n.account.locked?"(locked)":"";return"".concat(Object(D.c)(n.account.amount,c.account.decimals)," ").concat(Object(D.d)(c.publicKey)," ").concat(e)}();return Object(U.jsxs)("div",{style:{paddingBottom:t?"24px":"12px",paddingTop:"12px",borderBottom:"solid 1pt #ccc"},children:[Object(U.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",overflow:"hidden"},children:[Object(U.jsx)("div",{children:Object(U.jsx)(A.a,{style:{whiteSpace:"pre",maxWidth:"195px",overflow:"hidden",fontWeight:"bold",fontSize:"14px"},children:"".concat(i)})}),Object(U.jsx)("div",{children:Object(U.jsx)(Y,{registrar:a,member:r,pendingWithdrawal:n})})]}),Object(U.jsx)(A.a,{style:{fontSize:"14px"},children:"Start: ".concat(new Date(1e3*n.account.startTs.toNumber()).toLocaleString())}),Object(U.jsx)(A.a,{style:{fontSize:"14px"},children:"End: ".concat(new Date(1e3*n.account.endTs.toNumber()).toLocaleString())}),Object(U.jsx)(A.a,{color:"textSecondary",style:{fontSize:"14px",overflow:"hidden"},children:n.account.pool.toString()})]})}function Y(e){var t=e.pendingWithdrawal,n=e.member,a=e.registrar,c=Object(E.b)().registryClient,s=Object(b.b)(),l=s.enqueueSnackbar,d=s.closeSnackbar,m=Object(u.b)(),j=function(){var e=Object(o.a)(i.a.mark((function e(){var o,s,u;return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return l("Completing redemption",{variant:"info"}),o=t.account.locked?n.account.balancesLocked:n.account.balances,e.t0=c.rpc,e.t1=a.publicKey,e.t2=n.publicKey,e.t3=c.provider.wallet.publicKey,e.t4=t.publicKey,e.t5=o.vault,e.t6=o.vaultPw,e.next=11,Object(V.c)(c.programId,a.publicKey,n.publicKey);case 11:return e.t7=e.sent.publicKey,e.t8=p.SYSVAR_CLOCK_PUBKEY,e.t9=W.TokenInstructions.TOKEN_PROGRAM_ID,e.t10={registrar:e.t1,member:e.t2,beneficiary:e.t3,pendingWithdrawal:e.t4,vault:e.t5,vaultPw:e.t6,memberSigner:e.t7,clock:e.t8,tokenProgram:e.t9},e.t11={accounts:e.t10},e.next=18,e.t0.endUnstake.call(e.t0,e.t11);case 18:s=e.sent,u={publicKey:t.publicKey,account:Object(r.a)(Object(r.a)({},t.account),{},{burned:!0})},m({type:L.a.RegistryUpdatePendingWithdrawal,item:{pendingWithdrawal:u}}),d(),l("Stake transfer completed",{variant:"success",action:Object(U.jsx)(I.a,{signature:s})});case 23:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),g=!1,f=B.a().ready,h=function(){var e=Object(o.a)(i.a.mark((function e(){return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",j().catch((function(e){console.error("Error completing transfer: ".concat(e.toString())),l("Error completing transfer. Wait for the transfer's timelock to end and try again.",{variant:"error"})})));case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return t.account.burned&&(g=!0,f=B.a().active,h=function(){var e=Object(o.a)(i.a.mark((function e(){return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}()),t.account.endTs.toNumber()>Date.now()/1e3&&(g=!0,f=B.a().notReady,h=function(){var e=Object(o.a)(i.a.mark((function e(){return i.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}()),Object(U.jsx)("div",{onClick:h,style:{display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(U.jsx)(S.a,{disabled:g,style:{width:"25px",height:"25px"},children:Object(U.jsx)(K.a,{style:{color:f,fontSize:"20px"}})})})}function F(){var e=Object(E.b)().registryClient,t=Object(u.c)((function(e){var t=e.accounts[e.registry.registrar.toString()];return{registrar:e.registry.registrar,registrarAccount:t,mintAccount:e.accounts[t.mint.toString()]}})),n=t.registrar,r=t.registrarAccount,c=t.mintAccount,l=Object(s.useState)(null),d=Object(a.a)(l,2),b=d[0],p=d[1];return Object(s.useEffect)((function(){(function(){var t=Object(o.a)(i.a.mark((function t(){var r;return i.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.account.pendingWithdrawal.all(n.toBuffer());case 2:r=(r=t.sent).filter((function(e){return!1===e.account.burned})).sort((function(e,t){return e.account.startTst.account.startTs?-1:0})),p(r);case 5:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}})()()}),[e,n]),Object(U.jsxs)(C.a,{style:{maxHeight:"900px",overflow:"auto"},children:[Object(U.jsx)(A.a,{variant:"h5",style:{padding:"16px",borderBottom:"solid 1pt #ccc"},children:"All pending transfers"}),null!==b?Object(U.jsxs)(m.a,{children:[Object(U.jsx)(j.a,{children:Object(U.jsxs)(h.a,{children:[Object(U.jsx)(f.a,{children:"Member Account"}),Object(U.jsx)(f.a,{children:"Amount"}),Object(U.jsx)(f.a,{children:"Pool"}),Object(U.jsx)(f.a,{children:"Locked"}),Object(U.jsx)(f.a,{children:"Start"}),Object(U.jsx)(f.a,{children:"End"})]})}),Object(U.jsx)(g.a,{children:b.map((function(e){return Object(U.jsxs)(h.a,{children:[Object(U.jsx)(f.a,{children:e.account.member.toString()}),Object(U.jsx)(f.a,{children:Object(D.c)(e.account.amount.toString(),c.decimals)}),Object(U.jsx)(f.a,{children:e.account.amount.div(r.stakeRate).toString()}),Object(U.jsx)(f.a,{children:e.account.locked.toString()}),Object(U.jsx)(f.a,{children:new Date(1e3*e.account.startTs.toNumber()).toString()}),Object(U.jsx)(f.a,{children:new Date(1e3*e.account.endTs.toNumber()).toString()})]})}))})]}):Object(U.jsx)("div",{style:{padding:"24px"},children:Object(U.jsx)(x.a,{style:{display:"block",marginLeft:"auto",marginRight:"auto"}})})]})}}).call(this,n(15).Buffer)},462:function(e,t,n){},466:function(e,t){},468:function(e,t){},488:function(e,t){},489:function(e,t){},527:function(e,t){},529:function(e,t){},53:function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d}));var r=n(2),a=n.n(r),c=n(5),i=(n(0),n(22)),o=n(77),s=n(1);function u(e,t,n,r){return l.apply(this,arguments)}function l(){return(l=Object(c.a)(a.a.mark((function e(t,n,r,c){var i;return a.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.enqueueSnackbar(n,{variant:"info"}),e.prev=1,e.next=4,c();case 4:i=e.sent,t.closeSnackbar(),t.enqueueSnackbar(r,{variant:"success",action:Object(s.jsx)(d,{signature:i})}),e.next=12;break;case 9:e.prev=9,e.t0=e.catch(1),t.enqueueSnackbar("Error: ".concat(e.t0.toString()),{variant:"error"});case 12:case"end":return e.stop()}}),e,null,[[1,9]])})))).apply(this,arguments)}function d(e){var t=e.signature,n=Object(i.c)((function(e){return{explorerClusterSuffix:e.common.network.explorerClusterSuffix}})).explorerClusterSuffix,r="?cluster=".concat(n);return Object(s.jsx)(o.a,{color:"inherit",component:"a",target:"_blank",rel:"noopener",href:"https://explorer.solana.com/tx/".concat(t)+r,children:"View on Solana Explorer"})}},59:function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"c",(function(){return p})),n.d(t,"f",(function(){return j})),n.d(t,"b",(function(){return f})),n.d(t,"a",(function(){return x})),n.d(t,"e",(function(){return O}));var r=n(24),a=n(2),c=n.n(a),i=n(9),o=n(5),s=n(4),u=n(48),l=n(50);function d(e,t){return b.apply(this,arguments)}function b(){return(b=Object(o.a)(c.a.mark((function e(t,n){var r,a,o,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l.e.PublicKey.findProgramAddress([n.toBuffer()],t);case 2:return r=e.sent,a=Object(i.a)(r,2),o=a[0],s=a[1],e.abrupt("return",{publicKey:o,nonce:s});case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,n){return m.apply(this,arguments)}function m(){return(m=Object(o.a)(c.a.mark((function e(t,n,r){var a,o,s,u;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l.e.PublicKey.findProgramAddress([n.toBuffer(),r.toBuffer()],t);case 2:return a=e.sent,o=Object(i.a)(a,2),s=o[0],u=o[1],e.abrupt("return",{publicKey:s,nonce:u});case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function j(e,t,n){return g.apply(this,arguments)}function g(){return(g=Object(o.a)(c.a.mark((function e(t,n,r){var a,o,s,u;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l.e.PublicKey.findProgramAddress([n.toBuffer(),r.toBuffer()],t);case 2:return a=e.sent,o=Object(i.a)(a,2),s=o[0],u=o[1],e.abrupt("return",{publicKey:s,nonce:u});case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function f(e){return h.apply(this,arguments)}function h(){return(h=Object(o.a)(c.a.mark((function e(t){var n;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l.d.sha256("".concat(t.toString(),":Member"));case 2:return n=e.sent,e.abrupt("return",n.slice(0,32));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function x(e,t,n){return y.apply(this,arguments)}function y(){return(y=Object(o.a)(c.a.mark((function e(t,n,a){var i,o,l,d,b,p,m,j,g,f,h;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=new s.Account,o=new s.Account,l=new s.Account,d=new s.Account,e.next=6,t.connection.getMinimumBalanceForRentExemption(165);case 6:return b=e.sent,e.next=9,u.createTokenAccountInstrs(t,i.publicKey,n.poolMint,a,b);case 9:return p=e.sent,e.next=12,u.createTokenAccountInstrs(t,o.publicKey,n.mint,a,b);case 12:return m=e.sent,e.next=15,u.createTokenAccountInstrs(t,l.publicKey,n.mint,a,b);case 15:return j=e.sent,e.next=18,u.createTokenAccountInstrs(t,d.publicKey,n.mint,a,b);case 18:return g=e.sent,(f=new s.Transaction).add.apply(f,Object(r.a)(p).concat(Object(r.a)(m),Object(r.a)(j),Object(r.a)(g))),h={tx:f,signers:[i,o,l,d]},e.abrupt("return",[h,{spt:i.publicKey,vault:o.publicKey,vaultStake:l.publicKey,vaultPw:d.publicKey}]);case 24:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function O(e){for(var t=[],n=e.tail;n0&&void 0!==arguments[0]?arguments[0]:x,t=arguments.length>1?arguments[1]:void 0,n={common:Object(g.a)({},e.common),lockup:Object(g.a)({},e.lockup),registry:Object(g.a)({},e.registry),accounts:Object(g.a)({},e.accounts)};switch(t.type){case f.a.CommonAppWillBootstrap:return n.common.bootstrapState=r.IsBootstrapping,n.common.bootstrapTrigger=!1,n;case f.a.CommonAppDidBootstrap:return n.common.bootstrapState=r.Bootstrapped,n;case f.a.CommonWalletSetProvider:return n.common.walletProvider=t.item.walletProvider,n;case f.a.CommonWalletDidConnect:return n.common.isWalletConnected=!0,n;case f.a.CommonWalletDidDisconnect:return n.common.isWalletConnected=!1,n;case f.a.CommonSetNetwork:if(n.common.network.label!==t.item.network.label){n.common.network=t.item.network,n.common.bootstrapState=r.NeedsBootstrap,n.common.shutdownTrigger=!0;var a=h.a[t.item.networkKey];n.registry.registrar=Object.values(a.registrars)[0]}return n;case f.a.CommonTriggerBootstrap:return n.common.bootstrapState=r.NeedsBootstrap,n.common.bootstrapTrigger=!0,n;case f.a.CommonTriggerShutdown:return n.common.bootstrapState=r.NeedsBootstrap,n.common.shutdownTrigger=!0,n;case f.a.CommonDidShutdown:var c=Object(g.a)({},x);return c.common.network=n.common.network,c.registry.registrar=n.registry.registrar,c;case f.a.CommonOwnedTokenAccountsSet:return n.common.ownedTokenAccounts=t.item.ownedTokenAccounts,n;case f.a.CommonOwnedTokenAccountsUpdate:return n.common.ownedTokenAccounts=n.common.ownedTokenAccounts.map((function(e){return e.publicKey.equals(t.item.account.publicKey)?t.item.account:e})),n;case f.a.LockupSetVestings:return n.lockup.vestings=t.item.vestingAccounts,n;case f.a.LockupUpdateVesting:return n.accounts[t.item.vesting.publicKey.toString()]=t.item.vesting.account,n;case f.a.LockupCreateVesting:return n.lockup.vestings.unshift(t.item.vesting.publicKey),n.accounts[t.item.vesting.publicKey.toString()]=t.item.vesting.account,n;case f.a.RegistrySetMember:return n.registry.member=t.item.member,n;case f.a.RegistrySetRegistrar:return n.registry.registrar=t.item.registrar,n.registry.member=t.item.member,n.registry.pendingWithdrawals=null,n;case f.a.RegistrySetPendingWithdrawals:return t.item.pendingWithdrawals.forEach((function(e){n.accounts[e.publicKey.toString()]=e.account})),n.registry.pendingWithdrawals=t.item.pendingWithdrawals.map((function(e){return e.publicKey})),n;case f.a.RegistryCreatePendingWithdrawal:return n.accounts[t.item.pendingWithdrawal.publicKey.toString()]=t.item.pendingWithdrawal.account,null===n.registry.pendingWithdrawals&&(n.registry.pendingWithdrawals=[]),n.registry.pendingWithdrawals.unshift(t.item.pendingWithdrawal.publicKey),n;case f.a.RegistryUpdatePendingWithdrawal:return n.accounts[t.item.pendingWithdrawal.publicKey.toString()]=t.item.pendingWithdrawal.account,n;case f.a.AccountAdd:case f.a.AccountUpdate:return n.accounts[t.item.account.publicKey.toString()]=t.item.account.account,n;default:return n}})),O=n(34),v=n(2),w=n.n(v),S=n(5),k=n(7),K=n(4),C=n(152),M=n(48),T=n(50),P=n(59),A=n(1);function R(e){var t=Object(s.c)((function(e){return{bootstrapTrigger:e.common.bootstrapTrigger,shutdownTrigger:e.common.shutdownTrigger,network:e.common.network,registrar:e.registry.registrar}})),n=t.bootstrapTrigger,r=t.shutdownTrigger,c=t.network,i=t.registrar,o=Object(s.b)(),u=Object(O.b)(),l=u.wallet,b=u.lockupClient,p=u.registryClient,m=Object(d.b)().enqueueSnackbar,j=Object(a.useCallback)(Object(S.a)(w.a.mark((function e(){var t,n,r,a;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return m("Connecting to ".concat(c.label),{variant:"info",autoHideDuration:2500}),o({type:f.a.CommonAppWillBootstrap,item:{}}),e.next=4,W({dispatch:o,lockupClient:b,registryClient:p,network:c,wallet:l});case 4:return t=e.sent,n=t.registrars,r=t.members,a=Object.fromEntries(new Map(n.map((function(e){return[e.publicKey.toString(),e.account]})))),r.forEach((function(e){a[e.publicKey.toString()]=e.account})),e.next=11,I(p,a,o,i,void 0);case 11:o({type:f.a.CommonAppDidBootstrap,item:{}}),m("Connection established",{variant:"success",autoHideDuration:2500});case 13:case"end":return e.stop()}}),e)}))),[o,m,p,i,b,c,l]),g=Object(a.useCallback)(Object(S.a)(w.a.mark((function e(){return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:l.disconnect(),o({type:f.a.CommonDidShutdown,item:{}});case 2:case"end":return e.stop()}}),e)}))),[o,l]);return Object(a.useEffect)((function(){n&&j().catch((function(e){console.error(e),m("Error bootstrapping application: ".concat(e.toString()),{variant:"error"})})),r&&g().catch((function(e){console.error(e),m("Error shutting down application: ".concat(e.toString()),{variant:"error"})}))}),[n,j,r,g,m]),Object(A.jsx)(A.Fragment,{children:e.children})}function W(e){return E.apply(this,arguments)}function E(){return(E=Object(S.a)(w.a.mark((function e(t){var n,r,a,c,i,o,s,u,l,d,b,p;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.dispatch,r=t.lockupClient,a=t.registryClient,c=t.network,i=t.wallet,o=function(){var e=Object(S.a)(w.a.mark((function e(){var t,r,i,o;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=Object.values(c.registrars),e.next=3,T.d.getMultipleAccounts(a.provider.connection,t);case 3:return r=e.sent.map((function(e){var t=a.coder.accounts.decode("Registrar",e.account.data);return{publicKey:e.publicKey,account:t}})),e.next=6,T.d.getMultipleAccounts(a.provider.connection,r.map((function(e){return e.account.mint})));case 6:return i=e.sent.map((function(e){var t=Object(M.parseMintAccount)(e.account.data);return{publicKey:e.publicKey,account:t}})),e.next=9,T.d.getMultipleAccounts(a.provider.connection,r.map((function(e){return e.account.rewardEventQ})));case 9:return o=e.sent.map((function(e){var t=a.coder.accounts.decode("RewardQueue",e.account.data);return{publicKey:e.publicKey,account:t}})),r.concat(i).concat(o).forEach((function(e){n({type:f.a.AccountAdd,item:{account:e}})})),e.abrupt("return",r);case 12:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),s=function(){var e=Object(S.a)(w.a.mark((function e(t){var r,c,o;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all(t.map((function(e){return e.publicKey})).map((function(e){return Object(P.b)(e).then((function(e){return K.PublicKey.createWithSeed(i.publicKey,e,a.programId)})).then((function(t){return{memberPublicKey:t,registrar:e}}))})));case 2:return r=e.sent,c=r.map((function(e){return e.memberPublicKey})),e.next=6,T.d.getMultipleAccounts(a.provider.connection,c);case 6:return o=e.sent.filter((function(e){return null!==e})).map((function(e){var t=a.coder.accounts.decode("Member",e.account.data);return{publicKey:e.publicKey,account:t}})),e.next=9,Promise.all(o.map((function(e){return U(e,n,a.provider.connection)})));case 9:return o.forEach((function(e){n({type:f.a.AccountAdd,item:{account:e}})})),e.abrupt("return",o);case 11:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),u=function(){var e=Object(S.a)(w.a.mark((function e(t){var r;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.map((function(e){return e.account.mint})).concat(t.map((function(e){return e.account.poolMint}))),e.next=3,T.d.getMultipleAccounts(a.provider.connection,r);case 3:e.sent.map((function(e){var t=Object(M.parseMintAccount)(e.account.data);return{publicKey:e.publicKey,account:t}})).forEach((function(e){n({type:f.a.AccountAdd,item:{account:e}})}));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),l=function(){var e=Object(S.a)(w.a.mark((function e(){var t;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_(r.provider.connection,i.publicKey);case 2:t=e.sent,n({type:f.a.CommonOwnedTokenAccountsSet,item:{ownedTokenAccounts:t}});case 4:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),d=function(){var e=Object(S.a)(w.a.mark((function e(){var t;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,r.account.vesting.all(i.publicKey.toBuffer());case 2:(t=e.sent).forEach((function(e){n({type:f.a.AccountAdd,item:{account:e}})})),n({type:f.a.LockupSetVestings,item:{vestingAccounts:t.map((function(e){return e.publicKey}))}});case 5:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),e.next=8,o();case 8:return b=e.sent,e.next=11,s(b);case 11:return p=e.sent,e.next=14,u(b);case 14:return e.next=16,l();case 16:return e.next=18,d();case 18:return e.abrupt("return",{registrars:b,members:p});case 19:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function I(e,t,n,r,a){return L.apply(this,arguments)}function L(){return(L=Object(S.a)(w.a.mark((function e(t,n,r,a,c){var i;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(S.a)(w.a.mark((function e(){var r,a;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==c){e.next=2;break}return e.abrupt("return",void 0);case 2:return e.t0=K.PublicKey,e.t1=t.provider.wallet.publicKey,e.next=6,Object(P.b)(c);case 6:return e.t2=e.sent,e.t3=t.programId,e.next=10,e.t0.createWithSeed.call(e.t0,e.t1,e.t2,e.t3);case 10:return r=e.sent,a=n[r.toString()],e.abrupt("return",void 0!==a?{publicKey:r,account:a}:void 0);case 13:case"end":return e.stop()}}),e)})))();case 2:return e.sent,e.next=5,Object(S.a)(w.a.mark((function e(){var r,c;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=K.PublicKey,e.t1=t.provider.wallet.publicKey,e.next=4,Object(P.b)(a);case 4:return e.t2=e.sent,e.t3=t.programId,e.next=8,e.t0.createWithSeed.call(e.t0,e.t1,e.t2,e.t3);case 8:return r=e.sent,c=n[r.toString()],e.abrupt("return",c?{publicKey:r,account:c}:void 0);case 11:case"end":return e.stop()}}),e)})))();case 5:return i=e.sent,e.next=8,B(t,n,r,a,c);case 8:i&&V(i,t,r),r({type:f.a.RegistrySetRegistrar,item:{registrar:a,member:i?i.publicKey:void 0}});case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function B(e,t,n,r,a){return D.apply(this,arguments)}function D(){return(D=Object(S.a)(w.a.mark((function e(t,n,r,a,c){var i,o;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:c&&(i=n[c.toString()],t.account.rewardQueue.unsubscribe(i.rewardEventQ)),o=n[a.toString()],t.account.rewardQueue.subscribe(o.rewardEventQ).on("change",(function(e){r({type:f.a.AccountUpdate,item:{account:{publicKey:o.rewardEventQ,account:e}}})})),t.provider.connection.onAccountChange(o.poolMint,(function(e){var t=Object(M.parseMintAccount)(e.data);r({type:f.a.AccountUpdate,item:{account:{publicKey:o.poolMint,account:t}}})}),"recent");case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function V(e,t,n){t.account.member.subscribe(e.publicKey).on("change",(function(t){n({type:f.a.AccountUpdate,item:{account:{publicKey:e.publicKey,account:t}}})}));var r=function(e){t.provider.connection.onAccountChange(e,(function(t){var r=Object(M.parseTokenAccount)(t.data);n({type:f.a.AccountUpdate,item:{account:{publicKey:e,account:r}}})}),"recent")};r(e.account.balances.vault),r(e.account.balances.vaultStake),r(e.account.balances.vaultPw),r(e.account.balances.spt),r(e.account.balancesLocked.vault),r(e.account.balancesLocked.vaultStake),r(e.account.balancesLocked.vaultPw),r(e.account.balancesLocked.spt)}function U(e,t,n){return N.apply(this,arguments)}function N(){return(N=Object(S.a)(w.a.mark((function e(t,n,r){return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T.d.getMultipleAccounts(r,[t.account.balances.vault,t.account.balances.vaultStake,t.account.balances.vaultPw,t.account.balances.spt,t.account.balancesLocked.vault,t.account.balancesLocked.vaultStake,t.account.balancesLocked.vaultPw,t.account.balancesLocked.spt]);case 2:e.sent.filter((function(e){return null!==e})).map((function(e){return{publicKey:e.publicKey,account:Object(M.parseTokenAccount)(e.account.data)}})).forEach((function(e){n({type:f.a.AccountAdd,item:{account:e}})}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _(e,t){return q.apply(this,arguments)}function q(){return(q=Object(S.a)(w.a.mark((function e(t,n){var r,a,c;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=Y(n),e.next=3,t.getProgramAccounts(C.TOKEN_PROGRAM_ID,{filters:r});case 3:return a=e.sent,c=a.map((function(e){var t=e.pubkey,n=e.account.data;return{publicKey:new K.PublicKey(t),account:F(n)}})),e.abrupt("return",c);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var z=k.struct([k.blob(32,"mint"),k.blob(32,"owner"),k.nu64("amount"),k.blob(93)]);function Y(e){return[{memcmp:{offset:z.offsetOf("owner"),bytes:e.toBase58()}},{dataSize:z.span}]}function F(e){var t=z.decode(e),n=t.mint,r=t.owner,a=t.amount;return{mint:new K.PublicKey(n),owner:new K.PublicKey(r),amount:a}}var Q=n(33),G=n(9),J=n(39),H=n(711),Z=n(716),X=n(77),$=n(670),ee=n(671),te=n(429),ne=n(715),re=n(132),ae=n(411),ce=n.n(ae),ie=n(410),oe=n.n(ie),se=n(157),ue=n(235),le=n(436);function de(e){var t=e.isAppReady,n=Object(s.c)((function(e){return{network:e.common.network,isAppReady:e.common.isWalletConnected&&e.common.bootstrapState===r.Bootstrapped}})).network,c=Object(s.b)(),i=Object(d.b)(),o=i.enqueueSnackbar,u=i.closeSnackbar,l=Object(O.b)(),b=l.wallet,p=l.registryClient,m=l.lockupClient,j=Object(a.useState)(!1),g=Object(G.a)(j,2),f=g[0],h=g[1];return Object(A.jsx)($.a,{position:"static",style:{background:"#ffffff",color:"#272727",boxShadow:"none",borderBottom:"solid 1pt #ccc"},children:Object(A.jsx)(ee.a,{children:Object(A.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",width:"100%"},children:[Object(A.jsxs)("div",{style:{display:"flex"},children:[Object(A.jsx)(be,{}),Object(A.jsx)(pe,{label:"Stake",hrefClient:"/stake"}),Object(A.jsx)(pe,{label:"Lockup",hrefClient:"/lockup"}),Object(A.jsx)(pe,{label:"Multisig",href:"https://multisig.projectserum.com"}),Object(A.jsx)(pe,{label:"Trade",href:"https://dex.projectserum.com"}),n.srmFaucet&&Object(A.jsx)(pe,{label:"Faucet",href:"https://www.spl-token-ui.com/#/token-faucets"})]}),Object(A.jsxs)("div",{style:{display:"flex"},children:[Object(A.jsx)("div",{onClick:function(){h(!0),o("Refreshing",{variant:"info"}),W({dispatch:c,lockupClient:m,registryClient:p,network:n,wallet:b}).then((function(){h(!1),u()})).catch((function(e){h(!1),u(),o("There was a problem refreshing: ".concat(e),{variant:"error",autoHideDuration:2500})}))},style:{display:t?"block":"none",justifyContent:"center",flexDirection:"column",marginRight:"10px"},children:f?Object(A.jsx)("div",{style:{marginTop:"8px",padding:"10px"},children:Object(A.jsx)(se.a,{style:{width:"24px",height:"24px"}})}):Object(A.jsx)("div",{children:Object(A.jsx)(re.a,{children:Object(A.jsx)(oe.a,{})})})}),Object(A.jsx)(me,{}),Object(A.jsx)(je,{})]})]})})})}function be(){var e=Object(l.e)();return Object(A.jsx)("div",{style:{display:"flex"},onClick:function(){return e.push("/")},children:Object(A.jsx)(X.a,{color:"inherit",children:Object(A.jsx)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center"},children:Object(A.jsx)("img",{style:{display:"block",height:"35px"},alt:"Logo",src:"http://dex.projectserum.com/static/media/logo.49174c73.svg"})})})})}function pe(e){var t=Object(l.e)(),n=e.label,r=e.href,a=e.hrefClient;return Object(A.jsx)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center"},onClick:function(){return a&&t.push(a)},children:Object(A.jsx)(ne.a,{style:{color:"inherit",textDecoration:"none"},href:r,target:"_blank",children:Object(A.jsx)(X.a,{color:"inherit",children:Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(A.jsx)(J.a,{style:{fontSize:"15px"},children:n})})})})})}function me(){var e=Object(s.c)((function(e){return e.common.network})),t=Object(s.b)(),n=Object(a.useState)(null),r=Object(G.a)(n,2),c=r[0],i=r[1],o=function(){i(null)};return Object(A.jsxs)("div",{style:{marginRight:"10px",fontSize:"15px",display:"flex",justifyContent:"center",flexDirection:"column"},children:[Object(A.jsxs)(X.a,{color:"inherit",onClick:function(e){return i(e.currentTarget)},children:[Object(A.jsx)(ce.a,{}),Object(A.jsx)(J.a,{style:{marginLeft:"5px",fontSize:"15px"},children:e.label})]}),Object(A.jsx)(te.a,{anchorEl:c,open:Boolean(c),onClose:o,style:{marginLeft:"12px",color:"white"},children:Object.keys(h.a).map((function(e){return Object(A.jsx)(le.a,{onClick:function(){o(),t({type:f.a.CommonSetNetwork,item:{network:h.a[e],networkKey:e}})},children:Object(A.jsx)(J.a,{children:h.a[e].label})},e)}))})]})}function je(){Object(s.c)((function(e){return{showDisconnect:e.common.isWalletConnected}})).showDisconnect;var e=Object(s.b)(),t=Object(O.b)(),n=t.wallet,r=t.lockupClient,c=Object(d.b)().enqueueSnackbar;return Object(a.useEffect)((function(){n.on("disconnect",(function(){c("Disconnected from wallet",{variant:"info",autoHideDuration:2500}),e({type:f.a.CommonWalletDidDisconnect,item:{}}),e({type:f.a.CommonTriggerShutdown,item:{}})})),n.on("connect",Object(S.a)(w.a.mark((function t(){return w.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e({type:f.a.CommonWalletDidConnect,item:{}}),e({type:f.a.CommonTriggerBootstrap,item:{}});case 2:case"end":return t.stop()}}),t)}))))}),[n,e,c,r.provider.connection]),Object(A.jsxs)(ue.a,{children:[Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column"},onClick:function(){return n.disconnect()},children:Object(A.jsx)(ue.b,{})}),Object(A.jsx)("div",{onClick:function(){return n.connect()},style:{display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(A.jsx)(ue.c,{})})]})}function ge(){return Object(A.jsx)("div",{style:{zIndex:99,position:"fixed",width:"100%",bottom:0,textAlign:"center",height:"30px",backgroundColor:"#fbfbfb",borderTop:"solid 1pt #ccc",display:"flex",justifyContent:"space-between",paddingLeft:"10px",paddingRight:"10px"},children:Object(A.jsxs)("div",{style:{marginLeft:"auto",marginRight:"auto",display:"flex"},children:[Object(A.jsx)(fe,{href:"https://github.com/project-serum/anchor/blob/master/examples/lockup/docs/staking.md",label:"Technical Documentation"}),Object(A.jsx)(fe,{href:"https://github.com/project-serum/awesome-serum",label:"Developer Resources"}),Object(A.jsx)(fe,{href:"https://discord.com/channels/739225212658122886",label:"Discord"}),Object(A.jsx)(fe,{href:"https://t.me/ProjectSerum",label:"Telegram"}),Object(A.jsx)(fe,{href:"https://github.com/project-serum",label:"GitHub"}),Object(A.jsx)(fe,{href:"https://solanabeach.io/",label:"Solana Network",isEnd:!0})]})})}function fe(e){var t=e.label,n=e.href,r=e.isEnd;return Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column",marginRight:r?"":"15px"},children:Object(A.jsx)(ne.a,{href:n,target:"_blank",color:"inherit",children:Object(A.jsx)(J.a,{style:{fontSize:"14px"},children:t})})})}function he(e){var t=Object(s.c)((function(e){return{isAppReady:e.common.isWalletConnected&&e.common.bootstrapState===r.Bootstrapped}})).isAppReady,n=Object(a.useState)(!1),c=Object(G.a)(n,2),i=c[0],o=c[1];return Object(A.jsxs)("div",{style:{display:"flex",minHeight:"100vh",flexDirection:"column",backgroundColor:"rgb(251, 251, 251)"},children:[Object(A.jsxs)("div",{style:{position:"fixed",width:"100%",zIndex:99},children:[Object(A.jsx)(xe,{}),Object(A.jsx)(de,{isAppReady:t})]}),Object(A.jsx)("div",{style:{width:"100%",marginTop:"94px",flex:1,display:"flex",marginBottom:"30px"},children:window.localStorage.getItem("consent")?t?Object(A.jsx)("div",{style:{width:"100%"},children:e.children}):Object(A.jsx)(ve,{}):Object(A.jsx)(Oe,{onConsent:function(){window.localStorage.setItem("consent","true"),o(!i)}})}),Object(A.jsx)(ge,{})]})}function xe(){return Object(A.jsx)("div",{style:{color:"#fff",backgroundColor:"rgb(245, 0, 87)",height:"60px",textAlign:"center"},children:Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column",height:"100%"},children:Object(A.jsx)(J.a,{style:{fontSize:"16px",fontWeight:"bold"},children:"Staking is moving to DAO governance. This site will be deprecated effective October 5."})})})}var ye=Object(H.a)((function(e){return{root:{width:"100%","& > * + *":{marginTop:e.spacing(2)}}}}));function Oe(e){var t=e.onConsent;return Object(A.jsxs)("div",{style:{flex:"1",display:"flex",justifyContent:"center",flexDirection:"column",textAlign:"center"},children:[Object(A.jsx)("div",{style:{width:"100%",display:"flex"},children:Object(A.jsx)("div",{style:{display:"flex",marginLeft:"auto",marginRight:"auto"},children:Object(A.jsx)(J.a,{style:{marginBottom:"16px",maxWidth:"1000px"},color:"textSecondary",variant:"h4",children:"No statement or warranty is provided in relation to the utility of this program, the safety of its code or its suitability for your use, and by using it, you agree to bear any risk associated with such potential vulnerabilities, including, but not limited to the potential loss of tokens."})})}),Object(A.jsx)("div",{style:{display:"flex",marginLeft:"auto",marginRight:"auto"},children:Object(A.jsx)(X.a,{variant:"contained",color:"primary",onClick:t,children:"I agree"})})]})}function ve(){var e=ye(),t=Object(s.c)((function(e){return{network:e.common.network,isDisconnected:!e.common.isWalletConnected}})),n=t.network,r=t.isDisconnected;return Object(A.jsx)("div",{style:{flex:"1",display:"flex",justifyContent:"center",flexDirection:"column",textAlign:"center"},children:Object(A.jsx)("div",{style:{width:"100%",display:"flex"},children:r?Object(A.jsx)("div",{style:{display:"flex",marginLeft:"auto",marginRight:"auto"},children:Object(A.jsx)(J.a,{style:{marginLeft:"24px"},color:"textSecondary",variant:"h4",children:"Disconnected"})}):Object(A.jsx)("div",{style:{width:"100%"},children:Object(A.jsxs)("div",{style:{width:"100%"},className:e.root,children:[Object(A.jsx)("div",{children:Object(A.jsx)(J.a,{variant:"h5",children:"Connecting to ".concat(n.label,"...")})}),Object(A.jsx)("div",{style:{marginLeft:"auto",marginRight:"auto",width:"300px"},children:Object(A.jsx)(Z.a,{style:{width:"100%"}})})]})})})})}var we=n(412),Se=n(414),ke=n(228),Ke=n.n(ke),Ce=n(677),Me=n(418),Te=n.n(Me),Pe=n(419),Ae=n.n(Pe),Re=n(307),We=n(438),Ee=n(305),Ie=n(304),Le=n(105),Be=n(437),De=n(708),Ve=n(675),Ue=n(722),Ne=n(718),_e=n(676),qe=n(679),ze=n(52),Ye=n(80),Fe=n(53),Qe=n(440);function Ge(e){return Object.keys(e.common.network.registrars).map((function(t){return[t,{publicKey:e.common.network.registrars[t],account:e.accounts[e.common.network.registrars[t].toString()]}]})).filter((function(e){return void 0!==e[1].account})).filter((function(t){var n=Object(G.a)(t,2);n[0];return n[1].publicKey.equals(e.registry.registrar)})).map((function(e){var t=Object(G.a)(e,2);return{label:t[0],programAccount:t[1]}})).pop()}function Je(){var e=Object(O.b)().registryClient,t=Object(s.c)((function(e){var t=Object.keys(e.common.network.registrars).map((function(t){return[t,{publicKey:e.common.network.registrars[t],account:e.accounts[e.common.network.registrars[t].toString()]}]})).filter((function(e){return void 0!==e[1].account})),n=t.filter((function(t){var n=Object(G.a)(t,2);n[0];return n[1].publicKey.equals(e.registry.registrar)})).map((function(e){var t=Object(G.a)(e,2);return{label:t[0],programAccount:t[1]}})).pop();return{network:e.common.network,accounts:e.accounts,registrars:t,selectedRegistrar:n}})),n=t.registrars,r=t.selectedRegistrar,a=t.accounts,c=t.network,i=Object(s.b)(),o=Object(Q.e)();return Object(A.jsx)(Qe.a,{style:{width:"294px",height:"36px"},variant:"outlined",fullWidth:!0,value:r.label,onChange:function(){var t=Object(S.a)(w.a.mark((function t(c){var o;return w.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:o=n.filter((function(e){var t=Object(G.a)(e,2),n=t[0];t[1];return n===c.target.value})).map((function(e){var t=Object(G.a)(e,2);t[0];return t[1]})).pop(),I(e,a,i,o.publicKey,r.programAccount.publicKey);case 2:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),children:0===n.length?Object(A.jsx)(le.a,{value:"_loading",children:"Loading registrars..."}):n.map((function(e){var t=Object(G.a)(e,2),n=t[0],r=t[1];return Object(A.jsx)(le.a,{value:n,children:Object(A.jsxs)("div",{style:{display:"flex"},children:[Object(A.jsx)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center"},children:Ze(o.get(r.account.mint.toString()))}),Object(A.jsx)("div",{style:{overflow:"hidden",display:"flex",flexDirection:"column",justifyContent:"center"},children:"".concat(He(r,c))})]})},n)}))})}function He(e,t){var n=Object.keys(t.registrars).filter((function(n){return t.registrars[n].equals(e.publicKey)})).pop();return void 0!==n?n.toUpperCase():e.publicKey.toString()}function Ze(e,t){return e?Object(A.jsx)("img",{alt:"Token Icon",style:null!==t&&void 0!==t?t:{marginRight:"10px",height:"25px"},src:e.logoURI}):Object(A.jsx)("div",{style:{marginLeft:"32px"}})}var Xe=n(133),$e=n(158),et=n(184),tt=n(186),nt=n(45),rt=n(717),at=n(185),ct=n(96);function it(){var e=Object(s.c)((function(e){return{member:e.registry.member}})).member;return Object(A.jsx)("div",{style:{display:"flex",width:"100%"},children:Object(A.jsx)("div",{style:{flex:1,marginTop:"24px",marginBottom:"24px"},children:e&&Object(A.jsx)(ot,{})})})}function ot(){var e=Object(s.c)((function(e){var t=e.accounts[e.registry.member.toString()],n=e.accounts[e.registry.registrar.toString()];return{registrar:n,mint:e.accounts[n.mint.toString()],vault:e.accounts[t.balances.vault],vaultStake:e.accounts[t.balances.vaultStake],vaultPw:e.accounts[t.balances.vaultPw],spt:e.accounts[t.balances.spt],lockedVault:e.accounts[t.balancesLocked.vault],lockedVaultStake:e.accounts[t.balancesLocked.vaultStake],lockedVaultPw:e.accounts[t.balancesLocked.vaultPw],lockedSpt:e.accounts[t.balancesLocked.spt]}})),t=e.mint,n=e.registrar,r=e.vault,a=e.vaultStake,c=e.vaultPw,i=e.spt,o=e.lockedVault,u=e.lockedVaultStake,l=e.lockedVaultPw,d=e.lockedSpt,b=[{title:"Main Balances",description:"Balances deposited directly from the connected wallet.",rows:[{token:Object(Q.d)(n.mint),balance:Object(Q.c)(r.amount,t.decimals),stake:Object(Q.c)(a.amount,t.decimals),pending:Object(Q.c)(c.amount,t.decimals),spt:Object(Q.c)(i.amount,0)}]},{title:"Locked Balances",description:"Balances deposited from the lockup program. These funds are isolated from the Main Balances and may only be withdrawn back to the lockup program. At all times they are program controlled.",rows:[{token:Object(Q.d)(n.mint),balance:Object(Q.c)(o.amount,t.decimals),stake:Object(Q.c)(u.amount,t.decimals),pending:Object(Q.c)(l.amount,t.decimals),spt:Object(Q.c)(d.amount,0)}]}];return Object(A.jsx)(Xe.a,{style:{marginBottom:"24px"},children:Object(A.jsx)($e.a,{style:{marginTop:"24px",position:"relative",paddingTop:0,paddingBottom:"16px"},children:b.map((function(e){return Object(A.jsx)(st,{title:e.title,description:e.description,rows:e.rows},e.title)}))})})}function st(e){var t=e.title,n=e.rows,r=e.description;return Object(A.jsxs)("div",{style:{marginBottom:"16px"},children:[Object(A.jsx)(J.a,{style:{fontWeight:"bold"},children:t}),Object(A.jsx)(J.a,{color:"textSecondary",style:{fontSize:"14px"},children:r}),Object(A.jsx)(rt.a,{children:Object(A.jsxs)(et.a,{children:[Object(A.jsx)(at.a,{children:Object(A.jsxs)(ct.a,{children:[Object(A.jsx)(nt.a,{children:"Token"}),Object(A.jsx)(nt.a,{align:"right",children:"Available"}),Object(A.jsx)(nt.a,{align:"right",children:"Pending"}),Object(A.jsx)(nt.a,{align:"right",children:"Staked"}),Object(A.jsx)(nt.a,{align:"right",children:"Pool"})]})}),Object(A.jsx)(tt.a,{children:null===n?Object(A.jsx)(se.a,{}):n.map((function(e){return Object(A.jsxs)(ct.a,{children:[Object(A.jsx)(nt.a,{component:"th",scope:"row",children:e.token}),Object(A.jsx)(nt.a,{align:"right",children:e.balance}),Object(A.jsx)(nt.a,{align:"right",children:e.pending}),Object(A.jsx)(nt.a,{align:"right",children:e.stake}),Object(A.jsx)(nt.a,{align:"right",children:e.spt})]},e.token)}))})]})})]})}function ut(e,t){return lt.apply(this,arguments)}function lt(){return(lt=Object(S.a)(w.a.mark((function e(t,n){var r,a,c,i;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T.e.PublicKey.findProgramAddress([n.toBuffer()],t);case 2:return r=e.sent,a=Object(G.a)(r,2),c=a[0],i=a[1],e.abrupt("return",{publicKey:c,nonce:i});case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function dt(){return(dt=Object(S.a)(w.a.mark((function e(t,n){var r,a,c;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(r=t.transaction.availableForWithdrawal({accounts:{vesting:n,clock:K.SYSVAR_CLOCK_PUBKEY}})).setSigners.apply(r,[t.provider.wallet.publicKey]),e.next=4,Object(M.simulateTransaction)(t.provider.connection,r,"recent");case 4:if(!(a=e.sent).value.err){e.next=7;break}throw new Error("RPC error: ".concat(a.value.err.toString()));case 7:return c=a.value.logs[1].slice("Program log: ".length),e.abrupt("return",new T.a(JSON.parse(c).result));case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var bt,pt,mt,jt=n(413),gt=n(303),ft=n(296),ht=n(24),xt=n(36),yt=n.n(xt),Ot=n(681);function vt(){var e=Object(a.useState)(!1),t=Object(G.a)(e,2),n=t[0],r=t[1];return Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)("div",{onClick:function(){return r(!0)},children:Object(A.jsx)(X.a,{variant:"contained",color:"secondary",children:"Drop Rewards"})}),Object(A.jsx)(wt,{open:n,onClose:function(){return r(!1)}})]})}function wt(e){var t=e.open,n=e.onClose,r=Object(s.c)((function(e){return{selectedRegistrar:Ge(e)}})).selectedRegistrar,c=Object(a.useState)(bt.Unlocked),i=Object(G.a)(c,2),o=i[0],u=i[1];return Object(A.jsxs)(Re.a,{open:t,onClose:n,fullWidth:!0,maxWidth:"md",children:[Object(A.jsx)(Ie.a,{children:Object(A.jsx)("div",{style:{display:"flex",justifyContent:"space-between"},children:Object(A.jsx)(J.a,{variant:"h4",component:"h2",children:"Drop Rewards on ".concat(r.label.toUpperCase()," Stakers")})})}),Object(A.jsxs)(Ee.a,{children:[Object(A.jsxs)(Ue.a,{value:o,onChange:function(e,t){return u(t)},children:[Object(A.jsx)(Ne.a,{value:bt.Unlocked,label:"Unlocked"}),Object(A.jsx)(Ne.a,{value:bt.Locked,label:"Locked"})]}),o===bt.Unlocked&&Object(A.jsx)(St,{onClose:n}),o===bt.Locked&&Object(A.jsx)(kt,{onClose:n})]})]})}function St(e){var t=e.onClose,n=Object(d.b)(),r=Object(O.b)().registryClient,c=Object(s.c)((function(e){return{network:e.common.network,registrar:{publicKey:e.registry.registrar,account:e.accounts[e.registry.registrar.toString()]},accounts:e.accounts}})),i=c.network,o=c.registrar,u=c.accounts,l=Object(a.useState)(null),b=Object(G.a)(l,2),p=b[0],m=b[1],j=Object(a.useState)(null),g=Object(G.a)(j,2),f=g[0],h=g[1],x=Object(a.useState)(null),y=Object(G.a)(x,2),v=y[0],k=y[1],C=Object(a.useState)(null),T=Object(G.a)(C,2),P=T[0],R=T[1],W=null!==P&&null!==v&&null!==p&&p>=100&&null!==f,E=function(){var e=Object(S.a)(w.a.mark((function e(){return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Fe.b(n,"Dropping unlocked reward...","Unlocked reward dropped",Object(S.a)(w.a.mark((function e(){var t,n,a,c,s,l,d,b,m;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=u[i.mints[P].toString()]){e.next=5;break}return e.next=4,M.getMintInfo(r.provider,i.mints[P]);case 4:t=e.sent;case 5:return n=Object(Q.b)(p,t.decimals),a={unlocked:{}},c=new K.Account,s=new K.Account,e.next=11,K.PublicKey.findProgramAddress([o.publicKey.toBuffer(),c.publicKey.toBuffer()],r.programId);case 11:return l=e.sent,d=Object(G.a)(l,2),b=d[0],m=d[1],e.t0=r.rpc,e.t1=a,e.t2=n,e.t3=new yt.a(f),e.t4=r.provider.wallet.publicKey,e.t5=m,e.t6={registrar:o.publicKey,rewardEventQ:o.account.rewardEventQ,poolMint:o.account.poolMint,vendor:c.publicKey,vendorVault:s.publicKey,depositor:v,depositorAuthority:r.provider.wallet.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,clock:K.SYSVAR_CLOCK_PUBKEY,rent:K.SYSVAR_RENT_PUBKEY},e.t7=[s,c],e.t8=[],e.t9=ht.a,e.next=27,M.createTokenAccountInstrs(r.provider,s.publicKey,i.mints[P],b);case 27:return e.t10=e.sent,e.t11=(0,e.t9)(e.t10),e.next=31,r.account.rewardVendor.createInstruction(c);case 31:return e.t12=e.sent,e.t13=[e.t12],e.t14=e.t8.concat.call(e.t8,e.t11,e.t13),e.t15={accounts:e.t6,signers:e.t7,instructions:e.t14},e.next=37,e.t0.dropReward.call(e.t0,e.t1,e.t2,e.t3,e.t4,e.t5,e.t15);case 37:return e.abrupt("return",e.sent);case 38:case"end":return e.stop()}}),e)}))));case 2:t();case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Object(A.jsx)(Kt,{network:i,mint:P,setMint:R,setDepositor:k,setRewardDisplayAmount:m,expiryTs:f,setExpiryTs:h,onCancel:t,onClick:function(){E().catch((function(e){console.error(e),n.enqueueSnackbar("Error dropping unlocked reward: ".concat(e.toString()),{variant:"error"})}))},isSendEnabled:W})}function kt(e){var t=e.onClose,n=Object(d.b)(),r=Object(O.b)().registryClient,c=Object(s.c)((function(e){return{network:e.common.network,registrar:{publicKey:e.registry.registrar,account:e.accounts[e.registry.registrar.toString()]},accounts:e.accounts}})),i=c.network,o=c.registrar,u=c.accounts,l=Object(a.useState)(null),b=Object(G.a)(l,2),p=b[0],m=b[1],j=Object(a.useState)(null),g=Object(G.a)(j,2),f=g[0],h=g[1],x=Object(a.useState)(null),y=Object(G.a)(x,2),v=y[0],k=y[1],C=Object(a.useState)(null),T=Object(G.a)(C,2),P=T[0],R=T[1],W=Object(a.useState)(null),E=Object(G.a)(W,2),I=E[0],L=E[1],B=Object(a.useState)(null),D=Object(G.a)(B,2),V=D[0],U=D[1],N=Object(a.useState)(7),_=Object(G.a)(N,2),q=_[0],z=_[1],Y=null!==f&&null!==v&&null!==V&&null!==I&&null!==p&&p>=100&&null!==P,F=function(){var e=Object(S.a)(w.a.mark((function e(){return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Fe.b(n,"Dropping locked reward...","Locked reward dropped",Object(S.a)(w.a.mark((function e(){var t,n,a,c,s,l,d,b,m;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t={locked:{startTs:new yt.a(f),endTs:new yt.a(v),periodCount:new yt.a(q)}},n=new K.Account,a=new K.Account,e.next=5,K.PublicKey.findProgramAddress([o.publicKey.toBuffer(),n.publicKey.toBuffer()],r.programId);case 5:return c=e.sent,s=Object(G.a)(c,2),l=s[0],d=s[1],b=u[i.mints[V].toString()],m=Object(Q.b)(p,b.decimals),e.t0=r.rpc,e.t1=t,e.t2=m,e.t3=new yt.a(P),e.t4=r.provider.wallet.publicKey,e.t5=d,e.t6={registrar:o.publicKey,rewardEventQ:o.account.rewardEventQ,poolMint:o.account.poolMint,vendor:n.publicKey,vendorVault:a.publicKey,depositor:I,depositorAuthority:r.provider.wallet.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,clock:K.SYSVAR_CLOCK_PUBKEY,rent:K.SYSVAR_RENT_PUBKEY},e.t7=[a,n],e.t8=[],e.t9=ht.a,e.next=23,M.createTokenAccountInstrs(r.provider,a.publicKey,i.mints[V],l);case 23:return e.t10=e.sent,e.t11=(0,e.t9)(e.t10),e.next=27,r.account.rewardVendor.createInstruction(n);case 27:return e.t12=e.sent,e.t13=[e.t12],e.t14=e.t8.concat.call(e.t8,e.t11,e.t13),e.t15={accounts:e.t6,signers:e.t7,instructions:e.t14},e.next=33,e.t0.dropReward.call(e.t0,e.t1,e.t2,e.t3,e.t4,e.t5,e.t15);case 33:return e.abrupt("return",e.sent);case 34:case"end":return e.stop()}}),e)}))));case 2:t();case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Object(A.jsx)(Kt,{network:i,mint:V,setMint:U,setDepositor:L,setRewardDisplayAmount:m,setStartTs:h,setEndTs:k,periodCount:q,setPeriodCount:z,expiryTs:P,setExpiryTs:R,onCancel:t,onClick:function(){F().catch((function(e){n.enqueueSnackbar("Error dropping locked reward: ".concat(e.toString()),{variant:"error"})}))},isSendEnabled:Y})}function Kt(e){var t=e.network,n=e.mint,r=e.setDepositor,a=e.setMint,c=e.setRewardDisplayAmount,i=e.setStartTs,o=e.setEndTs,s=e.periodCount,u=e.setPeriodCount,l=e.expiryTs,d=e.setExpiryTs,b=e.onCancel,p=e.onClick,m=e.isSendEnabled,j=Object.keys(t.mints).map((function(e){return{label:e,publicKey:t.mints[e]}}));return Object(A.jsxs)(A.Fragment,{children:[Object(A.jsxs)("div",{children:[Object(A.jsxs)("div",{style:{display:"flex",marginTop:"10px"},children:[Object(A.jsxs)("div",{style:{flex:1},children:[Object(A.jsx)(Ye.a,{style:{height:"100%"},mint:null===n?void 0:t.mints[n],onChange:function(e){return r(e)}}),Object(A.jsx)(Ve.a,{children:"Account to send from"})]}),Object(A.jsx)("div",{children:Object(A.jsxs)(Be.a,{variant:"outlined",style:{width:"200px",marginLeft:"10px",marginTop:"10px"},children:[Object(A.jsx)(Ot.a,{children:"Mint"}),Object(A.jsx)(Qe.a,{value:n,onChange:function(e){return a(e.target.value)},label:"Mint",children:j.map((function(e){return Object(A.jsx)(le.a,{value:e.label,children:e.label.toUpperCase()})}))})]})}),Object(A.jsx)("div",{children:Object(A.jsx)(Le.a,{style:{marginLeft:"10px",marginTop:"10px"},id:"outlined-number",label:"Amount",type:"number",InputLabelProps:{shrink:!0},variant:"outlined",onChange:function(e){return c(parseFloat(e.target.value))},InputProps:{inputProps:{min:0}}})})]}),void 0!==o&&void 0!==i&&Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)("div",{style:{display:"flex",marginTop:"37px"},children:Object(A.jsxs)("div",{style:{flex:1},children:[Object(A.jsx)(Le.a,{fullWidth:!0,label:"Start date",type:"datetime-local",InputLabelProps:{shrink:!0},onChange:function(e){var t=new Date(e.target.value);i(t.getTime()/1e3)}}),Object(A.jsx)(Ve.a,{children:"Date vesting begins"})]})}),Object(A.jsxs)("div",{style:{flex:1,marginTop:"20px"},children:[Object(A.jsx)(Le.a,{fullWidth:!0,label:"End date",type:"datetime-local",InputLabelProps:{shrink:!0},onChange:function(e){var t=new Date(e.target.value);o(t.getTime()/1e3)}}),Object(A.jsx)(Ve.a,{children:"Date the vesting account is fully vested"})]}),Object(A.jsx)("div",{children:Object(A.jsx)(Be.a,{fullWidth:!0,children:Object(A.jsx)(Le.a,{style:{marginTop:"37px"},id:"outlined-number",label:"Period Count",type:"number",InputLabelProps:{shrink:!0},variant:"outlined",value:s,onChange:function(e){return u(parseInt(e.target.value))},InputProps:{inputProps:{min:1}}})})})]}),Object(A.jsxs)("div",{style:{marginTop:"37px",display:"flex"},children:[Object(A.jsxs)("div",{style:{flex:1,height:"100%",marginRight:"10px"},children:[Object(A.jsx)(Le.a,{fullWidth:!0,label:"Expiry date",type:"datetime-local",InputLabelProps:{shrink:!0},onChange:function(e){var t=new Date(e.target.value);d(t.getTime()/1e3)}}),Object(A.jsx)(Ve.a,{children:"Date after which the account owner dropping rewards can withdraw all unclaimed rewards."})]}),Object(A.jsx)("div",{style:{marginTop:"26px"},children:Object(A.jsx)(Le.a,{style:{height:"100%"},disabled:!0,placeholder:"Expiry Unix timestamp",fullWidth:!0,value:l})})]})]}),Object(A.jsxs)(We.a,{children:[Object(A.jsx)(X.a,{onClick:b,children:"Cancel"}),Object(A.jsx)(X.a,{onClick:p,type:"submit",color:"primary",disabled:!m,children:"Send"})]})]})}function Ct(e){var t=Object(O.b)(),n=t.registryClient,r=t.lockupClient,c=Object(s.c)((function(e){return{registrar:{publicKey:e.registry.registrar,account:e.accounts[e.registry.registrar.toString()]},member:e.registry.member?{publicKey:e.registry.member,account:e.accounts[e.registry.member.toString()]}:void 0}})),i=c.member,o=c.registrar,u=e.rli,l=Object(s.b)(),b=Object(d.b)(),p=Object(a.useState)(null),m=Object(G.a)(p,2),j=m[0],h=m[1],x=function(){var e=Object(S.a)(w.a.mark((function e(){return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Fe.b(b,"Processing vendor reward ".concat(u.vendor.publicKey.toString()),"Reward processed",Object(S.a)(w.a.mark((function e(){var t,a,c,s,d,b,p,m;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.account.rewardVendor(u.vendor.publicKey);case 2:return t=e.sent,e.next=5,Object(P.f)(n.programId,o.publicKey,u.vendor.publicKey);case 5:if(a=e.sent,!u.reward.locked){e.next=45;break}return c=new K.Account,s=new K.Account,e.next=11,ut(r.programId,c.publicKey);case 11:return d=e.sent,b=r.instruction.createVesting.accounts({vesting:c.publicKey,vault:s.publicKey,depositor:t.vault,depositorAuthority:a.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,rent:K.SYSVAR_RENT_PUBKEY,clock:K.SYSVAR_CLOCK_PUBKEY}).map((function(e){return e.pubkey.equals(a.publicKey)?Object(g.a)(Object(g.a)({},e),{},{isSigner:!1}):e})),e.t0=n.rpc,e.t1=d.nonce,e.next=17,n.state.address();case 17:return e.t2=e.sent,e.t3=r.programId,e.t4={registrar:o.publicKey,member:i.publicKey,beneficiary:n.provider.wallet.publicKey,balances:i.account.balances,balancesLocked:i.account.balancesLocked,vendor:u.vendor.publicKey,vault:u.vendor.account.vault,vendorSigner:a.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,clock:K.SYSVAR_CLOCK_PUBKEY},e.t5={registry:e.t2,lockupProgram:e.t3,cmn:e.t4},e.t6=b,e.t7=[c,s],e.next=25,r.account.vesting.createInstruction(c);case 25:return e.t9=e.sent,e.t8=[e.t9],e.t10=ht.a,e.next=30,Object(M.createTokenAccountInstrs)(n.provider,s.publicKey,u.vendor.account.mint,d.publicKey);case 30:return e.t11=e.sent,e.t12=(0,e.t10)(e.t11),e.t13=e.t8.concat.call(e.t8,e.t12),e.t14={accounts:e.t5,remainingAccounts:e.t6,signers:e.t7,instructions:e.t13},e.next=36,e.t0.claimRewardLocked.call(e.t0,e.t1,e.t14);case 36:return p=e.sent,e.next=39,r.account.vesting.all(n.provider.wallet.publicKey.toBuffer());case 39:return(m=e.sent).forEach((function(e){l({type:f.a.AccountAdd,item:{account:e}})})),l({type:f.a.LockupSetVestings,item:{vestingAccounts:m.map((function(e){return e.publicKey}))}}),e.abrupt("return",p);case 45:return e.next=47,n.rpc.claimReward({accounts:{to:j,cmn:{registrar:o.publicKey,member:i.publicKey,beneficiary:n.provider.wallet.publicKey,balances:i.account.balances,balancesLocked:i.account.balancesLocked,vendor:u.vendor.publicKey,vault:t.vault,vendorSigner:a.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,clock:K.SYSVAR_CLOCK_PUBKEY}}});case 47:return e.abrupt("return",e.sent);case 48:case"end":return e.stop()}}),e)}))));case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();return Object(A.jsxs)(A.Fragment,{children:[!u.reward.locked&&Object(A.jsx)("div",{children:Object(A.jsx)(Ye.a,{style:{width:"400px",height:"100%"},mint:u.vendor.account.mint,onChange:function(e){return h(e)}})}),Object(A.jsx)("div",{style:{marginLeft:"10px",marginRight:"10px"},children:Object(A.jsx)(X.a,{disabled:u.reward.unlockedAlloc&&null===j,variant:"contained",color:"primary",onClick:function(){return x().catch((function(e){console.error(e),b.enqueueSnackbar("Error ending pending redemption: ".concat(e.toString()),{variant:"error"})}))},children:"Process Reward"})})]})}function Mt(){var e=Object(O.b)().registryClient,t=Object(s.b)(),n=Object(d.b)(),r=Object(s.c)((function(e){var t=e.accounts[e.registry.registrar.toString()],n={publicKey:t.rewardEventQ,account:e.accounts[t.rewardEventQ.toString()]};return{accounts:e.accounts,rewardEventQueue:n,member:e.registry.member?{publicKey:e.registry.member,account:e.accounts[e.registry.member.toString()]}:void 0,network:e.common.network}})),c=r.rewardEventQueue,i=Object(a.useMemo)((function(){return Object(P.e)(c.account)}),[c.account]);Object(a.useEffect)((function(){Object(S.a)(w.a.mark((function r(){return w.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.next=2,T.d.getMultipleAccounts(e.provider.connection,i.map((function(e){return e.vendor})));case 2:r.sent.forEach((function(r){if(null!==r){var a=e.coder.accounts.decode("RewardVendor",r.account.data);t({type:f.a.AccountAdd,item:{account:{publicKey:r.publicKey,account:a}}})}else n.enqueueSnackbar("RPC node returned invalid vendor account",{variant:"error"})}));case 4:case"end":return r.stop()}}),r)})))()}),[i,t,n,e.coder.accounts,e.provider.connection]);var o=i.map((function(e){return ft.a.fromMessage(r,e)})).reverse(),u=null;return 0===o.filter((function(e){return null===e})).length&&(u=o.filter((function(e){return e.needsClaim})).sort((function(e,t){return e.cursort.cursor?1:0})).shift()),Object(A.jsxs)("div",{style:{width:"100%",marginTop:"24px"},children:[u&&Object(A.jsx)(Xe.a,{style:{marginBottom:"24px"},children:Object(A.jsx)($e.a,{children:Object(A.jsxs)(J.a,{variant:"h6",children:['You were staked during a previous reward. To prove eligibility, click the "Process" button until you\'ve processed ',Object(A.jsx)("b",{children:"all"})," ","eligible rewards. For unlocked rewards, don't forget to select the address you wish to send your stake reward to."]})})}),Object(A.jsxs)("div",{style:{marginBottom:"10px",display:"flex",justifyContent:"space-between"},children:[Object(A.jsx)(J.a,{style:{fontWeight:"bold",fontSize:"20px"},children:"Reward History"}),Object(A.jsxs)("div",{style:{display:"flex"},children:[u&&Object(A.jsx)(Ct,{rli:u}),localStorage.getItem("private")&&Object(A.jsx)(vt,{})]})]}),Object(A.jsx)("div",{style:{marginBottom:"16px"},children:Object(A.jsxs)(J.a,{children:["When rewards are dropped, one must prove one was staked during the time of drop. This means sending a transaction to the staking program to ",Object(A.jsx)("b",{children:"process"})," the reward. For ",Object(A.jsx)("b",{children:"unlocked"})," rewards, select the token address to transfer the reward to. For ",Object(A.jsx)("b",{children:"locked"})," rewards, a locked vesting account will be created and realized to the staker upon unstaking. See the Lockup tab."]})}),Object(A.jsx)(gt.a,{children:Object(A.jsx)(ft.b,{rewards:o})})]})}function Tt(e){var t=e.mint,n=e.decimals,r=e.variant,c=e.onChange,i=e.style,o=e.deposit,u=Object(s.c)((function(e){return t?e.lockup.vestings.map((function(t){return{publicKey:t,account:e.accounts[t.toString()]}})).filter((function(e){return e.account.mint.equals(t)})):[]})),l=Object(a.useState)(""),d=Object(G.a)(l,2),b=d[0],p=d[1];return Object(A.jsx)(Qe.a,{style:i,variant:r,fullWidth:!0,value:b,onChange:function(e){var t=e.target.value;p(t);var n=new K.PublicKey(t),r=u.filter((function(e){return e.publicKey.equals(n)})).pop();c(n,Pt(r,o))},children:0===u.length?Object(A.jsx)(le.a,{value:"",children:"No vesting accounts found"}):u.map((function(e){return Object(A.jsx)(le.a,{value:e.publicKey.toString(),children:Object(A.jsxs)("div",{style:{width:"100%",display:"flex",justifyContent:"space-between"},children:[Object(A.jsx)("div",{children:"".concat(e.publicKey.toString())}),Object(A.jsx)("div",{style:{float:"right",color:"#ccc"},children:"".concat(Object(Q.c)(Pt(e,o),n))})]})})}))})}function Pt(e,t){return t?e.account.outstanding.sub(e.account.whitelistOwned):e.account.whitelistOwned}function At(){var e=Object(a.useState)(mt.Me),t=Object(G.a)(e,2),n=t[0],r=t[1];return Object(A.jsxs)("div",{children:[Object(A.jsx)(Rt,{setTab:r}),Object(A.jsxs)(Ce.a,{fixed:!0,maxWidth:"md",style:{flex:1,display:"flex"},children:[n===mt.Me&&Object(A.jsx)(it,{}),n===mt.Stake&&Object(A.jsx)(jt.a,{}),n===mt.Rewards&&Object(A.jsx)(Mt,{})]})]})}function Rt(e){var t=Object(a.useState)(mt.Me),n=Object(G.a)(t,2),r=n[0],c=n[1],i=Object(s.c)((function(e){return{member:e.registry.member,registrar:e.registry.registrar,registrarAccount:e.accounts[e.registry.registrar.toString()]}})),o=i.member,u=i.registrar,l=i.registrarAccount,b=Object(a.useState)(!1),p=Object(G.a)(b,2),m=p[0],j=p[1],g=Object(a.useState)(!1),h=Object(G.a)(g,2),x=h[0],y=h[1],v=Object(d.b)(),k=v.enqueueSnackbar,C=v.closeSnackbar,M=Object(O.b)(),T=M.wallet,R=M.registryClient,W=Object(s.b)(),E=function(){var e=Object(S.a)(w.a.mark((function e(){var t,n,r,a,c,i,o,s,d,b,p,m,j,g,h,x,y,O,v;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return k("Creating stake account",{variant:"info"}),e.next=3,Object(P.b)(u);case 3:return t=e.sent,e.next=6,K.PublicKey.createWithSeed(T.publicKey,t,R.programId);case 6:return n=e.sent,e.next=9,Object(P.c)(R.programId,u,n);case 9:return r=e.sent,a=r.publicKey,c=r.nonce,i=a,e.next=15,Object(P.a)(R.provider,l,i);case 15:return o=e.sent,s=Object(G.a)(o,2),d=s[0],b=s[1],e.next=21,Object(P.a)(R.provider,l,i);case 21:return p=e.sent,m=Object(G.a)(p,2),j=m[0],g=m[1],e.t0=R.transaction,e.t1=c,e.t2={registrar:u,member:n,beneficiary:T.publicKey,memberSigner:i,balances:b,balancesLocked:g,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,rent:K.SYSVAR_RENT_PUBKEY},e.t3=K.SystemProgram,e.t4=T.publicKey,e.t5=n,e.t6=T.publicKey,e.t7=t,e.next=35,R.provider.connection.getMinimumBalanceForRentExemption(R.account.member.size);case 35:return e.t8=e.sent,e.t9=R.account.member.size,e.t10=R.programId,e.t11={fromPubkey:e.t4,newAccountPubkey:e.t5,basePubkey:e.t6,seed:e.t7,lamports:e.t8,space:e.t9,programId:e.t10},e.t12=e.t3.createAccountWithSeed.call(e.t3,e.t11),e.t13=[e.t12],e.t14={accounts:e.t2,instructions:e.t13},h=e.t0.createMember.call(e.t0,e.t1,e.t14),x=[d,j,{tx:h,signers:[]}],e.next=47,R.provider.sendAll(x,{commitment:"recent",preflightCommitment:"recent",skipPreflight:!0});case 47:return y=e.sent,console.log("Accounts created with transactions:",y),e.next=51,R.account.member(n);case 51:return O=e.sent,v={publicKey:n,account:O},W({type:f.a.AccountAdd,item:{account:v}}),e.next=56,U(v,W,R.provider.connection);case 56:V(v,R,W),W({type:f.a.RegistrySetMember,item:{member:n}}),C(),k("Stake account created ".concat(n.toString()),{variant:"success"});case 60:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),I=Se.a.span(pt||(pt=Object(we.a)(["\n :hover {\n cursor: pointer;\n }\n "])));return Object(A.jsxs)(A.Fragment,{children:[Object(A.jsxs)("div",{style:{backgroundColor:"#fff",paddingTop:"24px",borderBottom:"solid 1pt #ccc"},children:[Object(A.jsxs)(Ce.a,{fixed:!0,maxWidth:"md",style:{height:"100%",display:"flex",flexDirection:"column",justifyContent:"space-between"},children:[Object(A.jsxs)("div",{style:{display:"flex",justifyContent:"space-between"},children:[Object(A.jsx)("div",{children:Object(A.jsx)(J.a,{variant:"h4",style:{marginBottom:"10px"},children:"My Stake"})}),Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(A.jsx)(Je,{})})]}),Object(A.jsxs)("div",{style:{display:"flex",justifyContent:"space-between"},children:[Object(A.jsx)("div",{children:Object(A.jsx)(J.a,{children:void 0!==o?o.toString():Object(A.jsxs)(A.Fragment,{children:["Account not found. Please"," ",Object(A.jsx)(I,{onClick:function(){E().catch((function(e){console.error(e),k("Error creating stake account: ".concat(e.toString()),{variant:"error"})}))},style:{color:"black",fontWeight:"bold",textDecoration:"underline"},children:"create"})," ","a stake account."]})})}),Object(A.jsx)("div",{children:Object(A.jsxs)("div",{children:[Object(A.jsxs)(X.a,{disabled:void 0===o,onClick:function(){return j(!0)},variant:"outlined",color:"primary",style:{marginRight:"10px"},children:[Object(A.jsx)(Te.a,{style:{fontSize:"20px"}}),Object(A.jsx)(J.a,{style:{marginLeft:"5px",marginRight:"5px"},children:"Deposit"})]}),Object(A.jsxs)(X.a,{disabled:void 0===o,variant:"outlined",color:"primary",onClick:function(){return y(!0)},children:[Object(A.jsx)(Ae.a,{style:{fontSize:"20px"}}),Object(A.jsx)(J.a,{style:{marginLeft:"5px",marginRight:"5px"},children:"Withdraw"})]})]})})]})]}),Object(A.jsx)("div",{style:{maxWidth:"960px",marginLeft:"auto",marginRight:"auto",paddingLeft:"24px",paddingRight:"24px",marginTop:"10px"},children:Object(A.jsxs)(Ue.a,{value:r,onChange:function(t,n){c(n),e.setTab(n)},children:[Object(A.jsx)(Ne.a,{value:mt.Me,label:"Me"}),Object(A.jsx)(Ne.a,{value:mt.Stake,label:"Stake"}),Object(A.jsx)(Ne.a,{value:mt.Rewards,label:"Rewards"})]})})]}),void 0!==o&&Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)(Wt,{open:m,onClose:function(){return j(!1)}}),Object(A.jsx)(Et,{open:x,onClose:function(){return y(!1)}})]})]})}function Wt(e){var t=e.open,n=e.onClose,r=Object(d.b)(),a=r.enqueueSnackbar,c=r.closeSnackbar,i=Object(O.b)(),o=i.registryClient,u=i.lockupClient,l=Object(s.b)(),b=Object(s.c)((function(e){var t=void 0;e.registry.member&&(t=e.accounts[e.registry.member.toString()]);var n=e.accounts[e.registry.registrar.toString()],r={publicKey:e.registry.registrar,account:n};return{registrar:r,memberAccount:t,member:e.registry.member,mintAccount:e.accounts[r.account.mint.toString()],accounts:e.accounts}})),p=b.registrar,m=b.member,j=b.memberAccount,g=b.mintAccount,h=b.accounts;return Object(A.jsx)(It,{deposit:!0,title:"Deposit",contextText:"Select the amount to deposit",open:t,onClose:n,onTransfer:function(){var e=Object(S.a)(w.a.mark((function e(t,r,i){var s,d;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=Object(Q.b)(r,g.decimals),a("Depositing ".concat(r," ").concat(Object(Q.d)(p.account.mint)," from ").concat(t.toString()),{variant:"info"}),e.next=4,Object(S.a)(w.a.mark((function e(){var n,r,a,c,d,b,g,x,y;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!i){e.next=45;break}return n=o.coder.instruction.encode("deposit_locked",{amount:s}),r=h[t.toString()],e.next=5,Object(P.c)(o.programId,p.publicKey,m);case 5:return a=e.sent.publicKey,e.next=8,ut(u.programId,t);case 8:return c=e.sent.publicKey,e.next=11,o.state.address();case 11:return e.t0=e.sent,e.t1={pubkey:e.t0,isWritable:!1,isSigner:!1},e.t2={pubkey:p.publicKey,isWritable:!1,isSigner:!1},e.t3={pubkey:m,isWritable:!1,isSigner:!1},e.t4={pubkey:o.provider.wallet.publicKey,isWritable:!1,isSigner:!0},d=[e.t1,e.t2,e.t3,e.t4],e.t5=u.rpc,e.t6=n,e.t7=s,e.next=22,u.state.address();case 22:return e.t8=e.sent,e.t9=o.provider.wallet.publicKey,e.t10=o.programId,e.t11=t,e.t12=r.vault,e.t13=c,e.t14=ze.TokenInstructions.TOKEN_PROGRAM_ID,e.t15=j.balancesLocked.vault,e.t16=a,e.t17={lockup:e.t8,beneficiary:e.t9,whitelistedProgram:e.t10,vesting:e.t11,vault:e.t12,vestingSigner:e.t13,tokenProgram:e.t14,whitelistedProgramVault:e.t15,whitelistedProgramVaultAuthority:e.t16},e.t18={transfer:e.t17},e.t19=d,e.t20={accounts:e.t18,remainingAccounts:e.t19},e.next=37,e.t5.whitelistWithdraw.call(e.t5,e.t6,e.t7,e.t20);case 37:return b=e.sent,e.next=40,u.account.vesting(t);case 40:return g=e.sent,l({type:f.a.LockupUpdateVesting,item:{vesting:{publicKey:t,account:g}}}),e.abrupt("return",b);case 45:return e.next=47,o.rpc.deposit(s,{accounts:{depositor:t,depositorAuthority:o.provider.wallet.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,vault:j.balances.vault,beneficiary:o.provider.wallet.publicKey,member:m}});case 47:return x=e.sent,e.next=50,Object(M.getTokenAccount)(o.provider,t);case 50:return y=e.sent,l({type:f.a.CommonOwnedTokenAccountsUpdate,item:{account:{publicKey:t,account:y}}}),e.abrupt("return",x);case 53:case"end":return e.stop()}}),e)})))();case 4:d=e.sent,c(),a("Deposit complete",{variant:"success",action:Object(A.jsx)(Fe.a,{signature:d})}),n();case 8:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()})}function Et(e){var t=e.open,n=e.onClose,r=Object(O.b)(),a=r.registryClient,c=r.lockupClient,i=Object(d.b)(),o=i.enqueueSnackbar,u=i.closeSnackbar,l=Object(s.b)(),b=Object(s.c)((function(e){var t=void 0;e.registry.member&&(t=e.accounts[e.registry.member.toString()]);var n=e.accounts[e.registry.registrar.toString()];return{registrar:e.registry.registrar,registrarAccount:n,member:e.registry.member,memberAccount:t,mintAccount:e.accounts[n.mint.toString()],accounts:e.accounts}})),p=b.registrar,m=b.registrarAccount,j=b.member,g=b.memberAccount,h=b.mintAccount,x=b.accounts;return Object(A.jsx)(It,{title:"Withdraw",contextText:"Select the amount to withdraw",open:t,onClose:n,onTransfer:function(){var e=Object(S.a)(w.a.mark((function e(t,r,i){var s,d;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s=Object(Q.b)(r,h.decimals),o("Withdrawing ".concat(r," ").concat(Object(Q.d)(m.mint)," to ").concat(t.toString()),{variant:"info"}),e.next=4,Object(S.a)(w.a.mark((function e(){var n,r,o,u,d,b,m,h,y,O;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(P.c)(a.programId,p,j);case 2:if(n=e.sent,!i){e.next=47;break}return r=a.coder.instruction.encode("withdraw_locked",{amount:s}),o=x[t.toString()],e.next=8,Object(P.c)(a.programId,p,j);case 8:return u=e.sent.publicKey,e.next=11,ut(c.programId,t);case 11:return d=e.sent.publicKey,e.next=14,a.state.address();case 14:return e.t0=e.sent,e.t1={pubkey:e.t0,isWritable:!1,isSigner:!1},e.t2={pubkey:p,isWritable:!1,isSigner:!1},e.t3={pubkey:j,isWritable:!1,isSigner:!1},e.t4={pubkey:a.provider.wallet.publicKey,isWritable:!1,isSigner:!0},b=[e.t1,e.t2,e.t3,e.t4],e.t5=c.rpc,e.t6=r,e.next=24,c.state.address();case 24:return e.t7=e.sent,e.t8=a.provider.wallet.publicKey,e.t9=a.programId,e.t10=t,e.t11=o.vault,e.t12=d,e.t13=ze.TokenInstructions.TOKEN_PROGRAM_ID,e.t14=g.balancesLocked.vault,e.t15=u,e.t16={lockup:e.t7,beneficiary:e.t8,whitelistedProgram:e.t9,vesting:e.t10,vault:e.t11,vestingSigner:e.t12,tokenProgram:e.t13,whitelistedProgramVault:e.t14,whitelistedProgramVaultAuthority:e.t15},e.t17={transfer:e.t16},e.t18=b,e.t19={accounts:e.t17,remainingAccounts:e.t18},e.next=39,e.t5.whitelistDeposit.call(e.t5,e.t6,e.t19);case 39:return m=e.sent,e.next=42,c.account.vesting(t);case 42:return h=e.sent,l({type:f.a.LockupUpdateVesting,item:{vesting:{publicKey:t,account:h}}}),e.abrupt("return",m);case 47:return e.next=49,a.rpc.withdraw(s,{accounts:{registrar:p,member:j,beneficiary:a.provider.wallet.publicKey,vault:g.balances.vault,memberSigner:n.publicKey,depositor:t,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID}});case 49:return y=e.sent,e.next=52,Object(M.getTokenAccount)(a.provider,t);case 52:return O=e.sent,l({type:f.a.CommonOwnedTokenAccountsUpdate,item:{account:{publicKey:t,account:O}}}),e.abrupt("return",y);case 55:case"end":return e.stop()}}),e)})))();case 4:d=e.sent,u(),o("Withdraw complete",{variant:"success",action:Object(A.jsx)(Fe.a,{signature:d})}),n();case 8:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()})}function It(e){var t=Object(s.c)((function(e){var t=e.accounts[e.registry.registrar.toString()];return{mint:t?t.mint:void 0,mintAccount:e.accounts[t.mint.toString()]}})),n=t.mint,r=t.mintAccount,c=Object(d.b)().enqueueSnackbar,i=e.open,o=e.onClose,u=e.onTransfer,l=e.title,b=e.contextText,p=e.deposit,m=Object(a.useState)(null),j=Object(G.a)(m,2),g=j[0],f=j[1],h=Object(a.useState)(null),x=Object(G.a)(h,2),y=x[0],O=x[1],v=Object(a.useState)(null),w=Object(G.a)(v,2),S=w[0],k=w[1],K=Object(a.useState)(null),C=Object(G.a)(K,2),M=C[0],T=C[1],P=Object(a.useState)(!1),R=Object(G.a)(P,2),W=R[0],E=R[1],I=(W?!S:!y)||!g||!M||g>M;return Object(A.jsx)("div",{children:Object(A.jsxs)(Re.a,{open:i,TransitionComponent:Lt,keepMounted:!0,onClose:o,fullWidth:!0,children:[Object(A.jsxs)("div",{style:{display:"flex",justifyContent:"space-between"},children:[Object(A.jsx)(Ie.a,{children:l}),Object(A.jsxs)("div",{style:{display:"flex",paddingRight:"24px"},children:[Object(A.jsx)("div",{style:{display:"flex",justifyContent:"center",flexDirection:"column"},children:Object(A.jsx)(Ke.a,{})}),Object(A.jsx)(_e.a,{style:{marginLeft:"0px",marginRight:"0px"},control:Object(A.jsx)(qe.a,{checked:W,onChange:function(){return E(!W)}}),label:""})]})]}),Object(A.jsxs)(Ee.a,{children:[Object(A.jsx)("div",{style:{display:"flex"},children:Object(A.jsxs)("div",{style:{flex:1},children:[Object(A.jsx)(Le.a,{style:{width:"100%"},id:"outlined-number",label:"Amount",type:"number",InputLabelProps:{shrink:!0},variant:"outlined",onChange:function(e){return f(parseFloat(e.target.value))},InputProps:{inputProps:{min:0,max:null!==M&&void 0!==M?M:0}}}),Object(A.jsx)(Ve.a,{children:b})]})}),Object(A.jsx)(Be.a,{fullWidth:!0,children:W?Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)(Tt,{variant:"outlined",mint:n,decimals:r.decimals,deposit:p,onChange:function(e,t){k(e),T(t.toNumber())}}),Object(A.jsxs)(Ve.a,{children:["Vesting account to transfer to/from your ",Object(A.jsx)("b",{children:"locked"})," ","balances"]})]}):Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)(Ye.a,{variant:"outlined",decimals:r.decimals,mint:n,onChange:function(e,t){O(e),T(Math.pow(2,53))}}),Object(A.jsx)(Ve.a,{children:"Token account to transfer to/from"})]})})]}),Object(A.jsxs)(We.a,{children:[Object(A.jsx)(X.a,{onClick:o,color:"primary",children:"Cancel"}),Object(A.jsx)(X.a,{onClick:function(){u(W?S:y,g,W).catch((function(e){console.error(e),c("Error transferring funds: ".concat(e.toString()),{variant:"error"})}))},color:"primary",disabled:I,children:l})]})]})})}!function(e){e[e.Unlocked=0]="Unlocked",e[e.Locked=1]="Locked"}(bt||(bt={})),function(e){e[e.Me=0]="Me",e[e.Stake=1]="Stake",e[e.Rewards=2]="Rewards",e[e.Lockup=3]="Lockup"}(mt||(mt={}));var Lt=c.a.forwardRef((function(e,t){return Object(A.jsx)(De.a,Object(g.a)({direction:"up",ref:t},e))}));function Bt(){return Object(A.jsx)(At,{})}var Dt=n(104),Vt=n(306);function Ut(){var e=Object(a.useState)(!1),t=Object(G.a)(e,2),n=t[0],r=t[1];return Object(A.jsxs)(A.Fragment,{children:[Object(A.jsx)("div",{onClick:function(){return r(!0)},children:Object(A.jsx)(X.a,{variant:"contained",color:"secondary",children:"New"})}),Object(A.jsx)(Nt,{open:n,onClose:function(){return r(!1)}})]})}function Nt(e){var t=e.open,n=e.onClose,r=Object(s.c)((function(e){return{network:e.common.network,accounts:e.accounts}})),c=r.network,i=r.accounts,o=(new Date).toString(),u=new Date(o).getTime()/1e3,l="2027-01-01T12:00",b=new Date(l).getTime()/1e3,p=Object(a.useState)(""),m=Object(G.a)(p,2),j=m[0],g=m[1],h=function(){try{return new K.PublicKey(j),!0}catch(e){return!1}}(),x=!h&&""!==j,y=Object(a.useState)(null),v=Object(G.a)(y,2),k=v[0],C=v[1],T=Object(a.useState)(u),P=Object(G.a)(T,2),R=P[0],W=P[1],E=Object(a.useState)(b),I=Object(G.a)(E,2),L=I[0],B=I[1],D=Object(a.useState)(7),V=Object(G.a)(D,2),U=V[0],N=V[1],_=Object(a.useState)(null),q=Object(G.a)(_,2),z=q[0],Y=q[1],F=Object(O.b)().lockupClient,H=Object(a.useState)(!1),Z=Object(G.a)(H,2),$=Z[0],ee=Z[1],te=Object(a.useState)(null),ne=Object(G.a)(te,2),re=ne[0],ae=ne[1],ce=Object(d.b)().enqueueSnackbar,ie=Object(s.b)(),oe=null!==re&&null!==k&&h&&null!==z,ue=function(){var e=Object(S.a)(w.a.mark((function e(){var t,r,a,c,o,s,u,l,d;return w.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return ee(!0),e.prev=1,t=new K.PublicKey(j),e.next=5,F.provider.connection.getAccountInfo(t);case 5:if(null!==(r=e.sent)){e.next=10;break}return ce("Unable to validate given beneficiary.",{variant:"error"}),ee(!1),e.abrupt("return");case 10:if(r.owner.equals(K.SystemProgram.programId)){e.next=14;break}return ce("The beneficiary must be owned by the System Program.",{variant:"error"}),ee(!1),e.abrupt("return");case 14:return ce("Creating vesting acount...",{variant:"info"}),a=i[re.toString()],c=a?Object(Q.b)(z,a.decimals):new yt.a(z),o=new K.Account,s=new K.Account,e.next=21,ut(F.programId,o.publicKey);case 21:return u=e.sent,e.t0=F.rpc,e.t1=t,e.t2=c,e.t3=u.nonce,e.t4=new yt.a(R),e.t5=new yt.a(L),e.t6=new yt.a(U),e.t7={vesting:o.publicKey,vault:s.publicKey,depositor:k,depositorAuthority:F.provider.wallet.publicKey,tokenProgram:ze.TokenInstructions.TOKEN_PROGRAM_ID,rent:K.SYSVAR_RENT_PUBKEY,clock:K.SYSVAR_CLOCK_PUBKEY},e.t8=[o,s],e.next=33,F.account.vesting.createInstruction(o);case 33:return e.t10=e.sent,e.t9=[e.t10],e.t11=ht.a,e.next=38,Object(M.createTokenAccountInstrs)(F.provider,s.publicKey,re,u.publicKey);case 38:return e.t12=e.sent,e.t13=(0,e.t11)(e.t12),e.t14=e.t9.concat.call(e.t9,e.t13),e.t15={accounts:e.t7,signers:e.t8,instructions:e.t14},e.next=44,e.t0.createVesting.call(e.t0,e.t1,e.t2,e.t3,e.t4,e.t5,e.t6,null,e.t15);case 44:if(l=e.sent,!t.equals(F.provider.wallet.publicKey)){e.next=50;break}return e.next=48,F.account.vesting(o.publicKey);case 48:d=e.sent,ie({type:f.a.LockupCreateVesting,item:{vesting:{publicKey:o.publicKey,account:d}}});case 50:ce("Vesting account created",{variant:"success",action:Object(A.jsx)(Fe.a,{signature:l})}),n(),e.next=57;break;case 54:e.prev=54,e.t16=e.catch(1),ce("Error creating vesting account: ".concat(e.t16.toString()),{variant:"error"});case 57:ee(!1);case 58:case"end":return e.stop()}}),e,null,[[1,54]])})));return function(){return e.apply(this,arguments)}}();return Object(A.jsxs)(Re.a,{open:t,onClose:n,fullWidth:!0,maxWidth:"md",children:[Object(A.jsx)(Ie.a,{children:Object(A.jsx)(J.a,{variant:"h4",component:"h2",children:"New Vesting Account"})}),Object(A.jsx)(Ee.a,{children:Object(A.jsxs)("div",{children:[$&&Object(A.jsx)("div",{style:{width:"40px",marginLeft:"auto",marginRight:"auto",marginBottom:"24px"},children:Object(A.jsx)(se.a,{style:{marginLeft:"auto",marginRight:"auto"}})}),Object(A.jsxs)("div",{style:{display:"flex",width:"100%"},children:[Object(A.jsx)("div",{children:Object(A.jsxs)(Be.a,{variant:"outlined",style:{width:"200px"},children:[Object(A.jsx)(Ot.a,{children:"Mint"}),Object(A.jsx)(Qe.a,{value:re?re.toString():"",onChange:function(e){return ae(new K.PublicKey(e.target.value))},children:Object.keys(c.mints).map((function(e){return Object(A.jsx)(le.a,{value:c.mints[e].toString(),children:e.toUpperCase()})}))})]})}),!1]}),Object(A.jsx)("div",{children:Object(A.jsx)("div",{style:{display:"flex",width:"100%"},children:Object(A.jsx)("div",{style:{flex:1},children:Object(A.jsxs)(Be.a,{fullWidth:!0,children:[Object(A.jsx)(Ot.a,{children:"From"}),Object(A.jsx)(Ye.a,{mint:re,onChange:function(e){return C(e)}}),Object(A.jsx)(Ve.a,{children:"Token account to send from"})]})})})}),Object(A.jsxs)("div",{style:{marginTop:"24px"},children:[Object(A.jsx)(Le.a,{fullWidth:!0,error:x,helperText:x&&"Invalid beneficiary",label:"Beneficiary",value:j,onChange:function(e){return g(e.target.value)}}),Object(A.jsx)(Ve.a,{children:"Owner of the new vesting account"})]}),Object(A.jsxs)("div",{style:{marginTop:"24px"},children:[!1,Object(A.jsx)(Le.a,{fullWidth:!0,label:"Amount",type:"number",value:z,InputProps:{inputProps:{min:0}},onChange:function(e){return Y(parseFloat(e.target.value))}}),Object(A.jsx)(Ve.a,{children:"Amount to deposit into the vesting account"})]}),Object(A.jsxs)("div",{style:{marginTop:"24px",display:"flex"},children:[Object(A.jsxs)("div",{style:{flex:1,marginRight:"10px"},children:[Object(A.jsx)(Le.a,{fullWidth:!0,label:"Start date",type:"datetime-local",defaultValue:o,InputLabelProps:{shrink:!0},onChange:function(e){var t=new Date(e.target.value);W(t.getTime()/1e3)}}),Object(A.jsx)(Ve.a,{children:"Date when vesting begins"})]}),Object(A.jsx)("div",{children:Object(A.jsx)(Le.a,{disabled:!0,fullWidth:!0,label:"Unix Timestamp",value:R})})]}),Object(A.jsxs)("div",{style:{marginTop:"24px",display:"flex"},children:[Object(A.jsxs)("div",{style:{flex:1,marginRight:"10px"},children:[Object(A.jsx)(Le.a,{fullWidth:!0,label:"End date",type:"datetime-local",defaultValue:l,InputLabelProps:{shrink:!0},onChange:function(e){var t=new Date(e.target.value);B(t.getTime()/1e3)}}),Object(A.jsx)(Ve.a,{children:"Date when all tokens are vested"})]}),Object(A.jsx)("div",{children:Object(A.jsx)(Le.a,{disabled:!0,fullWidth:!0,label:"Unix Timestamp",value:L})})]}),Object(A.jsx)("div",{style:{marginTop:"24px"},children:Object(A.jsxs)(Be.a,{fullWidth:!0,children:[Object(A.jsx)(Le.a,{id:"outlined-number",label:"Period Count",type:"number",InputLabelProps:{shrink:!0},variant:"outlined",value:U,onChange:function(e){return N(parseInt(e.target.value))},InputProps:{inputProps:{min:1}}}),Object(A.jsx)(Ve.a,{children:"Number of vesting periods"})]})})]})}),Object(A.jsxs)(We.a,{children:[Object(A.jsx)(X.a,{onClick:n,children:"Cancel"}),Object(A.jsx)(X.a,{variant:"contained",type:"submit",color:"primary",disabled:!oe||$,onClick:function(){return ue()},children:"Create"})]})]})}var _t=n(420),qt=n.n(_t),zt=n(229),Yt=n(183),Ft=n(85),Qt=n(156);function Gt(e){var t=e.vesting,n=e.network,r=Object(O.b)(),c=r.lockupClient,i=r.registryClient,o=Object(d.b)().enqueueSnackbar,u=Object(Q.e)(),l=Object(s.b)(),b=Object(s.c)((function(e){return{accounts:e.accounts,member:e.registry.member?{publicKey:e.registry.member,account:e.accounts[e.registry.member.toString()]}:void 0,mintAccount:e.accounts[t.account.mint.toString()]}})),p=b.accounts,m=b.member,j=b.mintAccount,g=Object(a.useState)(!1),h=Object(G.a)(g,2),x=h[0],y=h[1],v=Object(a.useState)(!1),k=Object(G.a)(v,2),C=k[0],M=k[1],T=p[t.account.mint.toString()],P=T?function(e){return Object(Q.c)(e,T.decimals)}:function(e){return e.toString()},R="".concat(P(t.account.outstanding)," ").concat(Object(Q.d)(t.account.mint)),W=t.account.startTs,E=t.account.endTs,I=E.sub(W).mod(t.account.periodCount),L=W.sub(I),B=E.sub(L).div(t.account.periodCount),D=Object(ht.a)(Array(t.account.periodCount.toNumber()+1)).map((function(e,t){return Jt(new Date(1e3*(L.toNumber()+t*B.toNumber())))}));D[0]=Jt(new Date(1e3*W.toNumber()));var V=t.account.startBalance.mod(t.account.periodCount),U=t.account.startBalance.sub(V).div(t.account.periodCount).toNumber(),N=Object(ht.a)(Array(D.length)).map((function(){return 0}));N[1]=U+V.toNumber();for(var _=2;_ = rustEnum([\n struct([], 'create'),\n struct([], 'createBuffer'),\n struct([], 'write'),\n struct([], 'setBuffer'),\n struct([], 'setAuthority'),\n]);\n\nexport function encodeInstruction(i: IdlInstruction): Buffer {\n const buffer = Buffer.alloc(1000); // TODO: use a tighter buffer.\n const len = IDL_INSTRUCTION_LAYOUT.encode(i, buffer);\n return Buffer.concat([IDL_TAG, buffer.slice(0, len)]);\n}\n\n// Reverse for little endian.\nexport const IDL_TAG = Buffer.from('0a69e9a778bcf440', 'hex').reverse();\n","export type Action = {\n type: ActionType;\n item: any;\n};\n\nexport enum ActionType {\n // Common.\n CommonTriggerBootstrap,\n CommonAppWillBootstrap,\n CommonAppDidBootstrap,\n CommonTriggerShutdown,\n CommonDidShutdown,\n CommonWalletDidConnect,\n CommonWalletDidDisconnect,\n CommonWalletSetProvider,\n CommonSetNetwork,\n CommonOwnedTokenAccountsSet,\n CommonOwnedTokenAccountsUpdate,\n CommonWalletReset,\n\n // Lockup.\n LockupSetVestings,\n LockupUpdateVesting,\n LockupCreateVesting,\n\n // Registry.\n RegistrySetMember,\n RegistrySetRegistrar,\n RegistrySetPendingWithdrawals,\n RegistryCreatePendingWithdrawal,\n RegistryUpdatePendingWithdrawal,\n\n // Accounts.\n AccountAdd,\n AccountUpdate,\n}\n","import React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useSnackbar } from 'notistack';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport LockIcon from '@material-ui/icons/Lock';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Collapse from '@material-ui/core/Collapse';\nimport ExpandLess from '@material-ui/icons/ExpandLess';\nimport ExpandMore from '@material-ui/icons/ExpandMore';\nimport Button from '@material-ui/core/Button';\nimport { PublicKey, SYSVAR_CLOCK_PUBKEY } from '@solana/web3.js';\nimport { TokenInstructions } from '@project-serum/serum';\nimport OwnedTokenAccountsSelect from '../../components/common/OwnedTokenAccountsSelect';\nimport { useWallet } from '../../components/common/WalletProvider';\nimport { toDisplay } from '../../utils/tokens';\nimport { ProgramAccount } from '../../store/reducer';\nimport { Network } from '../../store/config';\nimport { State as StoreState } from '../../store/reducer';\nimport { ViewTransactionOnExplorerButton } from '../../components/common/Notification';\n\ntype RewardsListProps = {\n rewards: (RewardListItemViewModel | null)[];\n};\n\nexport default function RewardsList(props: RewardsListProps) {\n const { rewards } = props;\n let loading = false;\n rewards.forEach(r => {\n if (r === null) {\n loading = true;\n }\n });\n return (\n \n {loading ? (\n \n ) : rewards.length > 0 ? (\n rewards\n .filter(r => r!.vendor.account.expired === false)\n .map(r => {\n return ;\n })\n ) : (\n \n \n \n )}\n \n );\n}\n\ntype RewardListItemProps = {\n rli: RewardListItemViewModel;\n};\n\nfunction RewardListItem(props: RewardListItemProps) {\n const { rli } = props;\n\n const [open, setOpen] = useState(false);\n\n const dateLabel = new Date(\n rli.vendor!.account.startTs.toNumber() * 1000,\n ).toLocaleString();\n let fromLabel = `Dropped by ${rli.vendor.account.from.toString()} | ${dateLabel}`;\n return (\n <>\n setOpen(open => !open)}>\n \n \n
{`${toDisplay(\n rli.vendor.account.total,\n rli.mint!.account.decimals,\n )} ${rli.mint!.publicKey}`}
\n \n }\n secondary={fromLabel}\n />\n {open ? : }\n
\n \n {rli.vendor === undefined ? (\n \n ) : (\n \n )}\n \n \n );\n}\n\ntype RewardListItemDetailsProps = {\n vendor: ProgramAccount;\n};\n\nfunction RewardListItemDetails(props: RewardListItemDetailsProps) {\n let { vendor } = props;\n const { registryClient } = useWallet();\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n const { vendorMint, registrar } = useSelector((state: StoreState) => {\n return {\n registrar: state.registry.registrar,\n vendorMint: state.accounts[vendor.account.mint.toString()],\n };\n });\n const [\n expiryReceiverToken,\n setExpiryReceiverToken,\n ] = useState(null);\n const expire = async () => {\n enqueueSnackbar('Expiring reward', {\n variant: 'info',\n });\n const vendorSigner = await PublicKey.createProgramAddress(\n [\n registrar.toBuffer(),\n vendor.publicKey.toBuffer(),\n Buffer.from([vendor.account.nonce]),\n ],\n registryClient.programId,\n );\n\n const tx = await registryClient.rpc.expireReward({\n accounts: {\n registrar,\n vendor: vendor.publicKey,\n vault: vendor.account.vault,\n vendorSigner,\n expiryReceiver: vendor.account.expiryReceiver,\n expiryReceiverToken,\n tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,\n clock: SYSVAR_CLOCK_PUBKEY,\n },\n });\n closeSnackbar();\n enqueueSnackbar(`Reward expired`, {\n variant: 'success',\n action: ,\n });\n };\n return (\n \n
Vendor
\n
    \n
  • Address {vendor.publicKey.toString()}
  • \n
  • Vault: {vendor.account.vault.toString()}
  • \n
  • Mint: {vendor.account.mint.toString()}
  • \n
  • \n Pool token supply snapshot:{' '}\n {vendor.account.poolTokenSupply.toString()}\n
  • \n
  • \n Expiry:{' '}\n {new Date(\n vendor.account.expiryTs.toNumber() * 1000,\n ).toLocaleDateString()}\n {` (${vendor.account.expiryTs.toNumber()})`}\n
  • \n
  • Expiry receiver: {vendor.account.expiryReceiver.toString()}
  • \n
  • Expired: {vendor.account.expired.toString()}
  • \n
  • \n Reward queue cursor: {vendor.account.rewardEventQCursor.toString()}\n
  • \n
\n {(vendor.account.expiryTs.toNumber() <= Date.now()/1000) && registryClient.provider.wallet.publicKey.equals(vendor.account.expiryReceiver) && (\n
\n \n Expire\n \n
\n {\n setExpiryReceiverToken(f);\n }}\n />\n
\n
\n )}\n \n );\n}\n\nexport class RewardListItemViewModel {\n constructor(\n readonly reward: any,\n readonly cursor: number,\n readonly needsClaim: boolean,\n readonly mint: ProgramAccount,\n readonly vendor: ProgramAccount,\n ) {}\n\n static fromMessage(ctx: Context, event: any): RewardListItemViewModel | null {\n let needsClaim = false;\n\n const vendor = ctx.accounts[event.vendor.toString()];\n\n if (vendor === undefined) {\n return null;\n }\n\n const mint = {\n publicKey: vendor.mint,\n account: ctx.accounts[vendor.mint.toString()],\n };\n\n if (ctx.member !== undefined) {\n // Must own shares of the reward's target pool.\n const sptAccount =\n ctx.accounts[ctx.member.account.balances.spt.toString()];\n const lockedSptAccount =\n ctx.accounts[ctx.member.account.balancesLocked.spt.toString()];\n\n const ownsPoolShares = sptAccount.amount + lockedSptAccount.amount > 0;\n\n // Must not have claimed the reward yet.\n const notYetClaimed =\n vendor.rewardEventQCursor >= ctx.member.account.rewardsCursor;\n\n // Must have staked before the reward was dropped.\n const isEligible = ctx.member.account.lastStakeTs < vendor.startTs;\n\n // Must not have let the reward expire.\n const expired = vendor.expired;\n\n needsClaim = ownsPoolShares && notYetClaimed && isEligible && !expired;\n }\n\n const vendorProgramAccount = {\n publicKey: event.vendor,\n account: vendor,\n };\n\n return new RewardListItemViewModel(\n event,\n vendor.rewardEventQCursor,\n needsClaim,\n mint,\n vendorProgramAccount,\n );\n }\n}\n\ntype Context = {\n accounts: any;\n rewardEventQueue: ProgramAccount;\n member?: ProgramAccount;\n network: Network;\n};\n","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router';\nimport { useSnackbar } from 'notistack';\nimport { encode as encodeBase64 } from 'js-base64';\nimport Container from '@material-ui/core/Container';\nimport AppBar from '@material-ui/core/AppBar';\nimport GavelIcon from '@material-ui/icons/Gavel';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport Paper from '@material-ui/core/Paper';\nimport SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount';\nimport CheckIcon from '@material-ui/icons/Check';\nimport ReceiptIcon from '@material-ui/icons/Receipt';\nimport RemoveIcon from '@material-ui/icons/Remove';\nimport Collapse from '@material-ui/core/Collapse';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport InfoIcon from '@material-ui/icons/Info';\nimport Table from '@material-ui/core/Table';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\nimport BuildIcon from '@material-ui/icons/Build';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Typography from '@material-ui/core/Typography';\nimport Card from '@material-ui/core/Card';\nimport ExpandLess from '@material-ui/icons/ExpandLess';\nimport ExpandMore from '@material-ui/icons/ExpandMore';\nimport CardContent from '@material-ui/core/CardContent';\nimport TextField from '@material-ui/core/TextField';\nimport IconButton from '@material-ui/core/IconButton';\nimport Button from '@material-ui/core/Button';\nimport SearchIcon from '@material-ui/icons/Search';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport AddIcon from '@material-ui/icons/Add';\nimport List from '@material-ui/core/List';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport BN from 'bn.js';\nimport {\n Account,\n PublicKey,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n} from '@solana/web3.js';\nimport * as anchor from '@project-serum/anchor';\nimport { useWallet } from '../common/WalletProvider';\nimport { ViewTransactionOnExplorerButton } from '../common/Notification';\nimport * as idl from '../../utils/idl';\n\nexport default function Multisig({ multisig }: { multisig?: PublicKey }) {\n const history = useHistory();\n const [multisigAddress, setMultisigAddress] = useState('');\n const disabled = !isValidPubkey(multisigAddress);\n const searchFn = () => {\n history.push(`/multisig/${multisigAddress}`);\n };\n return (\n
\n \n setMultisigAddress(e.target.value as string)}\n onKeyPress={e => {\n if (e.key === 'Enter') {\n searchFn();\n }\n }}\n />\n \n \n \n \n
\n
{multisig && }
\n \n );\n}\n\nfunction isValidPubkey(addr: string): boolean {\n try {\n new PublicKey(addr);\n return true;\n } catch (_) {\n return false;\n }\n}\n\nexport function MultisigInstance({ multisig }: { multisig: PublicKey }) {\n const { multisigClient } = useWallet();\n const [multisigAccount, setMultisigAccount] = useState(undefined);\n const [transactions, setTransactions] = useState(null);\n const [showSignerDialog, setShowSignerDialog] = useState(false);\n const [showAddTransactionDialog, setShowAddTransactionDialog] = useState(\n false,\n );\n const [forceRefresh, setForceRefresh] = useState(false);\n useEffect(() => {\n multisigClient.account\n .multisig(multisig)\n .then((account: any) => {\n setMultisigAccount(account);\n })\n .catch((err: any) => {\n console.error(err);\n setMultisigAccount(null);\n });\n }, [multisig, multisigClient.account]);\n useEffect(() => {\n multisigClient.account.transaction.all(multisig.toBuffer()).then(txs => {\n setTransactions(txs);\n });\n }, [multisigClient.account.transaction, multisig, forceRefresh]);\n useEffect(() => {\n multisigClient.account.multisig\n .subscribe(multisig)\n .on('change', account => {\n setMultisigAccount(account);\n });\n }, [multisigClient, multisig]);\n return (\n \n
\n \n {multisigAccount === undefined ? (\n
\n \n
\n ) : multisigAccount === null ? (\n \n \n Multisig not found\n \n \n ) : (\n <>\n )}\n
\n {multisigAccount && (\n \n \n \n \n {multisig.toString()} | {multisigAccount.threshold.toString()}{' '}\n of {multisigAccount.owners.length.toString()} Multisig\n \n \n setShowSignerDialog(true)}>\n \n \n \n \n setShowAddTransactionDialog(true)}>\n \n \n \n \n \n \n {transactions === null ? (\n
\n \n
\n ) : transactions.length === 0 ? (\n \n \n \n ) : (\n transactions.map((tx: any) => (\n \n ))\n )}\n
\n
\n )}\n
\n setShowAddTransactionDialog(false)}\n didAddTransaction={() => setForceRefresh(!forceRefresh)}\n />\n {multisigAccount && (\n setShowSignerDialog(false)}\n />\n )}\n
\n );\n}\n\nfunction NewMultisigButton() {\n const [open, setOpen] = useState(false);\n return (\n
\n setOpen(true)}>\n \n \n setOpen(false)} />\n
\n );\n}\n\nfunction NewMultisigDialog({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const history = useHistory();\n const { multisigClient } = useWallet();\n const { enqueueSnackbar } = useSnackbar();\n const [threshold, setThreshold] = useState(2);\n // @ts-ignore\n const zeroAddr = PublicKey.default.toString();\n const [participants, setParticipants] = useState([\n multisigClient.provider.wallet.publicKey.toString(),\n zeroAddr,\n ]);\n const _onClose = () => {\n onClose();\n setThreshold(2);\n setParticipants([zeroAddr, zeroAddr]);\n };\n const createMultisig = async () => {\n enqueueSnackbar('Creating multisig', {\n variant: 'info',\n });\n const multisig = new Account();\n // Disc. + threshold + nonce.\n const baseSize = 8 + 8 + 1;\n // Can only grow the participant set by 2x the initialized value.\n const ownerSize = participants.length * 2 * 32 + 8;\n const multisigSize = baseSize + ownerSize;\n const [, nonce] = await PublicKey.findProgramAddress(\n [multisig.publicKey.toBuffer()],\n multisigClient.programId,\n );\n const owners = participants.map(p => new PublicKey(p));\n const tx = await multisigClient.rpc.createMultisig(\n owners,\n new BN(threshold),\n nonce,\n {\n accounts: {\n multisig: multisig.publicKey,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [multisig],\n instructions: [\n await multisigClient.account.multisig.createInstruction(\n multisig,\n // @ts-ignore\n multisigSize,\n ),\n ],\n },\n );\n enqueueSnackbar(`Multisig created: ${multisig.publicKey.toString()}`, {\n variant: 'success',\n action: ,\n });\n _onClose();\n history.push(`/multisig/${multisig.publicKey.toString()}`);\n };\n return (\n \n \n \n New Multisig\n \n \n \n setThreshold(parseInt(e.target.value) as number)}\n />\n {participants.map((p, idx) => (\n {\n const p = [...participants];\n p[idx] = e.target.value;\n setParticipants(p);\n }}\n />\n ))}\n
\n {\n const p = [...participants];\n // @ts-ignore\n p.push(new PublicKey().toString());\n setParticipants(p);\n }}\n >\n \n \n
\n
\n \n \n \n createMultisig().catch(err => {\n const str = err ? err.toString() : '';\n enqueueSnackbar(`Error creating multisig: ${str}`, {\n variant: 'error',\n });\n })\n }\n >\n Create\n \n \n
\n );\n}\n\nfunction TxListItem({\n multisig,\n multisigAccount,\n tx,\n}: {\n multisig: PublicKey;\n multisigAccount: any;\n tx: any;\n}) {\n const { enqueueSnackbar } = useSnackbar();\n const { multisigClient } = useWallet();\n const [open, setOpen] = useState(false);\n const [txAccount, setTxAccount] = useState(tx.account);\n useEffect(() => {\n multisigClient.account.transaction\n .subscribe(tx.publicKey)\n .on('change', account => {\n setTxAccount(account);\n });\n }, [multisigClient, multisig, tx.publicKey]);\n const rows = [\n {\n field: 'Program ID',\n value: txAccount.programId.toString(),\n },\n {\n field: 'Did execute',\n value: txAccount.didExecute.toString(),\n },\n {\n field: 'Instruction data',\n value: (\n \n {encodeBase64(txAccount.data)}\n \n ),\n },\n {\n field: 'Multisig',\n value: txAccount.multisig.toString(),\n },\n {\n field: 'Transaction account',\n value: tx.publicKey.toString(),\n },\n {\n field: 'Owner set seqno',\n value: txAccount.ownerSetSeqno.toString(),\n },\n ];\n const msAccountRows = multisigAccount.owners.map(\n (owner: PublicKey, idx: number) => {\n return {\n field: owner.toString(),\n value: txAccount.signers[idx] ? : ,\n };\n },\n );\n const approve = async () => {\n enqueueSnackbar('Approving transaction', {\n variant: 'info',\n });\n await multisigClient.rpc.approve({\n accounts: {\n multisig,\n transaction: tx.publicKey,\n owner: multisigClient.provider.wallet.publicKey,\n },\n });\n enqueueSnackbar('Transaction approved', {\n variant: 'success',\n });\n };\n const execute = async () => {\n enqueueSnackbar('Executing transaction', {\n variant: 'info',\n });\n const [multisigSigner] = await PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n );\n await multisigClient.rpc.executeTransaction({\n accounts: {\n multisig,\n multisigSigner,\n transaction: tx.publicKey,\n },\n remainingAccounts: txAccount.accounts\n .map((t: any) => {\n if (t.pubkey.equals(multisigSigner)) {\n return { ...t, isSigner: false };\n }\n return t;\n })\n .concat({\n pubkey: txAccount.programId,\n isWritable: false,\n isSigner: false,\n }),\n });\n enqueueSnackbar('Transaction executed', {\n variant: 'success',\n });\n };\n return (\n <>\n setOpen(!open)}>\n {icon(tx, multisigClient)}\n {ixLabel(tx, multisigClient)}\n {txAccount.didExecute && (\n \n )}\n {open ? : }\n \n \n
\n
\n \n approve().catch(err => {\n let errStr = '';\n if (err) {\n errStr = err.toString();\n }\n enqueueSnackbar(`Unable to approve transaction: ${errStr}`, {\n variant: 'error',\n });\n })\n }\n >\n Approve\n \n \n execute().catch(err => {\n let errStr = '';\n if (err) {\n errStr = err.toString();\n }\n enqueueSnackbar(`Unable to execute transaction: ${errStr}`, {\n variant: 'error',\n });\n })\n }\n >\n Execute\n \n
\n \n \n \n \n \n Transaction Field\n Value\n \n \n \n {rows.map(r => (\n \n {r.field}\n {r.value}\n \n ))}\n \n
\n
\n
\n \n \n \n \n \n Multisig Owner\n Did Sign\n \n \n \n {txAccount.ownerSetSeqno === multisigAccount.ownerSetSeqno &&\n msAccountRows.map((r: any) => (\n \n {r.field}\n {r.value}\n \n ))}\n \n
\n {txAccount.ownerSetSeqno !== multisigAccount.ownerSetSeqno && (\n
\n \n The owner set has changed since this transaction was created\n \n
\n )}\n
\n
\n \n \n \n \n \n
\n
\n \n );\n}\n\nfunction ixLabel(tx: any, multisigClient: any) {\n if (tx.account.programId.equals(BPF_LOADER_UPGRADEABLE_PID)) {\n // Upgrade instruction.\n if (tx.account.data.equals(Buffer.from([3, 0, 0, 0]))) {\n return (\n \n );\n }\n }\n if (tx.account.programId.equals(multisigClient.programId)) {\n const setThresholdSighash = multisigClient.coder.sighash(\n 'global',\n 'change_threshold',\n );\n if (setThresholdSighash.equals(tx.account.data.slice(0, 8))) {\n return (\n \n );\n }\n const setOwnersSighash = multisigClient.coder.sighash(\n 'global',\n 'set_owners',\n );\n if (setOwnersSighash.equals(tx.account.data.slice(0, 8))) {\n return (\n \n );\n }\n }\n if (idl.IDL_TAG.equals(tx.account.data.slice(0, 8))) {\n return (\n \n );\n }\n return ;\n}\n\nfunction AccountsList({ accounts }: { accounts: any }) {\n return (\n \n \n \n Account\n Writable\n Signer\n \n \n \n {accounts.map((r: any) => (\n \n {r.pubkey.toString()}\n {r.isWritable.toString()}\n {r.isSigner.toString()}\n \n ))}\n \n
\n );\n}\n\nfunction SignerDialog({\n multisig,\n multisigAccount,\n open,\n onClose,\n}: {\n multisig: PublicKey;\n multisigAccount: any;\n open: boolean;\n onClose: () => void;\n}) {\n const { multisigClient } = useWallet();\n const [signer, setSigner] = useState(null);\n useEffect(() => {\n PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n ).then(addrNonce => setSigner(addrNonce[0].toString()));\n }, [multisig, multisigClient.programId, setSigner]);\n return (\n \n \n \n Multisig Info\n \n \n \n \n Program derived address: {signer}. This is the address one\n should use as the authority for data governed by the multisig.\n \n \n \n \n Owners\n \n \n \n {multisigAccount.owners.map((r: any) => (\n \n {r.toString()}\n \n ))}\n \n
\n
\n \n \n \n
\n );\n}\n\nfunction AddTransactionDialog({\n multisig,\n open,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n open: boolean;\n onClose: () => void;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n return (\n \n \n \n New Transaction\n \n \n \n \n Create a new transaction to be signed by the multisig. This\n transaction will not execute until enough owners have signed the\n transaction.\n \n \n \n \n \n \n \n \n \n );\n}\n\nfunction ChangeThresholdListItem({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [open, setOpen] = useState(false);\n return (\n <>\n setOpen(open => !open)}>\n \n \n \n \n {open ? : }\n \n \n \n \n \n );\n}\n\nfunction ChangeThresholdListItemDetails({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [threshold, setThreshold] = useState(2);\n const { multisigClient } = useWallet();\n // @ts-ignore\n const { enqueueSnackbar } = useSnackbar();\n const changeThreshold = async () => {\n enqueueSnackbar('Creating change threshold transaction', {\n variant: 'info',\n });\n const data = changeThresholdData(multisigClient, threshold);\n const [multisigSigner] = await PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n );\n const accounts = [\n {\n pubkey: multisig,\n isWritable: true,\n isSigner: false,\n },\n {\n pubkey: multisigSigner,\n isWritable: false,\n isSigner: true,\n },\n ];\n const transaction = new Account();\n const txSize = 1000; // todo\n const tx = await multisigClient.rpc.createTransaction(\n multisigClient.programId,\n accounts,\n data,\n {\n accounts: {\n multisig,\n transaction: transaction.publicKey,\n proposer: multisigClient.provider.wallet.publicKey,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [transaction],\n instructions: [\n await multisigClient.account.transaction.createInstruction(\n transaction,\n // @ts-ignore\n txSize,\n ),\n ],\n },\n );\n enqueueSnackbar('Transaction created', {\n variant: 'success',\n action: ,\n });\n didAddTransaction(transaction.publicKey);\n onClose();\n };\n return (\n \n {\n // @ts-ignore\n setThreshold(e.target.value);\n }}\n />\n
\n \n
\n \n );\n}\n\nfunction MultisigSetOwnersListItem({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [open, setOpen] = useState(false);\n return (\n <>\n setOpen(open => !open)}>\n \n \n \n \n {open ? : }\n \n \n \n \n \n );\n}\n\nfunction SetOwnersListItemDetails({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const { multisigClient } = useWallet();\n // @ts-ignore\n const zeroAddr = PublicKey.default.toString();\n const [participants, setParticipants] = useState([\n multisigClient.provider.wallet.publicKey.toString(),\n zeroAddr,\n ]);\n const { enqueueSnackbar } = useSnackbar();\n const setOwners = async () => {\n enqueueSnackbar('Creating setOwners transaction', {\n variant: 'info',\n });\n const owners = participants.map(p => new PublicKey(p));\n const data = setOwnersData(multisigClient, owners);\n const [multisigSigner] = await PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n );\n const accounts = [\n {\n pubkey: multisig,\n isWritable: true,\n isSigner: false,\n },\n {\n pubkey: multisigSigner,\n isWritable: false,\n isSigner: true,\n },\n ];\n const transaction = new Account();\n const txSize = 5000; // TODO: tighter bound.\n const tx = await multisigClient.rpc.createTransaction(\n multisigClient.programId,\n accounts,\n data,\n {\n accounts: {\n multisig,\n transaction: transaction.publicKey,\n proposer: multisigClient.provider.wallet.publicKey,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [transaction],\n instructions: [\n await multisigClient.account.transaction.createInstruction(\n transaction,\n // @ts-ignore\n txSize,\n ),\n ],\n },\n );\n enqueueSnackbar('Transaction created', {\n variant: 'success',\n action: ,\n });\n didAddTransaction(transaction.publicKey);\n onClose();\n };\n return (\n \n {participants.map((p, idx) => (\n {\n const p = [...participants];\n p[idx] = e.target.value;\n setParticipants(p);\n }}\n />\n ))}\n
\n {\n const p = [...participants];\n // @ts-ignore\n p.push(new PublicKey().toString());\n setParticipants(p);\n }}\n >\n \n \n
\n \n \n \n \n );\n}\n\nfunction IdlUpgradeListItem({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [open, setOpen] = useState(false);\n return (\n <>\n setOpen(open => !open)}>\n \n \n \n \n {open ? : }\n \n \n \n \n \n );\n}\n\nfunction UpgradeIdlListItemDetails({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [programId, setProgramId] = useState(null);\n const [buffer, setBuffer] = useState(null);\n\n const { multisigClient } = useWallet();\n const { enqueueSnackbar } = useSnackbar();\n const createTransactionAccount = async () => {\n enqueueSnackbar('Creating transaction', {\n variant: 'info',\n });\n const programAddr = new PublicKey(programId as string);\n const bufferAddr = new PublicKey(buffer as string);\n const idlAddr = await anchor.utils.idlAddress(programAddr);\n const [multisigSigner] = await PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n );\n const data = idl.encodeInstruction({ setBuffer: {} });\n const accs = [\n {\n pubkey: bufferAddr,\n isWritable: true,\n isSigner: false,\n },\n { pubkey: idlAddr, isWritable: true, isSigner: false },\n { pubkey: multisigSigner, isWritable: true, isSigner: false },\n ];\n const txSize = 1000; // TODO: tighter bound.\n const transaction = new Account();\n const tx = await multisigClient.rpc.createTransaction(\n programAddr,\n accs,\n data,\n {\n accounts: {\n multisig,\n transaction: transaction.publicKey,\n proposer: multisigClient.provider.wallet.publicKey,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [transaction],\n instructions: [\n await multisigClient.account.transaction.createInstruction(\n transaction,\n // @ts-ignore\n txSize,\n ),\n ],\n },\n );\n enqueueSnackbar('Transaction created', {\n variant: 'success',\n action: ,\n });\n didAddTransaction(transaction.publicKey);\n onClose();\n };\n\n return (\n \n setProgramId(e.target.value as string)}\n />\n setBuffer(e.target.value as string)}\n />\n \n \n \n \n );\n}\n\nfunction ProgramUpdateListItem({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [open, setOpen] = useState(false);\n return (\n <>\n setOpen(open => !open)}>\n \n \n \n \n {open ? : }\n \n \n \n \n \n );\n}\n\nconst BPF_LOADER_UPGRADEABLE_PID = new PublicKey(\n 'BPFLoaderUpgradeab1e11111111111111111111111',\n);\n\nfunction UpgradeProgramListItemDetails({\n multisig,\n onClose,\n didAddTransaction,\n}: {\n multisig: PublicKey;\n onClose: Function;\n didAddTransaction: (tx: PublicKey) => void;\n}) {\n const [programId, setProgramId] = useState(null);\n const [buffer, setBuffer] = useState(null);\n\n const { multisigClient } = useWallet();\n const { enqueueSnackbar } = useSnackbar();\n const createTransactionAccount = async () => {\n enqueueSnackbar('Creating transaction', {\n variant: 'info',\n });\n const programAddr = new PublicKey(programId as string);\n const bufferAddr = new PublicKey(buffer as string);\n // Hard code serialization.\n const data = Buffer.from([3, 0, 0, 0]);\n\n const programAccount = await (async () => {\n const programAccount = await multisigClient.provider.connection.getAccountInfo(\n programAddr,\n );\n if (programAccount === null) {\n throw new Error('Invalid program ID');\n }\n return {\n // Hard code deserialization.\n programdataAddress: new PublicKey(programAccount.data.slice(4)),\n };\n })();\n const spill = multisigClient.provider.wallet.publicKey;\n const [multisigSigner] = await PublicKey.findProgramAddress(\n [multisig.toBuffer()],\n multisigClient.programId,\n );\n const accs = [\n {\n pubkey: programAccount.programdataAddress,\n isWritable: true,\n isSigner: false,\n },\n { pubkey: programAddr, isWritable: true, isSigner: false },\n { pubkey: bufferAddr, isWritable: true, isSigner: false },\n { pubkey: spill, isWritable: true, isSigner: false },\n { pubkey: SYSVAR_RENT_PUBKEY, isWritable: false, isSigner: false },\n { pubkey: SYSVAR_CLOCK_PUBKEY, isWritable: false, isSigner: false },\n { pubkey: multisigSigner, isWritable: false, isSigner: false },\n ];\n const txSize = 1000; // TODO: tighter bound.\n const transaction = new Account();\n const tx = await multisigClient.rpc.createTransaction(\n BPF_LOADER_UPGRADEABLE_PID,\n accs,\n data,\n {\n accounts: {\n multisig,\n transaction: transaction.publicKey,\n proposer: multisigClient.provider.wallet.publicKey,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [transaction],\n instructions: [\n await multisigClient.account.transaction.createInstruction(\n transaction,\n // @ts-ignore\n txSize,\n ),\n ],\n },\n );\n enqueueSnackbar('Transaction created', {\n variant: 'success',\n action: ,\n });\n didAddTransaction(transaction.publicKey);\n onClose();\n };\n\n return (\n \n setProgramId(e.target.value as string)}\n />\n setBuffer(e.target.value as string)}\n />\n \n \n \n \n );\n}\n\n// @ts-ignore\nfunction icon(tx, multisigClient) {\n if (tx.account.programId.equals(BPF_LOADER_UPGRADEABLE_PID)) {\n return ;\n }\n if (tx.account.programId.equals(multisigClient.programId)) {\n const setThresholdSighash = multisigClient.coder.sighash(\n 'global',\n 'change_threshold',\n );\n if (setThresholdSighash.equals(tx.account.data.slice(0, 8))) {\n return ;\n }\n const setOwnersSighash = multisigClient.coder.sighash(\n 'global',\n 'set_owners',\n );\n if (setOwnersSighash.equals(tx.account.data.slice(0, 8))) {\n return ;\n }\n }\n if (idl.IDL_TAG.equals(tx.account.data.slice(0, 8))) {\n return ;\n }\n return ;\n}\n\n// @ts-ignore\nfunction changeThresholdData(multisigClient, threshold) {\n return multisigClient.coder.instruction.encode('change_threshold', {\n threshold: new BN(threshold),\n });\n}\n\n// @ts-ignore\nfunction setOwnersData(multisigClient, owners) {\n return multisigClient.coder.instruction.encode('set_owners', {\n owners,\n });\n}\n","import React, {\n ReactNode,\n PropsWithChildren,\n useContext,\n useState,\n useEffect,\n} from 'react';\nimport BN from 'bn.js';\nimport { PublicKey } from '@solana/web3.js';\nimport { TokenListProvider, TokenInfo } from '@solana/spl-token-registry';\nimport { networks } from '../store/config';\n\nconst TokenListContext = React.createContext({\n tokenMap: new Map(),\n});\n\ntype TokenListContextValues = {\n tokenMap: Map;\n};\n\nexport function useTokenInfos(): Map {\n const { tokenMap } = useContext(TokenListContext);\n return tokenMap;\n}\n\nexport function TokenRegistryProvider(props: PropsWithChildren) {\n const [tokenMap, setTokenMap] = useState>(new Map());\n useEffect(() => {\n new TokenListProvider().resolve().then(tokens => {\n const tokenList = tokens.filterByClusterSlug('mainnet-beta').getList();\n setTokenMap(\n tokenList.reduce((map, item) => {\n map.set(item.address, item);\n return map;\n }, new Map()),\n );\n });\n }, [setTokenMap]);\n\n return (\n \n {props.children}\n \n );\n}\n\nexport function fromDisplay(amount: number, decimals: number): BN {\n return new BN(amount * 10 ** decimals);\n}\n\nexport function toDisplay(amount: BN | number, decimals: number): string {\n if (amount instanceof BN) {\n amount = amount.toNumber();\n }\n return (amount / 10 ** decimals).toString();\n}\n\nexport function toDisplayLabel(mint: PublicKey): string {\n let whitelistedMint = Object.keys(networks.mainnet.mints)\n .filter(label => networks.mainnet.mints[label].equals(mint))\n .pop();\n if (whitelistedMint) {\n return whitelistedMint.toUpperCase();\n }\n return mint.toString();\n}\n","import { Idl } from '@project-serum/anchor';\n\nconst idl: Idl = {\n version: '0.0.0',\n name: 'lockup',\n instructions: [\n {\n name: 'createVesting',\n accounts: [\n {\n name: 'vesting',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositorAuthority',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'beneficiary',\n type: 'publicKey',\n },\n {\n name: 'depositAmount',\n type: 'u64',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'startTs',\n type: 'i64',\n },\n {\n name: 'endTs',\n type: 'i64',\n },\n {\n name: 'periodCount',\n type: 'u64',\n },\n {\n name: 'realizor',\n type: {\n option: {\n defined: 'Realizor',\n },\n },\n },\n ],\n },\n {\n name: 'withdraw',\n accounts: [\n {\n name: 'vesting',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vestingSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'token',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'whitelistWithdraw',\n accounts: [\n {\n name: 'transfer',\n accounts: [\n {\n name: 'lockup',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'whitelistedProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vesting',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vestingSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'whitelistedProgramVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'whitelistedProgramVaultAuthority',\n isMut: false,\n isSigner: false,\n },\n ],\n },\n ],\n args: [\n {\n name: 'instructionData',\n type: 'bytes',\n },\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'whitelistDeposit',\n accounts: [\n {\n name: 'transfer',\n accounts: [\n {\n name: 'lockup',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'whitelistedProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vesting',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vestingSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'whitelistedProgramVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'whitelistedProgramVaultAuthority',\n isMut: false,\n isSigner: false,\n },\n ],\n },\n ],\n args: [\n {\n name: 'instructionData',\n type: 'bytes',\n },\n ],\n },\n {\n name: 'availableForWithdrawal',\n accounts: [\n {\n name: 'vesting',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n ],\n state: {\n struct: {\n name: 'Lockup',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'authority',\n type: 'publicKey',\n },\n {\n name: 'whitelist',\n type: {\n vec: {\n defined: 'WhitelistEntry',\n },\n },\n },\n ],\n },\n },\n methods: [\n {\n name: 'new',\n accounts: [\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [],\n },\n {\n name: 'whitelistAdd',\n accounts: [\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'entry',\n type: {\n defined: 'WhitelistEntry',\n },\n },\n ],\n },\n {\n name: 'whitelistDelete',\n accounts: [\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'entry',\n type: {\n defined: 'WhitelistEntry',\n },\n },\n ],\n },\n {\n name: 'setAuthority',\n accounts: [\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'newAuthority',\n type: 'publicKey',\n },\n ],\n },\n ],\n },\n accounts: [\n {\n name: 'Vesting',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'beneficiary',\n type: 'publicKey',\n },\n {\n name: 'mint',\n type: 'publicKey',\n },\n {\n name: 'vault',\n type: 'publicKey',\n },\n {\n name: 'grantor',\n type: 'publicKey',\n },\n {\n name: 'outstanding',\n type: 'u64',\n },\n {\n name: 'startBalance',\n type: 'u64',\n },\n {\n name: 'createdTs',\n type: 'i64',\n },\n {\n name: 'startTs',\n type: 'i64',\n },\n {\n name: 'endTs',\n type: 'i64',\n },\n {\n name: 'periodCount',\n type: 'u64',\n },\n {\n name: 'whitelistOwned',\n type: 'u64',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'realizor',\n type: {\n option: {\n defined: 'Realizor',\n },\n },\n },\n ],\n },\n },\n ],\n types: [\n {\n name: 'Realizor',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'program',\n type: 'publicKey',\n },\n {\n name: 'metadata',\n type: 'publicKey',\n },\n ],\n },\n },\n {\n name: 'WhitelistEntry',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'programId',\n type: 'publicKey',\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 100,\n name: 'InvalidTimestamp',\n msg: 'Vesting end must be greater than the current unix timestamp.',\n },\n {\n code: 101,\n name: 'InvalidPeriod',\n msg: 'The number of vesting periods must be greater than zero.',\n },\n {\n code: 102,\n name: 'InvalidDepositAmount',\n msg: 'The vesting deposit amount must be greater than zero.',\n },\n {\n code: 103,\n name: 'InvalidWhitelistEntry',\n msg: 'The Whitelist entry is not a valid program address.',\n },\n {\n code: 104,\n name: 'InvalidProgramAddress',\n msg: 'Invalid program address. Did you provide the correct nonce?',\n },\n {\n code: 105,\n name: 'InvalidVaultOwner',\n msg: 'Invalid vault owner.',\n },\n {\n code: 106,\n name: 'InvalidVaultAmount',\n msg: 'Vault amount must be zero.',\n },\n {\n code: 107,\n name: 'InsufficientWithdrawalBalance',\n msg: 'Insufficient withdrawal balance.',\n },\n {\n code: 108,\n name: 'WhitelistFull',\n msg: 'Whitelist is full',\n },\n {\n code: 109,\n name: 'WhitelistEntryAlreadyExists',\n msg: 'Whitelist entry already exists',\n },\n {\n code: 110,\n name: 'InsufficientWhitelistDepositAmount',\n msg: 'Balance must go up when performing a whitelist deposit',\n },\n {\n code: 111,\n name: 'WhitelistDepositOverflow',\n msg: 'Cannot deposit more than withdrawn',\n },\n {\n code: 112,\n name: 'WhitelistWithdrawLimit',\n msg: 'Tried to withdraw over the specified limit',\n },\n {\n code: 113,\n name: 'WhitelistEntryNotFound',\n msg: 'Whitelist entry not found.',\n },\n {\n code: 114,\n name: 'Unauthorized',\n msg: 'You do not have sufficient permissions to perform this action.',\n },\n {\n code: 115,\n name: 'UnableToWithdrawWhileStaked',\n msg: 'You are unable to realize projected rewards until unstaking.',\n },\n {\n code: 116,\n name: 'InvalidLockRealizor',\n msg: \"The given lock realizor doesn't match the vesting account.\",\n },\n {\n code: 117,\n name: 'UnrealizedVesting',\n msg: 'You have not realized this vesting account.',\n },\n {\n code: 118,\n name: 'InvalidSchedule',\n msg: 'Invalid vesting schedule given.',\n },\n ],\n};\n\nexport default idl;\n","import { Idl } from '@project-serum/anchor';\n\nconst idl: Idl = {\n version: '0.0.0',\n name: 'registry',\n instructions: [\n {\n name: 'initialize',\n accounts: [\n {\n name: 'registrar',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'rewardEventQ',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'poolMint',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'mint',\n type: 'publicKey',\n },\n {\n name: 'authority',\n type: 'publicKey',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'withdrawalTimelock',\n type: 'i64',\n },\n {\n name: 'stakeRate',\n type: 'u64',\n },\n {\n name: 'rewardQLen',\n type: 'u32',\n },\n ],\n },\n {\n name: 'updateRegistrar',\n accounts: [\n {\n name: 'registrar',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'newAuthority',\n type: {\n option: 'publicKey',\n },\n },\n {\n name: 'withdrawalTimelock',\n type: {\n option: 'i64',\n },\n },\n ],\n },\n {\n name: 'createMember',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'balances',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'balancesLocked',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'nonce',\n type: 'u8',\n },\n ],\n },\n {\n name: 'updateMember',\n accounts: [\n {\n name: 'member',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'metadata',\n type: {\n option: 'publicKey',\n },\n },\n ],\n },\n {\n name: 'deposit',\n accounts: [\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositorAuthority',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'depositLocked',\n accounts: [\n {\n name: 'vesting',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vestingVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositorAuthority',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'memberVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'registry',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'stake',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rewardEventQ',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'poolMint',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'balances',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'balancesLocked',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'registrarSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'sptAmount',\n type: 'u64',\n },\n {\n name: 'locked',\n type: 'bool',\n },\n ],\n },\n {\n name: 'startUnstake',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rewardEventQ',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'poolMint',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'pendingWithdrawal',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'balances',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'balancesLocked',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'sptAmount',\n type: 'u64',\n },\n {\n name: 'locked',\n type: 'bool',\n },\n ],\n },\n {\n name: 'endUnstake',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'pendingWithdrawal',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: 'withdraw',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'depositor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'withdrawLocked',\n accounts: [\n {\n name: 'vesting',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vestingVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vestingSigner',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'memberVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'memberSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'registry',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'amount',\n type: 'u64',\n },\n ],\n },\n {\n name: 'dropReward',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rewardEventQ',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'poolMint',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vendor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vendorVault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'depositorAuthority',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'kind',\n type: {\n defined: 'RewardVendorKind',\n },\n },\n {\n name: 'total',\n type: 'u64',\n },\n {\n name: 'expiryTs',\n type: 'i64',\n },\n {\n name: 'expiryReceiver',\n type: 'publicKey',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n ],\n },\n {\n name: 'claimReward',\n accounts: [\n {\n name: 'cmn',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'balances',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'balancesLocked',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'vendor',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vendorSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n },\n {\n name: 'to',\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: 'claimRewardLocked',\n accounts: [\n {\n name: 'cmn',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'member',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'beneficiary',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'balances',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'balancesLocked',\n accounts: [\n {\n name: 'spt',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultStake',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vaultPw',\n isMut: true,\n isSigner: false,\n },\n ],\n },\n {\n name: 'vendor',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vendorSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n },\n {\n name: 'registry',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'lockupProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'nonce',\n type: 'u8',\n },\n ],\n },\n {\n name: 'expireReward',\n accounts: [\n {\n name: 'registrar',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'vendor',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vault',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'vendorSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'expiryReceiver',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'expiryReceiverToken',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'tokenProgram',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'clock',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n ],\n state: {\n struct: {\n name: 'Registry',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'lockupProgram',\n type: 'publicKey',\n },\n ],\n },\n },\n methods: [\n {\n name: 'new',\n accounts: [\n {\n name: 'lockupProgram',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: 'setLockupProgram',\n accounts: [\n {\n name: 'authority',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'lockupProgram',\n type: 'publicKey',\n },\n ],\n },\n ],\n },\n accounts: [\n {\n name: 'Registrar',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'authority',\n type: 'publicKey',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'withdrawalTimelock',\n type: 'i64',\n },\n {\n name: 'rewardEventQ',\n type: 'publicKey',\n },\n {\n name: 'mint',\n type: 'publicKey',\n },\n {\n name: 'poolMint',\n type: 'publicKey',\n },\n {\n name: 'stakeRate',\n type: 'u64',\n },\n ],\n },\n },\n {\n name: 'Member',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'registrar',\n type: 'publicKey',\n },\n {\n name: 'beneficiary',\n type: 'publicKey',\n },\n {\n name: 'metadata',\n type: 'publicKey',\n },\n {\n name: 'balances',\n type: {\n defined: 'BalanceSandbox',\n },\n },\n {\n name: 'balancesLocked',\n type: {\n defined: 'BalanceSandbox',\n },\n },\n {\n name: 'rewardsCursor',\n type: 'u32',\n },\n {\n name: 'lastStakeTs',\n type: 'i64',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n ],\n },\n },\n {\n name: 'PendingWithdrawal',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'registrar',\n type: 'publicKey',\n },\n {\n name: 'member',\n type: 'publicKey',\n },\n {\n name: 'burned',\n type: 'bool',\n },\n {\n name: 'pool',\n type: 'publicKey',\n },\n {\n name: 'startTs',\n type: 'i64',\n },\n {\n name: 'endTs',\n type: 'i64',\n },\n {\n name: 'amount',\n type: 'u64',\n },\n {\n name: 'locked',\n type: 'bool',\n },\n ],\n },\n },\n {\n name: 'RewardQueue',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'head',\n type: 'u32',\n },\n {\n name: 'tail',\n type: 'u32',\n },\n {\n name: 'events',\n type: {\n vec: {\n defined: 'RewardEvent',\n },\n },\n },\n ],\n },\n },\n {\n name: 'RewardVendor',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'registrar',\n type: 'publicKey',\n },\n {\n name: 'vault',\n type: 'publicKey',\n },\n {\n name: 'mint',\n type: 'publicKey',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'poolTokenSupply',\n type: 'u64',\n },\n {\n name: 'rewardEventQCursor',\n type: 'u32',\n },\n {\n name: 'startTs',\n type: 'i64',\n },\n {\n name: 'expiryTs',\n type: 'i64',\n },\n {\n name: 'expiryReceiver',\n type: 'publicKey',\n },\n {\n name: 'from',\n type: 'publicKey',\n },\n {\n name: 'total',\n type: 'u64',\n },\n {\n name: 'expired',\n type: 'bool',\n },\n {\n name: 'kind',\n type: {\n defined: 'RewardVendorKind',\n },\n },\n ],\n },\n },\n ],\n types: [\n {\n name: 'BalanceSandbox',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'spt',\n type: 'publicKey',\n },\n {\n name: 'vault',\n type: 'publicKey',\n },\n {\n name: 'vaultStake',\n type: 'publicKey',\n },\n {\n name: 'vaultPw',\n type: 'publicKey',\n },\n ],\n },\n },\n {\n name: 'RewardEvent',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'vendor',\n type: 'publicKey',\n },\n {\n name: 'ts',\n type: 'i64',\n },\n {\n name: 'locked',\n type: 'bool',\n },\n ],\n },\n },\n {\n name: 'RewardVendorKind',\n type: {\n kind: 'enum',\n variants: [\n {\n name: 'Unlocked',\n },\n {\n name: 'Locked',\n fields: [\n {\n name: 'start_ts',\n type: 'i64',\n },\n {\n name: 'end_ts',\n type: 'i64',\n },\n {\n name: 'period_count',\n type: 'u64',\n },\n ],\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 100,\n name: 'RewardQAlreadyInitialized',\n msg: 'The given reward queue has already been initialized.',\n },\n {\n code: 101,\n name: 'InvalidNonce',\n msg: \"The nonce given doesn't derive a valid program address.\",\n },\n {\n code: 102,\n name: 'InvalidPoolMintAuthority',\n msg: 'Invalid pool mint authority',\n },\n {\n code: 103,\n name: 'InvalidMemberSigner',\n msg: \"Member signer doesn't match the derived address.\",\n },\n {\n code: 104,\n name: 'InvalidVaultDeposit',\n msg: 'The given vault owner must match the signing depositor.',\n },\n {\n code: 105,\n name: 'InvalidDepositor',\n msg: \"The signing depositor doesn't match either of the balance accounts\",\n },\n {\n code: 106,\n name: 'InvalidVault',\n msg: 'The vault given does not match the vault expected.',\n },\n {\n code: 107,\n name: 'InvalidVaultOwner',\n msg: 'Invalid vault owner.',\n },\n {\n code: 108,\n name: 'Unknown',\n msg: 'An unknown error has occured.',\n },\n {\n code: 109,\n name: 'UnstakeTimelock',\n msg: 'The unstake timelock has not yet expired.',\n },\n {\n code: 110,\n name: 'InsufficientReward',\n msg: 'Reward vendors must have at least one token unit per pool token',\n },\n {\n code: 111,\n name: 'InvalidExpiry',\n msg: 'Reward expiry must be after the current clock timestamp.',\n },\n {\n code: 112,\n name: 'VendorExpired',\n msg: 'The reward vendor has been expired.',\n },\n {\n code: 113,\n name: 'CursorAlreadyProcessed',\n msg: 'This reward has already been processed.',\n },\n {\n code: 114,\n name: 'NotStakedDuringDrop',\n msg: 'The account was not staked at the time of this reward.',\n },\n {\n code: 115,\n name: 'VendorNotYetExpired',\n msg: 'The vendor is not yet eligible for expiry.',\n },\n {\n code: 116,\n name: 'RewardsNeedsProcessing',\n msg: 'Please collect your reward before otherwise using the program.',\n },\n {\n code: 117,\n name: 'ExpectedLockedVendor',\n msg: 'Locked reward vendor expected but an unlocked vendor was given.',\n },\n {\n code: 118,\n name: 'ExpectedUnlockedVendor',\n msg: 'Unlocked reward vendor expected but a locked vendor was given.',\n },\n {\n code: 119,\n name: 'InvalidVestingSigner',\n msg: 'Locked deposit from an invalid deposit authority.',\n },\n {\n code: 120,\n name: 'UnrealizedReward',\n msg: 'Locked rewards cannot be realized until one unstaked all tokens.',\n },\n {\n code: 121,\n name: 'InvalidBeneficiary',\n msg: \"The beneficiary doesn't match.\",\n },\n {\n code: 122,\n name: 'InvalidRealizorMetadata',\n msg: 'The given member account does not match the realizor metadata.',\n },\n {\n code: 123,\n name: 'InvalidVestingSchedule',\n msg: 'Invalid vesting schedule for the locked reward.',\n },\n {\n code: 124,\n name: 'InvalidProgramAuthority',\n msg: 'Please specify the correct authority for this program.',\n },\n ],\n};\n\nexport default idl;\n","import { Idl } from '@project-serum/anchor';\n\nconst idl: Idl = {\n version: '0.0.0',\n name: 'multisig',\n instructions: [\n {\n name: 'createMultisig',\n accounts: [\n {\n name: 'multisig',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'owners',\n type: {\n vec: 'publicKey',\n },\n },\n {\n name: 'threshold',\n type: 'u64',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n ],\n },\n {\n name: 'createTransaction',\n accounts: [\n {\n name: 'multisig',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'transaction',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'proposer',\n isMut: false,\n isSigner: true,\n },\n {\n name: 'rent',\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: 'pid',\n type: 'publicKey',\n },\n {\n name: 'accs',\n type: {\n vec: {\n defined: 'TransactionAccount',\n },\n },\n },\n {\n name: 'data',\n type: 'bytes',\n },\n ],\n },\n {\n name: 'approve',\n accounts: [\n {\n name: 'multisig',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'transaction',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'owner',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [],\n },\n {\n name: 'setOwners',\n accounts: [\n {\n name: 'multisig',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'multisigSigner',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'owners',\n type: {\n vec: 'publicKey',\n },\n },\n ],\n },\n {\n name: 'changeThreshold',\n accounts: [\n {\n name: 'multisig',\n isMut: true,\n isSigner: false,\n },\n {\n name: 'multisigSigner',\n isMut: false,\n isSigner: true,\n },\n ],\n args: [\n {\n name: 'threshold',\n type: 'u64',\n },\n ],\n },\n {\n name: 'executeTransaction',\n accounts: [\n {\n name: 'multisig',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'multisigSigner',\n isMut: false,\n isSigner: false,\n },\n {\n name: 'transaction',\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n ],\n accounts: [\n {\n name: 'Multisig',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'owners',\n type: {\n vec: 'publicKey',\n },\n },\n {\n name: 'threshold',\n type: 'u64',\n },\n {\n name: 'nonce',\n type: 'u8',\n },\n {\n name: 'ownerSetSeqno',\n type: 'u32',\n },\n ],\n },\n },\n {\n name: 'Transaction',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'multisig',\n type: 'publicKey',\n },\n {\n name: 'programId',\n type: 'publicKey',\n },\n {\n name: 'accounts',\n type: {\n vec: {\n defined: 'TransactionAccount',\n },\n },\n },\n {\n name: 'data',\n type: 'bytes',\n },\n {\n name: 'signers',\n type: {\n vec: 'bool',\n },\n },\n {\n name: 'didExecute',\n type: 'bool',\n },\n {\n name: 'ownerSetSeqno',\n type: 'u32',\n },\n ],\n },\n },\n ],\n types: [\n {\n name: 'TransactionAccount',\n type: {\n kind: 'struct',\n fields: [\n {\n name: 'pubkey',\n type: 'publicKey',\n },\n {\n name: 'isSigner',\n type: 'bool',\n },\n {\n name: 'isWritable',\n type: 'bool',\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 100,\n name: 'InvalidOwner',\n msg: 'The given owner is not part of this multisig.',\n },\n {\n code: 101,\n name: 'NotEnoughSigners',\n msg: 'Not enough owners signed this transaction.',\n },\n {\n code: 102,\n name: 'TransactionAlreadySigned',\n msg: 'Cannot delete a transaction that has been signed by an owner.',\n },\n {\n code: 103,\n name: 'Overflow',\n msg: 'Overflow when adding.',\n },\n {\n code: 104,\n name: 'UnableToDelete',\n msg: 'Cannot delete a transaction the owner did not create.',\n },\n {\n code: 105,\n name: 'AlreadyExecuted',\n msg: 'The given transaction has already been executed.',\n },\n {\n code: 106,\n name: 'InvalidThreshold',\n msg: 'Threshold must be less than or equal to the number of owners.',\n },\n ],\n};\n\nexport default idl;\n","import React, {\n PropsWithChildren,\n ReactElement,\n ReactNode,\n useMemo,\n useContext,\n} from \"react\";\nimport { useSelector } from \"react-redux\";\nimport {\n PublicKey,\n Transaction,\n Connection,\n ConfirmOptions,\n} from \"@solana/web3.js\";\nimport { Provider } from \"@project-serum/common\";\nimport { Program } from \"@project-serum/anchor\";\nimport { WalletProvider as SolanaWalletProvider } from \"@solana/wallet-adapter-react\";\nimport {\n getPhantomWallet,\n getSolflareWallet,\n getSolletWallet,\n} from \"@solana/wallet-adapter-wallets\";\nimport { State as StoreState } from \"../../store/reducer\";\nimport LockupIdl from \"../../idl/lockup\";\nimport RegistryIdl from \"../../idl/registry\";\nimport MultisigIdl from \"../../idl/multisig\";\nimport { useWallet as useSolana } from \"@solana/wallet-adapter-react\";\nimport { WalletAdapter } from \"@solana/wallet-adapter-base\";\n\nexport function useWallet(): WalletContextValues {\n const w = useContext(WalletContext);\n if (!w) {\n throw new Error(\"Missing wallet context\");\n }\n return w;\n}\n\nconst WalletContext = React.createContext(null);\n\ntype WalletContextValues = {\n wallet: Wallet;\n lockupClient: Program;\n registryClient: Program;\n\tmultisigClient: Program;\n};\n\nexport default function WalletProvider(\n props: PropsWithChildren\n): ReactElement {\n const wallets = useMemo(\n () => [getPhantomWallet(), getSolflareWallet(), getSolletWallet()],\n []\n );\n\n return (\n \n \n \n );\n}\n\nfunction WalletProviderInner(props: PropsWithChildren) {\n const { wallet: solWallet } = useSolana();\n const { walletProvider, network } = useSelector((state: StoreState) => {\n return {\n walletProvider: state.common.walletProvider,\n network: state.common.network,\n };\n });\n const { wallet, lockupClient, registryClient, multisigClient } =\n useMemo(() => {\n const opts: ConfirmOptions = {\n preflightCommitment: \"recent\",\n commitment: \"recent\",\n };\n const connection = new Connection(network.url, opts.preflightCommitment);\n const wallet = new Wallet(solWallet ? solWallet.adapter() : undefined);\n // @ts-ignore\n const provider = new Provider(connection, wallet, opts);\n\n const lockupClient = new Program(\n LockupIdl,\n network.lockupProgramId,\n provider\n );\n const registryClient = new Program(\n RegistryIdl,\n network.registryProgramId,\n provider\n );\n const multisigClient = new Program(\n MultisigIdl,\n network.multisigProgramId,\n provider,\n );\n return {\n wallet,\n lockupClient,\n registryClient,\n multisigClient,\n };\n }, [solWallet, walletProvider, network]);\n\n return (\n \n {props.children}\n \n );\n}\n\nclass Wallet {\n get publicKey(): PublicKey | undefined {\n // @ts-ignore\n return this.adapter ? this.adapter.publicKey : undefined;\n }\n\n constructor(readonly adapter: WalletAdapter | undefined) {}\n\n on(event: any, cb: any) {\n if (this.adapter) {\n return this.adapter.on(event, cb);\n }\n }\n\n async connect() {\n if (this.adapter) {\n try {\n await this.adapter.connect();\n } catch (err) {\n console.error(err);\n }\n }\n }\n\n disconnect() {\n if (this.adapter) {\n this.adapter.disconnect();\n }\n }\n\n signTransaction(tx: Transaction) {\n if (this.adapter) {\n return this.adapter.signTransaction(tx);\n }\n }\n\n signAllTransactions(txs: Transaction[]) {\n if (this.adapter) {\n return this.adapter.signAllTransactions(txs);\n }\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport BN from 'bn.js';\nimport { useSnackbar } from 'notistack';\nimport {\n Account,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n} from '@solana/web3.js';\nimport Table from '@material-ui/core/Table';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\nimport Button from '@material-ui/core/Button';\nimport TextField from '@material-ui/core/TextField';\nimport IconButton from '@material-ui/core/IconButton';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport FormControl from '@material-ui/core/FormControl';\nimport Typography from '@material-ui/core/Typography';\nimport { u64 } from '@solana/spl-token';\nimport { TokenInstructions } from '@project-serum/serum';\nimport { useWallet } from '../components/common/WalletProvider';\nimport { ViewTransactionOnExplorerButton } from '../components/common/Notification';\nimport { State as StoreState, ProgramAccount } from '../store/reducer';\nimport { ActionType } from '../store/actions';\nimport * as skin from '../skin';\nimport { toDisplay, toDisplayLabel } from '../utils/tokens';\nimport { memberSigner, registrarSigner } from '../utils/registry';\n\nexport default function Stake() {\n const { registryClient } = useWallet();\n const dispatch = useDispatch();\n const { member, memberAccount, registrarAccount, registrar } = useSelector(\n (state: StoreState) => {\n const registrarAccount =\n state.accounts[state.registry.registrar.toString()];\n return {\n member: state.registry.member,\n memberAccount: state.registry.member\n ? state.accounts[state.registry.member.toString()]\n : undefined,\n registrarAccount: registrarAccount,\n registrar: state.registry.registrar,\n };\n },\n );\n\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n\n const createPoolTokens = async (amount: number, isLocked: boolean) => {\n enqueueSnackbar(\n `Staking ${toDisplayLabel(registrarAccount.poolMint)} Pool tokens`,\n {\n variant: 'info',\n },\n );\n\n const tx = await registryClient.rpc.stake(new u64(amount), isLocked, {\n accounts: {\n registrar,\n rewardEventQ: registrarAccount.rewardEventQ,\n poolMint: registrarAccount.poolMint,\n member,\n beneficiary: registryClient.provider.wallet.publicKey,\n balances: memberAccount.balances,\n balancesLocked: memberAccount.balancesLocked,\n memberSigner: (\n await memberSigner(registryClient.programId, registrar, member!)\n ).publicKey,\n registrarSigner: (\n await registrarSigner(registryClient.programId, registrar)\n ).publicKey,\n clock: SYSVAR_CLOCK_PUBKEY,\n tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,\n },\n });\n closeSnackbar();\n enqueueSnackbar(`Staking complete`, {\n variant: 'success',\n action: ,\n });\n };\n\n const redeemPoolTokens = async (amount: number, isLocked: boolean) => {\n enqueueSnackbar(\n `Unstaking ${amount} ${toDisplayLabel(\n registrarAccount.poolMint,\n )} Pool tokens`,\n {\n variant: 'info',\n },\n );\n\n const pendingWithdrawal = new Account();\n const tx = await registryClient.rpc.startUnstake(\n new u64(amount),\n isLocked,\n {\n accounts: {\n registrar,\n rewardEventQ: registrarAccount.rewardEventQ,\n poolMint: registrarAccount.poolMint,\n\n pendingWithdrawal: pendingWithdrawal.publicKey,\n member,\n beneficiary: registryClient.provider.wallet.publicKey,\n balances: memberAccount.balances,\n balancesLocked: memberAccount.balancesLocked,\n\n memberSigner: (\n await memberSigner(registryClient.programId, registrar, member!)\n ).publicKey,\n\n tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,\n clock: SYSVAR_CLOCK_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n },\n signers: [pendingWithdrawal],\n instructions: [\n await registryClient.account.pendingWithdrawal.createInstruction(\n pendingWithdrawal,\n ),\n ],\n },\n );\n const pwAccount = await registryClient.account.pendingWithdrawal(\n pendingWithdrawal.publicKey,\n );\n dispatch({\n type: ActionType.RegistryCreatePendingWithdrawal,\n item: {\n pendingWithdrawal: {\n publicKey: pendingWithdrawal.publicKey,\n account: pwAccount,\n },\n },\n });\n closeSnackbar();\n enqueueSnackbar(`Stake transfer initiated`, {\n variant: 'success',\n action: ,\n });\n };\n\n const createPool = async (shares: number, isLocked: boolean) => {\n if (shares > 0) {\n createPoolTokens(shares, isLocked).catch(err => {\n console.error(err);\n enqueueSnackbar(`Error staking: ${err.toString()}`, {\n variant: 'error',\n });\n });\n }\n };\n const redeemPool = async (shares: number, isLocked: boolean) => {\n if (shares > 0) {\n redeemPoolTokens(shares, isLocked).catch(err => {\n console.error(err);\n enqueueSnackbar(`Error unstaking: ${err.toString()}`, {\n variant: 'error',\n });\n });\n }\n };\n\n return (\n
\n
\n
\n \n
\n \n
\n \n
\n );\n}\n\ntype PoolCardProps = {\n title: string;\n create: (shares: number, isLocked: boolean) => void;\n redeem: (shares: number, isLocked: boolean) => void;\n};\n\nfunction PoolCard(props: PoolCardProps) {\n const { title, create, redeem } = props;\n const [poolAmount, setPoolAmount] = useState(null);\n const [isLocked, setIsLocked] = useState(false);\n const { poolTokenMint, member, registrarAccount, mint } = useSelector(\n (state: StoreState) => {\n const registrarAccount =\n state.accounts[state.registry.registrar.toString()];\n const poolTokenMint = {\n publicKey: registrarAccount.poolMint,\n account: state.accounts[registrarAccount.poolMint.toString()],\n };\n return {\n poolTokenMint,\n member: state.registry.member,\n registrarAccount,\n mint: {\n publicKey: registrarAccount.mint,\n account: state.accounts[registrarAccount.mint.toString()],\n },\n };\n },\n );\n\n const pricePerShare = toDisplay(\n registrarAccount.stakeRate,\n mint.account.decimals,\n );\n\n const cost = poolAmount\n ? toDisplay(\n registrarAccount.stakeRate.mul(new BN(poolAmount)),\n mint.account.decimals,\n )\n : 0;\n return (\n \n
\n \n \n \n
\n \n \n \n \n Please enter the amount of pool tokens you would like to purchase in\n the form below. Upon pressing stake you will create new pool\n tokens at a fixed price, adding to the amount of pool tokens\n outstanding.\n \n
\n \n Unstaking works similarly, except one must incur an unbonding period\n where funds will not be able to be retrieved until the unbonding\n period ends. At the end of the unbonding period, click the blue\n checkbox next to your pending transfer. If the checkbox is grey,\n your unbonding period has not yet completed.\n \n
\n \n Total pool tokens outstanding\n \n {poolTokenMint.account.supply.toString()}\n \n Price per pool token\n \n {pricePerShare.toString()}\n \n Your total cost\n \n \n {cost} {toDisplayLabel(mint.publicKey)}\n \n \n Unbonding period (days)\n \n \n {(\n registrarAccount.withdrawalTimelock /\n (60 * 60 * 24.0)\n ).toString()}\n \n \n
\n
\n \n setPoolAmount(parseInt(e.target.value))}\n />\n \n
\n
\n
\n create(poolAmount as number, isLocked)}\n >\n Stake\n \n redeem(poolAmount as number, isLocked)}\n >\n Unstake\n \n
\n
\n setIsLocked(!isLocked)}\n />\n }\n labelPlacement={'start'}\n label=\"Locked balances\"\n />\n
\n
\n
\n
\n \n );\n}\n\ntype RedemptionListProps = {\n style: any;\n};\n\nfunction RedemptionList(props: RedemptionListProps) {\n const { registryClient } = useWallet();\n const dispatch = useDispatch();\n const { member, registrar, mint, pendingWithdrawals } = useSelector(\n (state: StoreState) => {\n const member = state.registry.member\n ? {\n publicKey: state.registry.member,\n account: state.accounts[state.registry.member.toString()],\n }\n : undefined;\n const registrar = {\n publicKey: state.registry.registrar!,\n account: state.accounts[state.registry.registrar.toString()],\n };\n const mint = {\n publicKey: registrar.account.mint,\n account: state.accounts[registrar.account.mint.toString()],\n };\n const pendingWithdrawals =\n state.registry.pendingWithdrawals === null\n ? null\n : state.registry.pendingWithdrawals.map(pw => {\n return {\n publicKey: pw,\n account: state.accounts[pw.toString()],\n };\n });\n return {\n member,\n registrar,\n mint,\n pendingWithdrawals,\n };\n },\n );\n\n useEffect(() => {\n if (!member) {\n return;\n }\n if (pendingWithdrawals !== null) {\n return;\n }\n\n // Only grab pending withdrawals for the current member account.\n const filter = Buffer.concat([\n registrar.publicKey.toBuffer(),\n member.publicKey.toBuffer(),\n ]);\n registryClient.account.pendingWithdrawal\n .all(filter)\n .then(pendingWithdrawals => {\n dispatch({\n type: ActionType.RegistrySetPendingWithdrawals,\n item: {\n pendingWithdrawals,\n },\n });\n });\n }, [\n dispatch,\n registrar,\n member,\n pendingWithdrawals,\n registryClient.account.pendingWithdrawal,\n ]);\n\n return (\n
\n \n \n \n Your Pending Transfers\n \n Click the checkmark to complete a transfer on or after the \"end\"\n date.\n \n
\n
\n {member && pendingWithdrawals === null ? (\n
\n \n
\n ) : pendingWithdrawals !== null && pendingWithdrawals.length > 0 ? (\n pendingWithdrawals.map((pw, idx) => {\n return (\n \n );\n })\n ) : (\n \n \n None found\n \n
\n )}\n \n \n \n \n );\n}\n\ntype PendingStakeListItemProps = {\n isLast?: boolean;\n registrar: ProgramAccount;\n pw: ProgramAccount;\n member: ProgramAccount;\n mint: ProgramAccount;\n};\n\nfunction PendingStakeListItem(props: PendingStakeListItemProps) {\n const { isLast, pw, member, registrar, mint } = props;\n const sptLabel = (() => {\n const isLocked = pw.account.locked;\n const l = isLocked ? '(locked)' : '';\n return `${toDisplay(\n pw.account.amount,\n mint.account.decimals,\n )} ${toDisplayLabel(mint.publicKey)} ${l}`;\n })();\n return (\n \n \n
\n \n {`${sptLabel}`}\n \n
\n
\n \n
\n \n \n {`Start: ${new Date(\n pw.account.startTs.toNumber() * 1000,\n ).toLocaleString()}`}\n \n \n {`End: ${new Date(\n pw.account.endTs.toNumber() * 1000,\n ).toLocaleString()}`}\n \n \n {pw.account.pool.toString()}\n \n \n );\n}\n\ntype PendingWithdrawalButtonProps = {\n registrar: ProgramAccount;\n pendingWithdrawal: ProgramAccount;\n member: ProgramAccount;\n};\n\nfunction PendingWithdrawalButton(props: PendingWithdrawalButtonProps) {\n const { pendingWithdrawal, member, registrar } = props;\n const { registryClient } = useWallet();\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n const dispatch = useDispatch();\n\n const endPendingWithdrawal = async () => {\n enqueueSnackbar(`Completing redemption`, {\n variant: 'info',\n });\n const balances = pendingWithdrawal.account.locked\n ? member.account.balancesLocked\n : member.account.balances;\n const tx = await registryClient.rpc.endUnstake({\n accounts: {\n registrar: registrar.publicKey,\n member: member.publicKey,\n beneficiary: registryClient.provider.wallet.publicKey,\n pendingWithdrawal: pendingWithdrawal.publicKey,\n vault: balances.vault,\n vaultPw: balances.vaultPw,\n memberSigner: (\n await memberSigner(\n registryClient.programId,\n registrar.publicKey,\n member.publicKey,\n )\n ).publicKey,\n clock: SYSVAR_CLOCK_PUBKEY,\n tokenProgram: TokenInstructions.TOKEN_PROGRAM_ID,\n },\n });\n\n const updatedPendingWithdrawal = {\n publicKey: pendingWithdrawal.publicKey,\n account: {\n ...pendingWithdrawal.account,\n burned: true,\n },\n };\n\n dispatch({\n type: ActionType.RegistryUpdatePendingWithdrawal,\n item: {\n pendingWithdrawal: updatedPendingWithdrawal,\n },\n });\n\n closeSnackbar();\n enqueueSnackbar(`Stake transfer completed`, {\n variant: 'success',\n action: ,\n });\n };\n\n let disabled = false;\n let color = skin.instance().ready;\n let onClick = async () =>\n endPendingWithdrawal().catch(err => {\n console.error(`Error completing transfer: ${err.toString()}`);\n enqueueSnackbar(\n `Error completing transfer. Wait for the transfer's timelock to end and try again.`,\n {\n variant: 'error',\n },\n );\n });\n if (pendingWithdrawal.account.burned) {\n disabled = true;\n color = skin.instance().active;\n onClick = async () => {};\n }\n\n if (pendingWithdrawal.account.endTs.toNumber() > Date.now() / 1000) {\n disabled = true;\n color = skin.instance().notReady;\n onClick = async () => {};\n }\n\n return (\n \n \n \n \n \n );\n}\n\nfunction AllPendingTransfers() {\n const { registryClient } = useWallet();\n const { registrar, registrarAccount, mintAccount } = useSelector(\n (state: StoreState) => {\n const registrarAccount =\n state.accounts[state.registry.registrar.toString()];\n return {\n registrar: state.registry.registrar,\n registrarAccount,\n mintAccount: state.accounts[registrarAccount.mint.toString()],\n };\n },\n );\n const [pendingTransfers, setPendingTransfers] = useState(null);\n useEffect(() => {\n const fetchAll = async () => {\n let transfers = await registryClient.account.pendingWithdrawal.all(\n registrar.toBuffer(),\n );\n transfers = transfers\n .filter((pw: any) => pw.account.burned === false)\n .sort((a, b) => {\n if (a.account.startTs < b.account.startTs) {\n return 1;\n } else if (a.account.startTs > b.account.startTs) {\n return -1;\n } else {\n return 0;\n }\n });\n setPendingTransfers(transfers);\n };\n fetchAll();\n }, [registryClient, registrar]);\n\n return (\n \n \n All pending transfers\n \n {pendingTransfers !== null ? (\n \n \n \n Member Account\n Amount\n Pool\n Locked\n Start\n End\n \n \n \n {pendingTransfers.map((pw: any) => (\n \n {pw.account.member.toString()}\n \n {toDisplay(\n pw.account.amount.toString(),\n mintAccount.decimals,\n )}\n \n \n {pw.account.amount.div(registrarAccount.stakeRate).toString()}\n \n {pw.account.locked.toString()}\n \n {new Date(pw.account.startTs.toNumber() * 1000).toString()}\n \n \n {new Date(pw.account.endTs.toNumber() * 1000).toString()}\n \n \n ))}\n \n
\n ) : (\n
\n \n
\n )}\n
\n );\n}\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport Button from '@material-ui/core/Button';\nimport { TransactionSignature } from '@solana/web3.js';\nimport { State as StoreState } from '../../store/reducer';\n\ntype Props = {\n signature: string;\n};\n\nexport async function withTx(\n snack: any,\n beforeLabel: string,\n afterLabel: string,\n execTx: () => Promise,\n) {\n snack.enqueueSnackbar(beforeLabel, {\n variant: 'info',\n });\n try {\n let tx = await execTx();\n snack.closeSnackbar();\n snack.enqueueSnackbar(afterLabel, {\n variant: 'success',\n action: ,\n });\n } catch (err) {\n snack.enqueueSnackbar(`Error: ${err.toString()}`, {\n variant: 'error',\n });\n }\n}\n\nexport function ViewTransactionOnExplorerButton(props: Props) {\n const { signature } = props;\n const { explorerClusterSuffix } = useSelector((state: StoreState) => {\n return {\n explorerClusterSuffix: state.common.network.explorerClusterSuffix,\n };\n });\n const urlSuffix = `?cluster=${explorerClusterSuffix}`;\n return (\n \n View on Solana Explorer\n \n );\n}\n","import { Transaction, PublicKey, Account } from '@solana/web3.js';\nimport * as serumCmn from '@project-serum/common';\nimport * as anchor from '@project-serum/anchor';\n\nexport async function registrarSigner(\n programId: PublicKey,\n registrar: PublicKey,\n): Promise<{ publicKey: PublicKey; nonce: number }> {\n const [publicKey, nonce] = await anchor.web3.PublicKey.findProgramAddress(\n [registrar.toBuffer()],\n programId,\n );\n return {\n publicKey,\n nonce,\n };\n}\n\nexport async function memberSigner(\n programId: PublicKey,\n registrar: PublicKey,\n member: PublicKey,\n): Promise<{ publicKey: PublicKey; nonce: number }> {\n const [publicKey, nonce] = await anchor.web3.PublicKey.findProgramAddress(\n [registrar.toBuffer(), member.toBuffer()],\n programId,\n );\n return {\n publicKey,\n nonce,\n };\n}\n\nexport async function vendorSigner(\n programId: PublicKey,\n registrar: PublicKey,\n vendor: PublicKey,\n): Promise<{ publicKey: PublicKey; nonce: number }> {\n const [publicKey, nonce] = await anchor.web3.PublicKey.findProgramAddress(\n [registrar.toBuffer(), vendor.toBuffer()],\n programId,\n );\n return {\n publicKey,\n nonce,\n };\n}\n\n// Returns the seed used to derive a member address. This is not necessary, but\n// a UX convenience. Each member address is a deterministic function of the\n// program, beneficiary, and this (constant) seed.\nexport async function memberSeed(registrar: PublicKey): Promise {\n const seed = await anchor.utils.sha256(`${registrar.toString()}:Member`);\n // The max length of seeds allowed by Solana is 32.\n return seed.slice(0, 32);\n}\n\n// Creates all the SPL otken vaults needed for constructing a `Member` account.\nexport async function createBalanceSandbox(\n provider: serumCmn.Provider,\n r: any,\n registrySigner: PublicKey,\n) {\n const spt = new Account();\n const vault = new Account();\n const vaultStake = new Account();\n const vaultPw = new Account();\n\n const lamports = await provider.connection.getMinimumBalanceForRentExemption(\n 165,\n );\n\n const createSptIx = await serumCmn.createTokenAccountInstrs(\n provider,\n spt.publicKey,\n r.poolMint,\n registrySigner,\n lamports,\n );\n const createVaultIx = await serumCmn.createTokenAccountInstrs(\n provider,\n vault.publicKey,\n r.mint,\n registrySigner,\n lamports,\n );\n const createVaultStakeIx = await serumCmn.createTokenAccountInstrs(\n provider,\n vaultStake.publicKey,\n r.mint,\n registrySigner,\n lamports,\n );\n const createVaultPwIx = await serumCmn.createTokenAccountInstrs(\n provider,\n vaultPw.publicKey,\n r.mint,\n registrySigner,\n lamports,\n );\n let tx0 = new Transaction();\n tx0.add(\n ...createSptIx,\n ...createVaultIx,\n ...createVaultStakeIx,\n ...createVaultPwIx,\n );\n let signers0 = [spt, vault, vaultStake, vaultPw];\n\n const tx = { tx: tx0, signers: signers0 };\n\n return [\n tx,\n {\n spt: spt.publicKey,\n vault: vault.publicKey,\n vaultStake: vaultStake.publicKey,\n vaultPw: vaultPw.publicKey,\n },\n ];\n}\n\n// Returns all events in the reward queue.\nexport function rewardEvents(rewardQ: any): any[] {\n let events = [];\n let tail = rewardQ.tail;\n while (tail < rewardQ.head) {\n let idx = tail % rewardQ.events.length;\n events.push(rewardQ.events[idx]);\n tail += 1;\n }\n return events;\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { AccountInfo as TokenAccount } from '@solana/spl-token';\nimport { ProgramAccount as CommonProgramAccount } from '@project-serum/common';\nimport { Action, ActionType } from './actions';\nimport { networks, Network } from './config';\n\nexport enum BootstrapState {\n NeedsBootstrap,\n IsBootstrapping,\n Bootstrapped,\n}\n\nexport default function reducer(\n state: State = initialState,\n action: Action,\n): State {\n let newState = {\n common: { ...state.common },\n lockup: { ...state.lockup },\n registry: { ...state.registry },\n accounts: { ...state.accounts },\n };\n switch (action.type) {\n // Common.\n case ActionType.CommonAppWillBootstrap:\n newState.common.bootstrapState = BootstrapState.IsBootstrapping;\n newState.common.bootstrapTrigger = false;\n return newState;\n case ActionType.CommonAppDidBootstrap:\n newState.common.bootstrapState = BootstrapState.Bootstrapped;\n return newState;\n case ActionType.CommonWalletSetProvider:\n newState.common.walletProvider = action.item.walletProvider;\n return newState;\n case ActionType.CommonWalletDidConnect:\n newState.common.isWalletConnected = true;\n return newState;\n case ActionType.CommonWalletDidDisconnect:\n newState.common.isWalletConnected = false;\n return newState;\n case ActionType.CommonSetNetwork:\n if (newState.common.network.label !== action.item.network.label) {\n newState.common.network = action.item.network;\n newState.common.bootstrapState = BootstrapState.NeedsBootstrap;\n newState.common.shutdownTrigger = true;\n const network = networks[action.item.networkKey];\n newState.registry.registrar = Object.values(network.registrars)[0];\n }\n return newState;\n case ActionType.CommonTriggerBootstrap:\n newState.common.bootstrapState = BootstrapState.NeedsBootstrap;\n newState.common.bootstrapTrigger = true;\n return newState;\n case ActionType.CommonTriggerShutdown:\n newState.common.bootstrapState = BootstrapState.NeedsBootstrap;\n newState.common.shutdownTrigger = true;\n return newState;\n case ActionType.CommonDidShutdown:\n // Reset everything except network and registrar.\n let s = {\n ...initialState,\n };\n s.common.network = newState.common.network;\n s.registry.registrar = newState.registry.registrar;\n return s;\n case ActionType.CommonOwnedTokenAccountsSet:\n newState.common.ownedTokenAccounts = action.item.ownedTokenAccounts;\n return newState;\n\n case ActionType.CommonOwnedTokenAccountsUpdate:\n newState.common.ownedTokenAccounts = newState.common.ownedTokenAccounts.map(\n programAccount => {\n if (programAccount.publicKey.equals(action.item.account.publicKey)) {\n return action.item.account;\n } else {\n return programAccount;\n }\n },\n );\n return newState;\n\n // Lockup.\n case ActionType.LockupSetVestings:\n newState.lockup.vestings = action.item.vestingAccounts;\n return newState;\n case ActionType.LockupUpdateVesting:\n newState.accounts[action.item.vesting.publicKey.toString()] =\n action.item.vesting.account;\n return newState;\n case ActionType.LockupCreateVesting:\n newState.lockup.vestings.unshift(action.item.vesting.publicKey);\n newState.accounts[action.item.vesting.publicKey.toString()] =\n action.item.vesting.account;\n return newState;\n\n // Registry.\n case ActionType.RegistrySetMember:\n // This should only be called on member creation. All other member\n // member switches should route through `RegistrySetMember`.\n newState.registry.member = action.item.member;\n return newState;\n case ActionType.RegistrySetRegistrar:\n newState.registry.registrar = action.item.registrar;\n newState.registry.member = action.item.member;\n newState.registry.pendingWithdrawals = null;\n return newState;\n case ActionType.RegistrySetPendingWithdrawals:\n action.item.pendingWithdrawals.forEach((pw: any) => {\n newState.accounts[pw.publicKey.toString()] = pw.account;\n });\n newState.registry.pendingWithdrawals = action.item.pendingWithdrawals.map(\n (pw: any) => pw.publicKey,\n );\n return newState;\n case ActionType.RegistryCreatePendingWithdrawal:\n newState.accounts[action.item.pendingWithdrawal.publicKey.toString()] =\n action.item.pendingWithdrawal.account;\n if (newState.registry.pendingWithdrawals === null) {\n newState.registry.pendingWithdrawals = [];\n }\n newState.registry.pendingWithdrawals.unshift(\n action.item.pendingWithdrawal.publicKey,\n );\n return newState;\n case ActionType.RegistryUpdatePendingWithdrawal:\n newState.accounts[action.item.pendingWithdrawal.publicKey.toString()] =\n action.item.pendingWithdrawal.account;\n return newState;\n case ActionType.AccountAdd:\n newState.accounts[action.item.account.publicKey.toString()] =\n action.item.account.account;\n return newState;\n case ActionType.AccountUpdate:\n newState.accounts[action.item.account.publicKey.toString()] =\n action.item.account.account;\n return newState;\n default:\n return newState;\n }\n}\n\nexport type State = {\n common: CommonState;\n lockup: LockupState;\n registry: RegistryState;\n accounts: { [pubkey: string]: any };\n};\n\nexport type CommonState = {\n walletProvider?: string;\n isWalletConnected: boolean;\n bootstrapTrigger: boolean;\n bootstrapState: BootstrapState;\n shutdownTrigger: boolean;\n network: Network;\n ownedTokenAccounts: ProgramAccount[];\n};\n\nexport type LockupState = {\n vestings: PublicKey[];\n};\n\n// All state associated with a single instance of a staking registrar.\nexport type RegistryState = {\n registrar: PublicKey;\n member?: PublicKey;\n pendingWithdrawals: PublicKey[] | null;\n};\n\nexport const initialState: State = {\n common: {\n bootstrapTrigger: false,\n shutdownTrigger: false,\n isWalletConnected: false,\n walletProvider: 'https://www.sollet.io',\n bootstrapState: BootstrapState.NeedsBootstrap,\n network: networks.mainnet,\n ownedTokenAccounts: [],\n },\n lockup: {\n vestings: [],\n },\n registry: {\n pendingWithdrawals: null,\n registrar: networks.mainnet.registrars.srm,\n },\n accounts: {},\n};\n\nexport type AsyncData = {\n isReady: boolean;\n data?: T;\n};\n\n// Re-export.\nexport type ProgramAccount = CommonProgramAccount;\n","import { createStore } from 'redux';\nimport reducer from './reducer';\n\nexport const store = createStore(reducer);\n","import React, {\n PropsWithChildren,\n ReactNode,\n useEffect,\n useCallback,\n} from 'react';\nimport * as BufferLayout from 'buffer-layout';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useSnackbar } from 'notistack';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport {\n parseMintAccount,\n parseTokenAccount,\n} from '@project-serum/common';\nimport * as anchor from '@project-serum/anchor';\nimport { State as StoreState, ProgramAccount } from '../../store/reducer';\nimport { ActionType } from '../../store/actions';\nimport { useWallet } from './WalletProvider';\nimport { memberSeed } from '../../utils/registry';\n\n// BootstrapProvider performs data fetching on application startup.\nexport default function BootstrapProvider(props: PropsWithChildren) {\n const { bootstrapTrigger, shutdownTrigger, network, registrar } = useSelector(\n (state: StoreState) => {\n return {\n bootstrapTrigger: state.common.bootstrapTrigger,\n shutdownTrigger: state.common.shutdownTrigger,\n network: state.common.network,\n registrar: state.registry.registrar,\n };\n },\n );\n const dispatch = useDispatch();\n const { wallet, lockupClient, registryClient } = useWallet();\n const { enqueueSnackbar } = useSnackbar();\n\n // Entry point for bootstrapping all the data for the app.\n const bootstrap = useCallback(async () => {\n enqueueSnackbar(`Connecting to ${network.label}`, {\n variant: 'info',\n autoHideDuration: 2500,\n });\n\n dispatch({\n type: ActionType.CommonAppWillBootstrap,\n item: {},\n });\n\n let { registrars, members } = await refreshAccounts({\n dispatch,\n lockupClient,\n registryClient,\n network,\n wallet,\n });\n\n // Temporary account store for the initial registrar switch.\n const accountStore = Object.fromEntries(\n new Map(registrars.map(r => [r.publicKey.toString(), r.account])),\n );\n members.forEach(m => {\n accountStore[m.publicKey.toString()] = m.account;\n });\n\n await registrarSwitch(\n registryClient,\n accountStore,\n dispatch,\n registrar,\n undefined,\n );\n\n dispatch({\n type: ActionType.CommonAppDidBootstrap,\n item: {},\n });\n\n enqueueSnackbar(`Connection established`, {\n variant: 'success',\n autoHideDuration: 2500,\n });\n }, [\n dispatch,\n enqueueSnackbar,\n registryClient,\n registrar,\n lockupClient,\n network,\n wallet,\n ]);\n\n const shutdown = useCallback(async () => {\n wallet.disconnect();\n dispatch({\n type: ActionType.CommonDidShutdown,\n item: {},\n });\n }, [dispatch, wallet]);\n\n useEffect(() => {\n if (bootstrapTrigger) {\n bootstrap().catch(err => {\n console.error(err);\n enqueueSnackbar(`Error bootstrapping application: ${err.toString()}`, {\n variant: 'error',\n });\n });\n }\n if (shutdownTrigger) {\n shutdown().catch(err => {\n console.error(err);\n enqueueSnackbar(`Error shutting down application: ${err.toString()}`, {\n variant: 'error',\n });\n });\n }\n }, [bootstrapTrigger, bootstrap, shutdownTrigger, shutdown, enqueueSnackbar]);\n\n return <>{props.children};\n}\n\n// Fetches and populates the redux store with all accounts needed for the app to start.\nexport async function refreshAccounts({\n dispatch,\n lockupClient,\n registryClient,\n network,\n wallet,\n}: any) {\n // Fetch all staking instances.\n const fetchRegistrars = async (): Promise => {\n const registrarAddresses: PublicKey[] = Object.values(network.registrars);\n\n // All registrars.\n const registrars: ProgramAccount[] = (\n await anchor.utils.getMultipleAccounts(\n registryClient.provider.connection,\n registrarAddresses,\n )\n ).map(raw => {\n const account = registryClient.coder.accounts.decode(\n 'Registrar',\n raw!.account.data,\n );\n return {\n publicKey: raw!.publicKey,\n account,\n };\n });\n\n // Mint for each registrar.\n const mints: ProgramAccount[] = (\n await anchor.utils.getMultipleAccounts(\n registryClient.provider.connection,\n registrars.map(r => r.account.mint),\n )\n ).map(raw => {\n const account = parseMintAccount(raw!.account.data);\n return {\n publicKey: raw!.publicKey,\n account,\n };\n });\n\n // Reward queues for each registrar.\n const rewardQs = (\n await anchor.utils.getMultipleAccounts(\n registryClient.provider.connection,\n registrars.map(r => r.account.rewardEventQ),\n )\n ).map(raw => {\n const account = registryClient.coder.accounts.decode(\n 'RewardQueue',\n raw!.account.data,\n );\n return {\n publicKey: raw!.publicKey,\n account,\n };\n });\n\n // Add all the accounts to the store.\n registrars\n .concat(mints)\n .concat(rewardQs)\n .forEach(r => {\n dispatch({\n type: ActionType.AccountAdd,\n item: {\n account: r,\n },\n });\n });\n return registrars;\n };\n\n // Fetch the stake accounts for each staking instance (for the connected wallet).\n const fetchMembers = async (\n registrars: ProgramAccount[],\n ): Promise => {\n const members = await Promise.all(\n registrars\n .map((r: ProgramAccount) => r.publicKey)\n .map((r: PublicKey) =>\n memberSeed(r)\n .then(seed =>\n PublicKey.createWithSeed(\n wallet.publicKey,\n seed,\n registryClient.programId,\n ),\n )\n .then(member => {\n return {\n memberPublicKey: member,\n registrar: r,\n };\n }),\n ),\n );\n const memberAddresses: PublicKey[] = members.map(m => m.memberPublicKey);\n const memberAccounts: ProgramAccount[] = (\n await anchor.utils.getMultipleAccounts(\n registryClient.provider.connection,\n memberAddresses,\n )\n )\n .filter(raw => raw !== null)\n .map((raw: any) => {\n const account = registryClient.coder.accounts.decode(\n 'Member',\n raw!.account.data,\n );\n return {\n publicKey: raw!.publicKey,\n account,\n };\n });\n\n // Get all accounts for all of our member accounts.\n //\n // Note: As the number of registrars grows, we'll probably want to move\n // this fetch to be an on demand query, rather than on application\n // bootstrap.\n await Promise.all(\n memberAccounts.map(memberAccount => {\n return fetchAndDispatchMemberAccounts(\n memberAccount,\n dispatch,\n registryClient.provider.connection,\n );\n }),\n );\n\n // Add all the member accounts to the store. Must be done *after* the\n // active member's vaults.\n memberAccounts.forEach(m => {\n dispatch({\n type: ActionType.AccountAdd,\n item: {\n account: m,\n },\n });\n });\n\n return memberAccounts;\n };\n\n // All mints for each staking instance (pool token and the token being staked).\n const fetchMints = async (registrars: ProgramAccount[]) => {\n const mintAddresses = registrars\n .map(r => r.account.mint)\n .concat(registrars.map(r => r.account.poolMint));\n const mints = (\n await anchor.utils.getMultipleAccounts(\n registryClient.provider.connection,\n mintAddresses,\n )\n ).map(raw => {\n const account = parseMintAccount(raw!.account.data);\n return {\n publicKey: raw!.publicKey,\n account,\n };\n });\n mints.forEach(m => {\n dispatch({\n type: ActionType.AccountAdd,\n item: {\n account: m,\n },\n });\n });\n };\n\n // All token accounts owned by the current user.\n const fetchOwnedTokenAccounts = async () => {\n const ownedTokenAccounts = await getOwnedTokenAccounts(\n lockupClient.provider.connection,\n wallet.publicKey,\n );\n dispatch({\n type: ActionType.CommonOwnedTokenAccountsSet,\n item: {\n ownedTokenAccounts,\n },\n });\n };\n\n // All vesting accounts owned by the current user.\n const fetchVestingAccounts = async () => {\n const vestingAccounts = await lockupClient.account.vesting.all(\n wallet.publicKey.toBuffer(),\n );\n vestingAccounts.forEach((account: any) => {\n dispatch({\n type: ActionType.AccountAdd,\n item: {\n account,\n },\n });\n });\n dispatch({\n type: ActionType.LockupSetVestings,\n item: {\n vestingAccounts: vestingAccounts.map(\n (v: ProgramAccount) => v.publicKey,\n ),\n },\n });\n };\n\n const registrars = await fetchRegistrars();\n const members = await fetchMembers(registrars);\n await fetchMints(registrars);\n await fetchOwnedTokenAccounts();\n await fetchVestingAccounts();\n\n return { registrars, members };\n}\n\nexport async function registrarSwitch(\n registryClient: any,\n accounts: any,\n dispatch: any,\n newRegistrar: PublicKey,\n oldRegistrar?: PublicKey,\n) {\n const oldMember = await (async (): Promise => {\n if (oldRegistrar === undefined) {\n return undefined;\n }\n const oldMember = await PublicKey.createWithSeed(\n registryClient.provider.wallet.publicKey,\n await memberSeed(oldRegistrar),\n registryClient.programId,\n );\n const oldMemberAccount = accounts[oldMember.toString()];\n return oldMemberAccount !== undefined\n ? {\n publicKey: oldMember,\n account: oldMemberAccount,\n }\n : undefined;\n })();\n\n const newMember = await (async (): Promise => {\n const newMember = await PublicKey.createWithSeed(\n registryClient.provider.wallet.publicKey,\n await memberSeed(newRegistrar),\n registryClient.programId,\n );\n const newMemberAccount = accounts[newMember.toString()];\n return newMemberAccount\n ? {\n publicKey: newMember,\n account: newMemberAccount,\n }\n : undefined;\n })();\n\n await subscribeRegistrar(\n registryClient,\n accounts,\n dispatch,\n newRegistrar,\n oldRegistrar,\n );\n if (newMember) {\n unsubscribeMember(registryClient, oldMember);\n subscribeMember(newMember, registryClient, dispatch);\n }\n\n // Perform the UI update.\n dispatch({\n type: ActionType.RegistrySetRegistrar,\n item: {\n registrar: newRegistrar,\n member: newMember ? newMember.publicKey : undefined,\n },\n });\n}\n\nexport async function subscribeRegistrar(\n registryClient: any,\n accounts: any,\n dispatch: any,\n newRegistrar: PublicKey,\n oldRegistrar?: PublicKey,\n) {\n if (oldRegistrar) {\n const oldRegistrarAccount = accounts[oldRegistrar.toString()];\n registryClient.account.rewardQueue.unsubscribe(\n oldRegistrarAccount.rewardEventQ,\n );\n // TODO: unsubscribe from the staking pool subscription.\n }\n\n const newRegistrarAccount = accounts[newRegistrar.toString()];\n\n // Reward event queue sub.\n const conn = registryClient.account.rewardQueue.subscribe(\n newRegistrarAccount.rewardEventQ,\n );\n conn.on('change', (account: any) => {\n dispatch({\n type: ActionType.AccountUpdate,\n item: {\n account: {\n publicKey: newRegistrarAccount.rewardEventQ,\n account,\n },\n },\n });\n });\n\n // Staking pool token sub.\n // TODO: track these connections somewhere more organized.\n registryClient.provider.connection.onAccountChange(\n newRegistrarAccount.poolMint,\n (acc: any) => {\n const poolMint = parseMintAccount(acc.data);\n dispatch({\n type: ActionType.AccountUpdate,\n item: {\n account: {\n publicKey: newRegistrarAccount.poolMint,\n account: poolMint,\n },\n },\n });\n },\n 'recent',\n );\n}\n\nexport function subscribeMember(\n newMember: ProgramAccount,\n registryClient: any,\n dispatch: any,\n) {\n // Subscribe to all member account updates.\n registryClient.account.member\n .subscribe(newMember.publicKey)\n .on('change', (account: any) => {\n dispatch({\n type: ActionType.AccountUpdate,\n item: {\n account: {\n publicKey: newMember.publicKey,\n account,\n },\n },\n });\n });\n\n // Subscription function, updating the redux store on every change\n // to a token account.\n //\n // TODO: should track these subscriptions for unsubscribing on demand.\n const createVaultSubscription = (address: PublicKey) => {\n registryClient.provider.connection.onAccountChange(\n address,\n (acc: any) => {\n const tokenAccount = parseTokenAccount(acc.data);\n dispatch({\n type: ActionType.AccountUpdate,\n item: {\n account: {\n publicKey: address,\n account: tokenAccount,\n },\n },\n });\n },\n 'recent',\n );\n };\n\n // Subscribe to all the member's token vaults.\n createVaultSubscription(newMember.account.balances.vault);\n createVaultSubscription(newMember.account.balances.vaultStake);\n createVaultSubscription(newMember.account.balances.vaultPw);\n createVaultSubscription(newMember.account.balances.spt);\n createVaultSubscription(newMember.account.balancesLocked.vault);\n createVaultSubscription(newMember.account.balancesLocked.vaultStake);\n createVaultSubscription(newMember.account.balancesLocked.vaultPw);\n createVaultSubscription(newMember.account.balancesLocked.spt);\n}\n\nfunction unsubscribeMember(registryClient: any, newMember?: ProgramAccount) {\n // todo\n}\n\n// Fetches all accounts for a member account and populates the store with them.\nexport async function fetchAndDispatchMemberAccounts(\n memberAccount: ProgramAccount,\n dispatch: any,\n connection: any,\n) {\n let accounts = (\n await anchor.utils.getMultipleAccounts(connection, [\n memberAccount.account.balances.vault,\n memberAccount.account.balances.vaultStake,\n memberAccount.account.balances.vaultPw,\n memberAccount.account.balances.spt,\n memberAccount.account.balancesLocked.vault,\n memberAccount.account.balancesLocked.vaultStake,\n memberAccount.account.balancesLocked.vaultPw,\n memberAccount.account.balancesLocked.spt,\n ])\n )\n .filter(raw => raw !== null)\n .map((raw: any) => {\n return {\n publicKey: raw.publicKey,\n account: parseTokenAccount(raw.account.data),\n };\n });\n accounts.forEach(account => {\n dispatch({\n type: ActionType.AccountAdd,\n item: {\n account,\n },\n });\n });\n}\n\nexport async function getOwnedTokenAccounts(connection: Connection, publicKey: PublicKey) {\n let filters = getOwnedAccountsFilters(publicKey);\n let resp = await connection.getProgramAccounts(\n TOKEN_PROGRAM_ID,\n {\n filters,\n },\n );\n const result = resp\n .map(({ pubkey, account: { data } }) => {\n return {\n publicKey: new PublicKey(pubkey),\n account: parseTokenAccountData(data),\n };\n });\n\n return result;\n}\n\nexport const ACCOUNT_LAYOUT = BufferLayout.struct([\n BufferLayout.blob(32, 'mint'),\n BufferLayout.blob(32, 'owner'),\n BufferLayout.nu64('amount'),\n BufferLayout.blob(93),\n]);\n\n\nexport function getOwnedAccountsFilters(publicKey: PublicKey) {\n return [\n {\n memcmp: {\n // @ts-ignore\n offset: ACCOUNT_LAYOUT.offsetOf('owner'),\n bytes: publicKey.toBase58(),\n },\n },\n {\n dataSize: ACCOUNT_LAYOUT.span,\n },\n ];\n}\n\nexport function parseTokenAccountData(data: any) {\n // @ts-ignore\n let { mint, owner, amount } = ACCOUNT_LAYOUT.decode(data);\n return {\n mint: new PublicKey(mint),\n owner: new PublicKey(owner),\n amount,\n };\n}\n","import React, { useState, useEffect, ReactElement } from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport { useSnackbar } from \"notistack\";\nimport AppBar from \"@material-ui/core/AppBar\";\nimport Toolbar from \"@material-ui/core/Toolbar\";\nimport Select from \"@material-ui/core/Select\";\nimport Menu from \"@material-ui/core/Menu\";\nimport Link from \"@material-ui/core/Link\";\nimport Typography from \"@material-ui/core/Typography\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport ExitToAppIcon from \"@material-ui/icons/ExitToApp\";\nimport Button from \"@material-ui/core/Button\";\nimport PersonIcon from \"@material-ui/icons/Person\";\nimport BubbleChartIcon from \"@material-ui/icons/BubbleChart\";\nimport RefreshIcon from \"@material-ui/icons/Refresh\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\nimport {\n WalletDialogProvider,\n WalletDisconnectButton,\n WalletMultiButton,\n} from \"@solana/wallet-adapter-material-ui\";\nimport { Popper, MenuList, MenuItem, Grow } from \"@material-ui/core\";\nimport { refreshAccounts } from \"./BootstrapProvider\";\nimport { networks } from \"../../store/config\";\nimport {\n State as StoreState,\n ProgramAccount,\n BootstrapState,\n} from \"../../store/reducer\";\nimport { ActionType } from \"../../store/actions\";\nimport { useWallet } from \"./WalletProvider\";\n\ntype HeaderProps = {\n isAppReady: boolean;\n member?: ProgramAccount;\n};\n\nexport default function Header(props: HeaderProps) {\n const { isAppReady } = props;\n const { network } = useSelector((state: StoreState) => {\n return {\n network: state.common.network,\n isAppReady:\n state.common.isWalletConnected &&\n state.common.bootstrapState === BootstrapState.Bootstrapped,\n };\n });\n const dispatch = useDispatch();\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n const { wallet, registryClient, lockupClient } = useWallet();\n const [isRefreshing, setIsRefreshing] = useState(false);\n return (\n \n \n \n
\n \n \n \n \n \n {network.srmFaucet && (\n \n )}\n
\n \n {\n setIsRefreshing(true);\n enqueueSnackbar(`Refreshing`, {\n variant: \"info\",\n });\n refreshAccounts({\n dispatch,\n lockupClient,\n registryClient,\n network,\n wallet,\n })\n .then(() => {\n setIsRefreshing(false);\n closeSnackbar();\n })\n .catch((err) => {\n setIsRefreshing(false);\n closeSnackbar();\n enqueueSnackbar(`There was a problem refreshing: ${err}`, {\n variant: \"error\",\n autoHideDuration: 2500,\n });\n });\n }}\n style={{\n display: isAppReady ? \"block\" : \"none\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n marginRight: \"10px\",\n }}\n >\n {isRefreshing ? (\n \n \n \n ) : (\n
\n \n \n \n
\n )}\n \n \n \n \n \n
\n \n );\n}\n\nfunction SerumLogoButton() {\n const history = useHistory();\n return (\n
history.push(\"/\")}>\n
\n \n \n );\n}\n\ntype BarButtonProps = {\n label: string;\n hrefClient?: string;\n href?: string;\n};\n\nfunction BarButton(props: BarButtonProps) {\n const history = useHistory();\n const { label, href, hrefClient } = props;\n return (\n hrefClient && history.push(hrefClient)}\n >\n \n \n \n \n );\n}\n\nfunction NetworkSelector() {\n const network = useSelector((state: StoreState) => {\n return state.common.network;\n });\n const dispatch = useDispatch();\n const [anchorEl, setAnchorEl] = useState(null);\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n return (\n \n \n setAnchorEl(\n // @ts-ignore\n e.currentTarget\n )\n }\n >\n \n \n {network.label}\n \n \n \n {Object.keys(networks).map((n: string) => (\n {\n handleClose();\n dispatch({\n type: ActionType.CommonSetNetwork,\n item: {\n network: networks[n],\n networkKey: n,\n },\n });\n }}\n >\n {networks[n].label}\n \n ))}\n \n \n );\n}\n\nexport function WalletConnectButton(): ReactElement {\n const { showDisconnect } = useSelector((state: StoreState) => {\n return {\n showDisconnect: state.common.isWalletConnected,\n };\n });\n const dispatch = useDispatch();\n const { wallet, lockupClient } = useWallet();\n const { enqueueSnackbar } = useSnackbar();\n\n // Wallet connection event listeners.\n useEffect(() => {\n wallet.on(\"disconnect\", () => {\n enqueueSnackbar(\"Disconnected from wallet\", {\n variant: \"info\",\n autoHideDuration: 2500,\n });\n dispatch({\n type: ActionType.CommonWalletDidDisconnect,\n item: {},\n });\n dispatch({\n type: ActionType.CommonTriggerShutdown,\n item: {},\n });\n });\n wallet.on(\"connect\", async () => {\n dispatch({\n type: ActionType.CommonWalletDidConnect,\n item: {},\n });\n dispatch({\n type: ActionType.CommonTriggerBootstrap,\n item: {},\n });\n });\n }, [wallet, dispatch, enqueueSnackbar, lockupClient.provider.connection]);\n\n return (\n \n wallet.disconnect()}\n >\n \n \n wallet.connect()}\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n flexDirection: \"column\",\n }}\n >\n \n \n \n );\n}\n","import React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport Link from '@material-ui/core/Link';\n\nexport default function Footer() {\n return (\n \n
\n \n \n \n \n \n \n
\n \n );\n}\n\ntype FooterButtonProps = {\n label: string;\n href: string;\n isEnd?: boolean;\n};\n\nfunction FooterButton(props: FooterButtonProps) {\n const { label, href, isEnd } = props;\n return (\n \n \n {label}\n \n \n );\n}\n","import React, { useState, PropsWithChildren } from 'react';\nimport { useSelector } from 'react-redux';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Button from '@material-ui/core/Button';\nimport { State as StoreState, BootstrapState } from '../../store/reducer';\nimport Header from './Header';\nimport Footer from './Footer';\n\ntype Props = {};\n\nexport default function Layout(props: PropsWithChildren) {\n const { isAppReady } = useSelector((state: StoreState) => {\n return {\n isAppReady:\n state.common.isWalletConnected &&\n state.common.bootstrapState === BootstrapState.Bootstrapped,\n };\n });\n const [refresh, setRefresh] = useState(false);\n return (\n \n \n \n
\n \n \n {window.localStorage.getItem('consent') ? (\n !isAppReady ? (\n \n ) : (\n
{props.children}
\n )\n ) : (\n {\n window.localStorage.setItem('consent', 'true');\n setRefresh(!refresh);\n }}\n />\n )}\n \n