diff --git a/docs/assets/search.js b/docs/assets/search.js index f953c60..ed1e25c 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = JSON.parse("{\"kinds\":{\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\"},\"rows\":[{\"id\":0,\"kind\":64,\"name\":\"getPod\",\"url\":\"modules.html#getPod\",\"classes\":\"tsd-kind-function\"},{\"id\":1,\"kind\":64,\"name\":\"getSuperProposal\",\"url\":\"modules.html#getSuperProposal\",\"classes\":\"tsd-kind-function\"},{\"id\":2,\"kind\":64,\"name\":\"getUserPods\",\"url\":\"modules.html#getUserPods\",\"classes\":\"tsd-kind-function\"},{\"id\":3,\"kind\":64,\"name\":\"getAdminPods\",\"url\":\"modules.html#getAdminPods\",\"classes\":\"tsd-kind-function\"},{\"id\":4,\"kind\":64,\"name\":\"init\",\"url\":\"modules.html#init\",\"classes\":\"tsd-kind-function\"},{\"id\":5,\"kind\":32,\"name\":\"config\",\"url\":\"modules.html#config\",\"classes\":\"tsd-kind-variable\"},{\"id\":6,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules.html#config.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"config\"},{\"id\":7,\"kind\":1024,\"name\":\"provider\",\"url\":\"modules.html#config.__type.provider\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":8,\"kind\":1024,\"name\":\"multicall\",\"url\":\"modules.html#config.__type.multicall\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":9,\"kind\":1024,\"name\":\"network\",\"url\":\"modules.html#config.__type.network\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":10,\"kind\":1024,\"name\":\"subgraphUrl\",\"url\":\"modules.html#config.__type.subgraphUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":11,\"kind\":1024,\"name\":\"gnosisUrl\",\"url\":\"modules.html#config.__type.gnosisUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":12,\"kind\":1024,\"name\":\"etherscanUrl\",\"url\":\"modules.html#config.__type.etherscanUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":13,\"kind\":1024,\"name\":\"etherscanApiKey\",\"url\":\"modules.html#config.__type.etherscanApiKey\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":14,\"kind\":64,\"name\":\"fetchPodUsers\",\"url\":\"modules.html#fetchPodUsers\",\"classes\":\"tsd-kind-function\"},{\"id\":15,\"kind\":64,\"name\":\"fetchUserPodIds\",\"url\":\"modules.html#fetchUserPodIds\",\"classes\":\"tsd-kind-function\"},{\"id\":16,\"kind\":64,\"name\":\"fetchAdminPodIds\",\"url\":\"modules.html#fetchAdminPodIds\",\"classes\":\"tsd-kind-function\"},{\"id\":17,\"kind\":64,\"name\":\"customSubgraphQuery\",\"url\":\"modules.html#customSubgraphQuery\",\"classes\":\"tsd-kind-function\"},{\"id\":18,\"kind\":64,\"name\":\"multiPodCreate\",\"url\":\"modules.html#multiPodCreate\",\"classes\":\"tsd-kind-function\"},{\"id\":19,\"kind\":64,\"name\":\"podifySafe\",\"url\":\"modules.html#podifySafe\",\"classes\":\"tsd-kind-function\"},{\"id\":20,\"kind\":64,\"name\":\"enableController\",\"url\":\"modules.html#enableController\",\"classes\":\"tsd-kind-function\"},{\"id\":21,\"kind\":128,\"name\":\"Pod\",\"url\":\"classes/Pod.html\",\"classes\":\"tsd-kind-class\"},{\"id\":22,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Pod.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":23,\"kind\":1024,\"name\":\"controller\",\"url\":\"classes/Pod.html#controller\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":24,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Pod.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":25,\"kind\":1024,\"name\":\"safe\",\"url\":\"classes/Pod.html#safe\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":26,\"kind\":1024,\"name\":\"nonce\",\"url\":\"classes/Pod.html#nonce\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":27,\"kind\":1024,\"name\":\"threshold\",\"url\":\"classes/Pod.html#threshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":28,\"kind\":1024,\"name\":\"ensName\",\"url\":\"classes/Pod.html#ensName\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":29,\"kind\":1024,\"name\":\"admin\",\"url\":\"classes/Pod.html#admin\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":30,\"kind\":1024,\"name\":\"imageUrl\",\"url\":\"classes/Pod.html#imageUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":31,\"kind\":1024,\"name\":\"imageNoTextUrl\",\"url\":\"classes/Pod.html#imageNoTextUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":32,\"kind\":2048,\"name\":\"getProposals\",\"url\":\"classes/Pod.html#getProposals\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":33,\"kind\":2048,\"name\":\"getProposal\",\"url\":\"classes/Pod.html#getProposal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":34,\"kind\":2048,\"name\":\"getSuperPods\",\"url\":\"classes/Pod.html#getSuperPods\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":35,\"kind\":2048,\"name\":\"getSuperProposals\",\"url\":\"classes/Pod.html#getSuperProposals\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":36,\"kind\":2048,\"name\":\"getMembers\",\"url\":\"classes/Pod.html#getMembers\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":37,\"kind\":2048,\"name\":\"getMemberEOAs\",\"url\":\"classes/Pod.html#getMemberEOAs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":38,\"kind\":2048,\"name\":\"getMemberPods\",\"url\":\"classes/Pod.html#getMemberPods\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":39,\"kind\":2048,\"name\":\"isMember\",\"url\":\"classes/Pod.html#isMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":40,\"kind\":2048,\"name\":\"isAdmin\",\"url\":\"classes/Pod.html#isAdmin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":41,\"kind\":2048,\"name\":\"isAdminPodMember\",\"url\":\"classes/Pod.html#isAdminPodMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":42,\"kind\":2048,\"name\":\"isSubPodMember\",\"url\":\"classes/Pod.html#isSubPodMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":43,\"kind\":2048,\"name\":\"getSubPodsByMember\",\"url\":\"classes/Pod.html#getSubPodsByMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":44,\"kind\":2048,\"name\":\"propose\",\"url\":\"classes/Pod.html#propose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":45,\"kind\":2048,\"name\":\"mintMember\",\"url\":\"classes/Pod.html#mintMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":46,\"kind\":2048,\"name\":\"burnMember\",\"url\":\"classes/Pod.html#burnMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":47,\"kind\":2048,\"name\":\"batchMintAndBurn\",\"url\":\"classes/Pod.html#batchMintAndBurn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":48,\"kind\":2048,\"name\":\"transferMembership\",\"url\":\"classes/Pod.html#transferMembership\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":49,\"kind\":2048,\"name\":\"transferAdmin\",\"url\":\"classes/Pod.html#transferAdmin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":50,\"kind\":2048,\"name\":\"migratePodToLatest\",\"url\":\"classes/Pod.html#migratePodToLatest\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":51,\"kind\":2048,\"name\":\"ejectSafe\",\"url\":\"classes/Pod.html#ejectSafe\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":52,\"kind\":2048,\"name\":\"createRejectProposal\",\"url\":\"classes/Pod.html#createRejectProposal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":53,\"kind\":128,\"name\":\"Proposal\",\"url\":\"classes/Proposal.html\",\"classes\":\"tsd-kind-class\"},{\"id\":54,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Proposal.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":55,\"kind\":1024,\"name\":\"pod\",\"url\":\"classes/Proposal.html#pod\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":56,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Proposal.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":57,\"kind\":1024,\"name\":\"status\",\"url\":\"classes/Proposal.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":58,\"kind\":1024,\"name\":\"isSubProposal\",\"url\":\"classes/Proposal.html#isSubProposal\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":59,\"kind\":1024,\"name\":\"approvals\",\"url\":\"classes/Proposal.html#approvals\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":60,\"kind\":1024,\"name\":\"rejections\",\"url\":\"classes/Proposal.html#rejections\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":61,\"kind\":1024,\"name\":\"threshold\",\"url\":\"classes/Proposal.html#threshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":62,\"kind\":1024,\"name\":\"method\",\"url\":\"classes/Proposal.html#method\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":63,\"kind\":1024,\"name\":\"parameters\",\"url\":\"classes/Proposal.html#parameters\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":64,\"kind\":1024,\"name\":\"value\",\"url\":\"classes/Proposal.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":65,\"kind\":1024,\"name\":\"timestamp\",\"url\":\"classes/Proposal.html#timestamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":66,\"kind\":2048,\"name\":\"approve\",\"url\":\"classes/Proposal.html#approve\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":67,\"kind\":2048,\"name\":\"reject\",\"url\":\"classes/Proposal.html#reject\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":68,\"kind\":2048,\"name\":\"executeApprove\",\"url\":\"classes/Proposal.html#executeApprove\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":69,\"kind\":2048,\"name\":\"executeReject\",\"url\":\"classes/Proposal.html#executeReject\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":70,\"kind\":4194304,\"name\":\"ProposalStatus\",\"url\":\"modules.html#ProposalStatus\",\"classes\":\"tsd-kind-type-alias\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,38.712]],[\"parent/0\",[]],[\"name/1\",[1,38.712]],[\"parent/1\",[]],[\"name/2\",[2,38.712]],[\"parent/2\",[]],[\"name/3\",[3,38.712]],[\"parent/3\",[]],[\"name/4\",[4,38.712]],[\"parent/4\",[]],[\"name/5\",[5,33.604]],[\"parent/5\",[]],[\"name/6\",[6,38.712]],[\"parent/6\",[5,3.003]],[\"name/7\",[7,38.712]],[\"parent/7\",[8,2.021]],[\"name/8\",[9,38.712]],[\"parent/8\",[8,2.021]],[\"name/9\",[10,38.712]],[\"parent/9\",[8,2.021]],[\"name/10\",[11,38.712]],[\"parent/10\",[8,2.021]],[\"name/11\",[12,38.712]],[\"parent/11\",[8,2.021]],[\"name/12\",[13,38.712]],[\"parent/12\",[8,2.021]],[\"name/13\",[14,38.712]],[\"parent/13\",[8,2.021]],[\"name/14\",[15,38.712]],[\"parent/14\",[]],[\"name/15\",[16,38.712]],[\"parent/15\",[]],[\"name/16\",[17,38.712]],[\"parent/16\",[]],[\"name/17\",[18,38.712]],[\"parent/17\",[]],[\"name/18\",[19,38.712]],[\"parent/18\",[]],[\"name/19\",[20,38.712]],[\"parent/19\",[]],[\"name/20\",[21,38.712]],[\"parent/20\",[]],[\"name/21\",[22,7.651]],[\"parent/21\",[]],[\"name/22\",[23,33.604]],[\"parent/22\",[22,0.684]],[\"name/23\",[24,38.712]],[\"parent/23\",[22,0.684]],[\"name/24\",[25,33.604]],[\"parent/24\",[22,0.684]],[\"name/25\",[26,38.712]],[\"parent/25\",[22,0.684]],[\"name/26\",[27,38.712]],[\"parent/26\",[22,0.684]],[\"name/27\",[28,33.604]],[\"parent/27\",[22,0.684]],[\"name/28\",[29,38.712]],[\"parent/28\",[22,0.684]],[\"name/29\",[30,38.712]],[\"parent/29\",[22,0.684]],[\"name/30\",[31,38.712]],[\"parent/30\",[22,0.684]],[\"name/31\",[32,38.712]],[\"parent/31\",[22,0.684]],[\"name/32\",[33,38.712]],[\"parent/32\",[22,0.684]],[\"name/33\",[34,38.712]],[\"parent/33\",[22,0.684]],[\"name/34\",[35,38.712]],[\"parent/34\",[22,0.684]],[\"name/35\",[36,38.712]],[\"parent/35\",[22,0.684]],[\"name/36\",[37,38.712]],[\"parent/36\",[22,0.684]],[\"name/37\",[38,38.712]],[\"parent/37\",[22,0.684]],[\"name/38\",[39,38.712]],[\"parent/38\",[22,0.684]],[\"name/39\",[40,38.712]],[\"parent/39\",[22,0.684]],[\"name/40\",[41,38.712]],[\"parent/40\",[22,0.684]],[\"name/41\",[42,38.712]],[\"parent/41\",[22,0.684]],[\"name/42\",[43,38.712]],[\"parent/42\",[22,0.684]],[\"name/43\",[44,38.712]],[\"parent/43\",[22,0.684]],[\"name/44\",[45,38.712]],[\"parent/44\",[22,0.684]],[\"name/45\",[46,38.712]],[\"parent/45\",[22,0.684]],[\"name/46\",[47,38.712]],[\"parent/46\",[22,0.684]],[\"name/47\",[48,38.712]],[\"parent/47\",[22,0.684]],[\"name/48\",[49,38.712]],[\"parent/48\",[22,0.684]],[\"name/49\",[50,38.712]],[\"parent/49\",[22,0.684]],[\"name/50\",[51,38.712]],[\"parent/50\",[22,0.684]],[\"name/51\",[52,38.712]],[\"parent/51\",[22,0.684]],[\"name/52\",[53,38.712]],[\"parent/52\",[22,0.684]],[\"name/53\",[54,14.145]],[\"parent/53\",[]],[\"name/54\",[23,33.604]],[\"parent/54\",[54,1.264]],[\"name/55\",[22,7.651]],[\"parent/55\",[54,1.264]],[\"name/56\",[25,33.604]],[\"parent/56\",[54,1.264]],[\"name/57\",[55,38.712]],[\"parent/57\",[54,1.264]],[\"name/58\",[56,38.712]],[\"parent/58\",[54,1.264]],[\"name/59\",[57,38.712]],[\"parent/59\",[54,1.264]],[\"name/60\",[58,38.712]],[\"parent/60\",[54,1.264]],[\"name/61\",[28,33.604]],[\"parent/61\",[54,1.264]],[\"name/62\",[59,38.712]],[\"parent/62\",[54,1.264]],[\"name/63\",[60,38.712]],[\"parent/63\",[54,1.264]],[\"name/64\",[61,38.712]],[\"parent/64\",[54,1.264]],[\"name/65\",[62,38.712]],[\"parent/65\",[54,1.264]],[\"name/66\",[63,38.712]],[\"parent/66\",[54,1.264]],[\"name/67\",[64,38.712]],[\"parent/67\",[54,1.264]],[\"name/68\",[65,38.712]],[\"parent/68\",[54,1.264]],[\"name/69\",[66,38.712]],[\"parent/69\",[54,1.264]],[\"name/70\",[67,38.712]],[\"parent/70\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":6,\"name\":{\"6\":{}},\"parent\":{}}],[\"admin\",{\"_index\":30,\"name\":{\"29\":{}},\"parent\":{}}],[\"approvals\",{\"_index\":57,\"name\":{\"59\":{}},\"parent\":{}}],[\"approve\",{\"_index\":63,\"name\":{\"66\":{}},\"parent\":{}}],[\"batchmintandburn\",{\"_index\":48,\"name\":{\"47\":{}},\"parent\":{}}],[\"burnmember\",{\"_index\":47,\"name\":{\"46\":{}},\"parent\":{}}],[\"config\",{\"_index\":5,\"name\":{\"5\":{}},\"parent\":{\"6\":{}}}],[\"config.__type\",{\"_index\":8,\"name\":{},\"parent\":{\"7\":{},\"8\":{},\"9\":{},\"10\":{},\"11\":{},\"12\":{},\"13\":{}}}],[\"constructor\",{\"_index\":23,\"name\":{\"22\":{},\"54\":{}},\"parent\":{}}],[\"controller\",{\"_index\":24,\"name\":{\"23\":{}},\"parent\":{}}],[\"createrejectproposal\",{\"_index\":53,\"name\":{\"52\":{}},\"parent\":{}}],[\"customsubgraphquery\",{\"_index\":18,\"name\":{\"17\":{}},\"parent\":{}}],[\"ejectsafe\",{\"_index\":52,\"name\":{\"51\":{}},\"parent\":{}}],[\"enablecontroller\",{\"_index\":21,\"name\":{\"20\":{}},\"parent\":{}}],[\"ensname\",{\"_index\":29,\"name\":{\"28\":{}},\"parent\":{}}],[\"etherscanapikey\",{\"_index\":14,\"name\":{\"13\":{}},\"parent\":{}}],[\"etherscanurl\",{\"_index\":13,\"name\":{\"12\":{}},\"parent\":{}}],[\"executeapprove\",{\"_index\":65,\"name\":{\"68\":{}},\"parent\":{}}],[\"executereject\",{\"_index\":66,\"name\":{\"69\":{}},\"parent\":{}}],[\"fetchadminpodids\",{\"_index\":17,\"name\":{\"16\":{}},\"parent\":{}}],[\"fetchpodusers\",{\"_index\":15,\"name\":{\"14\":{}},\"parent\":{}}],[\"fetchuserpodids\",{\"_index\":16,\"name\":{\"15\":{}},\"parent\":{}}],[\"getadminpods\",{\"_index\":3,\"name\":{\"3\":{}},\"parent\":{}}],[\"getmembereoas\",{\"_index\":38,\"name\":{\"37\":{}},\"parent\":{}}],[\"getmemberpods\",{\"_index\":39,\"name\":{\"38\":{}},\"parent\":{}}],[\"getmembers\",{\"_index\":37,\"name\":{\"36\":{}},\"parent\":{}}],[\"getpod\",{\"_index\":0,\"name\":{\"0\":{}},\"parent\":{}}],[\"getproposal\",{\"_index\":34,\"name\":{\"33\":{}},\"parent\":{}}],[\"getproposals\",{\"_index\":33,\"name\":{\"32\":{}},\"parent\":{}}],[\"getsubpodsbymember\",{\"_index\":44,\"name\":{\"43\":{}},\"parent\":{}}],[\"getsuperpods\",{\"_index\":35,\"name\":{\"34\":{}},\"parent\":{}}],[\"getsuperproposal\",{\"_index\":1,\"name\":{\"1\":{}},\"parent\":{}}],[\"getsuperproposals\",{\"_index\":36,\"name\":{\"35\":{}},\"parent\":{}}],[\"getuserpods\",{\"_index\":2,\"name\":{\"2\":{}},\"parent\":{}}],[\"gnosisurl\",{\"_index\":12,\"name\":{\"11\":{}},\"parent\":{}}],[\"id\",{\"_index\":25,\"name\":{\"24\":{},\"56\":{}},\"parent\":{}}],[\"imagenotexturl\",{\"_index\":32,\"name\":{\"31\":{}},\"parent\":{}}],[\"imageurl\",{\"_index\":31,\"name\":{\"30\":{}},\"parent\":{}}],[\"init\",{\"_index\":4,\"name\":{\"4\":{}},\"parent\":{}}],[\"isadmin\",{\"_index\":41,\"name\":{\"40\":{}},\"parent\":{}}],[\"isadminpodmember\",{\"_index\":42,\"name\":{\"41\":{}},\"parent\":{}}],[\"ismember\",{\"_index\":40,\"name\":{\"39\":{}},\"parent\":{}}],[\"issubpodmember\",{\"_index\":43,\"name\":{\"42\":{}},\"parent\":{}}],[\"issubproposal\",{\"_index\":56,\"name\":{\"58\":{}},\"parent\":{}}],[\"method\",{\"_index\":59,\"name\":{\"62\":{}},\"parent\":{}}],[\"migratepodtolatest\",{\"_index\":51,\"name\":{\"50\":{}},\"parent\":{}}],[\"mintmember\",{\"_index\":46,\"name\":{\"45\":{}},\"parent\":{}}],[\"multicall\",{\"_index\":9,\"name\":{\"8\":{}},\"parent\":{}}],[\"multipodcreate\",{\"_index\":19,\"name\":{\"18\":{}},\"parent\":{}}],[\"network\",{\"_index\":10,\"name\":{\"9\":{}},\"parent\":{}}],[\"nonce\",{\"_index\":27,\"name\":{\"26\":{}},\"parent\":{}}],[\"parameters\",{\"_index\":60,\"name\":{\"63\":{}},\"parent\":{}}],[\"pod\",{\"_index\":22,\"name\":{\"21\":{},\"55\":{}},\"parent\":{\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{},\"36\":{},\"37\":{},\"38\":{},\"39\":{},\"40\":{},\"41\":{},\"42\":{},\"43\":{},\"44\":{},\"45\":{},\"46\":{},\"47\":{},\"48\":{},\"49\":{},\"50\":{},\"51\":{},\"52\":{}}}],[\"podifysafe\",{\"_index\":20,\"name\":{\"19\":{}},\"parent\":{}}],[\"proposal\",{\"_index\":54,\"name\":{\"53\":{}},\"parent\":{\"54\":{},\"55\":{},\"56\":{},\"57\":{},\"58\":{},\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"68\":{},\"69\":{}}}],[\"proposalstatus\",{\"_index\":67,\"name\":{\"70\":{}},\"parent\":{}}],[\"propose\",{\"_index\":45,\"name\":{\"44\":{}},\"parent\":{}}],[\"provider\",{\"_index\":7,\"name\":{\"7\":{}},\"parent\":{}}],[\"reject\",{\"_index\":64,\"name\":{\"67\":{}},\"parent\":{}}],[\"rejections\",{\"_index\":58,\"name\":{\"60\":{}},\"parent\":{}}],[\"safe\",{\"_index\":26,\"name\":{\"25\":{}},\"parent\":{}}],[\"status\",{\"_index\":55,\"name\":{\"57\":{}},\"parent\":{}}],[\"subgraphurl\",{\"_index\":11,\"name\":{\"10\":{}},\"parent\":{}}],[\"threshold\",{\"_index\":28,\"name\":{\"27\":{},\"61\":{}},\"parent\":{}}],[\"timestamp\",{\"_index\":62,\"name\":{\"65\":{}},\"parent\":{}}],[\"transferadmin\",{\"_index\":50,\"name\":{\"49\":{}},\"parent\":{}}],[\"transfermembership\",{\"_index\":49,\"name\":{\"48\":{}},\"parent\":{}}],[\"value\",{\"_index\":61,\"name\":{\"64\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file +window.searchData = JSON.parse("{\"kinds\":{\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\"},\"rows\":[{\"id\":0,\"kind\":64,\"name\":\"getPod\",\"url\":\"modules.html#getPod\",\"classes\":\"tsd-kind-function\"},{\"id\":1,\"kind\":64,\"name\":\"getSuperProposal\",\"url\":\"modules.html#getSuperProposal\",\"classes\":\"tsd-kind-function\"},{\"id\":2,\"kind\":64,\"name\":\"getUserPods\",\"url\":\"modules.html#getUserPods\",\"classes\":\"tsd-kind-function\"},{\"id\":3,\"kind\":64,\"name\":\"getAdminPods\",\"url\":\"modules.html#getAdminPods\",\"classes\":\"tsd-kind-function\"},{\"id\":4,\"kind\":64,\"name\":\"init\",\"url\":\"modules.html#init\",\"classes\":\"tsd-kind-function\"},{\"id\":5,\"kind\":32,\"name\":\"config\",\"url\":\"modules.html#config\",\"classes\":\"tsd-kind-variable\"},{\"id\":6,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules.html#config.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"config\"},{\"id\":7,\"kind\":1024,\"name\":\"provider\",\"url\":\"modules.html#config.__type.provider\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":8,\"kind\":1024,\"name\":\"multicall\",\"url\":\"modules.html#config.__type.multicall\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":9,\"kind\":1024,\"name\":\"network\",\"url\":\"modules.html#config.__type.network\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":10,\"kind\":1024,\"name\":\"subgraphUrl\",\"url\":\"modules.html#config.__type.subgraphUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":11,\"kind\":1024,\"name\":\"gnosisUrl\",\"url\":\"modules.html#config.__type.gnosisUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":12,\"kind\":1024,\"name\":\"etherscanUrl\",\"url\":\"modules.html#config.__type.etherscanUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":13,\"kind\":1024,\"name\":\"etherscanApiKey\",\"url\":\"modules.html#config.__type.etherscanApiKey\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"config.__type\"},{\"id\":14,\"kind\":64,\"name\":\"fetchPodUsers\",\"url\":\"modules.html#fetchPodUsers\",\"classes\":\"tsd-kind-function\"},{\"id\":15,\"kind\":64,\"name\":\"fetchUserPodIds\",\"url\":\"modules.html#fetchUserPodIds\",\"classes\":\"tsd-kind-function\"},{\"id\":16,\"kind\":64,\"name\":\"fetchAdminPodIds\",\"url\":\"modules.html#fetchAdminPodIds\",\"classes\":\"tsd-kind-function\"},{\"id\":17,\"kind\":64,\"name\":\"customSubgraphQuery\",\"url\":\"modules.html#customSubgraphQuery\",\"classes\":\"tsd-kind-function\"},{\"id\":18,\"kind\":64,\"name\":\"multiPodCreate\",\"url\":\"modules.html#multiPodCreate\",\"classes\":\"tsd-kind-function\"},{\"id\":19,\"kind\":64,\"name\":\"podifySafe\",\"url\":\"modules.html#podifySafe\",\"classes\":\"tsd-kind-function\"},{\"id\":20,\"kind\":64,\"name\":\"enableController\",\"url\":\"modules.html#enableController\",\"classes\":\"tsd-kind-function\"},{\"id\":21,\"kind\":128,\"name\":\"Pod\",\"url\":\"classes/Pod.html\",\"classes\":\"tsd-kind-class\"},{\"id\":22,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Pod.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":23,\"kind\":1024,\"name\":\"controller\",\"url\":\"classes/Pod.html#controller\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":24,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Pod.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":25,\"kind\":1024,\"name\":\"safe\",\"url\":\"classes/Pod.html#safe\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":26,\"kind\":1024,\"name\":\"nonce\",\"url\":\"classes/Pod.html#nonce\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":27,\"kind\":1024,\"name\":\"threshold\",\"url\":\"classes/Pod.html#threshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":28,\"kind\":1024,\"name\":\"ensName\",\"url\":\"classes/Pod.html#ensName\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":29,\"kind\":1024,\"name\":\"admin\",\"url\":\"classes/Pod.html#admin\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":30,\"kind\":1024,\"name\":\"imageUrl\",\"url\":\"classes/Pod.html#imageUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":31,\"kind\":1024,\"name\":\"imageNoTextUrl\",\"url\":\"classes/Pod.html#imageNoTextUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":32,\"kind\":2048,\"name\":\"getProposals\",\"url\":\"classes/Pod.html#getProposals\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":33,\"kind\":2048,\"name\":\"getProposal\",\"url\":\"classes/Pod.html#getProposal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":34,\"kind\":2048,\"name\":\"getSuperPods\",\"url\":\"classes/Pod.html#getSuperPods\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":35,\"kind\":2048,\"name\":\"getSuperProposals\",\"url\":\"classes/Pod.html#getSuperProposals\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":36,\"kind\":2048,\"name\":\"getMembers\",\"url\":\"classes/Pod.html#getMembers\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":37,\"kind\":2048,\"name\":\"getMemberEOAs\",\"url\":\"classes/Pod.html#getMemberEOAs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":38,\"kind\":2048,\"name\":\"getMemberPods\",\"url\":\"classes/Pod.html#getMemberPods\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":39,\"kind\":2048,\"name\":\"isMember\",\"url\":\"classes/Pod.html#isMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":40,\"kind\":2048,\"name\":\"isAdmin\",\"url\":\"classes/Pod.html#isAdmin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":41,\"kind\":2048,\"name\":\"isAdminPodMember\",\"url\":\"classes/Pod.html#isAdminPodMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":42,\"kind\":2048,\"name\":\"isSubPodMember\",\"url\":\"classes/Pod.html#isSubPodMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":43,\"kind\":2048,\"name\":\"getSubPodsByMember\",\"url\":\"classes/Pod.html#getSubPodsByMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":44,\"kind\":2048,\"name\":\"propose\",\"url\":\"classes/Pod.html#propose\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":45,\"kind\":2048,\"name\":\"mintMember\",\"url\":\"classes/Pod.html#mintMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":46,\"kind\":2048,\"name\":\"burnMember\",\"url\":\"classes/Pod.html#burnMember\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":47,\"kind\":2048,\"name\":\"batchMintAndBurn\",\"url\":\"classes/Pod.html#batchMintAndBurn\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":48,\"kind\":2048,\"name\":\"transferMembership\",\"url\":\"classes/Pod.html#transferMembership\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":49,\"kind\":2048,\"name\":\"transferAdmin\",\"url\":\"classes/Pod.html#transferAdmin\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":50,\"kind\":2048,\"name\":\"migratePodToLatest\",\"url\":\"classes/Pod.html#migratePodToLatest\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":51,\"kind\":2048,\"name\":\"isPodifyInProgress\",\"url\":\"classes/Pod.html#isPodifyInProgress\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":52,\"kind\":2048,\"name\":\"ejectSafe\",\"url\":\"classes/Pod.html#ejectSafe\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":53,\"kind\":2048,\"name\":\"createRejectProposal\",\"url\":\"classes/Pod.html#createRejectProposal\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Pod\"},{\"id\":54,\"kind\":128,\"name\":\"Proposal\",\"url\":\"classes/Proposal.html\",\"classes\":\"tsd-kind-class\"},{\"id\":55,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Proposal.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":56,\"kind\":1024,\"name\":\"pod\",\"url\":\"classes/Proposal.html#pod\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":57,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Proposal.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":58,\"kind\":1024,\"name\":\"status\",\"url\":\"classes/Proposal.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":59,\"kind\":1024,\"name\":\"isSubProposal\",\"url\":\"classes/Proposal.html#isSubProposal\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":60,\"kind\":1024,\"name\":\"approvals\",\"url\":\"classes/Proposal.html#approvals\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":61,\"kind\":1024,\"name\":\"rejections\",\"url\":\"classes/Proposal.html#rejections\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":62,\"kind\":1024,\"name\":\"threshold\",\"url\":\"classes/Proposal.html#threshold\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":63,\"kind\":1024,\"name\":\"method\",\"url\":\"classes/Proposal.html#method\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":64,\"kind\":1024,\"name\":\"parameters\",\"url\":\"classes/Proposal.html#parameters\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":65,\"kind\":1024,\"name\":\"value\",\"url\":\"classes/Proposal.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":66,\"kind\":1024,\"name\":\"timestamp\",\"url\":\"classes/Proposal.html#timestamp\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":67,\"kind\":2048,\"name\":\"approve\",\"url\":\"classes/Proposal.html#approve\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":68,\"kind\":2048,\"name\":\"reject\",\"url\":\"classes/Proposal.html#reject\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":69,\"kind\":2048,\"name\":\"executeApprove\",\"url\":\"classes/Proposal.html#executeApprove\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":70,\"kind\":2048,\"name\":\"executeReject\",\"url\":\"classes/Proposal.html#executeReject\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Proposal\"},{\"id\":71,\"kind\":4194304,\"name\":\"ProposalStatus\",\"url\":\"modules.html#ProposalStatus\",\"classes\":\"tsd-kind-type-alias\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,38.85]],[\"parent/0\",[]],[\"name/1\",[1,38.85]],[\"parent/1\",[]],[\"name/2\",[2,38.85]],[\"parent/2\",[]],[\"name/3\",[3,38.85]],[\"parent/3\",[]],[\"name/4\",[4,38.85]],[\"parent/4\",[]],[\"name/5\",[5,33.742]],[\"parent/5\",[]],[\"name/6\",[6,38.85]],[\"parent/6\",[5,3.021]],[\"name/7\",[7,38.85]],[\"parent/7\",[8,2.037]],[\"name/8\",[9,38.85]],[\"parent/8\",[8,2.037]],[\"name/9\",[10,38.85]],[\"parent/9\",[8,2.037]],[\"name/10\",[11,38.85]],[\"parent/10\",[8,2.037]],[\"name/11\",[12,38.85]],[\"parent/11\",[8,2.037]],[\"name/12\",[13,38.85]],[\"parent/12\",[8,2.037]],[\"name/13\",[14,38.85]],[\"parent/13\",[8,2.037]],[\"name/14\",[15,38.85]],[\"parent/14\",[]],[\"name/15\",[16,38.85]],[\"parent/15\",[]],[\"name/16\",[17,38.85]],[\"parent/16\",[]],[\"name/17\",[18,38.85]],[\"parent/17\",[]],[\"name/18\",[19,38.85]],[\"parent/18\",[]],[\"name/19\",[20,38.85]],[\"parent/19\",[]],[\"name/20\",[21,38.85]],[\"parent/20\",[]],[\"name/21\",[22,7.495]],[\"parent/21\",[]],[\"name/22\",[23,33.742]],[\"parent/22\",[22,0.671]],[\"name/23\",[24,38.85]],[\"parent/23\",[22,0.671]],[\"name/24\",[25,33.742]],[\"parent/24\",[22,0.671]],[\"name/25\",[26,38.85]],[\"parent/25\",[22,0.671]],[\"name/26\",[27,38.85]],[\"parent/26\",[22,0.671]],[\"name/27\",[28,33.742]],[\"parent/27\",[22,0.671]],[\"name/28\",[29,38.85]],[\"parent/28\",[22,0.671]],[\"name/29\",[30,38.85]],[\"parent/29\",[22,0.671]],[\"name/30\",[31,38.85]],[\"parent/30\",[22,0.671]],[\"name/31\",[32,38.85]],[\"parent/31\",[22,0.671]],[\"name/32\",[33,38.85]],[\"parent/32\",[22,0.671]],[\"name/33\",[34,38.85]],[\"parent/33\",[22,0.671]],[\"name/34\",[35,38.85]],[\"parent/34\",[22,0.671]],[\"name/35\",[36,38.85]],[\"parent/35\",[22,0.671]],[\"name/36\",[37,38.85]],[\"parent/36\",[22,0.671]],[\"name/37\",[38,38.85]],[\"parent/37\",[22,0.671]],[\"name/38\",[39,38.85]],[\"parent/38\",[22,0.671]],[\"name/39\",[40,38.85]],[\"parent/39\",[22,0.671]],[\"name/40\",[41,38.85]],[\"parent/40\",[22,0.671]],[\"name/41\",[42,38.85]],[\"parent/41\",[22,0.671]],[\"name/42\",[43,38.85]],[\"parent/42\",[22,0.671]],[\"name/43\",[44,38.85]],[\"parent/43\",[22,0.671]],[\"name/44\",[45,38.85]],[\"parent/44\",[22,0.671]],[\"name/45\",[46,38.85]],[\"parent/45\",[22,0.671]],[\"name/46\",[47,38.85]],[\"parent/46\",[22,0.671]],[\"name/47\",[48,38.85]],[\"parent/47\",[22,0.671]],[\"name/48\",[49,38.85]],[\"parent/48\",[22,0.671]],[\"name/49\",[50,38.85]],[\"parent/49\",[22,0.671]],[\"name/50\",[51,38.85]],[\"parent/50\",[22,0.671]],[\"name/51\",[52,38.85]],[\"parent/51\",[22,0.671]],[\"name/52\",[53,38.85]],[\"parent/52\",[22,0.671]],[\"name/53\",[54,38.85]],[\"parent/53\",[22,0.671]],[\"name/54\",[55,14.283]],[\"parent/54\",[]],[\"name/55\",[23,33.742]],[\"parent/55\",[55,1.279]],[\"name/56\",[22,7.495]],[\"parent/56\",[55,1.279]],[\"name/57\",[25,33.742]],[\"parent/57\",[55,1.279]],[\"name/58\",[56,38.85]],[\"parent/58\",[55,1.279]],[\"name/59\",[57,38.85]],[\"parent/59\",[55,1.279]],[\"name/60\",[58,38.85]],[\"parent/60\",[55,1.279]],[\"name/61\",[59,38.85]],[\"parent/61\",[55,1.279]],[\"name/62\",[28,33.742]],[\"parent/62\",[55,1.279]],[\"name/63\",[60,38.85]],[\"parent/63\",[55,1.279]],[\"name/64\",[61,38.85]],[\"parent/64\",[55,1.279]],[\"name/65\",[62,38.85]],[\"parent/65\",[55,1.279]],[\"name/66\",[63,38.85]],[\"parent/66\",[55,1.279]],[\"name/67\",[64,38.85]],[\"parent/67\",[55,1.279]],[\"name/68\",[65,38.85]],[\"parent/68\",[55,1.279]],[\"name/69\",[66,38.85]],[\"parent/69\",[55,1.279]],[\"name/70\",[67,38.85]],[\"parent/70\",[55,1.279]],[\"name/71\",[68,38.85]],[\"parent/71\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":6,\"name\":{\"6\":{}},\"parent\":{}}],[\"admin\",{\"_index\":30,\"name\":{\"29\":{}},\"parent\":{}}],[\"approvals\",{\"_index\":58,\"name\":{\"60\":{}},\"parent\":{}}],[\"approve\",{\"_index\":64,\"name\":{\"67\":{}},\"parent\":{}}],[\"batchmintandburn\",{\"_index\":48,\"name\":{\"47\":{}},\"parent\":{}}],[\"burnmember\",{\"_index\":47,\"name\":{\"46\":{}},\"parent\":{}}],[\"config\",{\"_index\":5,\"name\":{\"5\":{}},\"parent\":{\"6\":{}}}],[\"config.__type\",{\"_index\":8,\"name\":{},\"parent\":{\"7\":{},\"8\":{},\"9\":{},\"10\":{},\"11\":{},\"12\":{},\"13\":{}}}],[\"constructor\",{\"_index\":23,\"name\":{\"22\":{},\"55\":{}},\"parent\":{}}],[\"controller\",{\"_index\":24,\"name\":{\"23\":{}},\"parent\":{}}],[\"createrejectproposal\",{\"_index\":54,\"name\":{\"53\":{}},\"parent\":{}}],[\"customsubgraphquery\",{\"_index\":18,\"name\":{\"17\":{}},\"parent\":{}}],[\"ejectsafe\",{\"_index\":53,\"name\":{\"52\":{}},\"parent\":{}}],[\"enablecontroller\",{\"_index\":21,\"name\":{\"20\":{}},\"parent\":{}}],[\"ensname\",{\"_index\":29,\"name\":{\"28\":{}},\"parent\":{}}],[\"etherscanapikey\",{\"_index\":14,\"name\":{\"13\":{}},\"parent\":{}}],[\"etherscanurl\",{\"_index\":13,\"name\":{\"12\":{}},\"parent\":{}}],[\"executeapprove\",{\"_index\":66,\"name\":{\"69\":{}},\"parent\":{}}],[\"executereject\",{\"_index\":67,\"name\":{\"70\":{}},\"parent\":{}}],[\"fetchadminpodids\",{\"_index\":17,\"name\":{\"16\":{}},\"parent\":{}}],[\"fetchpodusers\",{\"_index\":15,\"name\":{\"14\":{}},\"parent\":{}}],[\"fetchuserpodids\",{\"_index\":16,\"name\":{\"15\":{}},\"parent\":{}}],[\"getadminpods\",{\"_index\":3,\"name\":{\"3\":{}},\"parent\":{}}],[\"getmembereoas\",{\"_index\":38,\"name\":{\"37\":{}},\"parent\":{}}],[\"getmemberpods\",{\"_index\":39,\"name\":{\"38\":{}},\"parent\":{}}],[\"getmembers\",{\"_index\":37,\"name\":{\"36\":{}},\"parent\":{}}],[\"getpod\",{\"_index\":0,\"name\":{\"0\":{}},\"parent\":{}}],[\"getproposal\",{\"_index\":34,\"name\":{\"33\":{}},\"parent\":{}}],[\"getproposals\",{\"_index\":33,\"name\":{\"32\":{}},\"parent\":{}}],[\"getsubpodsbymember\",{\"_index\":44,\"name\":{\"43\":{}},\"parent\":{}}],[\"getsuperpods\",{\"_index\":35,\"name\":{\"34\":{}},\"parent\":{}}],[\"getsuperproposal\",{\"_index\":1,\"name\":{\"1\":{}},\"parent\":{}}],[\"getsuperproposals\",{\"_index\":36,\"name\":{\"35\":{}},\"parent\":{}}],[\"getuserpods\",{\"_index\":2,\"name\":{\"2\":{}},\"parent\":{}}],[\"gnosisurl\",{\"_index\":12,\"name\":{\"11\":{}},\"parent\":{}}],[\"id\",{\"_index\":25,\"name\":{\"24\":{},\"57\":{}},\"parent\":{}}],[\"imagenotexturl\",{\"_index\":32,\"name\":{\"31\":{}},\"parent\":{}}],[\"imageurl\",{\"_index\":31,\"name\":{\"30\":{}},\"parent\":{}}],[\"init\",{\"_index\":4,\"name\":{\"4\":{}},\"parent\":{}}],[\"isadmin\",{\"_index\":41,\"name\":{\"40\":{}},\"parent\":{}}],[\"isadminpodmember\",{\"_index\":42,\"name\":{\"41\":{}},\"parent\":{}}],[\"ismember\",{\"_index\":40,\"name\":{\"39\":{}},\"parent\":{}}],[\"ispodifyinprogress\",{\"_index\":52,\"name\":{\"51\":{}},\"parent\":{}}],[\"issubpodmember\",{\"_index\":43,\"name\":{\"42\":{}},\"parent\":{}}],[\"issubproposal\",{\"_index\":57,\"name\":{\"59\":{}},\"parent\":{}}],[\"method\",{\"_index\":60,\"name\":{\"63\":{}},\"parent\":{}}],[\"migratepodtolatest\",{\"_index\":51,\"name\":{\"50\":{}},\"parent\":{}}],[\"mintmember\",{\"_index\":46,\"name\":{\"45\":{}},\"parent\":{}}],[\"multicall\",{\"_index\":9,\"name\":{\"8\":{}},\"parent\":{}}],[\"multipodcreate\",{\"_index\":19,\"name\":{\"18\":{}},\"parent\":{}}],[\"network\",{\"_index\":10,\"name\":{\"9\":{}},\"parent\":{}}],[\"nonce\",{\"_index\":27,\"name\":{\"26\":{}},\"parent\":{}}],[\"parameters\",{\"_index\":61,\"name\":{\"64\":{}},\"parent\":{}}],[\"pod\",{\"_index\":22,\"name\":{\"21\":{},\"56\":{}},\"parent\":{\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{},\"36\":{},\"37\":{},\"38\":{},\"39\":{},\"40\":{},\"41\":{},\"42\":{},\"43\":{},\"44\":{},\"45\":{},\"46\":{},\"47\":{},\"48\":{},\"49\":{},\"50\":{},\"51\":{},\"52\":{},\"53\":{}}}],[\"podifysafe\",{\"_index\":20,\"name\":{\"19\":{}},\"parent\":{}}],[\"proposal\",{\"_index\":55,\"name\":{\"54\":{}},\"parent\":{\"55\":{},\"56\":{},\"57\":{},\"58\":{},\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"68\":{},\"69\":{},\"70\":{}}}],[\"proposalstatus\",{\"_index\":68,\"name\":{\"71\":{}},\"parent\":{}}],[\"propose\",{\"_index\":45,\"name\":{\"44\":{}},\"parent\":{}}],[\"provider\",{\"_index\":7,\"name\":{\"7\":{}},\"parent\":{}}],[\"reject\",{\"_index\":65,\"name\":{\"68\":{}},\"parent\":{}}],[\"rejections\",{\"_index\":59,\"name\":{\"61\":{}},\"parent\":{}}],[\"safe\",{\"_index\":26,\"name\":{\"25\":{}},\"parent\":{}}],[\"status\",{\"_index\":56,\"name\":{\"58\":{}},\"parent\":{}}],[\"subgraphurl\",{\"_index\":11,\"name\":{\"10\":{}},\"parent\":{}}],[\"threshold\",{\"_index\":28,\"name\":{\"27\":{},\"62\":{}},\"parent\":{}}],[\"timestamp\",{\"_index\":63,\"name\":{\"66\":{}},\"parent\":{}}],[\"transferadmin\",{\"_index\":50,\"name\":{\"49\":{}},\"parent\":{}}],[\"transfermembership\",{\"_index\":49,\"name\":{\"48\":{}},\"parent\":{}}],[\"value\",{\"_index\":62,\"name\":{\"65\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/classes/Pod.html b/docs/classes/Pod.html index 6247540..300f393 100644 --- a/docs/classes/Pod.html +++ b/docs/classes/Pod.html @@ -10,51 +10,51 @@

You can also check if a user is a member, admin, or member of those pods with the following functions:

const pod = await getPod(podAddress);

const isMember = await pod.isMember(userAddress);
// Not an async function
const isAdmin = pod.isAdmin(userAddress);

const isAdminPodMember = await pod.isAdminPodMember(userAddress);

// Includes both pods and users as sub pod members.
const isSubPodMember = await pod.isSubPodMember(userAddress);
-

Hierarchy

Index

Constructors

Hierarchy

Index

Constructors

  • new Pod(identifier: string | number): Pod
  • Note this constructor should not be called directly. Use getPod() instead.

    Parameters

    • identifier: string | number

      Can be either podId or safe address

      -

    Returns Pod

Properties

admin: string
property

Admin address

-
controller: string
ensName: string
property

ENS name

-
id: number
property

Pod ID

-
imageNoTextUrl: string
property

Link to Pod NFT image with no text

-
imageUrl: string
property

Link to Pod NFT image

-
nonce: number
property

Current nonce, i.e., the nonce of the active proposal

-
safe: string
property

Gnosis Safe address

-
threshold: number
property

Number of votes required to pass a proposal

-

Methods

  • batchMintAndBurn(mintMembers: string[], burnMembers: string[], signer?: Signer): Promise<any>

Returns Pod

Properties

admin: string
property

Admin address

+
controller: string
ensName: string
property

ENS name

+
id: number
property

Pod ID

+
imageNoTextUrl: string
property

Link to Pod NFT image with no text

+
imageUrl: string
property

Link to Pod NFT image

+
nonce: number
property

Current nonce, i.e., the nonce of the active proposal

+
safe: string
property

Gnosis Safe address

+
threshold: number
property

Number of votes required to pass a proposal

+

Methods

  • batchMintAndBurn(mintMembers: string[], burnMembers: string[], signer?: Signer): Promise<any>
  • Mints and burns members simultaneously.

    -

    Parameters

    • mintMembers: string[]
    • burnMembers: string[]
    • Optional signer: Signer

    Returns Promise<any>

  • burnMember(memberToBurn: string | string[], signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • +

    Parameters

    • mintMembers: string[]
    • burnMembers: string[]
    • Optional signer: Signer

    Returns Promise<any>

  • burnMember(memberToBurn: string | string[], signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Burns member(s) from this pod, or returns an unsigned transaction to do so.

    throws

    If signer is not admin

    Parameters

    • memberToBurn: string | string[]

      Can be a single address or an array of addresses

    • Optional signer: Signer

      If a signer is provided, then the tx will execute. Otherwise, an unsigned transaction will be returned.

      -

    Returns Promise<TransactionResponse | { data: string; to: string }>

  • createRejectProposal(nonce: number, signer: string | Signer): Promise<void>

Returns Promise<TransactionResponse | { data: string; to: string }>

  • createRejectProposal(nonce: number, signer: string | Signer): Promise<void>
  • Creates a reject proposal at a given nonce, mostly used to un-stuck the transaction queue

    Parameters

    • nonce: number

      nonce to create the reject transaction at

    • signer: string | Signer

      Signer or address of pod member

      -

    Returns Promise<void>

  • ejectSafe(signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>

Returns Promise<void>

  • ejectSafe(signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Ejects a safe from the Orca ecosystem. This zeroes out all ENS + Controller data, removes the Orca module, and burns the pod's MemberTokens If a signer is provided, it will execute the transaction. Otherwise it will return the unsigned tx.

    This function can also clean up data for safes that have already removed the Orca module, but note that the reverse resolver must be zeroed out by the safe manually in this case.

    -

    Parameters

    • Optional signer: Signer

    Returns Promise<TransactionResponse | { data: string; to: string }>

  • getMemberEOAs(): Promise<string[]>
  • +

    Parameters

    • Optional signer: Signer

    Returns Promise<TransactionResponse | { data: string; to: string }>

  • getMemberEOAs(): Promise<string[]>
  • Returns list of all member EOAs, not including any smart contract/pod members.

    -

    Returns Promise<string[]>

  • getMemberPods(): Promise<Pod[]>
  • getMemberPods(): Promise<Pod[]>
  • Returns Pod objects of all member pods.

    -

    Returns Promise<Pod[]>

  • getMembers(): Promise<string[]>
  • getMembers(): Promise<string[]>
  • Returns of list of all member addresses. Members include member pods and member EOAs

    -

    Returns Promise<string[]>

  • getProposal(identifier: string | number): Promise<Proposal>
  • getProposal(identifier: string | number): Promise<Proposal>
  • Gets a specific proposal by either nonce or the safeTxHash.

    Parameters

    • identifier: string | number

      Can be either the proposal id/nonce (preferred), or the safeTxHash

      -

    Returns Promise<Proposal>

Returns Promise<Proposal>

  • Returns an array of Proposal objects in reverse chronological order. Defaults to returning 5, which can be overridden by passing { limit: 10 } for example in the options.

    By default, the first Proposal will be the active proposal, if there is one, and then any executed proposals.

    @@ -62,40 +62,40 @@ proposals, then the active proposal, then executed proposals (up to the requested limit).

    Executed proposals can be fetched by passing { status: 'executed' } in the options. This will return only executed proposals.

    -

    Parameters

    Returns Promise<Proposal[]>

  • getSubPodsByMember(address: string): Promise<Pod[]>
  • getSubPodsByMember(address: string): Promise<Pod[]>
  • Returns all sub pods of this pod that an address is the member of.

    Parameters

    • address: string
      -

    Returns Promise<Pod[]>

  • getSuperPods(): Promise<Pod[]>

Returns Promise<Pod[]>

  • getSuperPods(): Promise<Pod[]>
  • Returns an array of this pod's super pods, i.e., pods that this pod is a member of

    -

    Returns Promise<Pod[]>

  • getSuperProposals(): Promise<Proposal[]>
  • getSuperProposals(): Promise<Proposal[]>
  • Returns an array of all active super proposals, i.e., active proposals of any super pods

    -

    Returns Promise<Proposal[]>

  • isAdmin(address: string): boolean
  • isAdmin(address: string): boolean
  • Checks if user is admin of this pod

    Parameters

    • address: string
      -

    Returns boolean

  • isAdminPodMember(address: string): Promise<boolean>

Returns boolean

  • isAdminPodMember(address: string): Promise<boolean>
  • Checks if given address is a member of the admin pod (if there is one) Returns false if there is no admin pod.

    -

    Parameters

    • address: string

    Returns Promise<boolean>

  • isMember(address: string): Promise<boolean>
  • +

    Parameters

    • address: string

    Returns Promise<boolean>

  • isMember(address: string): Promise<boolean>
  • Checks if user is a member of this pod

    Parameters

    • address: string
      -

    Returns Promise<boolean>

  • isSubPodMember(address: string): Promise<boolean>

Returns Promise<boolean>

  • isPodifyInProgress(): Promise<boolean>
  • isSubPodMember(address: string): Promise<boolean>
  • Checks if given address is a member of any subpods. Returns false if the user is a member of this pod, but not any sub pods

    Parameters

    • address: string
      -

    Returns Promise<boolean>

  • migratePodToLatest(signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>

Returns Promise<boolean>

  • migratePodToLatest(signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Migrates the pod to the latest version. Signer must be the admin of pod. If a signer is provided, it will execute the transaction. Otherwise it will return the unsigned tx.

    throws

    If signer is not pod admin

    Parameters

    • Optional signer: Signer

      Signer of pod admin

      -

    Returns Promise<TransactionResponse | { data: string; to: string }>

  • mintMember(newMember: string | string[], signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>

Returns Promise<TransactionResponse | { data: string; to: string }>

  • mintMember(newMember: string | string[], signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Mints member(s) to this pod, or returns an unsigned transaction to do so.

    throws

    if signer is not admin

    Parameters

    • newMember: string | string[]

      Can be a single address or an array of addresses

    • Optional signer: Signer

      If a signer is provided, then the tx will execute. Otherwise, an unsigned transaction will be returned.

      -

    Returns Promise<TransactionResponse | { data: string; to: string }>

  • propose(proposal: Proposal | TransactionResponse | { data: string; to: string }, sender: string, opts?: { nonce?: number }): Promise<Proposal>

Returns Promise<TransactionResponse | { data: string; to: string }>

  • propose(proposal: Proposal | TransactionResponse | { data: string; to: string }, sender: string, opts?: { nonce?: number }): Promise<Proposal>
  • Creates a proposal on the pod.

    If the proposal parameter is in the { data, to } format, this will create a proposal to execute an arbitrary smart contract function on this pod.

    @@ -119,7 +119,7 @@

    Address of sender

  • opts: { nonce?: number } = {}
    • Optional nonce?: number

      Optional nonce. This will create a proposal with the given nonce.

      -

Returns Promise<Proposal>

  • transferAdmin(addressToTransferTo: string, signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>

Returns Promise<Proposal>

  • transferAdmin(addressToTransferTo: string, signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Transfers admin role from signer's account to addressToTransferTo If a signer is provided, it will execute the transaction. Otherwise it will return the unsigned tx.

    throws

    If signer is not admin

    @@ -127,7 +127,7 @@

    Address that will receive admin role

  • Optional signer: Signer

    Signer of admin

    -

Returns Promise<TransactionResponse | { data: string; to: string }>

  • transferMembership(fromAddress: string, toAddress: string, signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>

Returns Promise<TransactionResponse | { data: string; to: string }>

  • transferMembership(fromAddress: string, toAddress: string, signer?: Signer): Promise<TransactionResponse | { data: string; to: string }>
  • Transfers a membership. If a signer is provided, it will execute the transaction. Otherwise it will return the unsigned tx.

    throws

    If toAddress is already a member

    throws

    if fromAddress is not a member

    @@ -138,4 +138,4 @@

    Address that will receive membership

  • Optional signer: Signer

    If a signer is provided, then the tx will execute. Otherwise, an unsigned transaction will be returned.

    -

Returns Promise<TransactionResponse | { data: string; to: string }>

Generated using TypeDoc

\ No newline at end of file +

Returns Promise<TransactionResponse | { data: string; to: string }>

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/Proposal.html b/docs/classes/Proposal.html index d6e7e5d..efa855f 100644 --- a/docs/classes/Proposal.html +++ b/docs/classes/Proposal.html @@ -1,40 +1,40 @@ Proposal | @orcaprotocol/orca-sdk
Options
All
  • Public
  • Public/Protected
  • All
Menu

The Proposal object is the interface for interacting with any Proposals. Can be gotten via the Pod object, through Pod.getProposals.

-

Hierarchy

  • Proposal

Index

Constructors

  • new Proposal(Pod: Pod, podNonce: number, safeTransaction: SafeTransaction, rejectTransaction?: SafeTransaction): Proposal

Hierarchy

  • Proposal

Index

Constructors

  • new Proposal(Pod: Pod, podNonce: number, safeTransaction: SafeTransaction, rejectTransaction?: SafeTransaction): Proposal
  • Transforms a Safe Transaction object into one of our Proposals.

    Parameters

    • Pod: Pod
    • podNonce: number
    • safeTransaction: SafeTransaction
    • Optional rejectTransaction: SafeTransaction

      Optional reject transaction

      -

    Returns Proposal

Properties

approvals: string[]
property

Array of addresses that approved

-
id: number
property

Proposal ID, i.e., the Gnosis nonce. This is not necessarily a unique number

-
isSubProposal?: boolean
property

Whether or not this proposal corresponds to a superproposal

-
method?: string
property

Name of smart contract method being called, if there is one

-
parameters?: { name: string; type: string; value: string }[]
property

Parameters for the smart contract function being called, if there is one

-
pod: Pod
property

Pod object this Proposal is associated with

-
rejections: string[]
property

Array of addresses that rejected

-
property

Proposal status, i.e., 'active', 'executed', or 'queued',

-
threshold: number
property

Number of votes required to pass/reject a proposal

-
timestamp: Date
value: string
property

Eth value of transfer in Wei, if there is one

-

Methods

  • approve(signer: Signer): Promise<void>

Returns Proposal

Properties

approvals: string[]
property

Array of addresses that approved

+
id: number
property

Proposal ID, i.e., the Gnosis nonce. This is not necessarily a unique number

+
isSubProposal?: boolean
property

Whether or not this proposal corresponds to a superproposal

+
method?: string
property

Name of smart contract method being called, if there is one

+
parameters?: { name: string; type: string; value: string }[]
property

Parameters for the smart contract function being called, if there is one

+
pod: Pod
property

Pod object this Proposal is associated with

+
rejections: string[]
property

Array of addresses that rejected

+
property

Proposal status, i.e., 'active', 'executed', or 'queued',

+
threshold: number
property

Number of votes required to pass/reject a proposal

+
timestamp: Date
value: string
property

Eth value of transfer in Wei, if there is one

+

Methods

  • approve(signer: Signer): Promise<void>
  • Votes to approve the proposal

    throws

    If signer already approved proposal

    throws

    If signer is not a pod member

    throws

    If there was an error approving Proposal

    Parameters

    • signer: Signer

      Signer of pod member

      -

    Returns Promise<void>

  • executeApprove(signer: Signer): Promise<any>

Returns Promise<void>

  • executeApprove(signer: Signer): Promise<any>
  • Executes proposal

    throws

    If not enough approvals to execute

    throws

    If signer was not part of the pod

    Parameters

    • signer: Signer

      Signer of pod member

      -

    Returns Promise<any>

  • executeReject(signer: Signer): Promise<any>

Returns Promise<any>

  • executeReject(signer: Signer): Promise<any>
  • Executes the rejection of proposal

    throws

    If not enough rejections to execute

    throws

    If signer was not part of the pod

    Parameters

    • signer: Signer

      Signer of pod member

      -

    Returns Promise<any>

  • reject(signer: Signer): Promise<void>

Returns Promise<any>

  • reject(signer: Signer): Promise<void>
  • Votes to reject the proposal

    throws

    If signer has already rejected proposal

    throws

    If signer was not pod member

    diff --git a/docs/modules.html b/docs/modules.html index a2d22e4..6904da8 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,7 +1,7 @@ -@orcaprotocol/orca-sdk
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    @orcaprotocol/orca-sdk

    Index

    Type aliases

    ProposalStatus: "active" | "executed" | "queued"

    Variables

    config: { etherscanApiKey: any; etherscanUrl: any; gnosisUrl: any; multicall: any; network: any; provider: any; subgraphUrl: any } = ...
    +@orcaprotocol/orca-sdk
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    @orcaprotocol/orca-sdk

    Index

    Type aliases

    ProposalStatus: "active" | "executed" | "queued"

    Variables

    config: { etherscanApiKey: any; etherscanUrl: any; gnosisUrl: any; multicall: any; network: any; provider: any; subgraphUrl: any } = ...

    The config object. This object should not be manipulated directly, and is exported mostly for debug purposes.

    -

    Type declaration

    • etherscanApiKey: any
    • etherscanUrl: any
    • gnosisUrl: any
    • multicall: any
    • network: any
    • provider: any
    • subgraphUrl: any

    Functions

    • customSubgraphQuery(query: string): Promise<any>
    • +

      Type declaration

      • etherscanApiKey: any
      • etherscanUrl: any
      • gnosisUrl: any
      • multicall: any
      • network: any
      • provider: any
      • subgraphUrl: any

    Functions

    • customSubgraphQuery(query: string): Promise<any>
    • Makes a custom call on the subgraph by passing a query in directly. Note that this data will likely require manual transformation to be usable.

      Example: Making a call to retrieve pod IDs 1 through 3:

      @@ -28,47 +28,47 @@ }


      Note these are not Pod objects as defined by the SDK.

      @param query - GraphQL query
      @returns
      -

      Parameters

      • query: string

      Returns Promise<any>

    • enableController(safe: string, signer: Signer): Promise<void>
    • enableController(safe: string, signer: Signer): Promise<void>
    • Creates a SafeTx on a safe to enable the latest Controller as a module.

      throws

      If a Controller module is already enabled. If you are attempting to upgrade versions, use Pod.migratePodToLatest.

      Parameters

      • safe: string

        Safe address

        -
      • signer: Signer

      Returns Promise<void>

    • fetchAdminPodIds(address: string): Promise<number[]>

    Returns Promise<void>

  • fetchAdminPodIds(address: string): Promise<number[]>
  • Returns an array of Pod IDs from sub graph that an address is the admin of This function bypasses Pod construction and is mostly used for optimization purposes. If you're unsure on what function to use, use getAdminPods instead.

    Parameters

    • address: string
      -

    Returns Promise<number[]>

  • fetchPodUsers(id: number): Promise<string[]>

Returns Promise<number[]>

  • fetchPodUsers(id: number): Promise<string[]>
  • Returns an array of addresses of all pod members.

    Parameters

    • id: number
      -

    Returns Promise<string[]>

  • fetchUserPodIds(address: string): Promise<number[]>

Returns Promise<string[]>

  • fetchUserPodIds(address: string): Promise<number[]>
  • Returns a list of Pod IDs from subgraph that user is a member of. This function bypasses Pod construction and is mostly used for optimization purposes. If you're unsure on what function to use, use getUserPods instead.

    Parameters

    • address: string
      -

    Returns Promise<number[]>

  • getAdminPods(address: string): Promise<Pod[]>

Returns Promise<number[]>

  • getAdminPods(address: string): Promise<Pod[]>
  • Gets an array of Pod objects that a user is the admin of

    Parameters

    • address: string

      user address

      -

    Returns Promise<Pod[]>

  • getPod(identifier: string | number): Promise<Pod>

Returns Promise<Pod[]>

  • getPod(identifier: string | number): Promise<Pod>
  • Gets a pod object.

    Parameters

    • identifier: string | number

      Pod ID (as number), safe address, or ENS name

      -

    Returns Promise<Pod>

Returns Promise<Pod>

  • Gets the super proposal that the sub proposal relates to

    throws

    If this proposal is not a sub proposal

    throws

    If the found super proposal does not relate to this sub proposal.

    -

    Parameters

    Returns Promise<Proposal>

  • getUserPods(address: string): Promise<Pod[]>
  • getUserPods(address: string): Promise<Pod[]>
  • Fetches an array of Pod objects that a user is a member of

    Parameters

    • address: string

      user address

      -

    Returns Promise<Pod[]>

  • init(input: { network: number; provider: Provider; subgraphUrl?: string }): void

Returns Promise<Pod[]>

  • init(input: { network: number; provider: Provider; subgraphUrl?: string }): void
  • Initializes the SDK. This should be called on app startup.

    Parameters

    • input: { network: number; provider: Provider; subgraphUrl?: string }
      • network: number

        Network ID. Currently supporting Mainnet (id 1) and Rinkeby (id 4)

      • provider: Provider
      • Optional subgraphUrl?: string

        Optional override for development/debug purposes.

        -

    Returns void

  • multiPodCreate(pods: { admin?: string; label: string; members: string[]; threshold: number }[], signer: Signer): Promise<any>

Returns void

  • multiPodCreate(pods: { admin?: string; label: string; members: string[]; threshold: number }[], signer: Signer): Promise<any>
  • Creates multiple pods simultaneously.

    Each pod requires an array of members, a threshold and label, with an optional admin. Members or admins can be other pods in this create action.

    @@ -81,7 +81,7 @@
     [
    {
    label: 'orcanauts',
    // This will add the below pods as sub pods to this newly created one.
    members: ['art-nauts', 'gov-nauts'],
    threshold: 1,
    },
    {
    label: 'art-nauts',
    members: ['0x1234...', '0x2345...'],
    threshold: 1,
    },
    {
    label: 'gov-nauts',
    members: ['0x3456...', '0x4567...'],
    threshold: 1,
    // This will add the above 'orcanauts' pod as the admin to this new pod.
    admin: 'orcanauts',
    }
    ]

    Parameters

    • pods: { admin?: string; label: string; members: string[]; threshold: number }[]
      -
    • signer: Signer

    Returns Promise<any>

  • podifySafe(args: { admin?: string; name: string; safe: string }, signer?: Signer): Promise<ethers.providers.TransactionResponse | { data: string; to: string }>

Returns Promise<any>

  • podifySafe(args: { admin?: string; name: string; safe: string }, signer?: Signer): Promise<ethers.providers.TransactionResponse | { data: string; to: string }>
  • Adds a Gnosis Safe to the pod ecosystem. If a signer is not provided, it instead returns the unsigned transaction.

    throws
      diff --git a/scripts/sandbox.ts b/scripts/sandbox.ts index b89618b..ce98da6 100644 --- a/scripts/sandbox.ts +++ b/scripts/sandbox.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers'; -import { customSubgraphQuery, getUserPods, init } from '../src'; +import { customSubgraphQuery, getUserPods, init, podifySafe } from '../src'; import { getPod, multiPodCreate } from '../src'; import { accountOne, accountTwo, adminPodAddress } from '../env.json'; import { setup, sleep } from './utils'; @@ -25,19 +25,17 @@ const multiPodInput = [ ]; async function main() { - const { walletOne, dummyAccount } = setup(4); + const { walletTwo, dummyAccount } = setup(4); - const butt = await customSubgraphQuery(`{ - pods(where: { - id_in: [1, 2, 3] - }) { - id - users { - id - } - admin - } - }`); + // await podifySafe({ + // admin: walletTwo.address, + // name: 'blargh', + // safe: '0x49E55999e9c47589Fd953747edffA1a754d9f8B5', + // }, walletTwo); + + const pod = await getPod('0xA4fD170b92b9CBac066e4551DC4BdbbB85093c51'); + + const butt = await pod.isPodifyInProgress(); console.log('butt', butt); } diff --git a/src/Pod.ts b/src/Pod.ts index f7955c3..57fd5eb 100644 --- a/src/Pod.ts +++ b/src/Pod.ts @@ -852,6 +852,28 @@ export default class Pod { } }; + /** + * + */ + isPodifyInProgress = async () => { + const proposals = await this.getProposals(); + let result = false; + proposals.forEach(proposal => { + if (proposal.status === 'executed') return; + if (proposal.method === 'enableModule') { + try { + // This throws if the provided address is not one of our controllers. + getControllerByAddress(proposal.parameters[0].value, config.network); + // Set to true if it doesn't throw. + result = true; + } catch { + // Do nothing. + } + } + }); + return result; + }; + /** * Ejects a safe from the Orca ecosystem. * This zeroes out all ENS + Controller data, removes the Orca module, and burns the pod's MemberTokens diff --git a/test/fixtures/index.ts b/test/fixtures/index.ts index e637cb0..b982fd2 100644 --- a/test/fixtures/index.ts +++ b/test/fixtures/index.ts @@ -561,3 +561,56 @@ const subProposalFixture = [ signatures: null, }, ]; + +export const enableModuleSafeTx = { + safe: '0x49E55999e9c47589Fd953747edffA1a754d9f8B5', + to: '0x49E55999e9c47589Fd953747edffA1a754d9f8B5', + value: '0', + data: '0x610b592500000000000000000000000011e2d4c75b9803ff5d6da8c30b354b44992e0248', + operation: 0, + gasToken: '0x0000000000000000000000000000000000000000', + safeTxGas: 0, + baseGas: 0, + gasPrice: '0', + refundReceiver: '0x0000000000000000000000000000000000000000', + nonce: 0, + executionDate: '2022-01-26T18:01:37Z', + submissionDate: '2022-01-26T18:01:25.726016Z', + modified: '2022-01-26T18:01:37Z', + blockNumber: 10059884, + transactionHash: '0xa00e81f88f4cb3df006779007424cc469ecc6bdfbac753dba383cfdb03ad97c1', + safeTxHash: '0x6723fd3b412953fe3a2c9c776805287d9c914964bc761604cbe73419f6169e80', + executor: '0x1cC62cE7cb56ed99513823064295761f9b7C856e', + isExecuted: true, + isSuccessful: true, + ethGasPrice: '2670677244', + maxFeePerGas: null, + maxPriorityFeePerGas: null, + gasUsed: 75937, + fee: '202803217877628', + origin: '{"url":"https://gnosis-zodiac-app.netlify.app/","name":"Zodiac"}', + dataDecoded: { + method: 'enableModule', + parameters: [ + { + name: 'module', + type: 'address', + value: '0x4C98aF741e352C6551BfF9509b3f8ca9Dd4E6397', + }, + ], + }, + confirmationsRequired: 1, + confirmations: [ + { + owner: '0x1cC62cE7cb56ed99513823064295761f9b7C856e', + submissionDate: '2022-01-26T18:01:37Z', + transactionHash: null, + signature: + '0x0000000000000000000000001cc62ce7cb56ed99513823064295761f9b7c856e000000000000000000000000000000000000000000000000000000000000000001', + signatureType: 'APPROVED_HASH', + }, + ], + trusted: true, + signatures: + '0x0000000000000000000000001cc62ce7cb56ed99513823064295761f9b7c856e000000000000000000000000000000000000000000000000000000000000000001', +}; diff --git a/test/pod.test.ts b/test/pod.test.ts index 90b7dd9..1ff4d7a 100644 --- a/test/pod.test.ts +++ b/test/pod.test.ts @@ -9,8 +9,10 @@ import { userAddress2, constructGqlGetUsers, artNautPod, + enableModuleSafeTx, } from './fixtures'; import * as fetchers from '../src/fetchers'; +import * as txService from '../src/lib/services/transaction-service'; import Pod from '../src/Pod'; function mockGetPodFetchersByAddress(opts?: { overrideAdmin?: string }) { @@ -43,264 +45,264 @@ beforeEach(() => { jest.restoreAllMocks(); }); -// test('getPod should be able to fetch via address', async () => { -// mockGetPodFetchersByAddress(); -// const pod = await getPod(orcanautAddress); -// expect(pod.id).toEqual(orcanautPod.id); -// expect(pod.safe).toEqual(orcanautPod.safe); -// expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); -// expect(pod.admin).toEqual(orcanautPod.admin); -// expect(pod.ensName).toEqual(orcanautPod.ensName); -// expect(pod.nonce).toBe(5); -// expect(pod.threshold).toBe(10); -// }); +test('getPod should be able to fetch via address', async () => { + mockGetPodFetchersByAddress(); + const pod = await getPod(orcanautAddress); + expect(pod.id).toEqual(orcanautPod.id); + expect(pod.safe).toEqual(orcanautPod.safe); + expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); + expect(pod.admin).toEqual(orcanautPod.admin); + expect(pod.ensName).toEqual(orcanautPod.ensName); + expect(pod.nonce).toBe(5); + expect(pod.threshold).toBe(10); +}); -// test('getPod should be able to fetch via ens name', async () => { -// mockGetPodFetchersByAddress(); -// const pod = await getPod(orcanautPod.ensName); -// expect(pod.id).toEqual(orcanautPod.id); -// expect(pod.safe).toEqual(orcanautPod.safe); -// expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); -// expect(pod.admin).toEqual(orcanautPod.admin); -// expect(pod.ensName).toEqual(orcanautPod.ensName); -// }); +test('getPod should be able to fetch via ens name', async () => { + mockGetPodFetchersByAddress(); + const pod = await getPod(orcanautPod.ensName); + expect(pod.id).toEqual(orcanautPod.id); + expect(pod.safe).toEqual(orcanautPod.safe); + expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); + expect(pod.admin).toEqual(orcanautPod.admin); + expect(pod.ensName).toEqual(orcanautPod.ensName); +}); -// test('getPod should be able to fetch via pod id', async () => { -// mockGetPodFetchersByAddress(); -// const pod = await getPod(orcanautPod.id); -// expect(pod.id).toEqual(orcanautPod.id); -// expect(pod.safe).toEqual(orcanautPod.safe); -// expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); -// expect(pod.admin).toEqual(orcanautPod.admin); -// expect(pod.ensName).toEqual(orcanautPod.ensName); -// }); +test('getPod should be able to fetch via pod id', async () => { + mockGetPodFetchersByAddress(); + const pod = await getPod(orcanautPod.id); + expect(pod.id).toEqual(orcanautPod.id); + expect(pod.safe).toEqual(orcanautPod.safe); + expect(pod.imageNoTextUrl).toEqual(orcanautPod.imageNoTextUrl); + expect(pod.admin).toEqual(orcanautPod.admin); + expect(pod.ensName).toEqual(orcanautPod.ensName); +}); -// test('getPod should return null if given a value that doesnt resolve to an address', async () => { -// const pod = await getPod('not valid string'); -// expect(pod).toBe(null); -// }); +test('getPod should return null if given a value that doesnt resolve to an address', async () => { + const pod = await getPod('not valid string'); + expect(pod).toBe(null); +}); -// test('getPod should return null if the given address is not a pod', async () => { -// jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockImplementationOnce(() => { -// throw new Error('failed pod fetch or whatever'); -// }); -// const pod = await getPod(ethers.constants.AddressZero); -// expect(pod).toBeNull(); -// }); +test('getPod should return null if the given address is not a pod', async () => { + jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockImplementationOnce(() => { + throw new Error('failed pod fetch or whatever'); + }); + const pod = await getPod(ethers.constants.AddressZero); + expect(pod).toBeNull(); +}); -// test('pod.admin should be null if there is none', async () => { -// mockGetPodFetchersByAddress({ overrideAdmin: ethers.constants.AddressZero }); -// const pod = await getPod(orcanautAddress); -// expect(pod.admin).toBeNull(); -// }); +test('pod.admin should be null if there is none', async () => { + mockGetPodFetchersByAddress({ overrideAdmin: ethers.constants.AddressZero }); + const pod = await getPod(orcanautAddress); + expect(pod.admin).toBeNull(); +}); -// test('getPod should be able to fetch members via async call', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); +test('getPod should be able to fetch members via async call', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); -// const pod = await getPod(orcanautAddress); -// const members = await pod.getMembers(); -// expect(members).toEqual([ -// '0x25F55d2e577a937433686A01439E5fFdffe62218', -// '0x46E69D6801d4E09360Ab62A638849D72623A2e7E', -// '0x4846162806B025Dcd0759cACF9ec6F9474274282', -// '0x7aAef56837f37965fb410F4901bDC1172870e2F8', -// '0x7B54195b743BF76c314e9dBDDf110F5a22743998', -// '0x7f08D6A56b7B6f75eb8c628384855b82D2Ab18C8', -// '0x7f33BeaA131a6896B97E27c505c532cE40f88f33', -// '0xAfBb354FF03E17b1EffBaF661FFca106ba78b966', -// '0xcABB78f39Fbeb0CdFBD3C8f30E37630EB9e7A151', -// ]); -// }); + const pod = await getPod(orcanautAddress); + const members = await pod.getMembers(); + expect(members).toEqual([ + '0x25F55d2e577a937433686A01439E5fFdffe62218', + '0x46E69D6801d4E09360Ab62A638849D72623A2e7E', + '0x4846162806B025Dcd0759cACF9ec6F9474274282', + '0x7aAef56837f37965fb410F4901bDC1172870e2F8', + '0x7B54195b743BF76c314e9dBDDf110F5a22743998', + '0x7f08D6A56b7B6f75eb8c628384855b82D2Ab18C8', + '0x7f33BeaA131a6896B97E27c505c532cE40f88f33', + '0xAfBb354FF03E17b1EffBaF661FFca106ba78b966', + '0xcABB78f39Fbeb0CdFBD3C8f30E37630EB9e7A151', + ]); +}); -// test('Pod object should be able to fetch member pods via async call', async () => { -// mockGetPodFetchersByAddress(); -// // Additional mock to fill out the artnaut pod (i.e., the member pod) -// jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockResolvedValueOnce({ -// // eslint-disable-next-line @typescript-eslint/ban-ts-comment -// // @ts-ignore -// Controller: { podAdmin: jest.fn().mockResolvedValueOnce(artNautPod.admin) }, -// Safe: { -// address: artNautPod.safe, -// nonce: jest.fn().mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 5) }), -// getThreshold: jest -// .fn() -// .mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 10) }), -// }, -// podId: artNautPod.id, -// Name: { name: artNautPod.ensName }, -// }); -// jest -// .spyOn(axios, 'post') -// .mockResolvedValueOnce(constructGqlGetUsers(['0x25F55d2e577a937433686A01439E5fFdffe62218'])); +test('Pod object should be able to fetch member pods via async call', async () => { + mockGetPodFetchersByAddress(); + // Additional mock to fill out the artnaut pod (i.e., the member pod) + jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockResolvedValueOnce({ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + Controller: { podAdmin: jest.fn().mockResolvedValueOnce(artNautPod.admin) }, + Safe: { + address: artNautPod.safe, + nonce: jest.fn().mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 5) }), + getThreshold: jest + .fn() + .mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 10) }), + }, + podId: artNautPod.id, + Name: { name: artNautPod.ensName }, + }); + jest + .spyOn(axios, 'post') + .mockResolvedValueOnce(constructGqlGetUsers(['0x25F55d2e577a937433686A01439E5fFdffe62218'])); + + const rootPod = await getPod(orcanautAddress); + const memberPods = await rootPod.getMemberPods(); + const podNames = memberPods.map(pod => pod.ensName); + expect(podNames).toEqual(expect.arrayContaining(['art-naut.pod.xyz'])); +}); -// const rootPod = await getPod(orcanautAddress); -// const memberPods = await rootPod.getMemberPods(); -// const podNames = memberPods.map(pod => pod.ensName); -// expect(podNames).toEqual(expect.arrayContaining(['art-naut.pod.xyz'])); -// }); +test('Pod.getMembers() should include member pods in its list', async () => { + mockGetPodFetchersByAddress(); + jest + .spyOn(axios, 'post') + .mockResolvedValueOnce(constructGqlGetUsers(['0x25F55d2e577a937433686A01439E5fFdffe62218'])); + // Additional mock to fill out the artnaut pod (i.e., the member pod) + jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockResolvedValueOnce({ + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + Controller: { podAdmin: jest.fn().mockResolvedValueOnce(artNautPod.admin) }, + Safe: { + address: artNautPod.safe, + nonce: jest.fn().mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 5) }), + getThreshold: jest + .fn() + .mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 10) }), + }, + podId: artNautPod.id, + Name: { name: artNautPod.ensName }, + }); + + const rootPod = await getPod(orcanautAddress); + const [artNaut] = await rootPod.getMemberPods(); + const members = await rootPod.getMembers(); + + // users should contain the safe addresses of member pods + expect(members).toEqual(expect.arrayContaining([artNaut.safe])); +}); -// test('Pod.getMembers() should include member pods in its list', async () => { +// Test commented out because it's not really testing anything, but probably useful down the line. +// test('Pod.getMemberEOAs() should not include pod members', async () => { // mockGetPodFetchersByAddress(); -// jest -// .spyOn(axios, 'post') -// .mockResolvedValueOnce(constructGqlGetUsers(['0x25F55d2e577a937433686A01439E5fFdffe62218'])); -// // Additional mock to fill out the artnaut pod (i.e., the member pod) -// jest.spyOn(fetchers, 'getPodFetchersByAddressOrEns').mockResolvedValueOnce({ -// // eslint-disable-next-line @typescript-eslint/ban-ts-comment -// // @ts-ignore -// Controller: { podAdmin: jest.fn().mockResolvedValueOnce(artNautPod.admin) }, -// Safe: { -// address: artNautPod.safe, -// nonce: jest.fn().mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 5) }), -// getThreshold: jest -// .fn() -// .mockResolvedValueOnce({ toNumber: jest.fn().mockImplementation(() => 10) }), -// }, -// podId: artNautPod.id, -// Name: { name: artNautPod.ensName }, -// }); +// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); // const rootPod = await getPod(orcanautAddress); -// const [artNaut] = await rootPod.getMemberPods(); // const members = await rootPod.getMembers(); - -// // users should contain the safe addresses of member pods -// expect(members).toEqual(expect.arrayContaining([artNaut.safe])); +// const EOAs = await rootPod.getMemberEOAs(); + +// expect(members).toEqual( +// expect.arrayContaining([ +// '0xcABB78f39Fbeb0CdFBD3C8f30E37630EB9e7A151', +// '0xAfBb354FF03E17b1EffBaF661FFca106ba78b966', +// '0x46E69D6801d4E09360Ab62A638849D72623A2e7E', +// '0x4846162806B025Dcd0759cACF9ec6F9474274282', +// '0x7B54195b743BF76c314e9dBDDf110F5a22743998', +// ]), +// ); +// expect(members.length).toBeGreaterThan(EOAs.length); +// expect(EOAs.every(element => typeof element === 'string')).toBeTruthy(); // }); -// // Test commented out because it's not really testing anything, but probably useful down the line. -// // test('Pod.getMemberEOAs() should not include pod members', async () => { -// // mockGetPodFetchersByAddress(); -// // jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); - -// // const rootPod = await getPod(orcanautAddress); -// // const members = await rootPod.getMembers(); -// // const EOAs = await rootPod.getMemberEOAs(); - -// // expect(members).toEqual( -// // expect.arrayContaining([ -// // '0xcABB78f39Fbeb0CdFBD3C8f30E37630EB9e7A151', -// // '0xAfBb354FF03E17b1EffBaF661FFca106ba78b966', -// // '0x46E69D6801d4E09360Ab62A638849D72623A2e7E', -// // '0x4846162806B025Dcd0759cACF9ec6F9474274282', -// // '0x7B54195b743BF76c314e9dBDDf110F5a22743998', -// // ]), -// // ); -// // expect(members.length).toBeGreaterThan(EOAs.length); -// // expect(EOAs.every(element => typeof element === 'string')).toBeTruthy(); -// // }); - -// // Test commented out because it's not really testing anything, but probably useful down the line. -// // test('Pod.getMemberPods() should not include non-pod users', async () => { -// // mockGetPodFetchersByAddress(); -// // jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); - -// // const rootPod = await getPod(orcanautAddress); -// // const members = await rootPod.getMembers(); -// // const memberPods = await rootPod.getMemberPods(); - -// // // rootPod has some users that are not pods, -// // // therefore there should be more users than member pods. -// // expect(members.length).toBeGreaterThan(memberPods.length); -// // expect(memberPods.every(pod => pod instanceof Pod)).toBeTruthy(); -// // }); - -// test('Pod.getMemberPods should also async fetch memberEOAs', async () => { +// Test commented out because it's not really testing anything, but probably useful down the line. +// test('Pod.getMemberPods() should not include non-pod users', async () => { // mockGetPodFetchersByAddress(); // jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); // const rootPod = await getPod(orcanautAddress); -// await rootPod.getMemberPods(); +// const members = await rootPod.getMembers(); +// const memberPods = await rootPod.getMemberPods(); -// expect(rootPod.memberEOAs.length > 0).toBeTruthy(); +// // rootPod has some users that are not pods, +// // therefore there should be more users than member pods. +// expect(members.length).toBeGreaterThan(memberPods.length); +// expect(memberPods.every(pod => pod instanceof Pod)).toBeTruthy(); // }); -// test('Pod.isMember() should return true/false if a given address is a member', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); +test('Pod.getMemberPods should also async fetch memberEOAs', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); -// const pod = await getPod(orcanautAddress); -// // User address. -// const isMember1 = await pod.isMember('0x46E69D6801d4E09360Ab62A638849D72623A2e7E'); -// expect(isMember1).toBe(true); -// const isMember1LowerCase = await pod.isMember('0x46e69d6801d4e09360ab62a638849d72623a2e7e'); -// expect(isMember1LowerCase).toBe(true); -// const isMember2 = await pod.isMember(userAddress2); -// expect(isMember2).toBe(false); -// // Pod address -// const isMemberPod = await pod.isMember('0x7aAef56837f37965fb410F4901bDC1172870e2F8'); -// expect(isMemberPod).toBe(true); -// }); + const rootPod = await getPod(orcanautAddress); + await rootPod.getMemberPods(); -// test('Pod.isMember() should reject on non-address inputs', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + expect(rootPod.memberEOAs.length > 0).toBeTruthy(); +}); -// const pod = await getPod(orcanautAddress); -// await expect(pod.isMember('not an address')).rejects.toThrow('Invalid address'); -// }); +test('Pod.isMember() should return true/false if a given address is a member', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); -// test('Pod.isAdmin() should return true/false if a given address is the admin', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + const pod = await getPod(orcanautAddress); + // User address. + const isMember1 = await pod.isMember('0x46E69D6801d4E09360Ab62A638849D72623A2e7E'); + expect(isMember1).toBe(true); + const isMember1LowerCase = await pod.isMember('0x46e69d6801d4e09360ab62a638849d72623a2e7e'); + expect(isMember1LowerCase).toBe(true); + const isMember2 = await pod.isMember(userAddress2); + expect(isMember2).toBe(false); + // Pod address + const isMemberPod = await pod.isMember('0x7aAef56837f37965fb410F4901bDC1172870e2F8'); + expect(isMemberPod).toBe(true); +}); -// const pod = await getPod(orcanautAddress); -// const isAdmin1 = pod.isAdmin('0x094A473985464098b59660B37162a284b5132753'); -// expect(isAdmin1).toBe(true); -// const isAdmin1LowerCase = pod.isAdmin('0x094A473985464098b59660B37162a284b5132753'.toLowerCase()); -// expect(isAdmin1LowerCase).toBe(true); -// const isAdmin2 = pod.isAdmin(userAddress); -// expect(isAdmin2).toBe(false); -// }); +test('Pod.isMember() should reject on non-address inputs', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); -// test('Pod.isAdmin() should throw if given a non-address input', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + const pod = await getPod(orcanautAddress); + await expect(pod.isMember('not an address')).rejects.toThrow('Invalid address'); +}); -// const pod = await getPod(orcanautAddress); -// expect(() => { -// pod.isAdmin('not an address'); -// }).toThrow('Invalid address'); -// }); +test('Pod.isAdmin() should return true/false if a given address is the admin', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); -// // Commented out because these tests are messing with CI/CD -// // test('Pod.isAdminPodMember() should return true/false if a given address is a member of the admin pod', async () => { -// // mockGetPodFetchersByAddress({ overrideAdmin: artNautPod.safe }); -// // jest.spyOn(axios, 'post').mockResolvedValueOnce(constructGqlGetUsers(artNautPod.members)); - -// // const pod = await getPod(orcanautAddress); -// // // Artnaut pod member -// // expect(await pod.isAdminPodMember('0x094A473985464098b59660B37162a284b5132753')).toBe(true); -// // // Not an adminPod member. -// // expect(await pod.isAdminPodMember(userAddress)).toBe(false); -// // }); - -// // test('Pod.isSubPodMember() should return true/false if a given address is a nested member', async () => { -// // mockGetPodFetchersByAddress(); -// // jest -// // .spyOn(axios, 'post') -// // // Populates members on the pod to be artNaut pod. -// // .mockResolvedValueOnce(constructGqlGetUsers([artNautPod.safe])) -// // // Populates members on the first subPod (i.e., the artNaut pod) -// // .mockResolvedValueOnce(constructGqlGetUsers([artNautPod.members[0]])); - -// // const pod = await getPod(orcanautAddress); -// // const isSubPodMember1 = await pod.isSubPodMember(artNautPod.members[0]); -// // expect(isSubPodMember1).toBe(true); -// // const isSubPodMember1LowerCase = await pod.isSubPodMember(artNautPod.members[0].toLowerCase()); -// // expect(isSubPodMember1LowerCase).toBe(true); -// // const isSubPodMember2 = await pod.isSubPodMember(userAddress); -// // expect(isSubPodMember2).toBe(false); -// // }); - -// test('Pod.isNestedMember() should throw on non-address inputs', async () => { -// mockGetPodFetchersByAddress(); -// jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + const pod = await getPod(orcanautAddress); + const isAdmin1 = pod.isAdmin('0x094A473985464098b59660B37162a284b5132753'); + expect(isAdmin1).toBe(true); + const isAdmin1LowerCase = pod.isAdmin('0x094A473985464098b59660B37162a284b5132753'.toLowerCase()); + expect(isAdmin1LowerCase).toBe(true); + const isAdmin2 = pod.isAdmin(userAddress); + expect(isAdmin2).toBe(false); +}); -// const pod = await getPod(orcanautAddress); -// await expect(pod.isSubPodMember('not an address')).rejects.toThrow('Invalid address'); -// }); +test('Pod.isAdmin() should throw if given a non-address input', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + + const pod = await getPod(orcanautAddress); + expect(() => { + pod.isAdmin('not an address'); + }).toThrow('Invalid address'); +}); + +// Commented out because these tests are messing with CI/CD +test('Pod.isAdminPodMember() should return true/false if a given address is a member of the admin pod', async () => { + mockGetPodFetchersByAddress({ overrideAdmin: artNautPod.safe }); + jest.spyOn(axios, 'post').mockResolvedValueOnce(constructGqlGetUsers(artNautPod.members)); + + const pod = await getPod(orcanautAddress); + // Artnaut pod member + expect(await pod.isAdminPodMember('0x094A473985464098b59660B37162a284b5132753')).toBe(true); + // Not an adminPod member. + expect(await pod.isAdminPodMember(userAddress)).toBe(false); +}); + +test('Pod.isSubPodMember() should return true/false if a given address is a nested member', async () => { + mockGetPodFetchersByAddress(); + jest + .spyOn(axios, 'post') + // Populates members on the pod to be artNaut pod. + .mockResolvedValueOnce(constructGqlGetUsers([artNautPod.safe])) + // Populates members on the first subPod (i.e., the artNaut pod) + .mockResolvedValueOnce(constructGqlGetUsers([artNautPod.members[0]])); + + const pod = await getPod(orcanautAddress); + const isSubPodMember1 = await pod.isSubPodMember(artNautPod.members[0]); + expect(isSubPodMember1).toBe(true); + const isSubPodMember1LowerCase = await pod.isSubPodMember(artNautPod.members[0].toLowerCase()); + expect(isSubPodMember1LowerCase).toBe(true); + const isSubPodMember2 = await pod.isSubPodMember(userAddress); + expect(isSubPodMember2).toBe(false); +}); + +test('Pod.isNestedMember() should throw on non-address inputs', async () => { + mockGetPodFetchersByAddress(); + jest.spyOn(axios, 'post').mockResolvedValueOnce(gqlGetUsers); + + const pod = await getPod(orcanautAddress); + await expect(pod.isSubPodMember('not an address')).rejects.toThrow('Invalid address'); +}); test('Pod.ejectSafe', async () => { // mockGetPodFetchersByAddress(); @@ -312,4 +314,37 @@ test('Pod.ejectSafe', async () => { await expect(pod.ejectSafe(provider)).rejects.toThrow('you may need to upgrade to the latest'); }); +test('Pod.isPodifyInProgress returns true for active enableModule proposals', async () => { + mockGetPodFetchersByAddress(); + const safeTx = enableModuleSafeTx; + // Set nonce to be the active proposal. + safeTx.nonce = 5; + jest.spyOn(txService, 'getSafeTransactionsBySafe').mockResolvedValueOnce([safeTx]); + const pod = await getPod(orcanautAddress); + const result = await pod.isPodifyInProgress(); + expect(result).toBe(true); +}); + +test('Pod.isPodifyInProgress returns true for queued enableModule proposals', async () => { + mockGetPodFetchersByAddress(); + const safeTx = enableModuleSafeTx; + // Set nonce to be the queued proposal. + safeTx.nonce = 6; + jest.spyOn(txService, 'getSafeTransactionsBySafe').mockResolvedValueOnce([safeTx]); + const pod = await getPod(orcanautAddress); + const result = await pod.isPodifyInProgress(); + expect(result).toBe(true); +}); + +test('Pod.isPodifyInProgress returns false on executed enableModule proposals', async () => { + mockGetPodFetchersByAddress(); + const safeTx = enableModuleSafeTx; + // Set nonce to be an executed proposal. + safeTx.nonce = 1; + jest.spyOn(txService, 'getSafeTransactionsBySafe').mockResolvedValueOnce([safeTx]); + const pod = await getPod(orcanautAddress); + const result = await pod.isPodifyInProgress(); + expect(result).toBe(false); +}); + //TODO: Other ejectSafe tests.