{"_id":"@31third/sdk","_rev":"17-800b5ce936c05346579f3611bc6cbaeb","name":"@31third/sdk","dist-tags":{"latest":"0.3.3"},"versions":{"0.1.0-alpha.0":{"name":"@31third/sdk","version":"0.1.0-alpha.0","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.0","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"9cd5ffc34f056593fad212c29a101b4998af7a3a","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.0.tgz","fileCount":13,"integrity":"sha512-6Dt46y3q8IdPIlGMBgxjLm9EQAaTj5H06TuZQe6s0WJ2k9bQ69sTYDnzZyY30KTf4N7YAaIXpXGubvwHctBExQ==","signatures":[{"sig":"MEUCIDi26rAr1OLfniGbB5w78tBBol0z2Fa6hcLNMTAy9jCEAiEA+daN3BgXQKcYVU6BusiNICko1Q1pSN9/QfR0MGIaHZ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2205382},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"abac3ab3e122c291010c489ef334d7bf7f9ff881","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.0_1770481944695_0.7382903375951178","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.1":{"name":"@31third/sdk","version":"0.1.0-alpha.1","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.1","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"03550aa90a7ec7f14db0f41b45c6b0599716ad31","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.1.tgz","fileCount":13,"integrity":"sha512-LYLw/7S2KVlCuz3BYYqf5A8i4LEzrMwf1EEJzc6WIroa07ZG8Izld02AxtZc/+fE1eBgvXA6TAOU9WDHfzB7Uw==","signatures":[{"sig":"MEUCIQCZLJgamCDLLzki4RYtf0jlK6x5voGLyWZLpwKK1XQAHAIgeuywkDf5aT29jsXPHHtPtAe57y9BTJqv4+aYGOZj084=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2206383},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"12e84aeadda5360f98964405876e05698c8cfdd1","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.1_1770570460838_0.7341149295709573","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.2":{"name":"@31third/sdk","version":"0.1.0-alpha.2","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.2","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"9e55a596b4a78bcd097f9675ac4234f04aa410d9","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.2.tgz","fileCount":13,"integrity":"sha512-wud7SSUtnsC+Un+h/hwSr0B2X1c9sRD672z7oKp4487UEeA2Wc6hYW9OnjysjaXHP6b+y9H9Cp4GM32R/TBa4Q==","signatures":[{"sig":"MEUCICItbpzJxZgEH0Qz/4Ze9EBmod+oja+oSpZprmSdHAXlAiEA3jnAW7aRk8GTJR1biII5HmMM+skXb7WvBf3UOqxMeOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2213035},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"ab2e1eb810b5fa6cae22d1c43cbb0d5ca4df4167","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.2_1770827522221_0.5593562505042582","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.3":{"name":"@31third/sdk","version":"0.1.0-alpha.3","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.3","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"49621ba6bc1f71b1843a612b2b20a19835f9dfa9","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.3.tgz","fileCount":13,"integrity":"sha512-j+xJeSZKf/Yic4LB87ZWO2VuOdpul8PcgaKLQ+LkRqWYRmcAyUJsKRuHNordliWd+tTVhGkR6dX4cWufuxnJrw==","signatures":[{"sig":"MEUCIEpRdTas+qFffrrJVLULIWWr7r0hXVsEesQqvSaxJbQAAiEAs394RKl1XHl89Ngo+oaSNBnijDf236RZ2hx3icXvAeE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2213149},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d0dbd8dbe129b610e56e54785fa61ffefcb4b909","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.3_1770828000246_0.9180498626337772","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.4":{"name":"@31third/sdk","version":"0.1.0-alpha.4","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.4","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"3ef49b12dd7ffba18bbac2e08706ee7abdf5c693","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.4.tgz","fileCount":13,"integrity":"sha512-i4zS79YN7WibJ+jQPgsjJBSXuc3hOTc84435ObLHFlNxm3cM4+1h/4dpb3YuHqi2M8rgZPTl9o1YaKrxrTsd+w==","signatures":[{"sig":"MEQCIAwo5uPaGOp6iHjAyiKI8oHsQpuawRfdVhImRKn5V0X1AiBy1tbACfp4l/KF+ZudTbuaJ+zY5ikujwc6lGkIz1kD2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2214141},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"b009ec68f45c6deeb01ea0d691b594a59dda2ff2","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.4_1770910866088_0.9239796052574716","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.5":{"name":"@31third/sdk","version":"0.1.0-alpha.5","license":"Apache-2.0","_id":"@31third/sdk@0.1.0-alpha.5","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"424518aa86d03f055ae0c0625074d140058118e4","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0-alpha.5.tgz","fileCount":13,"integrity":"sha512-ui90iKq1b1Qp7lkEK6gWvNMsfY8gdBomnYVotBSl9AO8CnevhI5m1OOYLM98JVxbPjfkqzjfBsTxzLwrdQUJHQ==","signatures":[{"sig":"MEUCIQDZX1wCyZsSW//HUbr++62sq+3u2FLuXolSP6NS118eLgIgNjMn219XWEmPIGniu43kgzP/K2O/9xB8Jh3OcyNEgg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2347458},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"b6d8241e0175517a5ff4692ad5bf34f799b636f1","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0-alpha.5_1771344721624_0.44844523527345226","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@31third/sdk","version":"0.1.0","license":"Apache-2.0","_id":"@31third/sdk@0.1.0","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"dab8c0249743836cc818f67117f6e07735bf5f49","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.0.tgz","fileCount":13,"integrity":"sha512-xIzy2BU1DFzIin4e+F9nf1z6K1rDJM40B6qckfxmeFwvMnwWXOowk8LXgVfBNXJZRNpBsSucdt5eM++TY1QaWg==","signatures":[{"sig":"MEUCIFMHWGC7NItWCdeke13LEFv+is0OBCinPWLDC7OY6nnSAiEA4Dof31xRTAS6UQNXllCUl+vys9i9PMUomcahUH0jA9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2347329},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2e3defd4084384b1d62aa4a17c574423a0779352","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1771429743932_0.9836561735335543","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@31third/sdk","version":"0.1.1","license":"Apache-2.0","_id":"@31third/sdk@0.1.1","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"d76f6ee49b633664fedfb9282c27fff08fc937a8","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.1.tgz","fileCount":13,"integrity":"sha512-DMa5EfGPLm2xMfZSIMDFwQvqv3wpKC6+I/OYEg1tIh5w/GIqLghgvbujiumW5igBgDPl9pvQAWrZ+8ToAl36lw==","signatures":[{"sig":"MEUCID2k9MdZhM8JnRcsu/1McrKvD2Rv0YC3f1YLHHa70ELDAiEAk51kik5s/yuO/3cA/8Jdhgaj1Kfzz6ru4y6/nsU+vCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2348397},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"90f69ae3db88e42fb08853d3a8738bc21d255f47","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1771436763632_0.513128199933135","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@31third/sdk","version":"0.1.2","license":"Apache-2.0","_id":"@31third/sdk@0.1.2","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"6b5173f651500742d1a34cec601bf1c017e81686","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.2.tgz","fileCount":13,"integrity":"sha512-mlwErE2vJDRouGORVLWvOCMGqeU1IMwfY0DO9I9jHwsxIfllkBF5HgWG3NDk1jLEgADo9yt8jgD82aOB6tvPuA==","signatures":[{"sig":"MEQCIE3L0bDyXZl2NG6/RAVk5kdL1KHyY/Nvs2al+xnHcQ7/AiAg9lhg/wtSolHSnGS5IqSVvwUTivUXyCgpQ8SmntPRNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2348397},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"478f8ab66febfd6603f8686f84720fe20efa4545","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1771581041092_0.16406490429481968","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@31third/sdk","version":"0.1.3","license":"Apache-2.0","_id":"@31third/sdk@0.1.3","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"ae202da1fb376e3422bf76950c9d55051e1f7aff","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.1.3.tgz","fileCount":13,"integrity":"sha512-70+gzwdFj13G7YARyUeHHO+rNrOZKLFs++o3i1E+tO69Vq/f0dpMyWJNJ/vfGy6NAfma+Zsau9Kbtv8x4rou0w==","signatures":[{"sig":"MEUCIBpZEaVZ03MOnp9gi8Gvc8KusnLjDKK9wJiml13l+rq4AiEA9itToHopATXSwyZ8L5QznfRTn4/XRrhhb/bvQDDa34w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2349201},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3e68b4d86c4a31c6a437dcc437ee3c3f896b5c73","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.3_1771595419123_0.26442373943712316","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@31third/sdk","version":"0.2.0","license":"Apache-2.0","_id":"@31third/sdk@0.2.0","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"4d8f09314e172b3c937ff7606f4f2af85d9364c8","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.2.0.tgz","fileCount":14,"integrity":"sha512-cfJBhXIfuTiqNOeM1ipLGTLtrWlb+X8XjL6A4PyskCQSsZGGA+IAIjgLpXKZ8oo8yFPU2ZmnEN2c6gajIQve3g==","signatures":[{"sig":"MEUCIHlj9HWyQK+2yFQ//wkYJC77aVqAhT3poMVnHHCGUz6jAiEA7jw1SxCSSVhOJCVNyYpFUztLDI/pGm2xKNiW+AtqllQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2153442},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"7588e7a6eb61b2aba8353f29ded7ebebe9d5576a","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.0_1772890758785_0.9424895702386225","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@31third/sdk","version":"0.2.1","license":"Apache-2.0","_id":"@31third/sdk@0.2.1","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"4ac4a29a5b81bdae161bb083ae7e437762e58a32","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.2.1.tgz","fileCount":14,"integrity":"sha512-q6MpCaNAgflqj8vplACWYo9BfnsKT17CMhIwWElxh/yssVFBvLieMjmyjpxIqyxXrmA1ZyPwZzD6i66CStX+PQ==","signatures":[{"sig":"MEYCIQDNr6DZESOVLUFSoG8EkAxERyzeKzSxgObt6oK/RRzG8AIhAPoJwEcrXAVVLj4xoyi/gR/XbEokwpS7z1S5m+iufOZg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2154078},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"daad4baf39c5be6797e2aa7753fb0b655bd96f6b","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.1_1773307021945_0.5293312041541645","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@31third/sdk","version":"0.2.2","license":"Apache-2.0","_id":"@31third/sdk@0.2.2","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"2dd450f4b1529e525bb3d2fd9d30cd06cff84aa4","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.2.2.tgz","fileCount":14,"integrity":"sha512-mBBLXC8KWZUocZV9F15KsimnHXbqna0ME8ytaQkTPu9dB23Vf1Cj6J5hm/W2EFhiOttPxS/cAb6H3qoManRhAg==","signatures":[{"sig":"MEQCIH8//ES+6+2THwjkU/J9DpV3IsTY5uihFkQCrmy9Rn10AiAPqOYQBReYGGEpjbYixBBxACyGVb0YLHgWYR63HrJ5mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2154695},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bfbc7aaed8630e7bb8cf51a8620dc31d6adc2aaa","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.2.2_1773647912046_0.1084934598607099","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@31third/sdk","version":"0.3.0","license":"Apache-2.0","_id":"@31third/sdk@0.3.0","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"3521ddf1150d5402319ceecb823a8afeaf61a088","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.3.0.tgz","fileCount":15,"integrity":"sha512-ljpbGP5bVwwgNxFMRjXDNowijNJmO8oOmkdt/3+JdPjjZXi4xImSws89saSS/YZdrVhnCoy1DmEmG6Ik0AEvYQ==","signatures":[{"sig":"MEQCIGm7RxIlSDtlztXePZkPI0oS0/Mt7vAlYZbxJkEYPeo8AiAVNXKKxRSSzqqdBp91/k8fW7I8sbBJ+EcrMCb4D487zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3052396},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"8800c20a5516c6c7dc7ed2d94202122d7d625301","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.0_1774001238225_0.8718302131876796","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@31third/sdk","version":"0.3.1","license":"Apache-2.0","_id":"@31third/sdk@0.3.1","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"74616dbae1ddb0584c59cd411d2f5454180cf9bb","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.3.1.tgz","fileCount":15,"integrity":"sha512-naZu8WbJQLeYjLN8ek4TwYaRa7uxdaoKaStQXgMYOSCrhuIWBB/7NPl3BkwXUAfVSOnpNxD4G2prqzHELT5DdA==","signatures":[{"sig":"MEQCIGGV6ubRS7YSB+tB20mJl80c7aVLzhOk6BMvGaPOKsCVAiBXfPHoXdmWSKILGYbZgXZ3seyMA83+Vuee+25pf+WIiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3052537},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"90fd26eea3bd2ff0dcb48785c81b6ea35b4de0f7","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.1_1774006861989_0.2755595140650604","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@31third/sdk","version":"0.3.2","license":"Apache-2.0","_id":"@31third/sdk@0.3.2","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"dist":{"shasum":"4041fd4b8ee1f50714530bf0e4453a13083c2ac3","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.3.2.tgz","fileCount":15,"integrity":"sha512-JoIkEsQtZdFpSf9ncn5sfUU2amYagaQ7Qf7plrGLrMZysjDzWe/f/bVSxkOV/rX9HYACK8u+9ye8qUWmMTJN1w==","signatures":[{"sig":"MEUCIQDyB+UQjni/MhKoSYYfaNRuIPhr1JdxCiNG6PCDE7M5wgIgMdosQ+UqIlozwwYeMcWUDCn6ojH5u87gcRHxciMBeTo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3052573},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9200fb48f1acd3ccb2e5f94b1e2098485ab22038","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public"},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"_npmVersion":"10.9.2","description":"31Third SDK for Safe automation deployment and policy-guarded execution","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"ethers":"^6.13.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.0.5","typescript":"^5.4.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.3.2_1774017459261_0.6771838342943672","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@31third/sdk","version":"0.3.3","description":"31Third SDK for Safe automation deployment and policy-guarded execution","license":"Apache-2.0","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","clean":"rm -rf dist","publish:pkg":"npm run build && npm publish --access public","test":"vitest"},"dependencies":{"ethers":"^6.13.4"},"devDependencies":{"vitest":"^2.0.5","tsup":"^8.3.5","typescript":"^5.4.5"},"_id":"@31third/sdk@0.3.3","gitHead":"d44c483ed9532aeb0a3c7164200caac8b4d4182b","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-DL5NlG/VXikwWQODpM4ksxy7svnHa4BOnATKhtzDUkRldBLXKwe6nCsmZHgSUNA5YhxGLLSSFlPG+eI0gz1AZQ==","shasum":"84a3a2c667379d98419877b7313992010e722f86","tarball":"https://registry.npmjs.org/@31third/sdk/-/sdk-0.3.3.tgz","fileCount":15,"unpackedSize":2889942,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICPgAAybYrnXbi0nLQiBD3nha03wumRrGzCnkYEYmdIZAiEAjL2difjtmj2tD3wTKL1SE5NGZMByZTSvJn2x/hwv1Iw="}]},"_npmUser":{"name":"31third-philipp","email":"dev@31third.com"},"directories":{},"maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.3.3_1774020076691_0.9247400127671219"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-07T16:32:24.571Z","modified":"2026-03-20T15:21:17.063Z","0.1.0-alpha.0":"2026-02-07T16:32:24.899Z","0.1.0-alpha.1":"2026-02-08T17:07:41.082Z","0.1.0-alpha.2":"2026-02-11T16:32:02.477Z","0.1.0-alpha.3":"2026-02-11T16:40:00.422Z","0.1.0-alpha.4":"2026-02-12T15:41:06.285Z","0.1.0-alpha.5":"2026-02-17T16:12:01.853Z","0.1.0":"2026-02-18T15:49:04.145Z","0.1.1":"2026-02-18T17:46:03.783Z","0.1.2":"2026-02-20T09:50:41.340Z","0.1.3":"2026-02-20T13:50:19.356Z","0.2.0":"2026-03-07T13:39:18.973Z","0.2.1":"2026-03-12T09:17:02.099Z","0.2.2":"2026-03-16T07:58:32.246Z","0.3.0":"2026-03-20T10:07:18.445Z","0.3.1":"2026-03-20T11:41:02.172Z","0.3.2":"2026-03-20T14:37:39.716Z","0.3.3":"2026-03-20T15:21:16.928Z"},"license":"Apache-2.0","description":"31Third SDK for Safe automation deployment and policy-guarded execution","maintainers":[{"name":"johannes-31third","email":"johannes@31third.com"},{"name":"31third-philipp","email":"dev@31third.com"}],"readme":"# @31third/sdk\n\nSDK for deploying `ExecutorModule` on Safe and executing policy-guarded rebalancings. It helps you create the Safe deployment proposal, attach on-chain policies, calculate a rebalance, and execute it with a dedicated executor wallet.\n\nTable of contents:\n- [Concept](#concept)\n- [Install](#install)\n- [Quick start](#quick-start)\n- [Step 1: Create and fund a Safe](#step-1-create-and-fund-a-safe)\n- [Step 2: Choose owner and executor](#step-2-choose-owner-and-executor)\n- [Step 3: Deploy ExecutorModule + policies](#step-3-deploy-executormodule--policies)\n- [Step 4: Calculate a rebalancing](#step-4-calculate-a-rebalancing)\n- [Step 5: Execute the rebalancing](#step-5-execute-the-rebalancing)\n- [Rebalancing payload parameters](#rebalancing-payload-parameters)\n- [Chain overrides](#chain-overrides)\n- [View helpers](#view-helpers)\n- [Policy reference](#policy-reference)\n- [Execution integration guide](#execution-integration-guide)\n- [Current status](#current-status)\n\n## Concept\n\n`ExecutorModule` lets a Safe keep custody of assets while delegating trading to a dedicated executor wallet. Every execution is checked against on-chain policies before the Safe trade is allowed to proceed.\n\nImportant rules:\n- The module `owner` and `executor` must be different addresses.\n- By default, SDK deployment sets the module owner to the Safe itself.\n- You can choose a different owner if you deploy through a flow that supports it, but `owner != executor` must still hold.\n- The executor wallet is a hot wallet and should never be used to create or approve the Safe deployment transaction.\n\nSetup overview:\n1. Create and fund a Safe.\n2. Choose a dedicated executor wallet.\n3. Deploy `ExecutorModule` plus policies to the Safe.\n4. Use the executor wallet to calculate and execute rebalances.\n\nSecurity notes:\n- Use a dedicated hot wallet for execution with limited funds.\n- Keep policies strict (asset universe, slippage, allocation) before enabling autonomous execution.\n- Treat the executor wallet as production infrastructure; rotate keys and monitor activity.\n\n## Install\n\n```bash\nnpm install @31third/sdk\n```\n\nDeployment note: the Safe deployment proposal must be created by a Safe signer, not by the executor wallet.\n\n## Quick start\n\nThe recommended flow is:\n1. Create and fund a Safe.\n2. Choose distinct `owner` and `executor` addresses.\n3. Deploy `ExecutorModule` and policies.\n4. Calculate a rebalance.\n5. Execute it with the executor wallet.\n\n## Step 1: Create and fund a Safe\n\nCreate a Safe at https://app.safe.global/ and fund it with the assets you want the strategy to manage.\n\n## Step 2: Choose owner and executor\n\n- `owner`: address allowed to manage module settings such as executor, cooldown, and policies.\n- `executor`: address allowed to call `execute`.\n- These addresses must be different.\n- In the default SDK deployment flow, the Safe is used as the module owner.\n\nRecommended setup:\n- `owner = SAFE_ADDRESS`\n- `executor = dedicated hot wallet`\n\n## Step 3: Deploy ExecutorModule + policies\n\nYou can deploy in two ways:\n\nRecommended:\n- Use https://app.31third.com/safe-policy-deployer to configure policies and create the Safe transaction.\n\nSDK flow:\n- Use `proposeDeployModuleBatchTx` when you want to generate and submit the Safe proposal programmatically.\n- Use `buildDeploySafePolicyStackTx` when you want an already-deployed `SafePolicyStackFactory` to build the factory deployment transaction for a connected wallet to sign and send directly. This helper does not submit anything to the Safe transaction service. After that transaction executes, call `proposeEnableModuleTx` with the deployed module address.\n\n```ts\nimport { proposeDeployModuleBatchTx } from '@31third/sdk';\nimport { JsonRpcProvider, Wallet } from 'ethers';\n\nconst provider = new JsonRpcProvider(process.env.RPC_URL!);\nconst safeSigner = new Wallet(process.env.SAFE_SIGNER_PK!, provider);\nconst safeAddress = process.env.SAFE_ADDRESS!;\nconst executor = process.env.EXECUTOR_ADDRESS!;\nconst priceOracle = process.env.PRICE_ORACLE!;\n\nawait proposeDeployModuleBatchTx({\n  automationId: 'uuid-or-id',\n  safeAddress,\n  signer: safeSigner, // Safe signer, not the executor\n  chainId: 8453,\n  executor,\n  batchTrade: process.env.BATCH_TRADE_ADDRESS!,\n  policyConfig: {\n    cooldown: 3600,\n    assetUniverse: {\n      assetUniverseTokens: ['0xToken1', '0xToken2'],\n    },\n    slippage: {\n      priceOracle,\n      maxSlippageBps: 50,\n    },\n    staticAllocation: {\n      priceOracle,\n      targetTokens: ['0xToken1', '0xToken2'],\n      targetBps: [5000, 5000],\n      driftThresholdBps: 50,\n      toleranceThresholdBps: 50,\n    },\n  },\n});\n```\n\nAfter the Safe transaction is approved and executed, record the deployed module address. You will need it for execution.\n\nFactory flow:\n\n```ts\nimport {\n  buildDeploySafePolicyStackTx,\n  proposeEnableModuleTx,\n} from '@31third/sdk';\nimport { JsonRpcProvider, Wallet } from 'ethers';\n\nconst provider = new JsonRpcProvider(process.env.RPC_URL!);\nconst connectedWallet = new Wallet(process.env.CONNECTED_WALLET_PK!, provider);\nconst safeSigner = new Wallet(process.env.SAFE_SIGNER_PK!, provider);\n\nconst { safeTx, moduleAddress } = await buildDeploySafePolicyStackTx({\n  safeAddress: process.env.SAFE_ADDRESS!,\n  factoryAddress: process.env.SAFE_POLICY_STACK_FACTORY!, // Optional, defaults to 0xC13C487819b0c656c49fD7Cf5A9f23E77FF42aF8\n  executor: process.env.EXECUTOR_ADDRESS!,\n  batchTrade: process.env.BATCH_TRADE_ADDRESS!,\n  policyConfig: {\n    cooldown: 3600,\n    assetUniverse: {\n      assetUniverseTokens: ['0xToken1', '0xToken2'],\n    },\n    slippage: {\n      priceOracle: process.env.PRICE_ORACLE!, // Optional, defaults to 0x37C6D6729FF637Ed9bF493c897794B256AFee004\n      maxSlippageBps: 50,\n    },\n    staticAllocation: {\n      priceOracle: process.env.PRICE_ORACLE!, // Optional, defaults to 0x37C6D6729FF637Ed9bF493c897794B256AFee004\n      targetTokens: ['0xToken1', '0xToken2'],\n      targetBps: [5000, 5000],\n      driftThresholdBps: 50,\n      toleranceThresholdBps: 50,\n    },\n  },\n});\n\nconst txResponse = await connectedWallet.sendTransaction({\n  to: safeTx.to,\n  data: safeTx.data,\n  value: safeTx.value,\n});\nconst receipt = await txResponse.wait();\n\n// `moduleAddress` is predicted up front. You can also read the deployed address\n// from the SafePolicyStackFactory StackDeployed event in `receipt` if needed.\nawait proposeEnableModuleTx({\n  safeAddress: process.env.SAFE_ADDRESS!,\n  moduleAddress,\n  signer: safeSigner,\n  chainId: 8453,\n});\n```\n\nFactory note: the SDK now sends CREATE2 deployment bundles to `SafePolicyStackFactory`,\nmatching the current protocol contract. The helper also predicts the deployed\naddresses up front from the factory address, salts, and creation code.\nDefaults:\n- `priceOracle`: `0x37C6D6729FF637Ed9bF493c897794B256AFee004`\n- `safePolicyStackFactory`: `0xC13C487819b0c656c49fD7Cf5A9f23E77FF42aF8`\n- If you omit these fields in the factory flow, the SDK uses the defaults above.\n- You can override the defaults explicitly by passing `factoryAddress` and/or policy `priceOracle` values.\n\nAfter the factory Safe transaction executes, you can notify the backend in a best-effort way:\n\n```ts\nimport { trackFactoryDeployment } from '@31third/sdk';\n\nawait trackFactoryDeployment({\n  automationId: 'uuid-or-id',\n  safeAddress: process.env.SAFE_ADDRESS!,\n  chainId: 8453,\n  executor: process.env.EXECUTOR_ADDRESS!,\n  batchTrade: process.env.BATCH_TRADE_ADDRESS!,\n  factoryAddress: process.env.SAFE_POLICY_STACK_FACTORY!, // Optional, defaults to 0xC13C487819b0c656c49fD7Cf5A9f23E77FF42aF8\n  transactionHash: process.env.EXECUTED_SAFE_TX_HASH!,\n  provider,\n});\n```\n\n`trackFactoryDeployment` resolves the deployed addresses from the\n`SafePolicyStackFactory` `StackDeployed` event and sends them to the backend.\nIt is best-effort and returns `undefined` if receipt resolution, event parsing,\nor backend notification fails.\n\n## Step 4: Calculate a rebalancing\n\nUse the 31Third API to calculate the rebalance for the Safe portfolio.\n\n```ts\nimport { calculateRebalancing } from '@31third/sdk';\n\nconst rebalancing = await calculateRebalancing({\n  apiBaseUrl: 'https://api.31third.com/1.3',\n  apiKey: process.env.API_KEY!,\n  chainId: 8453,\n  payload: {\n    wallet: process.env.SAFE_ADDRESS!,\n    signer: process.env.EXECUTOR_ADDRESS!,\n    simulationTxOrigin: process.env.EXECUTOR_ADDRESS!,\n    baseEntries: [],\n    targetEntries: [],\n    maxSlippage: 0.01,\n    maxPriceImpact: 0.05,\n    minTradeValue: 0.01,\n    skipBalanceValidation: false,\n  },\n});\n```\n\n## Step 5: Execute the rebalancing\n\nExecute the returned `txData` through the deployed module with the dedicated executor wallet.\n\n```ts\nimport { executeRebalancing } from '@31third/sdk';\nimport { JsonRpcProvider, Wallet } from 'ethers';\n\nconst executor = new Wallet(\n  process.env.EXECUTOR_PK!,\n  new JsonRpcProvider(process.env.RPC_URL!),\n);\n\nconst tx = await executeRebalancing({\n  signer: executor,\n  executorModule: process.env.EXECUTOR_MODULE!,\n  rebalancing,\n});\n\nawait tx.wait();\n```\n\n## Rebalancing payload parameters\n\nThese are the fields you can set in `calculateRebalancing({ payload })`:\n\n- `wallet`: Safe address the rebalancing is calculated for.\n- `signer`: address that will sign and execute on-chain. In the single-wallet executor flow, this should be the executor address.\n- `simulationTxOrigin`: optional override for simulation. In most cases this should match the executor address.\n- `baseEntries`: list of `{ tokenAddress, amount }` for the assets to sell. `amount` is in token base units.\n- `targetEntries`: list of `{ tokenAddress, allocation }` where `allocation` is a fraction such as `0.2` for 20%.\n- `maxDeviationFromTarget`: maximum allowed deviation from the target allocation before the API rejects the rebalance.\n- `maxSlippage`: maximum slippage used when calculating trades.\n- `maxPriceImpact`: maximum total price impact allowed for the basket trade.\n- `minTradeValue`: minimum trade value in USD.\n- `batchTrade`: whether batch trade mode is enabled.\n- `revertOnError`: whether the full batch should revert if one trade fails.\n- `skipBalanceValidation`: skip Safe balance checks.\n- `failOnMissingPricePair`: fail if a required price pair is missing.\n- `async`: calculate asynchronously.\n\nToken address note: use `ETH` or `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` for native ETH.\n\n## Chain overrides\n\nYou can override chain constants by passing `chainOverrides` to deployment helpers:\n\n```ts\nimport { proposeDeployModuleBatchTx } from '@31third/sdk';\n\nawait proposeDeployModuleBatchTx({\n  /* ... */\n  chainOverrides: {\n    safeTxServiceUrls: {\n      8453: 'https://safe-transaction-base.safe.global',\n    },\n    multisendAddresses: {\n      8453: '0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526',\n    },\n    create2FactoryAddresses: {\n      8453: '0xce0042B868300000d44A59004Da54A005ffdcf9f',\n    },\n    safeAppPrefixes: {\n      8453: 'base',\n    },\n    safeTxGasMultiplier: 1.2,\n    forceSafeTxGasZero: true,\n  },\n});\n```\n\nFields:\n- `safeTxServiceUrls`: Safe Transaction Service API per chain id.\n- `multisendAddresses`: MultiSend contract address per chain id.\n- `create2FactoryAddresses`: CREATE2 factory per chain id.\n- `safeAppPrefixes`: Safe app URL prefix per chain id.\n- `safeTxGasMultiplier`: optional multiplier applied to Safe Tx Service gas estimation (default `1.2`).\n- `forceSafeTxGasZero`: force `safeTxGas` to `0` and skip Safe Tx Service gas estimation (default `false`).\n\n## View helpers\n\nThe SDK now includes read helpers for `ExecutorModule` and policy contracts.\n\n```ts\nimport {\n  getExecutorModuleState,\n  getPoliciesWithTypes,\n  areTokensAllowed,\n} from '@31third/sdk';\nimport { JsonRpcProvider } from 'ethers';\n\nconst provider = new JsonRpcProvider(process.env.RPC_URL!);\n\nconst state = await getExecutorModuleState(process.env.EXECUTOR_MODULE!, provider);\nconst policies = await getPoliciesWithTypes(process.env.EXECUTOR_MODULE!, provider);\nconst allowed = await areTokensAllowed(process.env.ASSET_UNIVERSE_POLICY!, [\n  '0x4200000000000000000000000000000000000006',\n  '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n], provider);\n```\n\n### ExecutorModule\n\n| Function | Returns |\n|---|---|\n| `getExecutorModuleState(executorModule, runner)` | `{ owner, executor, safe, batchTrade, cooldown, lastExecution }` (`cooldown`, `lastExecution` are `bigint`) |\n| `getPolicies(executorModule, runner)` | `string[]` (policy addresses) |\n| `getPoliciesWithTypes(executorModule, runner)` | `{ policy: string, policyType: string }[]` |\n| `checkPoliciesVerbose(executorModule, trades, config, runner)` | `{ ok: boolean, failedPolicy: string, reason: string }` |\n\n### AssetUniversePolicy\n\n| Function | Returns |\n|---|---|\n| `getAssetUniverseTokens(assetUniversePolicy, runner)` | `string[]` (allowed token addresses) |\n| `isTokenAllowed(assetUniversePolicy, token, runner)` | `boolean` |\n| `areTokensAllowed(assetUniversePolicy, tokens, runner)` | `boolean[]` (same order as input `tokens`) |\n\n### StaticAllocationPolicy\n\n| Function | Returns |\n|---|---|\n| `getStaticAllocationTargets(staticAllocationPolicy, runner)` | `{ token: string, bps: bigint }[]` |\n| `getStaticAllocationConfig(staticAllocationPolicy, runner)` | `{ assetUniverse: string, priceOracle: string, driftThresholdBps: bigint, toleranceThresholdBps: bigint }` |\n\n### SlippagePolicy\n\n| Function | Returns |\n|---|---|\n| `getSlippageConfig(slippagePolicy, runner)` | `{ priceOracle: string, maxSlippageBps: bigint, owner: string }` |\n\n### Policy reason decoding\n\n| Function | Returns |\n|---|---|\n| `decodePolicyFailure(policyAddress, reasonData, runner)` | `string` (decoded reason, or empty string if unavailable) |\n\n## Policy reference\n\nThis SDK can deploy these policies and attach them to the ExecutorModule. All policies run on-chain before execution and can veto trades.\n\n### AssetUniversePolicy\n\nPurpose: restrict trades to a fixed list of allowed tokens.\n\nHow it works:\n- On every trade, checks that `trade.from` and `trade.to` are in the allowed token set.\n- Any token not explicitly allowed fails the policy.\n\nOwner controls:\n- `allowToken(token)` adds a token to the universe.\n- `disallowToken(token)` removes a token from the universe.\n\nFailure modes (custom errors):\n- `AssetUniverseFromTokenNotAllowed(token)`\n- `AssetUniverseToTokenNotAllowed(token)`\n\nUse cases:\n- Prevent AI or external executors from trading into unknown assets.\n- Enforce allowlists per portfolio or strategy.\n\n### StaticAllocationPolicy\n\nPurpose: enforce a target portfolio allocation (in bps) and only allow rebalances when a deviation threshold is met.\n\nInputs:\n- `targetTokens` and `targetBps` (must sum to 10_000).\n- `assetUniverse` (optional, if provided it defines the full supported token set).\n- `priceOracle` for price feeds.\n- `driftThresholdBps`: minimum deviation from target that triggers a rebalance.\n- `toleranceThresholdBps`: maximum deviation allowed after executing the proposed trades.\n\nHow it works:\n1) Loads current balances for all supported tokens.\n2) Computes current USD weights via price oracle.\n3) If no token deviates by at least `driftThresholdBps`, it fails with `StaticAllocationNoRebalanceTrigger`.\n4) Simulates the proposed trades using `minToReceiveBeforeFees` and updates balances.\n5) Computes predicted USD weights. If any token is outside `toleranceThresholdBps`, it fails.\n\nFailure modes (custom errors):\n- `StaticAllocationFeedMissing(token)`\n- `StaticAllocationZeroPortfolioValue()`\n- `StaticAllocationNoRebalanceTrigger()`\n- `StaticAllocationTokenNotSupported(token)`\n- `StaticAllocationInsufficientBalance(token, required, available)`\n- `StaticAllocationZeroPredictedValue()`\n- `StaticAllocationOutsideTolerance()`\n\nNotes:\n- Requires all tokens to be supported by the configured price oracle.\n- `targetTokens` must be in the asset universe when `assetUniverse` is provided.\n- Use `assetUniverse` to include on-ramp tokens (e.g., USDC/USDT) even if the target allocation is only WBTC/WETH; the universe defines which tokens the strategy can trade through.\n\n### SlippagePolicy\n\nPurpose: ensure `minToReceiveBeforeFees` isn’t below a maximum slippage bound.\n\nInputs:\n- `priceOracle` for price feeds.\n- `maxSlippageBps` (<= 10_000).\n\nHow it works:\n- For each trade, gets USD price feeds for `from` and `to`.\n- Computes expected output amount and enforces `minToReceiveBeforeFees >= expected * (1 - maxSlippageBps/10_000)`.\n\nFailure modes (custom errors):\n- `SlippageFeedMissing(tradeIndex, token)`\n- `SlippageMinToReceiveTooLow(tradeIndex, minToReceive, minAllowed)`\n\nNotes:\n- Requires feeds for both `from` and `to` tokens.\n- Uses token decimals and feed decimals to normalize expected output.\n\n## Execution integration guide\n\nUse this when implementing an executor service, bot, or agent:\n\nInputs:\n- `SAFE_ADDRESS`: Safe that holds assets.\n- `EXECUTOR_MODULE`: Deployed module address.\n- `RPC_URL`: Chain RPC.\n- `API_KEY`: 31Third API key for rebalancing.\n- `CHAIN_ID`: 1 / 137 / 8453 / 42161.\n- `EXECUTOR_PK`: Private key of the executor wallet.\n\nSteps:\n1) Fetch current Safe token balances and use those amounts for `baseEntries` in `calculateRebalancing`. It is not necessary to include all balances; include only the tokens/amounts you want to rebalance. All selected tokens must be in the defined asset universe.\n2) Call `calculateRebalancing` with `rebalancing/wallet` payload.\n3) Call `executeRebalancing` or decode `txData` and call `checkPoliciesVerbose` yourself before execution.\n4) If policy checks pass, execute through the module with the executor wallet.\n5) Record tx hash and any policy failure reasons for auditing.\n\nExpected outputs:\n- Rebalancing response (txData + requiredAllowances).\n- Execution tx hash (or a policy failure reason).\n\n## Current status\n\n- Ethereum and Base are supported right now.\n- Configure the correct chain-specific `priceOracle` address when deploying policies.\n- Supported Ethereum Mainnet tokens:\n\n| Token Symbol | Token Address |\n|---|---|\n| wstETH | `0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0` |\n| WBTC | `0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599` |\n| AAVE | `0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9` |\n| LINK | `0x514910771AF9Ca656af840dff83E8264EcF986CA` |\n| UNI | `0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984` |\n| WETH | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` |\n| WSOL | `0xD31a59c85aE9D8edEFeC411D448f90841571b89c` |\n| USDC | `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` |\n| USDT | `0xdAC17F958D2ee523a2206206994597C13D831ec7` |\n| EURC | `0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c` |\n\n- Supported Base Mainnet tokens:\n\n| Token Symbol | Token Address |\n|---|---|\n| WBTC | `0x0555e30da8f98308edb960aa94c0db47230d2b9c` |\n| cbETH | `0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22` |\n| SOL | `0x311935cd80b76769bf2ecc9d8ab7635b2139cf82` |\n| DAI | `0x50c5725949a6f0c72e6c4a641f24049a917db0cb` |\n| PEPE | `0x52b492a33e447cdb854c7fc19f1e57e8bfa1777d` |\n| EURC | `0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42` |\n| AAVE | `0x63706e401c06ac8513145b7687a14804d17f814b` |\n| cbDOGE | `0xcbd06e5a2b0c65597161de254aa074e489deb510` |\n| ZRO | `0x6985884c4392d348587b19cb9eaaf157f13271cd` |\n| USDC | `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` |\n| LINK | `0x88fb150bdc53a65fe94dea0c9ba0a6daf8c6e196` |\n| AERO | `0x940181a94a35a4569e4529a3cdfb74e38fd98631` |\n| COMP | `0x9e1028f5f1d5ede59748ffcee5532509976840e0` |\n| YFI | `0x9eaf8c1e34f05a589eda6bafdf391cf6ad3cb239` |\n| OP | `0xafcc6ae807187a31e84138f3860d4ce27973e01b` |\n| MORPHO | `0xbaa5cc21fd487b8fcc2f632f3f4e8d37262a0842` |\n| cbBTC | `0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf` |\n| RDNT | `0xd722e55c1d9d9fa0021a5215cbb904b92b3dc5d4` |\n| LBTC | `0xecac9c5f704e954931349da37f60e39f515c11c1` |\n| WETH | `0x4200000000000000000000000000000000000006` |\n| aBascbBTC | `0xbdb9300b7cde636d9cd4aff00f6f009ffbbc8ee6` |\n| aBasUSDC | `0x4e65fe4dba92790696d040ac24aa414708f5c0ab` |\n| aBasWETH | `0xd4a0e0b9149bcee3c920d2e00b5de09138fd8bb7` |\n","readmeFilename":"README.md"}