{"_id":"@synfutures/oyster-sdk","_rev":"39-d0f8c4b14da555a5270b23ddb4dafb60","name":"@synfutures/oyster-sdk","dist-tags":{"latest":"0.2.29"},"versions":{"0.1.2":{"name":"@synfutures/oyster-sdk","version":"0.1.2","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.2","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"dist":{"shasum":"fd142cb3b1981f3df38fdec014eebdade1f40a57","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.2.tgz","fileCount":249,"integrity":"sha512-+keS3n5AlNFz9/vOXdG5y6Ui64mRM0Wo4siL5nDhA5sC3hNqA87Al98XOL3fdFUwpMvmJoUVHRAsRBrZfhCchA==","signatures":[{"sig":"MEUCIQC03+lTSQK2wDIkaA05eAVUH2IrcJi8DDfOS8mxfMji8wIgDPUSHMpfLBCoMrEf5U7/OVhsT7lRwqP7ZmXhXS7snec=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2146699},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"9bf9a4e0090d6e13231459dccfaa851af5e83702","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.28"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^4.3.1","typedoc":"^0.24.8","@types/lodash":"^4.14.195","typedoc-plugin-markdown":"^3.15.4"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.2_1712825555876_0.2217843163556743","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"@synfutures/oyster-sdk","version":"0.1.3","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.3","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"dist":{"shasum":"2c02fc519df92ae4b2e03d9c8c6639720a13c626","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.3.tgz","fileCount":249,"integrity":"sha512-l8b+XqXpigU6crXiTCTBlpOvY2UB/PmV4lYmrem7GFOv+/chL6snU2ysDZd5fILW9bgjbRLhUY2FvL2BzdcPRg==","signatures":[{"sig":"MEQCIHN4kVzV0pn71zojeZBilSfukKGVQ9ATSQM0Q48a9t1nAiBzGciGjU/0YGlHIs/hAjhsSRZwZF1IqrKcOuPFIrNc0Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2147518},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"3be9c76dfd05aedfa267f98adfbe654266562dba","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.28"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^4.3.1","typedoc":"^0.24.8","@types/lodash":"^4.14.195","typedoc-plugin-markdown":"^3.15.4"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.3_1714465331036_0.2150636125698786","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@synfutures/oyster-sdk","version":"0.1.4","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.4","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"dist":{"shasum":"618ae87ef4f98d0385d92cbbcb8440ef392ee795","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.4.tgz","fileCount":249,"integrity":"sha512-bzkcCTgSWhLAgjwLKtfg/2BnmiEf01kB6CWr1/F7Lt5fZhqytqh6zGol7xrhCj3jNUPiyYwZg0GfXMOTLSiOJA==","signatures":[{"sig":"MEQCICfGGmqFDvxi2x7dPzvGhr56A13xUsdsg3rNhb4FXodpAiAkgJciLk+sJH9ZUU+wQzlMjMgdnfU8FRaGgRYs23OQqQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2147398},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"fb76f06c00cb0b44c162a58099a9cd90df36e608","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.28"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^4.3.1","typedoc":"^0.24.8","@types/lodash":"^4.14.195","typedoc-plugin-markdown":"^3.15.4"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.4_1714465901055_0.8147148026789741","host":"s3://npm-registry-packages"}},"0.1.5":{"name":"@synfutures/oyster-sdk","version":"0.1.5","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.5","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"dist":{"shasum":"b199536639d9f6a0da82f4599c94fd0561f118e5","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.5.tgz","fileCount":252,"integrity":"sha512-witLFuQWdcfpZ5lVgICa/m+vTwqx3TAn+W/D0IUfiQo2cZwAL+0IPr2ktE0Y8ft+3VIqe+/Tlb+xjh1nDEtvdw==","signatures":[{"sig":"MEUCIGzN4QmvOZ23CAaSbY7pJTtALW/Mn7jsper412bs36fWAiEAoaF3Nw/4MWgG7eeHbdg5O7Dp9lmOzo5pJ4pPtjiV7sw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2171852},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"1f478fd1e3b7211bc30c6a1df69292035ec7b80b","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.5_1715157692288_0.8010707409400446","host":"s3://npm-registry-packages"}},"0.1.6":{"name":"@synfutures/oyster-sdk","version":"0.1.6","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.6","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"1434b1df71f9955be61edb61ea06be279657aab3","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.6.tgz","fileCount":253,"integrity":"sha512-Nkk6iIY3vnGTZZc/IQZ8cA1nRL89DiUY80Cidf3GzGU7UojzxgpfLwxwKxZ4gybMy1uaZd5yW/in+/1Vj1Q8kQ==","signatures":[{"sig":"MEUCIQDPzdMq6rv54zf/fmWE8JNHkVLTVyvYKF77eQZ8ZviCMAIgbR9zyNONIF6XPNuiSEGAF9i5HQvOiQEixm3tqui+XfY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2463290},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"2d5f0b02849d555e03f83f7d7cddc4a2bb392224","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.6_1715667087231_0.5500853469185403","host":"s3://npm-registry-packages"}},"0.1.7":{"name":"@synfutures/oyster-sdk","version":"0.1.7","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.7","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"de85ca5c13df99436af078d5e92e4745739875a7","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.7.tgz","fileCount":253,"integrity":"sha512-Ra6u3NylKZfip8PcnJWVRanrl+7kAFlNxibENUNIha7mYQCiSIZDi8SJfETbsM1wbhLrT63sNDhsB5dDE/cnBw==","signatures":[{"sig":"MEUCIQCzJHzLzLcP2RfZDcxqfA7NIFrBnOP7S/Ua0ZV87Hnu2QIgSDav9YswFUP8xfDuLAc/KaX+tRXfZaJts77ar6DiPY8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2472202},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"88b7a2a42cd616f17aad8b93d7b193b6739734ca","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.7_1715857866240_0.8787646563451785","host":"s3://npm-registry-packages"}},"0.1.8":{"name":"@synfutures/oyster-sdk","version":"0.1.8","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.8","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"68e93f3b278a748a027f84069ccc42fe53e3b1fe","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.8.tgz","fileCount":253,"integrity":"sha512-Gv8A9Olvpi23ZvvvQghpjcuxUgE2RD7826v2wnpeHmqAl+8cjzfQv5lgXuUdoszmarnsIrS8Awq/mf1KMRq3HA==","signatures":[{"sig":"MEYCIQCG9rPIuHrS/GYkHlkJe3pg+kYGlH6UcGfUMkBO4uFYdQIhAOtg4gUEYZKe0iX0Hn5AUDWmIaTI0Bd/zXEzxJqxnw23","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2472684},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"3cb20e1eeb13f43fe4b0e24d8f6fba314c1c8a75","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.8_1715929979499_0.941765610370116","host":"s3://npm-registry-packages"}},"0.1.10":{"name":"@synfutures/oyster-sdk","version":"0.1.10","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.10","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"e3d156c39b25b9f85758d72afcacba9de9ba199f","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.10.tgz","fileCount":253,"integrity":"sha512-krLN/fOwmLot05XPgf47jgopHBfRlxYIydcpRPbpHf3x83CiN8wmZhP1wo5ujfAPMrNcsb2xfaz+HVHLpNG00w==","signatures":[{"sig":"MEUCIFzvjbHmLC5WtT7NFTTV1wbAiqXO8hrQFWdMp5JnqzKFAiEAtegNE1RSoe7Tkgve8lShavxBmEPuDXz8/L7G8eEBlZI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2473930},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"f2de413a62f4cfb5125d161a65c10240b7b6c026","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.10_1716371121075_0.4080005513277509","host":"s3://npm-registry-packages"}},"0.1.11":{"name":"@synfutures/oyster-sdk","version":"0.1.11","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.11","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"031a499e2701d62287120d6e11d2217d192b028b","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.11.tgz","fileCount":253,"integrity":"sha512-GGtfvt+QsQwuvLveq07dsw/S0ZAdrBRus6LnabLOYcpr8xVFmSBPvfXcMwRw1OPDTjr9G9sf/zGNrXhlCF71ug==","signatures":[{"sig":"MEUCIFtE9LbvFBtFvQUETOGUaFtLj3Fj34RlnuPp9wu8LbUYAiEA9beYpQkm+P+BJxEe0efj8vIjrYtJ3/9Gn7uzfXr+KzQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2473926},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"b38ac1a0d1e68edc4913eccdbe439be8b1fcf320","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.11_1716876553522_0.21862009344411337","host":"s3://npm-registry-packages"}},"0.1.13":{"name":"@synfutures/oyster-sdk","version":"0.1.13","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.13","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"33d20f53cea526fae70a318cfa69a0298381779f","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.13.tgz","fileCount":262,"integrity":"sha512-SDiNQP+o7QFciN41ZjQrlesuyFxRc8rkuaoIRl4AYPEIIU7DKFUyHYtxHIWSrQRfdOkTx3F46dg5f9wk42UzZg==","signatures":[{"sig":"MEYCIQC7YcKnhE34MhQCKXdkaDpr7fbypWO3Z+q9beHTBuEzBAIhAPQC9ep9FAwY+HuphkussBIIR+zQkygLmZrJhVUW2G+D","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2699866},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"8553c4f5ca81572b60486d42617c9be29cef3684","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.30"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.13_1718160795609_0.11754283900250462","host":"s3://npm-registry-packages"}},"0.1.15":{"name":"@synfutures/oyster-sdk","version":"0.1.15","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.1.15","homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"5ff359f6554a427da9b59fe779c9739f78ce802c","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.1.15.tgz","fileCount":263,"integrity":"sha512-g6XfTT7Id2wvhxBzKNSkcvByBbogynMIym5MbnVWvYjHVJ6D1H+kpzCRmJ2u7NDnmbhQK9zP2eHuPhhYBzJNTQ==","signatures":[{"sig":"MEQCIAtPQeMQY6x3vWZr26X3c0HRfn1BbOtO+nmczY8wDvbTAiBv08+zkJ4MqPdB0fl/2b4fPSh/D7GhKnS13MM5J8z+Wg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2773865},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"2f92e869365a31ee4ad4899d226a75cd0fffe5b7","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.32"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.1.15_1718968069954_0.6530059405559192","host":"s3://npm-registry-packages"}},"0.2.1":{"name":"@synfutures/oyster-sdk","version":"0.2.1","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.1","homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"07c749a092315302027ef685cbe29e049989ee1a","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.1.tgz","fileCount":263,"integrity":"sha512-hWxJVerWHroNZPERZjWEpr5os3B9ncSKShU+NGqmdWlL5CCaqJIQX365vuGeimYRpvIMvuI5IfVFKhtwBiZGUA==","signatures":[{"sig":"MEUCIGW8GlgfeyHPlIg/mXKGRcMdAECH2PdYlY/px7gziK5TAiEArJl36/CpYjvuqVvTLpNVT+Bh+ExpN5Tp98T9C1dXP10=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2799944},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"6c981413021515c0084123b5ff00088aa373760e","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.1_1719392513379_0.8711433122429366","host":"s3://npm-registry-packages"}},"0.2.2":{"name":"@synfutures/oyster-sdk","version":"0.2.2","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.2","homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"019fcc90a236e5cad7f41f5c70a961e068b85cb8","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.2.tgz","fileCount":263,"integrity":"sha512-8+81cy8NUuMHUUBc6VZUwHmizxHCWQDkCNwM3d+uYeuts0I+feUBFW0XrbCp87oiLIOZhZ/fXCMMu36ecEcoCg==","signatures":[{"sig":"MEQCIFLnxLo2GD8r+8/EHFAzdF9/U8fbQ6m2e+Afri6xVhjrAiAeW3DWuxdha9gQQo1iB3oYbQCtaCc/Rlkfd+coeBNhDg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2802577},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"58fe5ecc869d2ea6f8937be2e5b6de342d2aa66f","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.2_1719459200705_0.7586742624617739","host":"s3://npm-registry-packages"}},"0.2.3":{"name":"@synfutures/oyster-sdk","version":"0.2.3","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.3","homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"6a15570c1261edebbd442daa9a5a240d127ff2df","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.3.tgz","fileCount":262,"integrity":"sha512-ROYUFPc0+6doa2EtfYH7YKbizjQaXikWg2chLbE/UEzj11fiIJJORSK1VcHjVehblUlxDtcbcn0yovKl4sUpwA==","signatures":[{"sig":"MEUCIQDPXCE+YKXgu7ev4GgqNZmpzFjQ/05oKt12pnRqeSXGhwIgS92Q0ecA2fKvasru3PX51OACU0kxipK+xYbc18ja4ps=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2555025},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"d2aecbb822102c1ad36f6b7c8a6faba652011222","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.3_1719887215457_0.2952024017031294","host":"s3://npm-registry-packages"}},"0.2.5":{"name":"@synfutures/oyster-sdk","version":"0.2.5","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.5","homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"6e560b541fcbce4d7306e491914706d74ac1a40d","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.5.tgz","fileCount":262,"integrity":"sha512-fn4ztF6BaAxyda4tIOnfs6TS8tOS0YXTaIZ4Uu3Lp4EqBPpnN7CN19yZB5+s4ULGcZx7B10iRnqTQ05pEXWbhQ==","signatures":[{"sig":"MEYCIQDpLeHJCbCCL1yIExv9In0Yc0rkcbg8DsfTvoOV6EMYfAIhAOuAvCLxNC3XSvXjfIXyfw37yR1h+0gLt39sXkMdMsWZ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2558947},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"e0f3fe27af416689fcbfa5d21b05d8da0c6101f3","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.5_1719915598899_0.15622942325828437","host":"s3://npm-registry-packages"}},"0.2.6":{"name":"@synfutures/oyster-sdk","version":"0.2.6","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.6","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"1797e04bfbce75a9f4ee60e5d0f0de54b0495a62","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.6.tgz","fileCount":262,"integrity":"sha512-GFo4etHPkydGUTsnozq4VTn9Y+Y8SSAI6ECoUYm6fKLMCVbmKiqkL/VivOdph5TIWRlpv7qUOxdzebV4854bhQ==","signatures":[{"sig":"MEQCIEjppTaMXt2h3QdyhXeVkJ4CtTb9VFnCxUdItiRSJwYXAiBF+YZjhdEMyf3H39ZA//6pPc6t2xI8BaLf+DXUjTfEZw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2572797},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"5c0f41f7b82867411f899a798c4d98ef7fd7d081","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.6_1720604629796_0.546463140410334","host":"s3://npm-registry-packages"}},"0.2.7":{"name":"@synfutures/oyster-sdk","version":"0.2.7","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.7","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"e758589002d49c79cd336da1696389bb69dff5f6","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.7.tgz","fileCount":262,"integrity":"sha512-bwGIw+rbWncNrcIgC7BheFTGnEAeoHutm0dz7uzT9/y92YSD8EurW+bkcTUegCeQfNExkpLKze1407t2dxYHeg==","signatures":[{"sig":"MEUCIQDF4tKZTdd07mS1eG8JNsqi6lndd2/zFisnWokfusXiYwIgQ4I2DtpiH0/ikRgpRUGu91jj1XHELHHYGn5pMLfuElw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2575069},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"d85303fc627b0edd533beff313525b7b5172283d","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.7_1720692602161_0.3947914411443012","host":"s3://npm-registry-packages"}},"0.2.9":{"name":"@synfutures/oyster-sdk","version":"0.2.9","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.9","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"d266044159fa823d717aa289859f8654159a5c3a","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.9.tgz","fileCount":262,"integrity":"sha512-DOJSGt+3Ey/Nc7AhHP2dieGPm6VX3ojWfxrBKpGrK1MJHqMGOSrnfjewgZGiNyZg6ao9yxMtRBrdOW4wPEIpzw==","signatures":[{"sig":"MEQCIFE2l3utqfBDb6p5z3UxFxeqHMFr6BvHOqvx03fhMGY0AiBDFNdHOpAKo5l76RJbq65PiX/0+qMCk9XjChrDDIWuVw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2575783},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"d21ca96c4bcf2867abbc0435d0a79b3791eed8c3","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"9.9.2","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"16.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.9_1721647310995_0.08468569654718561","host":"s3://npm-registry-packages"}},"0.2.10":{"name":"@synfutures/oyster-sdk","version":"0.2.10","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.10","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"f754754b501b10944775c420c658c877ba8d7f49","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.10.tgz","fileCount":262,"integrity":"sha512-vxIGHpeXVdSrVH7ZFwmxUFkw8vWP0GAQe6DviPrvhMvQynB1oJg18Tqodn6+8eaIEdFRqrTU0W4mgIfNhF5O5w==","signatures":[{"sig":"MEYCIQDeX9Jrtg0LDMcrRwdOm2g6ahINe2jpaKp3CiwedQxv8QIhAK13i9YvDKosVkuA5U64S2aI6EXMV7g5mgfxOmQOKcNf","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2576718},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"2c43c046746f672eee15815306a9f1a44acd1ea5","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"10.2.4","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"21.6.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"1.0.33"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.10_1721984101909_0.45936107365640955","host":"s3://npm-registry-packages"}},"0.2.23":{"name":"@synfutures/oyster-sdk","version":"0.2.23","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.23","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"e5579367e3945234d2221e12c20b779b0c38879f","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.23.tgz","fileCount":297,"integrity":"sha512-7EumzoPQq0W7hj3ph53OSWYr3iajui7WrZgq/Swthml8fABe2NnfqU8r4WLgygp7pwX3Jto1L/1nkRHZWN/8rQ==","signatures":[{"sig":"MEYCIQDo76hbDC2GSd6nQqQWBAJr7Ow8JR/3dInpxwn8LV2OHQIhAJjFfpV2VbwSxFJ0uzkZcvIXwgqw8pyQ9Y85yXXxCTQi","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2951190},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"ea2003865c8015ae358224fc90f6d165431023e4","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"10.8.1","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"20.16.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"^1.0.39"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.23_1730280206570_0.7873242243483654","host":"s3://npm-registry-packages"}},"0.2.27":{"name":"@synfutures/oyster-sdk","version":"0.2.27","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.27","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"965816c3896b12fcfd1617ce0b52cd33df796c5a","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.27.tgz","fileCount":297,"integrity":"sha512-4gdPYpcyEM95FNcoQqZj+K6ldVQKBeQmd45f+lbyLYUgnfFl1wpnpuC4sl6Pp6YR8lO5TiycO+9QZpZO6MMm7w==","signatures":[{"sig":"MEYCIQC3fKdKfmU6XTai4qIb4/iBPNX+BpewwKKB5p2Sy40k7wIhAOBmoaXU3SanQR7/msYxXI8hsnttY6oJ4DlOfCsiTyMC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2954664},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"c581c99051b08f776159f22640d947226bb63f8b","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"10.9.0","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"23.1.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"^1.0.39"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.27_1733994671274_0.5371351168323406","host":"s3://npm-registry-packages-npm-production"}},"0.2.28":{"name":"@synfutures/oyster-sdk","version":"0.2.28","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.28","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"a723ca108b47f8cba3edf0aad4e00781acf58144","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.28.tgz","fileCount":297,"integrity":"sha512-PWdWQM2HA//hyxijxSCG7YpKWUa7lYedtm3urCOZmUVVtckHnYZXiyQvIKwKFcZMRCgrcQFK1mUECU7b8MnQpA==","signatures":[{"sig":"MEQCID4Dwv5bIbeqvJTORolQkdPgPtme733a+YNRCn8feYSXAiB88ZSaCDWDQ6Xi9sx0exir05+DdauiSJ19IT4ELStbOw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2956398},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"b1a32af7cd197a75143246a2d6344778699f8f83","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"10.9.0","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"23.1.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"^1.0.39"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.28_1734489093667_0.791665987054917","host":"s3://npm-registry-packages-npm-production"}},"0.2.29":{"name":"@synfutures/oyster-sdk","version":"0.2.29","author":{"name":"SynFutures"},"license":"MIT","_id":"@synfutures/oyster-sdk@0.2.29","maintainers":[{"name":"ericfan","email":"eric.fan@derivation.info"},{"name":"yizhoucao","email":"yizhou.cao@taustrat.com"},{"name":"xi.jin_synfutures","email":"xi.jin@derivation.info"},{"name":"longcpp","email":"long.wen@derivation.info"}],"homepage":"https://oyster.synfutures.com/","bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"dist":{"shasum":"ec8f8e1c42b1e487d43ce65cb8b363c8345d2f73","tarball":"https://registry.npmjs.org/@synfutures/oyster-sdk/-/oyster-sdk-0.2.29.tgz","fileCount":297,"integrity":"sha512-deT/6yocxSkiGm2VUhfdmYA5oZu+0K2vUM7ruF/IUaZzMrKN/liq6tUvkUOz+Gz5dbioX5bcY5ZTos3uU55acg==","signatures":[{"sig":"MEQCIFmI5HBYVAU/5nwDhlY5ACJLByQuAmzxhuNAuS3tV2jcAiB0ya2Wv+AaEpmDPe28yxHQnZ5FLuBYi3Nk1+pteU7WDQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2956398},"main":"./build/index.js","types":"./build/index.d.ts","gitHead":"319cd2d568d177a63535881d8873e6f002aa31f9","scripts":{"build":"tsc -p tsconfig.json","prepack":"npm run build","typedoc":"rimraf docs && npx typedoc --options typedoc.json","prebuild":"rimraf build"},"_npmUser":{"name":"ericfan","email":"eric.fan@derivation.info"},"repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"_npmVersion":"10.9.0","description":"SynFutures V3 SDK","directories":{},"_nodeVersion":"23.1.0","dependencies":{"lodash":"^4.17.21","@derivation-tech/web3-core":"^1.0.42"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.41.0","rimraf":"^4.3.1","ts-node":"^10.9.1","typedoc":"^0.24.8","prettier":"^2.8.8","typescript":"^4.5.0","@types/node":"^18.0.0","@types/lodash":"^4.14.195","@types/node-fetch":"^2.6.11","@types/async-retry":"^1.4.5","eslint-config-prettier":"^8.8.0","eslint-plugin-prettier":"^4.2.1","typedoc-plugin-markdown":"^3.15.4","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0"},"_npmOperationalInternal":{"tmp":"tmp/oyster-sdk_0.2.29_1735205360032_0.9603938243979135","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2024-04-11T08:52:35.875Z","modified":"2025-12-29T02:42:09.672Z","0.1.0":"2024-04-11T07:57:12.622Z","0.1.1":"2024-04-11T08:17:54.290Z","0.1.2":"2024-04-11T08:52:36.074Z","0.1.3":"2024-04-30T08:22:11.342Z","0.1.4":"2024-04-30T08:31:41.392Z","0.1.4-debug":"2024-05-08T06:55:00.246Z","0.1.5":"2024-05-08T08:41:32.478Z","0.1.6":"2024-05-14T06:11:27.462Z","0.1.7":"2024-05-16T11:11:06.429Z","0.1.8":"2024-05-17T07:12:59.727Z","0.1.9":"2024-05-22T08:47:17.238Z","0.1.10":"2024-05-22T09:45:21.245Z","0.1.11":"2024-05-28T06:09:13.743Z","0.1.13":"2024-06-12T02:53:15.846Z","0.1.15":"2024-06-21T11:07:50.175Z","0.2.0":"2024-06-24T01:53:47.412Z","0.2.1":"2024-06-26T09:01:53.590Z","0.2.2":"2024-06-27T03:33:21.069Z","0.2.3":"2024-07-02T02:26:55.653Z","0.2.5":"2024-07-02T10:19:59.041Z","0.2.6":"2024-07-10T09:43:50.051Z","0.2.7":"2024-07-11T10:10:02.314Z","0.2.9":"2024-07-22T11:21:51.209Z","0.2.10":"2024-07-26T08:55:02.201Z","0.2.23":"2024-10-30T09:23:26.944Z","0.2.27":"2024-12-12T09:11:11.463Z","0.2.28":"2024-12-18T02:31:33.907Z","0.2.29":"2024-12-26T09:29:20.274Z"},"bugs":{"url":"https://github.com/SynFutures/oyster-sdk/issues"},"author":{"name":"SynFutures"},"license":"MIT","homepage":"https://oyster.synfutures.com/","repository":{"url":"git+https://github.com/SynFutures/oyster-sdk.git","type":"git"},"description":"SynFutures V3 SDK","maintainers":[{"email":"long.wen@derivation.info","name":"longcpp"},{"email":"waley.zhao@synfutures.xyz","name":"waley.zhao"}],"readme":"# SynFutures V3 SDK\n\nSDK for SynFutures V3\n\n## 💻 Getting Started\n\nnpm:\n\n```\nnpm install @synfutures/oyster-sdk\n```\n\nyarn:\n\n```\nyarn add @synfutures/oyster-sdk\n```\n\n## 📝 Environment Variables Requirement\n\nThis package depends on the more fundamental package `@derivation-tech/web3-core`. Therefore, some environment variables need to be provided as required during runtime. Please refer to [here](https://www.npmjs.com/package/@derivation-tech/web3-core).\n\n## 👀 Note\n\n1. Before carrying out operations like trade, place, etc., please check the user's allowance for `Gate`.\n2. When interacting with `Gate` (such as deposit, withdraw), the precision of the token is its own precision. However, when interacting with `Instrument`, the precision of the token is fixed at 18.\n\n## ABIs\n\nThe SDK provides ABIs of several important contracts to facilitate your interaction with SynFuturesV3. You can obtain them in the following ways:\n\n-   Extract the original JSON files directly from the SDK. The paths are as follows:\n\n```shell\n/oyster-sdk/src/abis/CexMarket.json\n/oyster-sdk/src/abis/Config.json\n/oyster-sdk/src/abis/DexV2Market.json\n/oyster-sdk/src/abis/Gate.json\n/oyster-sdk/src/abis/Instrument.json\n/oyster-sdk/src/abis/Observer.json\n```\n\n-   Use them directly from the SDK\n\n```typescript\nimport { INSTRUMENT_ABI } from '@synfutures/oyster-sdk';\nimport { Contract } from 'ethers';\n\n// Print the ABI of the Instrument contract\nconsole.info(JSON.stringify(INSTRUMENT_ABI, null, 2));\n\n// Use INSTRUMENT_ABI directly from the SDK\nnew Contract(address, INSTRUMENT_ABI, signerOrProvider);\n```\n\n## Examples\n\n1. [Query instruments and pairs information](#query-instruments-and-pairs-information)\n2. [Query accout information](#query-accout-information)\n3. [Deposit to `Gate`](#deposit-to-gate)\n4. [Withdraw from `Gate`](#withdraw-from-gate)\n5. [Trade](#trade)\n6. [Adjust position, withdraw half of the available margin](#adjust-position-withdraw-half-of-the-available-margin)\n7. [Place order](#place-order)\n8. [Batch place orders](#batch-place-orders)\n9. [Bulk cancel order](#bulk-cancel-order)\n10. [Add liquidity](#add-liquidity)\n11. [Add asymmetric liquidity](#add-asymmetric-liquidity)\n12. [Remove liquidity](#remove-liquidity)\n13. [Query user operation history](#query-user-operation-history)\n14. [Query pair kline chart data](#query-pair-kline)\n15. [Query pair depth chart data](#query-pair-depth)\n16. [Query pair funding rate data](#query-pair-funding-rate)\n17. [Query user single pair info](#query-user-single-pair-info)\n18. [Get Volume Chart](#get-volume-chart)\n19. [Query Account Portfolio Info](#query-account-portfolio-info)\n20. [Query Account Range History](#query-account-range-history)\n21. [Query Asset Transfer History](#query-asset-transfer-history)\n22. [Query Deposit Withdraw History](#query-deposit-withdraw-history)\n23. [Estimate Earning APY](#estimate-earning-apy)\n24. [Query market info](#query-market-info)\n25. [Direct trade interface](#direct-trade-interface)\n26. [Direct place interface](#direct-place-interface)\n27. [Direct add interface](#direct-add-interface)\n28. [Direct remove interface](#direct-remove-interface)\n29. [Direct cancel interface](#direct-cancel-interface)\n30. [Update pair](#update-pair)\n31. [Settle trader](#settle-trader)\n32. [Parse tx](#parse-tx)\n33. [Restrictions on add, trade and place](#restrictions-on-add-trade-and-place)\n34. [Query subgraph using referral code as filter](#query-subgraph-using-referral-code-as-filter)\n\n### Prerequisites\n\nTo successfully run the blew examples:\n\n-   Please put BLAST_RPC=https://rpc.ankr.com/blast into the .env file where you run your command.\n-   Also set your private key ALICE_PRIVATE_KEY=your_own_private_key if you want to send transactions.\n-   Or you can set your provider and wallet directly in the code.\n\n```ts\nconst sdk = SynFuturesV3.getInstance('blast');\nsdk.setProvider(new ethers.providers.JsonRpcProvider('https://rpc.ankr.com/blast'));\nconst keystore = readFileSync('keystore.json', 'utf-8');\nconst signer1 = ethers.Wallet.fromEncryptedJsonSync(keystore, 'password');\nconst signer2 = ethers.Wallet.fromMnemonic(\n    'test test test test test test test test test test test test',\n    \"m/44'/60'/0'/0/1\",\n);\nconst signer3 = new ethers.Wallet('private key');\n```\n\n### Query instruments and pairs information\n\n```ts\nimport { ethers } from 'ethers';\nimport { InstrumentCondition, SynFuturesV3 } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    const instruments = await sdk.getAllInstruments();\n\n    for (const instrument of instruments) {\n        // only show instruments spot price in NORMAL condition\n        if (instrument.state.condition === InstrumentCondition.NORMAL) {\n            console.log(instrument.info.symbol, ethers.utils.formatEther(instrument.spotPrice));\n        }\n        // show all pairs symbol, mark price and fair price\n        for (const [expiry, pair] of instrument.pairs) {\n            console.log(\n                pair.symbol,\n                expiry,\n                ethers.utils.formatEther(pair.markPrice),\n                ethers.utils.formatEther(pair.fairPriceWad),\n            );\n        }\n    }\n}\n\n// ts-node src/demo.ts\nmain().catch(console.error);\n```\n\n### Query accout information\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    // get signer address\n    const signer = process.argv[2];\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    // get user account\n    const account = await sdk.getPairLevelAccount(signer, instrument.info.addr, PERP_EXPIRY);\n\n    console.log(\n        `Position balance: ${ethers.utils.formatUnits(account.position.balance)}, size: ${ethers.utils.formatUnits(\n            account.position.size,\n        )}, entryNotional: ${ethers.utils.formatUnits(\n            account.position.entryNotional,\n        )}, entrySocialLossIndex: ${ethers.utils.formatUnits(\n            account.position.entrySocialLossIndex,\n        )}, entryFundingIndex: ${ethers.utils.formatUnits(account.position.entryFundingIndex, 18)}`,\n    );\n\n    for (const order of account.orders) {\n        console.log(\n            `Order id: ${order.oid}, size: ${ethers.utils.formatUnits(\n                order.size,\n                18,\n            )}, balance: ${ethers.utils.formatUnits(order.balance, 18)}, tick: ${order.tick}, nonce: ${order.nonce}`,\n        );\n    }\n\n    for (const range of account.ranges) {\n        console.log(\n            `Range id: ${range.rid}, size: ${ethers.utils.formatUnits(range.balance, 18)}, from: ${\n                range.tickLower\n            }, to: ${range.tickLower}`,\n        );\n    }\n}\n\n// ts-node src/demo.ts 0xYOUR_ACCOUNT_ADDRESS_HERE\nmain().catch(console.error);\n```\n\n### Deposit to `Gate`\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3 } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    // get USDB token info\n    const usdb = await sdk.ctx.getTokenInfo('USDB');\n\n    // approve\n    await sdk.ctx.erc20.approveIfNeeded(\n        signer,\n        usdb.address,\n        sdk.config.contractAddress.gate,\n        ethers.constants.MaxUint256,\n    );\n\n    // deposit\n    await sdk.deposit(signer, usdb.address, ethers.utils.parseUnits('10', usdb.decimals));\n\n    console.log('Deposit 10 USDB to gate');\n}\n\nmain().catch(console.error);\n```\n\n### Withdraw from `Gate`\n\n```ts\nimport { SynFuturesV3 } from '@synfutures/oyster-sdk';\nimport { ethers } from 'ethers';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    // 1. withdraw USDB\n    // get USDB token info\n    const usdb = await sdk.ctx.getTokenInfo('USDB');\n    await sdk.withdraw(signer, usdb.address, ethers.utils.parseUnits('10', usdb.decimals));\n    console.log('Withdraw 10 USDB from the gate');\n\n    // 2. withdraw WETH\n    await sdk.withdraw(\n        signer,\n        sdk.ctx.wrappedNative.address,\n        ethers.utils.parseUnits('0.01', await sdk.ctx.wrappedNative.decimals()),\n    );\n\n    // 3. withdraw all WETH to ETH\n    await sdk.withdraw(\n        signer,\n        NATIVE_TOKEN_ADDRESS,\n        await sdk.contracts.gate.reserveOf(sdk.ctx.wrappedNative.address, signer.address),\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Trade\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY, Side } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    const pair = instrument.pairs.get(PERP_EXPIRY)!;\n\n    // inquire quotation and how much BTC is equivalent to 500 USDB\n    const { baseAmount, quotation } = await sdk.inquireByQuote(pair, Side.LONG, ethers.utils.parseUnits('500', 18));\n\n    // update cache for signer\n    await sdk.syncVaultCacheWithAllQuotes(await signer.getAddress());\n\n    // simulate result\n    const {\n        tradePrice, // average trade price in quote token\n        estimatedTradeValue, // traded value in quote token, i.e. entryNotional\n        minTradeValue, // if no existing position, return a minimum trade value related to instrument imr\n        tradingFee, // trading fee in quote token, excluding stability fee\n        stabilityFee, // stability fee in quote token for pushing the fair price away from mark\n        margin, // required margin in quote token\n        leverageWad, // leverage in WAD format\n        priceImpactWad, // price impact = (postFair - preFair) / preFair, represented in WAD format\n        realized, // realized pnl, funding and social loss counted\n        simulationMainPosition, // main position after trade\n        marginToDepositWad, // if current margin is not enough, margin to deposit in WAD format\n        limitTick, // average price limit represented in tick, if trade price is out of limit price, tx will revert\n        exceedMaxLeverage, // return true if leverage exceeds max leverage\n    } = sdk.simulateTrade(\n        await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY),\n        quotation,\n        Side.LONG,\n        baseAmount,\n        undefined, // we want to estimate the required margin, so pass in undefined here\n        ethers.utils.parseUnits('4', 18), // leverage, precision is 18\n        100, // slippage, 100 means 100 / 10000 = 1%\n    );\n\n    // trade\n    await sdk.intuitiveTrade(\n        signer,\n        pair,\n        Side.LONG,\n        baseAmount,\n        margin, // required margin\n        tradePrice,\n        100, // slippage, 100 means 100 / 10000 = 1%\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n    );\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await sdk.intuitiveTrade(\n        signer,\n        pair,\n        Side.LONG,\n        baseAmount,\n        margin, // required margin\n        tradePrice,\n        100, // slippage, 100 means 100 / 10000 = 1%\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later,\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n\n    console.log(\n        `Open a long position of ${ethers.utils.formatEther(\n            baseAmount,\n        )} BTC(≈ 500 USDB) with ${ethers.utils.formatUnits(margin, 18)} USDB and ${ethers.utils.formatUnits(\n            leverageWad,\n        )} leverage`,\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Adjust position, withdraw half of the available margin\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    const pair = instrument.pairs.get(PERP_EXPIRY)!;\n\n    const account = await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY);\n\n    // calculate the maximum amount of margin that can be withdrawn\n    const available = account.position.getMaxWithdrawableMargin();\n\n    await sdk.adjustMargin(\n        signer,\n        pair,\n        false, // we try to withdraw the margin, so pass false here, otherwise pass true\n        available.div(2), // withdraw half of the available margin\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n    );\n\n    console.log(`Withdraw ${ethers.utils.formatUnits(available.div(2), 18)} USDB margin`);\n}\n\nmain().catch(console.error);\n```\n\n### Place order\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY, Side, TickMath } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    const pair = instrument.pairs.get(PERP_EXPIRY)!;\n\n    // update cache for signer\n    await sdk.syncVaultCacheWithAllQuotes(await signer.getAddress());\n\n    // we try to place a short order,\n    // so the price of the order must be higher than the fair price\n    // NOTICE: tick must be aligned with PEARL_SPACING, i.e. ORDER_SPACING\n    // order spacing is 5, so the tick must be divisible by 5\n    const targetTick = alignTick(pair.amm.tick + 100, PEARL_SPACING);\n\n    // simulate result\n    const result = sdk.simulateOrder(\n        await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY),\n        targetTick,\n        ethers.utils.parseEther('0.2'),\n        Side.SHORT,\n        ethers.utils.parseUnits('4', 18),\n    );\n\n    // place order\n    await sdk.limitOrder(\n        signer,\n        pair,\n        targetTick,\n        ethers.utils.parseEther('0.2'),\n        result.balance,\n        Side.SHORT,\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n    );\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await sdk.limitOrder(\n        signer,\n        pair,\n        targetTick,\n        ethers.utils.parseEther('0.2'),\n        result.balance,\n        Side.SHORT,\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n\n    console.log(\n        `Place a 4 leveraged limit order of 0.2 BTC at ${ethers.utils.formatUnits(\n            TickMath.getWadAtTick(targetTick),\n            18,\n        )}`,\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Batch place orders\n\n```ts\nexport async function demoBatchPlace(): Promise<void> {\n    const sdk = SynFuturesV3.getInstance('Blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n    const account = await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY);\n    await sdk.syncVaultCacheWithAllQuotes(account.traderAddr);\n    const pair = instrument.getPairModel(PERP_EXPIRY)!;\n    const ticks = Array.from({ length: 9 }, (_, i) =>\n        alignTick(pair.amm.tick + PEARL_SPACING * (i + 1), PEARL_SPACING),\n    );\n    const ratios = [1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1112]; // ratios must add up to 10000\n    const leverage = ethers.utils.parseEther('5');\n    const size = ethers.utils.parseEther('1');\n    const res = sdk.simulateBatchPlace(account, ticks, ratios, size, Side.SHORT, leverage);\n    for (const order of res.orders) {\n        console.log(\n            formatUnits(order.baseSize, 18),\n            formatUnits(wmul(order.baseSize, sqrtX96ToWad(pair.amm.sqrtPX96)), 18),\n            formatUnits(wdiv(wmul(order.baseSize, sqrtX96ToWad(pair.amm.sqrtPX96)), order.balance), 18),\n            formatUnits(order.balance, 18),\n            formatUnits(order.minFeeRebate, 18),\n        );\n    }\n    console.log(\n        formatUnits(\n            res.orders.reduce((acc, order) => acc.add(order.balance), ethers.BigNumber.from(0)),\n            18,\n        ),\n    );\n    console.log(formatUnits(res.marginToDepositWad, 18));\n    console.log(formatUnits(res.minOrderValue, 18));\n\n    // to simulate batch place with frontend input, use simulateBatchOrder interface\n    const lowerTick = TickMath.getTickAtPWad(pair.fairPriceWad.mul(10050).div(10000));\n    const upperTick = TickMath.getTickAtPWad(pair.fairPriceWad.mul(10150).div(10000));\n    const orderCount = 9;\n    const res2 = sdk.simulateBatchOrder(\n        account,\n        lowerTick,\n        upperTick,\n        orderCount,\n        BatchOrderSizeDistribution.FLAT,\n        size,\n        Side.SHORT,\n        leverage,\n    );\n    for (const order of res2.orders) {\n        console.log(\n            order.tick,\n            formatUnits(TickMath.getWadAtTick(order.tick), 18),\n            order.ratio,\n            formatUnits(order.baseSize, 18),\n            formatUnits(wmul(order.baseSize, sqrtX96ToWad(pair.amm.sqrtPX96)), 18),\n            formatUnits(wdiv(wmul(order.baseSize, sqrtX96ToWad(pair.amm.sqrtPX96)), order.balance), 18),\n            formatUnits(order.balance, 18),\n            formatUnits(order.minFeeRebate, 18),\n        );\n    }\n    console.log(\n        formatUnits(\n            res2.orders.reduce((acc, order) => acc.add(order.balance), ethers.BigNumber.from(0)),\n            18,\n        ),\n    );\n    console.log(formatUnits(res2.marginToDepositWad, 18));\n    console.log(formatUnits(res2.minOrderValue, 18));\n\n    await sdk.batchPlace(signer, instrument.info.addr, {\n        expiry: PERP_EXPIRY,\n        ticks,\n        ratios,\n        size,\n        leverage,\n        deadline: now() + 300, // deadline, set to 5 minutes from now\n    });\n}\n\ndemoBatchPlace().catch(console.error);\n```\n\n### Bulk Cancel order\n\n```ts\nimport { SynFuturesV3, PERP_EXPIRY } from '@synfutures/oyster-sdk';\nimport { ethers } from 'ethers';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    const account = await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY);\n\n    // cancel all orders\n    // NOTICE: the order amount must be [1, 8], otherwise an error will be thrown\n    await sdk.batchCancelOrder(signer, account, account.orders, Math.floor(Date.now() / 1000) + 300);\n\n    console.log('Cancel all orders:', account.orders.map((order) => order.oid).join(','));\n}\n\nmain().catch(console.error);\n```\n\n### Add liquidity\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY, TickMath } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    // update cache for signer\n    await sdk.syncVaultCacheWithAllQuotes(await signer.getAddress());\n\n    // margin to add liquidity\n    const margin = ethers.utils.parseUnits('1000', 18);\n\n    const {\n        tickDelta, // tick range to add, calculated based on alphaWad\n        liquidity, // amount of liquidity to add\n        // NOTICE: range lower tick and upper tick are aligned with RANGE_SPACING, but normally you are taken care of and don't have to deal with range spacing yourself\n        upperPrice, // range upper price, alinged with RANGE_SPACING\n        lowerPrice, // range lower price, aligned with RANGE_SPACING\n        lowerPosition, // new net position if get removed at lower price\n        lowerLeverageWad, // new leverage if get removed at lower price\n        upperPosition, // new net position if get removed at upper price\n        upperLeverageWad, // new leverage if get removed at upper price\n        sqrtStrikeLowerPX96, // tx would revert if fair price is lower than this, calculated with slippage\n        sqrtStrikeUpperPX96, // tx would revert if fair price is higher than this\n        marginToDepositWad, // if gate reserve is not enough to cover the margin, you need to deposit this amount\n        minMargin, // margin required\n        minEffectiveQuoteAmount, // minimum quote needed to add liquidity based on instrument imr and quote token setting\n        equivalentAlpha, // actual alpha, slightly different from input alpha\n    } = await sdk.simulateAddLiquidity(\n        await signer.getAddress(),\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        ethers.utils.parseUnits('1.8', 18), // alpha, liquidity range factor, 1.8 means [1/1.8, 1.8]x current price\n        margin,\n        100, // // slippage, 100 means 100 / 10000 = 1%\n    );\n\n    await sdk.addLiquidity(\n        signer,\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        tickDelta,\n        margin,\n        sqrtStrikeLowerPX96,\n        sqrtStrikeUpperPX96,\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n    );\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await sdk.addLiquidity(\n        signer,\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        tickDelta,\n        margin,\n        sqrtStrikeLowerPX96,\n        sqrtStrikeUpperPX96,\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n\n    console.log(\n        `Add 1000 USDB liquidity from tick ${TickMath.getTickAtSqrtRatio(\n            sqrtStrikeLowerPX96,\n        )} to tick ${TickMath.getTickAtSqrtRatio(sqrtStrikeUpperPX96)}`,\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Add asymmetric liquidity\n\n```ts\nexport async function demoAddAsymmetricLiquidity(): Promise<void> {\n    const sdk = SynFuturesV3.getInstance('Blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    // update cache for signer\n    await sdk.syncVaultCacheWithAllQuotes(await signer.getAddress());\n\n    // margin to add liquidity\n    const margin = ethers.utils.parseUnits('1000', 18);\n\n    // return value almost same as simulateAddLiquidity, tickDelta => tickDeltaLower and tickDeltaUpper\n    const res = await sdk.simulateAddLiquidityWithAsymmetricRange(\n        await signer.getAddress(),\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        ethers.utils.parseUnits('1.8', 18), // alpha lower, liquidity range factor, currPx / 1.8\n        ethers.utils.parseUnits('2', 18), // alpha upper, liquidity range factor, currPx * 2\n        margin,\n        100, // // slippage, 100 means 100 / 10000 = 1%\n    );\n\n    await sdk.addLiquidityWithAsymmetricRange(\n        signer,\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        res.tickDeltaLower,\n        res.tickDeltaUpper,\n        margin,\n        res.sqrtStrikeLowerPX96,\n        res.sqrtStrikeUpperPX96,\n        now() + 300, // deadline, set to 5 minutes from now\n    );\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n\n    await sdk.addLiquidityWithAsymmetricRange(\n        signer,\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        PERP_EXPIRY,\n        res.tickDeltaLower,\n        res.tickDeltaUpper,\n        margin,\n        res.sqrtStrikeLowerPX96,\n        res.sqrtStrikeUpperPX96,\n        now() + 300, // deadline, set to 5 minutes from now\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n}\n```\n\n### Remove liquidity\n\n```ts\nimport { ethers } from 'ethers';\nimport { SynFuturesV3, PERP_EXPIRY } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, sdk.ctx.provider);\n\n    const instruments = await sdk.getAllInstruments();\n\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    // update cache for signer\n    await sdk.syncVaultCacheWithAllQuotes(await signer.getAddress());\n\n    // get user account\n    const account = await sdk.getPairLevelAccount(await signer.getAddress(), instrument.info.addr, PERP_EXPIRY);\n\n    const range = account.ranges[0];\n\n    const result = sdk.simulateRemoveLiquidity(account, range, 100);\n\n    await sdk.removeLiquidity(\n        signer,\n        instrument.pairs.get(PERP_EXPIRY)!,\n        await signer.getAddress(),\n        range,\n        result.sqrtStrikeLowerPX96,\n        result.sqrtStrikeUpperPX96,\n        Math.floor(Date.now() / 1000) + 300, // deadline, set to 5 minutes later\n    );\n\n    console.log(\n        `Remove ${ethers.utils.formatUnits(range.balance, 18)} USDB liquidity from tick ${range.tickLower} to tick ${\n            range.tickUpper\n        }`,\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Get Volume Chart\n\n```ts\nimport { PERP_EXPIRY, SynFuturesV3, VolumeChartDataProvider } from '@synfutures/oyster-sdk';\nasync function main() {\n    function now() {\n        return Math.floor(Date.now() / 1000);\n    }\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const sdk = SynFuturesV3.getInstance('blast');\n    const instruments = await sdk.getAllInstruments();\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n\n    const dataProvider = new VolumeChartDataProvider(sdk.ctx.chainId);\n    const volumeChartData = await dataProvider.getVolumeData(instrument.info.addr, PERP_EXPIRY, 0, now());\n    for (const data of volumeChartData) {\n        console.log('timestamp:', data.timestamp, 'baseVolume:', data.baseVolume, 'quoteVolume:', data.quoteVolume);\n    }\n}\nmain().catch(console.error);\n```\n\n### Query Account Portfolio Info\n\n```ts\nimport { SynFuturesV3, PERP_EXPIRY, InstrumentLevelAccountModel, sqrtX96ToWad, TickMath, ZERO } from '@synfutures/oyster-sdk';\nimport { formatEther } from 'ethers/lib/utils';\nimport { ethers } from 'ethers';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n    await sdk.initInstruments();\n    const accAddr = '0xYOUR_ACCOUNT_ADDRESS_HERE';\n    await sdk.syncVaultCacheWithAllQuotes(accAddr);\n\n    console.log('print balance in gate contract');\n    for (const symbol of Object.keys(sdk.config.quotesParam)) {\n        const tokenInfo = await sdk.ctx.getTokenInfo(symbol);\n        const tokenBalanceInVault = await sdk.getCachedVaultBalance(tokenInfo.address, accAddr);\n        console.log(\n            `Token ${symbol} balance in vault: ${ethers.utils.formatUnits(tokenBalanceInVault, tokenInfo.decimals)}`,\n        );\n    }\n\n    const allInstrumentLevelAccount: InstrumentLevelAccountModel[] = await sdk.getInstrumentLevelAccounts(accAddr);\n    for (const instrumentLevelAccount of allInstrumentLevelAccount) {\n        for (const [, pairLevelAccountModel] of instrumentLevelAccount.portfolios) {\n            if (pairLevelAccountModel.ranges.length > 0) {\n                console.log('print ranges for pair:', pairLevelAccountModel.rootPair.symbol);\n                for (const range of pairLevelAccountModel.ranges) {\n                    console.log('range:', range.tickLower, range.tickUpper, 'enterPrice', formatEther(sqrtX96ToWad(range.sqrtEntryPX96)), 'fees Earned', formatEther(range.feeEarned), 'value locked', formatEther(range.valueLocked);\n                    console.log('lowerPrice', formatEther(TickMath.getWadAtTick(range.tickLower)), 'upperPrice', formatEther(TickMath.getWadAtTick(range.tickUpper)));\n                    console.log('lowerLiquidationPrice', formatEther(range.lowerPositionModelIfRemove.liquidationPrice), 'upperLiquidationPrice', formatEther(range.upperPositionModelIfRemove.liquidationPrice));\n                }\n            }\n            if (pairLevelAccountModel.position.size !== ZERO) {\n                console.log('print position for pair:', pairLevelAccountModel.rootPair.symbol);\n                console.log('position size:', formatEther(pairLevelAccountModel.position.size), 'side:', pairLevelAccountModel.position.side, 'leverage:', formatEther(pairLevelAccountModel.position.leverageWad),\n                    'position value', formatEther(pairLevelAccountModel.position.getEquity()), 'margin', formatEther(pairLevelAccountModel.position.balance), 'maxWithdrawableMargin', formatEther(pairLevelAccountModel.position.getMaxWithdrawableMargin()));\n                console.log('unrealized Pnl', formatEther(pairLevelAccountModel.position.unrealizedPnl));\n                console.log('unrealized Funding', formatEther(pairLevelAccountModel.position.unrealizedFundingFee));\n                console.log('liquidate price', formatEther(pairLevelAccountModel.position.liquidationPrice));\n            }\n\n            if (pairLevelAccountModel.orders.length > 0) {\n                console.log('print orders for pair:', pairLevelAccountModel.rootPair.symbol);\n                for (const order of pairLevelAccountModel.orders) {\n                    console.log('order price:', order.limitPrice, 'size:', formatEther(order.size), 'taken', formatEther(order.taken), 'margin:', formatEther(order.balance), 'leverage:', formatEther(order.leverageWad), 'side:', order.side);\n                }\n            }\n\n        }\n    }\n}\n\nmain().catch(console.error);\n```\n\n### Query Account Range History\n\n```ts\nimport { SynFuturesV3, TickMath, formatExpiry } from '@synfutures/oyster-sdk';\nimport { formatEther } from 'ethers/lib/utils';\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n    const accAddr = '0xYOUR_ACCOUNT_ADDRESS_HERE';\n\n    function now() {\n        return Math.floor(Date.now() / 1000);\n    }\n\n    // get user range history\n    const userFundingHistory = await sdk.subgraph.getTransactionEvents({\n        eventNames: ['Add', 'Remove'],\n        traders: [accAddr],\n        // instrumentAddr: instrument.info.addr, // optional\n        // expiry: pair.amm.expiry, // optional\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n\n    // print user range history\n    for (const event of userFundingHistory) {\n        console.log(\n            'instrumentAddress',\n            event.address,\n            'expiry',\n            formatExpiry(parseInt(event.args.expiry)),\n            'event:',\n            event.name,\n            'timestamp:',\n            event.timestamp,\n            'tickLowerPrice',\n            formatEther(TickMath.getWadAtTick(parseInt(event.args.tickLower))),\n            'tickUpperPrice',\n            formatEther(TickMath.getWadAtTick(parseInt(event.args.tickUpper))),\n        );\n    }\n}\nmain().catch(console.error);\n```\n\n### Query Asset Transfer History\n\n```ts\nimport { SynFuturesV3, TickMath, formatExpiry } from '@synfutures/oyster-sdk';\nimport { formatUnits } from 'ethers/lib/utils';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n    const accAddr = '0xYOUR_ACCOUNT_ADDRESS_HERE';\n\n    function now() {\n        return Math.floor(Date.now() / 1000);\n    }\n\n    // get user transfer history\n    const userTransferHistory = await sdk.subgraph.getTransactionEvents({\n        eventNames: ['Gather', 'Scatter'],\n        traders: [accAddr],\n        // instrumentAddr: instrument.info.addr, // optional\n        // expiry: pair.amm.expiry, // optional\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n\n    // print user transfer history\n    for (const event of userTransferHistory) {\n        console.log(\n            'instrumentAddress',\n            event.address,\n            'expiry',\n            formatExpiry(parseInt(event.args.expiry)),\n            'event:',\n            event.name,\n            'timestamp:',\n            event.timestamp,\n        );\n        const quoteAddr = event.args.quote;\n        const tokenInfo = await sdk.ctx.getTokenInfo(quoteAddr);\n        console.log(\n            'Type',\n            event.name === 'Gather' ? 'Transfer In' : 'Transfer Out',\n            'Token',\n            tokenInfo.symbol,\n            'amount',\n            formatUnits(event.args.quantity, tokenInfo.decimals),\n        );\n    }\n}\n\nmain().catch(console.error);\n```\n\n### Query Deposit Withdraw History\n\n```ts\nimport { NATIVE_TOKEN_ADDRESS, SynFuturesV3, TickMath, formatExpiry } from '@synfutures/oyster-sdk';\nimport { formatUnits } from 'ethers/lib/utils';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n    const accAddr = '0xYOUR_ACCOUNT_ADDRESS_HERE';\n\n    function now() {\n        return Math.floor(Date.now() / 1000);\n    }\n\n    // get user transfer history\n    const userDWHistory = await sdk.subgraph.getTransactionEvents({\n        eventNames: ['Deposit', 'Withdraw'],\n        traders: [accAddr],\n        // instrumentAddr: instrument.info.addr, // optional\n        // expiry: pair.amm.expiry, // optional\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n\n    // print user transfer history\n    for (const event of userDWHistory) {\n        console.log('event:', event.name, 'timestamp:', event.timestamp);\n        const quoteAddr = event.args.quote;\n        const tokenInfo =\n            quoteAddr.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()\n                ? await sdk.ctx.wrappedNativeToken\n                : await sdk.ctx.getTokenInfo(quoteAddr);\n        console.log('Token', tokenInfo.symbol, 'amount', formatUnits(event.args.quantity, tokenInfo.decimals));\n    }\n}\n\nmain().catch(console.error);\n```\n\n### Estimate Earning APY\n\n```ts\nimport { SynFuturesV3, PERP_EXPIRY } from '@synfutures/oyster-sdk';\nimport { parseEther } from 'ethers/lib/utils';\n\nasync function main() {\n    function getInstrumentBySymbol(symbol: string) {\n        const instrument = instruments.find((i) => i.info.symbol === symbol);\n        if (!instrument) {\n            throw new Error('unknown symbol: ' + symbol);\n        }\n        return instrument;\n    }\n\n    const sdk = SynFuturesV3.getInstance('blast');\n    const instruments = await sdk.getAllInstruments();\n    const instrument = getInstrumentBySymbol('BTC-USDB-PYTH');\n    const pair = instrument.pairs.get(PERP_EXPIRY)!;\n    // alpha means the width of the range -> 1.5 means [1/1.5, 1.5]x current price\n    const alpha = '1.5';\n    // compute APY need pairs data\n    const pairDatas = await sdk.subgraph.getPairsData();\n    // get the pair data for the instrument\n    const pairData = pairDatas.find(\n        (pd) => pd.instrumentAddr.toLowerCase() === instrument.info.addr.toLowerCase() && pd.expiry === PERP_EXPIRY,\n    );\n    //can estimate the apy\n    const fee_24hrs = pairData!.poolFee24h;\n    const apy = sdk.estimateAPY(pair, fee_24hrs, parseEther(alpha));\n    console.log('estimated apy:', apy);\n}\n\nmain().catch(console.error);\n```\n\n### Query user operation history\n\n```ts\nimport { SynFuturesV3 } from '@synfutures/oyster-sdk';\n\nasync function main() {\n    const sdk = SynFuturesV3.getInstance('blast');\n\n    await sdk.init();\n\n    // get signer address\n    const signer = process.argv[2];\n\n    console.log(\n        'Account history:',\n        await sdk.subgraph.getVirtualTrades({\n            traders: [signer],\n        }),\n    );\n}\n\nmain().catch(console.error);\n```\n\n### Query pair kline\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { CHAIN_ID, now } from '@derivation-tech/web3-core';\nimport { parseEther } from 'ethers/lib/utils';\nimport { PERP_EXPIRY } from './constants';\nimport { IKlineDataProvider, KlineDataProvider, KlineInterval } from './chart/kline';\nimport { SynFuturesV3 } from './synfuturesV3Core';\n\nexport async function demoKline(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('Blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const klineProvider: IKlineDataProvider = new KlineDataProvider(CHAIN_ID.BLAST);\n    // enum KlineInterval {\n    //     MINUTE = '1m',\n    //     FIVE_MINUTE = '5m',\n    //     FIFTEEN_MINUTE = '15m',\n    //     THIRTY_MINUTE = '30m',\n    //     HOUR = '1h',\n    //     FOUR_HOUR = '4h',\n    //     WEEK = '1w',\n    //     DAY = '1d',\n    // }\n    const klineData = await klineProvider.getKlineData(\n        instrument.info.addr,\n        PERP_EXPIRY,\n        KlineInterval.HOUR,\n        0, // start time\n        now(), // end time, use now() to get the latest timestamp in seconds\n        parseEther('0.01'), // filter out trade value less 0.1 quote token\n    );\n    console.log(klineData);\n}\n\ndemoKline().catch(console.error);\n```\n\n### Query pair depth\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { CHAIN_ID } from '@derivation-tech/web3-core';\nimport { parseEther } from 'ethers/lib/utils';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { DepthChartDataProvider } from './chart/depth';\n\nexport async function demoDepth(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('Blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const depthProvider = new DepthChartDataProvider(CHAIN_ID.BLAST);\n    const pair = instrument.state.pairStates.get(PERP_EXPIRY)!;\n\n    // get depth chart data from subgraph\n    const depth1 = await depthProvider.getDepthData(\n        instrument.info.addr,\n        PERP_EXPIRY,\n        pair.amm.liquidity,\n        pair.amm.sqrtPX96,\n        instrument.setting.initialMarginRatio,\n    );\n    console.log(depth1);\n\n    const IMR_STEP_RATIO_MAP = {\n        100: [5, 10, 15],\n        300: [5, 15, 35],\n        500: [5, 25, 50],\n        1000: [5, 50, 100],\n    };\n\n    // get default range depth chart data from Observer contract's onchain query\n    const depth2 = await depthProvider.getDepthDataFromObserver(\n        synfV3.contracts.observer,\n        instrument.info.addr,\n        PERP_EXPIRY,\n        IMR_STEP_RATIO_MAP[instrument.setting.initialMarginRatio as keyof typeof IMR_STEP_RATIO_MAP][1],\n    );\n    console.log(depth2);\n\n    // get full range depth chart data from Observer\n    const depth3 = await depthProvider.getDepthRangeDataFromObserver(\n        synfV3.contracts.observer,\n        instrument.info.addr,\n        PERP_EXPIRY,\n        IMR_STEP_RATIO_MAP[instrument.setting.initialMarginRatio as keyof typeof IMR_STEP_RATIO_MAP][1],\n    );\n    console.log(depth3);\n\n    // get custom price range depth chart data from Observer\n    const depth4 = await depthProvider.getDepthRangeDataFromObserver(\n        synfV3.contracts.observer,\n        instrument.info.addr,\n        PERP_EXPIRY,\n        IMR_STEP_RATIO_MAP[instrument.setting.initialMarginRatio as keyof typeof IMR_STEP_RATIO_MAP][1],\n        false, // set to true when pair's price is inverted, e.g., pair is USDB-WETH-PYTH-PERP, but the price is shown as WETH-USDB\n        parseEther('50000'), // lower price in WAD\n        parseEther('70000'), // upper price in WAD\n    );\n    console.log(depth4);\n\n    // get order book data, (price, size, size sum)\n    const orderBook: {\n        left: { price: number; size: number; sizeSum: number }[];\n        right: { price: number; size: number; sizeSum: number }[];\n    } = {\n        left: [],\n        right: [],\n    };\n    for (const data of depth3.left) {\n        orderBook.left.push({\n            price: data.price,\n            size: data.base,\n            sizeSum:\n                orderBook.left.length === 0 ? data.base : orderBook.left[orderBook.left.length - 1].sizeSum + data.base,\n        });\n    }\n    for (const data of depth3.right) {\n        orderBook.right.push({\n            price: data.price,\n            size: data.base,\n            sizeSum:\n                orderBook.right.length === 0\n                    ? data.base\n                    : orderBook.right[orderBook.right.length - 1].sizeSum + data.base,\n        });\n    }\n    console.log(orderBook);\n}\n\ndemoDepth().catch(console.error);\n```\n\n### Query pair funding rate\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { formatWad, fromWad } from '@derivation-tech/web3-core';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { FundingChartDataProvider, FundingChartInterval } from './chart/funding';\nimport { wdiv } from './math';\nimport { BigNumber } from 'ethers';\n\nexport async function demoFundingRate(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    console.log(instrument.info.symbol);\n    const pair = instrument.getPairModel(PERP_EXPIRY)!;\n    console.log(pair.amm.status);\n    const fundingProvider = new FundingChartDataProvider(synfV3);\n\n    // get last hour funding rate\n    const lastHourFundingRate = await fundingProvider.getLastHourFundingRate(pair);\n    console.log(\n        `last hour funding rate: ${fromWad(lastHourFundingRate.longFundingRate)}, ${fromWad(\n            lastHourFundingRate.shortFundingRate,\n        )}`,\n    );\n\n    // get history funding rate chart data\n    console.log(`history one hour funding rate: `);\n    const oneHourFundingRate = await fundingProvider.getFundingRateData(FundingChartInterval.HOUR, pair);\n    console.log(oneHourFundingRate.length);\n    for (const rate of oneHourFundingRate) {\n        console.log(rate.timestamp, formatWad(rate.longFundingRate), formatWad(rate.shortFundingRate));\n    }\n    console.log(`history eight hour funding rate: `);\n    const eightHourFundingRate = await fundingProvider.getFundingRateData(FundingChartInterval.EIGHT_HOUR, pair);\n    console.log(eightHourFundingRate.length);\n    for (const rate of eightHourFundingRate) {\n        console.log(rate.timestamp, formatWad(rate.longFundingRate), formatWad(rate.shortFundingRate));\n    }\n\n    // get estimated projected funding rate\n    const fair = pair.fairPriceWad;\n    const mark = pair.markPrice;\n    const projectedFundingRate = wdiv(fair.sub(mark), mark).div(24);\n    const longPayShort = fair.gt(mark);\n    let projectedLongFundingRate: BigNumber;\n    let projectedShortFundingRate: BigNumber;\n    if (longPayShort) {\n        projectedLongFundingRate = projectedFundingRate.mul(-1);\n        projectedShortFundingRate = projectedFundingRate.mul(pair.amm.totalLong).div(pair.amm.totalShort);\n    } else {\n        projectedShortFundingRate = projectedFundingRate;\n        projectedLongFundingRate = projectedFundingRate.mul(pair.amm.totalShort).div(pair.amm.totalLong).mul(-1);\n    }\n    console.log(\n        `projected one hour funding rate is for long: ${fromWad(projectedLongFundingRate)}, for short: ${fromWad(\n            projectedShortFundingRate,\n        )}`,\n    );\n}\n\ndemoFundingRate().catch(console.error);\n```\n\n### Query user single pair info\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { now } from '@derivation-tech/web3-core';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\n\nexport async function demoUserPairInfo(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    console.log(instrument.info.symbol);\n    const pair = instrument.getPairModel(PERP_EXPIRY)!;\n    const trader = ''; // TODO: fill in the trader address\n\n    // get user trade history\n    const userTradeHistory = await synfV3.subgraph.getVirtualTrades({\n        traders: [trader],\n        instrumentAddr: instrument.info.addr,\n        expiry: pair.amm.expiry,\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n    console.log(userTradeHistory);\n\n    // get user order history\n    const userOrderHistory = await synfV3.subgraph.getUserOrders({\n        traders: [trader],\n        instrumentAddr: instrument.info.addr,\n        expiry: pair.amm.expiry,\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n    console.log(userOrderHistory);\n\n    // get user funding history\n    const userFundingHistory = await synfV3.subgraph.getTransactionEvents({\n        eventNames: ['FundingFee'],\n        traders: [trader],\n        instrumentAddr: instrument.info.addr,\n        expiry: pair.amm.expiry,\n        // to get all history, just ignore startTs and endTs\n        startTs: now() - 3600 * 24 * 30, // 30 days ago, get 1 month history\n        endTs: now(),\n    });\n    console.log(userFundingHistory);\n\n    // get user position\n    const userAccount = await synfV3.getPairLevelAccount(trader, instrument.info.addr, pair.amm.expiry);\n    console.log(userAccount.getMainPosition());\n    console.log(userAccount.orders);\n}\n\ndemoUserPairInfo().catch(console.error);\n```\n\n### Query market info\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { formatWad } from '@derivation-tech/web3-core';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { wmul } from './math';\n\nexport async function demoMarketInfoPage(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const allPairsData = await synfV3.subgraph.getPairsData();\n    for (const pairData of allPairsData) {\n        const pair = allInstruments\n            .find((i) => i.info.addr.toLowerCase() === pairData.instrumentAddr.toLowerCase())!\n            .getPairModel(pairData.expiry)!;\n        console.log(\n            `${pair.symbol}, ${formatWad(pair.fairPriceWad)}, ${formatWad(pairData.priceChange24h)}, ${formatWad(\n                pairData.high24h,\n            )}, ${formatWad(pairData.low24h)}, ${formatWad(pairData.volume24h)}, ${formatWad(\n                wmul(pair.amm.openInterests, pair.fairPriceWad), // represented in quote token, need to convert to dollar value\n            )}`,\n        );\n    }\n}\n\ndemoMarketInfoPage().catch(console.error);\n```\n\n### Direct trade interface\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { INT24_MAX, INT24_MIN, NULL_DDL, PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { Side } from './types';\nimport { parseEther } from 'ethers/lib/utils';\nimport { ZERO } from '@derivation-tech/web3-core';\n\nexport async function demoTrade(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n    // want to open a long position with 1 BTC, inquire the quotation first\n    const side = Side.LONG;\n    const size = parseEther('0.1');\n    await synfV3.syncVaultCacheWithAllQuotes(signer.address); // get signer's account\n    const account = await synfV3.getPairLevelAccount(signer.address, instrument.info.addr, pair.amm.expiry);\n    const { quotation } = await synfV3.inquireByBase(pair, side, size);\n\n    // margin and leverage are optional\n    // 1. undefined margin, margin will be calculated based on leverage\n    // 2. undefined leverage, leverage will be calculated based on margin\n    // 3. both undefined, leverage will be calculated based on new size and equity\n    const { margin } = synfV3.simulateTrade(\n        account,\n        quotation,\n        side,\n        size,\n        undefined,\n        parseEther('4'), // leverage in WAD format\n        100, // slippage in bps, 100 bps = 1%\n    );\n\n    await synfV3.trade(signer, instrument.info.addr, {\n        expiry: pair.amm.expiry,\n        size,\n        amount: margin,\n        // if the traded average price exceeds the limit price represented in tick format, trade would revert\n        // say I want to long btc with 1 btc, and I don't want average trade price to exceed 60k, then set limitTick to\n        // TickMath.getTickAtPWad(parseEther('60000'))\n        limitTick: size.gt(ZERO) ? INT24_MAX : INT24_MIN,\n        deadline: NULL_DDL, // set tx deadline, if desire 10 minutes ddl, use now() + 10 * 60\n    });\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await synfV3.trade(\n        signer,\n        instrument.info.addr,\n        {\n            expiry: pair.amm.expiry,\n            size,\n            amount: margin,\n            // if the traded average price exceeds the limit price represented in tick format, trade would revert\n            // say I want to long btc with 1 btc, and I don't want average trade price to exceed 60k, then set limitTick to\n            // TickMath.getTickAtPWad(parseEther('60000'))\n            limitTick: size.gt(ZERO) ? INT24_MAX : INT24_MIN,\n            deadline: NULL_DDL, // set tx deadline, if desire 10 minutes ddl, use now() + 10 * 60\n        },\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n}\n\ndemoTrade().catch(console.error);\n```\n\n### Direct place interface\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { PEARL_SPACING, PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { Side } from './types';\nimport { parseEther } from 'ethers/lib/utils';\nimport { formatWad, now } from '@derivation-tech/web3-core';\nimport { alignTick } from './common';\nimport { TickMath } from './math';\n\nexport async function demoPlace(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n    // say you want to place an short limit order of size 1 BTC at price 5% higher from current fair price with 10x leverage\n    // order cannot be placed too far from mark price, which is 2 * imr, and order cannot be too trivial\n    // to get minOrderValue\n    const minOrderValue = instrument.minOrderValue;\n    console.log(formatWad(minOrderValue));\n    const size = parseEther('1').mul(-1);\n    const leverage = parseEther('10');\n    const placePrice = pair.fairPriceWad.mul(105).div(100);\n    const tick = alignTick(TickMath.getTickAtPWad(placePrice), PEARL_SPACING); // tick needs to be aligned with pearl spacing\n    await synfV3.syncVaultCacheWithAllQuotes(signer.address);\n    const account = await synfV3.getPairLevelAccount(signer.address, instrument.info.addr, PERP_EXPIRY);\n    const { balance: margin } = synfV3.simulateOrder(account, tick, size, Side.SHORT, leverage);\n    await synfV3.place(signer, instrument.info.addr, {\n        expiry: pair.amm.expiry,\n        tick, // the price you want to place your order in tick format\n        size: size,\n        amount: margin,\n        deadline: now() + 10 * 60,\n    });\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await synfV3.place(\n        signer,\n        instrument.info.addr,\n        {\n            expiry: pair.amm.expiry,\n            tick, // the price you want to place your order in tick format\n            size: size,\n            amount: margin,\n            deadline: now() + 10 * 60,\n        },\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n}\n\ndemoPlace().catch(console.error);\n```\n\n### Direct add liquidity interface\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { NULL_DDL, PERP_EXPIRY, RATIO_BASE } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { parseEther } from 'ethers/lib/utils';\nimport { formatWad, fromWad } from '@derivation-tech/web3-core';\nimport { tickDeltaToAlphaWad } from './common';\nimport { TICK_DELTA_MAX } from './math';\n\nexport async function demoAdd(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n    const margin = parseEther('1000'); // margin to add liquidity, has to be larger than minRangeValue\n    console.log(formatWad(instrument.minRangeValue));\n    // alphaWad has to be larger than (1 + imr) and less than maxAlphaWad which is round [1/5, 5]x\n    const minAlphaWad = parseEther(((RATIO_BASE + instrument.setting.initialMarginRatio) / RATIO_BASE).toString());\n    const maxAlphaWad = tickDeltaToAlphaWad(TICK_DELTA_MAX);\n    console.log(fromWad(minAlphaWad), fromWad(maxAlphaWad));\n    const alphaWad = parseEther('1.8'); // liquidity range factor, 1.8 means [1/1.8, 1.8]x current price\n    await synfV3.syncVaultCacheWithAllQuotes(signer.address);\n    const rangeSimulation = await synfV3.simulateAddLiquidity(\n        signer.address,\n        {\n            marketType: instrument.marketType,\n            baseSymbol: instrument.info.base.symbol,\n            quoteSymbol: instrument.info.quote.symbol,\n        },\n        pair.amm.expiry,\n        alphaWad,\n        margin,\n        100, // slippage, 100 means 100 / 10000 = 1%\n    );\n    // limit tick is calculated based on sqrtStrikeLowerPX96 and sqrtStrikeUpperPX96, which are calculated based on slippage\n    const limitTicks = synfV3.encodeLimitTicks(\n        rangeSimulation.sqrtStrikeLowerPX96,\n        rangeSimulation.sqrtStrikeUpperPX96,\n    );\n    await synfV3.add(signer, instrument.info.addr, {\n        expiry: pair.amm.expiry,\n        // can use tickDelta larger than calcMinTickDelta(imr) and smaller than TICK_DELTA_MAX\n        tickDelta: rangeSimulation.tickDelta,\n        amount: margin,\n        limitTicks,\n        deadline: NULL_DDL,\n    });\n\n    // use referral code\n    // NOTICE: channel code must be 6 bytes long\n    const channel = '8test8';\n    const getReferralCode = (channel: string): string => {\n        return '\\xff\\xff' + channel; // 0xffff means you are sending tx using SDK and private key\n    };\n    await synfV3.add(\n        signer,\n        instrument.info.addr,\n        {\n            expiry: pair.amm.expiry,\n            // can use tickDelta larger than calcMinTickDelta(imr) and smaller than TICK_DELTA_MAX\n            tickDelta: rangeSimulation.tickDelta,\n            amount: margin,\n            limitTicks,\n            deadline: NULL_DDL,\n        },\n        {}, // here is overrides, you can pass in custom overrides for gas price and limit\n        getReferralCode(channel),\n    );\n}\n\ndemoAdd().catch(console.error);\n```\n\n### Direct remove liquidity interface\n\nalmost the same with `removeLiquidity` interface\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { now } from '@derivation-tech/web3-core';\n\nexport async function demoRemove(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n    await synfV3.syncVaultCacheWithAllQuotes(signer.address);\n    const account = await synfV3.getPairLevelAccount(signer.address, instrument.info.addr, pair.amm.expiry);\n    const range = account.ranges[0];\n\n    const result = synfV3.simulateRemoveLiquidity(account, range, 100);\n\n    await synfV3.remove(signer, instrument.info.addr, {\n        expiry: pair.amm.expiry,\n        target: signer.address,\n        tickLower: range.tickLower,\n        tickUpper: range.tickUpper,\n        limitTicks: synfV3.encodeLimitTicks(result.sqrtStrikeLowerPX96, result.sqrtStrikeUpperPX96), // calculated based on slippage\n        deadline: now() + 60,\n    });\n}\n\ndemoRemove().catch(console.error);\n```\n\n### Direct cancel order interface\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\nimport { now } from '@derivation-tech/web3-core';\n\nexport async function demoCancel(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n    await synfV3.syncVaultCacheWithAllQuotes(signer.address);\n\n    const account = await synfV3.getPairLevelAccount(signer.address, instrument.info.addr, pair.amm.expiry);\n\n    await synfV3.cancel(signer, instrument.info.addr, {\n        expiry: pair.amm.expiry,\n        tick: account.orders[0].tick, // the price of the order you want to cancel in tick format\n        deadline: now() + 60,\n    });\n}\n\ndemoCancel().catch(console.error);\n```\n\n### Update pair\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\n\nexport async function demoUpdate(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n\n    await synfV3.update(signer, instrument.info.addr, pair.amm.expiry);\n}\n\ndemoUpdate().catch(console.error);\n```\n\n### Settle User\n\n```ts\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ethers } from 'ethers';\nimport { PERP_EXPIRY } from './constants';\nimport { SynFuturesV3 } from './synfuturesV3Core';\n\nexport async function demoSettle(): Promise<void> {\n    const synfV3 = SynFuturesV3.getInstance('blast');\n    const allInstruments = await synfV3.getAllInstruments();\n    const instrument = allInstruments.find((i) => i.info.symbol.includes('BTC-USDB'))!;\n    const pair = instrument.getPairModel(PERP_EXPIRY);\n\n    // get your own signer\n    const signer = new ethers.Wallet(process.env.ALICE_PRIVATE_KEY as string, synfV3.ctx.provider);\n\n","readmeFilename":"README.md"}