From 422f6499ebc6c67e19828290535337ea73e17758 Mon Sep 17 00:00:00 2001 From: tukwan <7630720+tukwan@users.noreply.github.com> Date: Tue, 26 Nov 2024 11:12:43 +0400 Subject: [PATCH] feat: revamps structure and adds Flow docs chore: add robots.txt chore: png for open graph fix: envio endpoints refactor docs to accommodate upcoming Flow protocol delete contracts directory fix: broken links feat: create redirects from old site to new site feat: update header page autogen polish docs polish docs refactor: add overview in lockup concepts feat: add Flow overview use stream shapes, stream curves instead of stream types update .gitmodules spelling mistake docs: flow apps (#190) * style: change icon for technical references chore: remove medium and replace with blog.sablier in landing page build: gitmodules path fix * chore: update app screenshots for the vesting section refactor: reorganize the app menu refactor: make the vesting section lighter docs: document relation between flow, lockup and payments, vesting * feat: technical guides * feat: app payments section chore: update images in the apps sections fix: formatter script * refactor: re-organize the apis sections * feat: add flow placeholder for endpoints * fix: broken links refactor: sablier v2 to sablier lockup v1.x in api section fix: gas benchmark formatter docs: add notes for subgraph naming convention chore: update v1 subgraph endpoint feat: docs for Flow protocol (#189) * feat: autogen script for Flow refactor: rename autogen to autogen-lockup * fix hyperlink issue * flow status and nft * flow fees and governance * refactor: use package versioning when referring to lockups refactor: rename v1 to v1 legacy feat: add benchmark, deployments, errors, access control for flow * update diagrams placeholde * Flow custom deployments * feat: flow diagrams refactor: rename guides folders to examples * adds link to flow audits polishing references to legacy protocol * update flow references * rename previous versions to previous deployments fix broken links build: update bun lockfile refactor: reorder and restructure pages refactor: copyright changes refactor: rename categories Co-authored-by: Paul Razvan Berg Co-authored-by: Razvan Gabriel Apostu refactor: use correct names for integration templates chore: img png to webp Co-authored-by: tukwan <7630720+tukwan@users.noreply.github.com> docs: adds note on versioning docs: update to webp images refactor: say token instead of asset small fixes feat: document flow subgraphs (#194) * refactor docs to accommodate upcoming Flow protocol * delete contracts directory * fix: broken links * feat: create redirects from old site to new site feat: update header page * autogen * polish docs * polish docs * refactor: add overview in lockup concepts * feat: add Flow overview * use stream shapes, stream curves instead of stream types * update .gitmodules * spelling mistake * docs: flow apps (#190) * style: change icon for technical references chore: remove medium and replace with blog.sablier in landing page build: gitmodules path fix * chore: update app screenshots for the vesting section refactor: reorganize the app menu refactor: make the vesting section lighter docs: document relation between flow, lockup and payments, vesting * feat: technical guides * feat: app payments section chore: update images in the apps sections fix: formatter script * refactor: re-organize the apis sections * feat: add flow placeholder for endpoints * fix: broken links * refactor: sablier v2 to sablier lockup v1.x in api section * fix: gas benchmark formatter * docs: add notes for subgraph naming convention * chore: update v1 subgraph endpoint * feat: docs for Flow protocol (#189) * feat: autogen script for Flow refactor: rename autogen to autogen-lockup * fix hyperlink issue * flow status and nft * flow fees and governance * refactor: use package versioning when referring to lockups refactor: rename v1 to v1 legacy feat: add benchmark, deployments, errors, access control for flow * update diagrams placeholde * Flow custom deployments * feat: flow diagrams refactor: rename guides folders to examples * adds link to flow audits polishing references to legacy protocol * update flow references * rename previous versions to previous deployments * fix broken links * build: update bun lockfile * refactor: reorder and restructure pages refactor: copyright changes refactor: rename categories * feat: add flow the graph api section * chore: add docs for flow envio * fix(api): envio queries fix(api): incorrect mentions of lockup inside flow * fix(static): remove pngs resulted from merge --------- Co-authored-by: smol-ninja Co-authored-by: Razvan Gabriel Apostu Co-authored-by: Paul Razvan Berg polish protocol mentions and remove old links Co-authored-by: andreivladbrg update Flow with latest commit refactor: rename asset to token refactor: release history Co-authored-by: andreivladbrg fix links use links from feat/flow branch of examples repo replaces jan with apr in lockup example docs: adds guide to pull vesting information (#202) * docs: adds guide to pull vesting information * refactor: polish vesting data guide * refactor: polish some more --------- Co-authored-by: Paul Razvan Berg feat: sequence diagrams (#200) * feat: use sequence diagrams * add flow diagram about actors and their actions * adds sequence diagram in lockup access control * refactor: replace statuses with rps values * removes streamId from sequence diagrams categorizes diagrams in Flow access control simplifies diagrams in Lockup access control defines ongoing debt in Flow overview fixes definition of snapshot debt in Flow overview adds abbreviations in Flow diagrams Co-authored-by: andreivladbrg * adds function status interaction diagram Co-authored-by: Co-authored-by: andreivladbrg --------- Co-authored-by: andreivladbrg feat: envio endpoints fix link feat: add flow deployments addresses (#201) fix: flow and drops (#204) * refactor: drops to airdrops * fix: broke links in apps and api * chore: mention geofencing in a separate section * misisng common bracket * use heading 3 for geo fencing title --------- Co-authored-by: smol-ninja moves legacy v1 dir to the same level as lockup refactors content for legacy v1 fixes redirects Co-authored-by: Andrei Vlad Birgaoanu <99738872+andreivladbrg@users.noreply.github.com> collapse examples category feat: add hook checklist rename v2-deployments to deployments chore: update flow subgraph endpoints chore: set branch to release in flow submodule feat(support): payment stream videos refactor: headings in local environment guide polish headings in local environment guides fix: logo in light mode docs: mention security researchers fix: fix CSS filter refactor: static img for GitHub icon chore: update csv columns refactor: update deployments and example hyperlink refactor: say "blob" instead of "tree" refactor: polish writing fix: fix periphery package fix: fix incorrect references refactor: alphabetical ordering refactor: improve writing refactor: reorder sections refactor: Sablier V1 to Sablier Legacy refactor: version Lockup and Flow fix redirects Co-authored-by: smol-ninja Co-authored-by: Razvan Gabriel Apostu Co-authored-by: Paul Razvan Berg Co-authored-by: andreivladbrg Co-authored-by: tukwan <7630720+tukwan@users.noreply.github.com> Co-authored-by: Mircea Gavriliu Co-authored-by: maxdesalle --- .gitmodules | 12 +- bun.lockb | Bin 663218 -> 663202 bytes docs/api/01-overview.mdx | 155 +++- docs/api/05-development.mdx | 226 +++++ .../02-differences.mdx => 06-differences.mdx} | 12 +- docs/api/07-legacy.mdx | 69 ++ docs/api/airdrops/01-overview.mdx | 57 ++ docs/api/airdrops/02-endpoints.mdx | 241 +++++ .../protocol => api/airdrops}/_category_.json | 2 +- docs/api/airdrops/envio/01-similarities.mdx | 16 + .../merkle => airdrops/envio}/02-queries.md | 4 +- docs/api/airdrops/envio/_category_.json | 5 + .../merkle-api/01-overview.mdx} | 20 +- .../merkle-api/02-functionality.mdx | 76 +- .../{ => airdrops}/merkle-api/03-examples.mdx | 42 +- docs/api/airdrops/merkle-api/_category_.json | 5 + .../the-graph}/01-entities.mdx | 18 +- .../the-graph}/02-queries.md | 4 +- docs/api/airdrops/the-graph/_category_.json | 5 + docs/api/flow/01-overview.mdx | 29 + docs/api/flow/02-endpoints.mdx | 233 +++++ .../merkle => flow}/_category_.json | 2 +- docs/api/flow/envio/01-similarities.mdx | 17 + docs/api/flow/envio/02-architecture.mdx | 8 + docs/api/flow/envio/03-queries.mdx | 158 ++++ docs/api/flow/envio/_category_.json | 5 + docs/api/flow/the-graph/01-entities.mdx | 32 + docs/api/flow/the-graph/02-structure.mdx | 138 +++ docs/api/flow/the-graph/03-architecture.mdx | 58 ++ docs/api/flow/the-graph/04-queries.md | 144 +++ docs/api/flow/the-graph/_category_.json | 5 + docs/api/indexers/01-endpoints.mdx | 73 -- docs/api/indexers/05-development.mdx | 60 -- docs/api/indexers/06-testing.mdx | 40 - docs/api/indexers/merkle/01-entities.mdx | 22 - docs/api/indexers/merkle/_category_.json | 5 - docs/api/indexers/protocol/01-entities.mdx | 22 - docs/api/indexers/protocol/02-structure.mdx | 8 - docs/api/lockup/01-overview.mdx | 29 + docs/api/lockup/02-endpoints.mdx | 212 +++++ docs/api/{indexers => lockup}/_category_.json | 2 +- docs/api/lockup/envio/01-similarities.mdx | 17 + .../envio/02-architecture.mdx} | 16 +- .../envio/03-queries.mdx} | 14 +- docs/api/lockup/envio/_category_.json | 5 + .../the-graph}/01-entities.mdx | 10 +- .../the-graph}/02-structure.mdx | 46 +- .../the-graph/03-architecture.mdx} | 13 +- .../the-graph}/04-queries.md | 24 +- docs/api/lockup/the-graph/_category_.json | 5 + docs/api/merkle-api/04-development.mdx | 79 -- docs/api/merkle-api/_category_.json | 5 - docs/api/subgraphs/01-endpoints.mdx | 377 -------- docs/api/subgraphs/04-development.mdx | 63 -- docs/api/subgraphs/_category_.json | 5 - docs/apps/01-overview.mdx | 36 - docs/apps/03-branding.mdx | 2 +- docs/apps/04-legacy-v1.mdx | 14 + docs/apps/features/01-overview.mdx | 53 ++ docs/apps/features/01-streams.mdx | 127 --- docs/apps/features/02-airstreams.mdx | 76 -- docs/apps/features/02-vesting.mdx | 150 ++++ docs/apps/features/03-payments.mdx | 88 ++ docs/apps/features/04-airdrops.mdx | 121 +++ .../{03-general.mdx => 05-generic.mdx} | 18 +- ...{03-csv-support.mdx => 01-csv-support.mdx} | 33 +- docs/apps/guides/02-url-schemes.mdx | 40 +- docs/apps/guides/03-how-to.mdx | 7 + docs/apps/guides/_category_.json | 4 +- docs/concepts/01-what-is-sablier.mdx | 117 ++- docs/concepts/02-sablier-protocol.md | 75 -- .../01-streaming.md => 02-streaming.md} | 31 +- docs/concepts/03-use-cases.mdx | 44 +- .../{protocol/05-nft.mdx => 06-nft.mdx} | 73 +- ...ansferability.md => 07-transferability.md} | 6 +- .../{05-governance.md => 08-governance.md} | 40 +- docs/concepts/09-fees.mdx | 77 ++ docs/concepts/10-security.md | 27 + .../{06-glossary.md => 11-glossary.md} | 66 +- docs/concepts/flow/01-overview.md | 90 ++ docs/concepts/flow/02-statuses.md | 130 +++ docs/concepts/flow/_category_.json | 5 + docs/concepts/lockup/01-overview.md | 22 + .../02-stream-shapes.mdx} | 41 +- .../{protocol => lockup}/03-segments.md | 5 +- .../{protocol => lockup}/04-tranches.md | 8 +- .../05-airstreams.mdx} | 4 +- .../07-statuses.md => lockup/06-statuses.md} | 22 +- docs/concepts/lockup/07-hooks.md | 89 ++ .../08-cancelability.md} | 2 +- .../lockup}/_category_.json | 2 +- docs/concepts/protocol/08-fees.mdx | 57 -- docs/concepts/protocol/09-hooks.md | 51 -- docs/contracts/v1/_category_.json | 5 - docs/contracts/v1/guides/codebase.mdx | 41 - docs/contracts/v2/01-overview.md | 32 - docs/contracts/v2/03-security.md | 20 - docs/contracts/v2/deployments/_category_.json | 5 - docs/contracts/v2/reference/01-overview.md | 74 -- .../v2/reference/05-access-control.md | 159 ---- .../03-custom-deployments.mdx} | 108 ++- .../04-snapshot-voting.md} | 28 +- .../07-frontend.md => guides/05-frontend.md} | 6 +- docs/guides/flow/01-overview.md | 29 + docs/guides/flow/02-deployments.md | 258 ++++++ docs/guides/flow/04-gas-benchmarks.md | 33 + .../protocol => guides/flow}/_category_.json | 2 +- .../flow/examples/01-local-environment.md | 140 +++ .../flow/examples}/_category_.json | 2 +- .../legacy/01-overview.md} | 14 +- .../legacy/02-deployments.md} | 22 +- docs/guides/legacy/03-codebase.mdx | 41 + .../legacy/04-streams.md} | 5 +- .../legacy/05-gas-costs.md} | 4 +- docs/guides/legacy/_category_.json | 5 + docs/guides/lockup/01-overview.md | 39 + .../v2 => guides/lockup}/02-deployments.md | 697 +++++++-------- .../lockup/04-gas-benchmarks.md} | 12 +- .../lockup/05-etherscan.md} | 43 +- .../v2 => guides/lockup}/_category_.json | 2 +- .../lockup/examples}/01-local-environment.md | 47 +- .../lockup/examples}/04-create-airstream.mdx | 31 +- .../lockup/examples}/06-hooks.md | 20 +- .../lockup/examples/08-pull-vesting-data.md | 181 ++++ docs/guides/lockup/examples/_category_.json | 5 + .../01-batch-lockup-linear.mdx | 18 +- .../02-batch-lockup-dynamic.mdx | 18 +- .../03-batch-lockup-tranched.mdx | 18 +- .../batch-create-streams/_category_.json | 0 .../create-stream/01-lockup-linear.mdx | 21 +- .../create-stream/02-lockup-dynamic.mdx | 26 +- .../create-stream/03-lockup-tranched.mdx | 27 +- .../examples}/create-stream/_category_.json | 0 .../lockup/examples}/staking/01-setup.md | 6 +- .../lockup/examples}/staking/02-full-code.md | 4 +- .../lockup/examples}/staking/03-hooks.md | 12 +- .../lockup/examples}/staking/04-stake.md | 0 .../lockup/examples}/staking/05-rewards.md | 0 .../lockup/examples}/staking/06-claim.md | 0 .../lockup/examples}/staking/07-unstake.md | 0 .../lockup/examples}/staking/_category_.json | 0 .../examples}/stream-management/01-setup.md | 8 +- .../stream-management/02-withdraw.md | 35 +- .../examples}/stream-management/03-cancel.md | 18 +- .../stream-management/04-renounce.md | 8 +- .../stream-management/05-transfer.md | 16 +- .../stream-management/_category_.json | 0 .../previous-deployments}/_category_.json | 2 +- .../lockup/previous-deployments/v1.0.md} | 340 +++---- .../lockup/previous-deployments/v1.1.md} | 386 ++++---- docs/reference/01-overview.md | 81 ++ .../06-errors.md => reference/05-errors.md} | 18 +- docs/reference/flow/01-diagrams.md | 166 ++++ docs/reference/flow/03-access-control.md | 154 ++++ .../flow}/_category_.json | 2 +- .../flow}/contracts/_category_.json | 0 .../abstracts/abstract.Adminable.md | 6 +- .../contracts/abstracts/abstract.Batch.md | 25 + .../abstracts/abstract.NoDelegateCall.md | 46 + .../abstracts/abstract.SablierFlowBase.md | 486 ++++++++++ .../contracts/contract.FlowNFTDescriptor.md | 37 + .../flow/contracts/contract.SablierFlow.md | 845 ++++++++++++++++++ .../interfaces/interface.IAdminable.md | 54 ++ .../contracts/interfaces/interface.IBatch.md | 21 + .../interface.IFlowNFTDescriptor.md | 30 + .../interfaces/interface.ISablierFlow.md | 722 +++++++++++++++ .../interfaces/interface.ISablierFlowBase.md | 441 +++++++++ .../contracts/libraries/library.Errors.md | 231 +++++ .../contracts/libraries/library.Helpers.md | 52 ++ .../flow/contracts/types/library.Flow.md | 74 ++ .../flow/contracts/types/struct.Broker.md | 19 + docs/reference/legacy/_category_.json | 5 + .../legacy/contracts/_category_.json | 5 + .../legacy}/contracts/constant-functions.md | 4 +- .../contracts/non-constant-functions.md | 2 +- .../lockup/01-diagrams.md} | 59 +- docs/reference/lockup/04-access-control.md | 177 ++++ docs/reference/lockup/_category_.json | 5 + .../lockup}/core/_category_.json | 2 +- .../lockup}/core/abstracts/_category_.json | 0 .../core/abstracts/abstract.Adminable.md | 48 + .../core/abstracts/abstract.NoDelegateCall.md | 2 +- .../abstracts/abstract.SablierV2Lockup.md | 16 +- .../core/contract.SablierV2LockupDynamic.md | 11 +- .../core/contract.SablierV2LockupLinear.md | 11 +- .../core/contract.SablierV2LockupTranched.md | 11 +- .../core/contract.SablierV2NFTDescriptor.md | 7 +- .../lockup}/core/interfaces/_category_.json | 0 .../core/interfaces/interface.IAdminable.md | 2 +- .../interface.ISablierLockupRecipient.md | 2 +- .../interfaces/interface.ISablierV2Lockup.md | 24 +- .../interface.ISablierV2LockupDynamic.md | 4 +- .../interface.ISablierV2LockupLinear.md | 4 +- .../interface.ISablierV2LockupTranched.md | 4 +- .../interface.ISablierV2NFTDescriptor.md | 2 +- .../lockup}/core/libraries/_category_.json | 0 .../lockup}/core/libraries/library.Errors.md | 2 +- .../lockup}/core/libraries/library.Helpers.md | 10 +- .../lockup}/core/libraries/library.NFTSVG.md | 2 +- .../core/libraries/library.SVGElements.md | 2 +- .../lockup}/core/types/_category_.json | 0 .../lockup}/core/types/library.Lockup.md | 20 +- .../core/types/library.LockupDynamic.md | 4 +- .../core/types/library.LockupLinear.md | 5 +- .../core/types/library.LockupTranched.md | 4 +- .../lockup}/core/types/struct.Broker.md | 2 +- .../lockup}/periphery/_category_.json | 2 +- .../periphery/abstracts/_category_.json | 0 .../abstract.SablierV2MerkleLockup.md | 7 +- .../contract.SablierV2BatchLockup.md | 67 +- .../periphery/contract.SablierV2MerkleLL.md | 10 +- .../periphery/contract.SablierV2MerkleLT.md | 11 +- .../contract.SablierV2MerkleLockupFactory.md | 6 +- .../periphery/interfaces/_category_.json | 0 .../interface.ISablierV2BatchLockup.md | 62 +- .../interface.ISablierV2MerkleLL.md | 7 +- .../interface.ISablierV2MerkleLT.md | 8 +- .../interface.ISablierV2MerkleLockup.md | 6 +- ...interface.ISablierV2MerkleLockupFactory.md | 40 +- .../periphery/libraries/_category_.json | 0 .../periphery/libraries/library.Errors.md | 2 +- .../lockup}/periphery/types/_category_.json | 0 .../periphery/types/library.BatchLockup.md | 2 +- .../periphery/types/library.MerkleLT.md | 2 +- .../periphery/types/library.MerkleLockup.md | 2 +- docs/snippets/BatchCommonSteps.mdx | 2 +- docs/snippets/ConstantsComment.mdx | 2 +- docs/snippets/ParamAsset.mdx | 2 +- docs/snippets/ParamTotalAmount.mdx | 4 +- docs/support/01-faq.mdx | 63 +- docs/support/02-technical-guides.mdx | 25 + docs/support/{02-how-to.mdx => 03-how-to.mdx} | 68 +- docusaurus.config.ts | 174 +++- formatter.js | 14 +- package.json | 14 +- repos/flow | 1 + repos/lockup/v2-core | 1 + repos/lockup/v2-periphery | 1 + repos/v2-core | 1 - repos/v2-periphery | 1 - scripts/autogen-flow.sh | 81 ++ scripts/{autogen.sh => autogen-lockup.sh} | 22 +- sidebars.js | 3 +- src/components/LinkPreview.tsx | 4 +- src/components/organisms/Header.tsx | 22 +- src/components/organisms/Socials.tsx | 33 +- src/constants/links.ts | 2 +- src/css/custom.css | 4 + src/icons/GitHubIcon.tsx | 13 - src/icons/MediumIcon.tsx | 19 - static/banner/docs-banner-apis.png | Bin 0 -> 123147 bytes static/banner/docs-banner-apis.webp | Bin 0 -> 69182 bytes static/banner/docs-banner-app-menu.png | Bin 0 -> 126460 bytes static/banner/docs-banner-app-menu.webp | Bin 0 -> 70996 bytes .../banner/docs-banner-drops-airstreams.png | Bin 0 -> 132797 bytes .../banner/docs-banner-drops-airstreams.webp | Bin 0 -> 74324 bytes static/banner/docs-banner-drops-instant.png | Bin 0 -> 127989 bytes static/banner/docs-banner-drops-instant.webp | Bin 0 -> 71710 bytes static/banner/docs-banner-payments.png | Bin 0 -> 121976 bytes static/banner/docs-banner-payments.webp | Bin 0 -> 67772 bytes static/banner/docs-banner-vesting.png | Bin 0 -> 122112 bytes static/banner/docs-banner-vesting.webp | Bin 0 -> 67878 bytes static/img/flow-nft.svg | 3 + static/img/frame/farcaster.jpg | Bin 184027 -> 0 bytes static/img/frame/farcaster.webp | Bin 0 -> 210950 bytes .../{nft-gallery.webp => lockup-gallery.webp} | Bin static/img/{nft.svg => lockup-nft.svg} | 0 static/img/social/github.svg | 1 + static/screenshots/drops-form-1.webp | Bin 0 -> 148482 bytes static/screenshots/drops-search.webp | Bin 0 -> 278708 bytes static/screenshots/drops-settings.webp | Bin 0 -> 73930 bytes static/screenshots/general-chains.webp | Bin 0 -> 84082 bytes .../screenshots/payments-dashboard-split.webp | Bin 0 -> 170970 bytes static/screenshots/payments-profile.webp | Bin 0 -> 131524 bytes .../vesting-create-csv-uploaded.webp | Bin 0 -> 42376 bytes static/screenshots/vesting-create-csv.webp | Bin 0 -> 31568 bytes static/screenshots/vesting-create.webp | Bin 0 -> 42814 bytes static/screenshots/vesting-dashboard.webp | Bin 0 -> 38984 bytes static/screenshots/vesting-gallery.webp | Bin 0 -> 37272 bytes static/screenshots/vesting-profile.webp | Bin 0 -> 31056 bytes 280 files changed, 9342 insertions(+), 3316 deletions(-) create mode 100644 docs/api/05-development.mdx rename docs/api/{indexers/02-differences.mdx => 06-differences.mdx} (97%) create mode 100644 docs/api/07-legacy.mdx create mode 100644 docs/api/airdrops/01-overview.mdx create mode 100644 docs/api/airdrops/02-endpoints.mdx rename docs/{concepts/protocol => api/airdrops}/_category_.json (56%) create mode 100644 docs/api/airdrops/envio/01-similarities.mdx rename docs/api/{indexers/merkle => airdrops/envio}/02-queries.md (94%) create mode 100644 docs/api/airdrops/envio/_category_.json rename docs/api/{merkle-api/01-intro.mdx => airdrops/merkle-api/01-overview.mdx} (66%) rename docs/api/{ => airdrops}/merkle-api/02-functionality.mdx (81%) rename docs/api/{ => airdrops}/merkle-api/03-examples.mdx (75%) create mode 100644 docs/api/airdrops/merkle-api/_category_.json rename docs/api/{subgraphs/merkle => airdrops/the-graph}/01-entities.mdx (83%) rename docs/api/{subgraphs/merkle => airdrops/the-graph}/02-queries.md (93%) create mode 100644 docs/api/airdrops/the-graph/_category_.json create mode 100644 docs/api/flow/01-overview.mdx create mode 100644 docs/api/flow/02-endpoints.mdx rename docs/api/{subgraphs/merkle => flow}/_category_.json (57%) create mode 100644 docs/api/flow/envio/01-similarities.mdx create mode 100644 docs/api/flow/envio/02-architecture.mdx create mode 100644 docs/api/flow/envio/03-queries.mdx create mode 100644 docs/api/flow/envio/_category_.json create mode 100644 docs/api/flow/the-graph/01-entities.mdx create mode 100644 docs/api/flow/the-graph/02-structure.mdx create mode 100644 docs/api/flow/the-graph/03-architecture.mdx create mode 100644 docs/api/flow/the-graph/04-queries.md create mode 100644 docs/api/flow/the-graph/_category_.json delete mode 100644 docs/api/indexers/01-endpoints.mdx delete mode 100644 docs/api/indexers/05-development.mdx delete mode 100644 docs/api/indexers/06-testing.mdx delete mode 100644 docs/api/indexers/merkle/01-entities.mdx delete mode 100644 docs/api/indexers/merkle/_category_.json delete mode 100644 docs/api/indexers/protocol/01-entities.mdx delete mode 100644 docs/api/indexers/protocol/02-structure.mdx create mode 100644 docs/api/lockup/01-overview.mdx create mode 100644 docs/api/lockup/02-endpoints.mdx rename docs/api/{indexers => lockup}/_category_.json (57%) create mode 100644 docs/api/lockup/envio/01-similarities.mdx rename docs/api/{indexers/protocol/03-flow.mdx => lockup/envio/02-architecture.mdx} (83%) rename docs/api/{indexers/protocol/04-queries.md => lockup/envio/03-queries.mdx} (89%) create mode 100644 docs/api/lockup/envio/_category_.json rename docs/api/{subgraphs/protocol => lockup/the-graph}/01-entities.mdx (84%) rename docs/api/{subgraphs/protocol => lockup/the-graph}/02-structure.mdx (78%) rename docs/api/{subgraphs/protocol/03-flow.mdx => lockup/the-graph/03-architecture.mdx} (89%) rename docs/api/{subgraphs/protocol => lockup/the-graph}/04-queries.md (83%) create mode 100644 docs/api/lockup/the-graph/_category_.json delete mode 100644 docs/api/merkle-api/04-development.mdx delete mode 100644 docs/api/merkle-api/_category_.json delete mode 100644 docs/api/subgraphs/01-endpoints.mdx delete mode 100644 docs/api/subgraphs/04-development.mdx delete mode 100644 docs/api/subgraphs/_category_.json delete mode 100644 docs/apps/01-overview.mdx create mode 100644 docs/apps/04-legacy-v1.mdx create mode 100644 docs/apps/features/01-overview.mdx delete mode 100644 docs/apps/features/01-streams.mdx delete mode 100644 docs/apps/features/02-airstreams.mdx create mode 100644 docs/apps/features/02-vesting.mdx create mode 100644 docs/apps/features/03-payments.mdx create mode 100644 docs/apps/features/04-airdrops.mdx rename docs/apps/features/{03-general.mdx => 05-generic.mdx} (77%) rename docs/apps/guides/{03-csv-support.mdx => 01-csv-support.mdx} (84%) create mode 100644 docs/apps/guides/03-how-to.mdx delete mode 100644 docs/concepts/02-sablier-protocol.md rename docs/concepts/{protocol/01-streaming.md => 02-streaming.md} (75%) rename docs/concepts/{protocol/05-nft.mdx => 06-nft.mdx} (57%) rename docs/concepts/{protocol/11-transferability.md => 07-transferability.md} (84%) rename docs/concepts/{05-governance.md => 08-governance.md} (62%) create mode 100644 docs/concepts/09-fees.mdx create mode 100644 docs/concepts/10-security.md rename docs/concepts/{06-glossary.md => 11-glossary.md} (73%) create mode 100644 docs/concepts/flow/01-overview.md create mode 100644 docs/concepts/flow/02-statuses.md create mode 100644 docs/concepts/flow/_category_.json create mode 100644 docs/concepts/lockup/01-overview.md rename docs/concepts/{protocol/02-stream-types.mdx => lockup/02-stream-shapes.mdx} (87%) rename docs/concepts/{protocol => lockup}/03-segments.md (90%) rename docs/concepts/{protocol => lockup}/04-tranches.md (78%) rename docs/concepts/{protocol/06-airstreams.mdx => lockup/05-airstreams.mdx} (97%) rename docs/concepts/{protocol/07-statuses.md => lockup/06-statuses.md} (73%) create mode 100644 docs/concepts/lockup/07-hooks.md rename docs/concepts/{protocol/10-cancelability.md => lockup/08-cancelability.md} (99%) rename docs/{contracts/v2/guides => concepts/lockup}/_category_.json (66%) delete mode 100644 docs/concepts/protocol/08-fees.mdx delete mode 100644 docs/concepts/protocol/09-hooks.md delete mode 100644 docs/contracts/v1/_category_.json delete mode 100644 docs/contracts/v1/guides/codebase.mdx delete mode 100644 docs/contracts/v2/01-overview.md delete mode 100644 docs/contracts/v2/03-security.md delete mode 100644 docs/contracts/v2/deployments/_category_.json delete mode 100644 docs/contracts/v2/reference/01-overview.md delete mode 100644 docs/contracts/v2/reference/05-access-control.md rename docs/{contracts/v2/guides/10-custom-deployments.mdx => guides/03-custom-deployments.mdx} (59%) rename docs/{contracts/v2/guides/08-snapshot-voting.md => guides/04-snapshot-voting.md} (86%) rename docs/{contracts/v2/guides/07-frontend.md => guides/05-frontend.md} (71%) create mode 100644 docs/guides/flow/01-overview.md create mode 100644 docs/guides/flow/02-deployments.md create mode 100644 docs/guides/flow/04-gas-benchmarks.md rename docs/{api/subgraphs/protocol => guides/flow}/_category_.json (56%) create mode 100644 docs/guides/flow/examples/01-local-environment.md rename docs/{contracts/v1/guides => guides/flow/examples}/_category_.json (64%) rename docs/{contracts/v1/guides/getting-started.md => guides/legacy/01-overview.md} (57%) rename docs/{contracts/v1/01-deployments.md => guides/legacy/02-deployments.md} (86%) create mode 100644 docs/guides/legacy/03-codebase.mdx rename docs/{contracts/v1/guides/streams.md => guides/legacy/04-streams.md} (73%) rename docs/{contracts/v1/guides/gas-costs.md => guides/legacy/05-gas-costs.md} (76%) create mode 100644 docs/guides/legacy/_category_.json create mode 100644 docs/guides/lockup/01-overview.md rename docs/{contracts/v2 => guides/lockup}/02-deployments.md (81%) rename docs/{contracts/v2/05-gas-benchmarks.md => guides/lockup/04-gas-benchmarks.md} (96%) rename docs/{contracts/v2/guides/09-etherscan.md => guides/lockup/05-etherscan.md} (86%) rename docs/{contracts/v2 => guides/lockup}/_category_.json (61%) rename docs/{contracts/v2/guides => guides/lockup/examples}/01-local-environment.md (75%) rename docs/{contracts/v2/guides => guides/lockup/examples}/04-create-airstream.mdx (83%) rename docs/{contracts/v2/guides => guides/lockup/examples}/06-hooks.md (66%) create mode 100644 docs/guides/lockup/examples/08-pull-vesting-data.md create mode 100644 docs/guides/lockup/examples/_category_.json rename docs/{contracts/v2/guides => guides/lockup/examples}/batch-create-streams/01-batch-lockup-linear.mdx (86%) rename docs/{contracts/v2/guides => guides/lockup/examples}/batch-create-streams/02-batch-lockup-dynamic.mdx (87%) rename docs/{contracts/v2/guides => guides/lockup/examples}/batch-create-streams/03-batch-lockup-tranched.mdx (87%) rename docs/{contracts/v2/guides => guides/lockup/examples}/batch-create-streams/_category_.json (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/create-stream/01-lockup-linear.mdx (82%) rename docs/{contracts/v2/guides => guides/lockup/examples}/create-stream/02-lockup-dynamic.mdx (84%) rename docs/{contracts/v2/guides => guides/lockup/examples}/create-stream/03-lockup-tranched.mdx (83%) rename docs/{contracts/v2/guides => guides/lockup/examples}/create-stream/_category_.json (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/01-setup.md (95%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/02-full-code.md (65%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/03-hooks.md (82%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/04-stake.md (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/05-rewards.md (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/06-claim.md (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/07-unstake.md (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/staking/_category_.json (100%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/01-setup.md (79%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/02-withdraw.md (51%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/03-cancel.md (55%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/04-renounce.md (68%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/05-transfer.md (65%) rename docs/{contracts/v2/guides => guides/lockup/examples}/stream-management/_category_.json (100%) rename docs/{contracts/v2/reference => guides/lockup/previous-deployments}/_category_.json (53%) rename docs/{contracts/v2/deployments/v2.0.md => guides/lockup/previous-deployments/v1.0.md} (80%) rename docs/{contracts/v2/deployments/v2.1.md => guides/lockup/previous-deployments/v1.1.md} (81%) create mode 100644 docs/reference/01-overview.md rename docs/{contracts/v2/reference/06-errors.md => reference/05-errors.md} (66%) create mode 100644 docs/reference/flow/01-diagrams.md create mode 100644 docs/reference/flow/03-access-control.md rename docs/{api/indexers/protocol => reference/flow}/_category_.json (52%) rename docs/{contracts/v1 => reference/flow}/contracts/_category_.json (100%) rename docs/{contracts/v2/reference/core => reference/flow/contracts}/abstracts/abstract.Adminable.md (72%) create mode 100644 docs/reference/flow/contracts/abstracts/abstract.Batch.md create mode 100644 docs/reference/flow/contracts/abstracts/abstract.NoDelegateCall.md create mode 100644 docs/reference/flow/contracts/abstracts/abstract.SablierFlowBase.md create mode 100644 docs/reference/flow/contracts/contract.FlowNFTDescriptor.md create mode 100644 docs/reference/flow/contracts/contract.SablierFlow.md create mode 100644 docs/reference/flow/contracts/interfaces/interface.IAdminable.md create mode 100644 docs/reference/flow/contracts/interfaces/interface.IBatch.md create mode 100644 docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md create mode 100644 docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md create mode 100644 docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md create mode 100644 docs/reference/flow/contracts/libraries/library.Errors.md create mode 100644 docs/reference/flow/contracts/libraries/library.Helpers.md create mode 100644 docs/reference/flow/contracts/types/library.Flow.md create mode 100644 docs/reference/flow/contracts/types/struct.Broker.md create mode 100644 docs/reference/legacy/_category_.json create mode 100644 docs/reference/legacy/contracts/_category_.json rename docs/{contracts/v1 => reference/legacy}/contracts/constant-functions.md (98%) rename docs/{contracts/v1 => reference/legacy}/contracts/non-constant-functions.md (99%) rename docs/{contracts/v2/reference/02-diagrams.md => reference/lockup/01-diagrams.md} (63%) create mode 100644 docs/reference/lockup/04-access-control.md create mode 100644 docs/reference/lockup/_category_.json rename docs/{contracts/v2/reference => reference/lockup}/core/_category_.json (73%) rename docs/{contracts/v2/reference => reference/lockup}/core/abstracts/_category_.json (100%) create mode 100644 docs/reference/lockup/core/abstracts/abstract.Adminable.md rename docs/{contracts/v2/reference => reference/lockup}/core/abstracts/abstract.NoDelegateCall.md (88%) rename docs/{contracts/v2/reference => reference/lockup}/core/abstracts/abstract.SablierV2Lockup.md (96%) rename docs/{contracts/v2/reference => reference/lockup}/core/contract.SablierV2LockupDynamic.md (93%) rename docs/{contracts/v2/reference => reference/lockup}/core/contract.SablierV2LockupLinear.md (92%) rename docs/{contracts/v2/reference => reference/lockup}/core/contract.SablierV2LockupTranched.md (92%) rename docs/{contracts/v2/reference => reference/lockup}/core/contract.SablierV2NFTDescriptor.md (94%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.IAdminable.md (91%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierLockupRecipient.md (96%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierV2Lockup.md (95%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierV2LockupDynamic.md (97%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierV2LockupLinear.md (96%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierV2LockupTranched.md (97%) rename docs/{contracts/v2/reference => reference/lockup}/core/interfaces/interface.ISablierV2NFTDescriptor.md (89%) rename docs/{contracts/v2/reference => reference/lockup}/core/libraries/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/core/libraries/library.Errors.md (98%) rename docs/{contracts/v2/reference => reference/lockup}/core/libraries/library.Helpers.md (83%) rename docs/{contracts/v2/reference => reference/lockup}/core/libraries/library.NFTSVG.md (92%) rename docs/{contracts/v2/reference => reference/lockup}/core/libraries/library.SVGElements.md (98%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/library.Lockup.md (83%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/library.LockupDynamic.md (97%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/library.LockupLinear.md (96%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/library.LockupTranched.md (97%) rename docs/{contracts/v2/reference => reference/lockup}/core/types/struct.Broker.md (85%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/_category_.json (75%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/abstracts/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/abstracts/abstract.SablierV2MerkleLockup.md (90%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/contract.SablierV2BatchLockup.md (80%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/contract.SablierV2MerkleLL.md (77%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/contract.SablierV2MerkleLT.md (82%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/contract.SablierV2MerkleLockupFactory.md (82%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/interface.ISablierV2BatchLockup.md (81%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/interface.ISablierV2MerkleLL.md (81%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/interface.ISablierV2MerkleLT.md (83%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/interface.ISablierV2MerkleLockup.md (92%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md (73%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/libraries/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/libraries/library.Errors.md (92%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/types/_category_.json (100%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/types/library.BatchLockup.md (95%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/types/library.MerkleLT.md (88%) rename docs/{contracts/v2/reference => reference/lockup}/periphery/types/library.MerkleLockup.md (91%) create mode 100644 docs/support/02-technical-guides.mdx rename docs/support/{02-how-to.mdx => 03-how-to.mdx} (73%) create mode 160000 repos/flow create mode 160000 repos/lockup/v2-core create mode 160000 repos/lockup/v2-periphery delete mode 160000 repos/v2-core delete mode 160000 repos/v2-periphery create mode 100755 scripts/autogen-flow.sh rename scripts/{autogen.sh => autogen-lockup.sh} (92%) delete mode 100644 src/icons/GitHubIcon.tsx delete mode 100644 src/icons/MediumIcon.tsx create mode 100644 static/banner/docs-banner-apis.png create mode 100644 static/banner/docs-banner-apis.webp create mode 100644 static/banner/docs-banner-app-menu.png create mode 100644 static/banner/docs-banner-app-menu.webp create mode 100644 static/banner/docs-banner-drops-airstreams.png create mode 100644 static/banner/docs-banner-drops-airstreams.webp create mode 100644 static/banner/docs-banner-drops-instant.png create mode 100644 static/banner/docs-banner-drops-instant.webp create mode 100644 static/banner/docs-banner-payments.png create mode 100644 static/banner/docs-banner-payments.webp create mode 100644 static/banner/docs-banner-vesting.png create mode 100644 static/banner/docs-banner-vesting.webp create mode 100644 static/img/flow-nft.svg delete mode 100644 static/img/frame/farcaster.jpg create mode 100644 static/img/frame/farcaster.webp rename static/img/{nft-gallery.webp => lockup-gallery.webp} (100%) rename static/img/{nft.svg => lockup-nft.svg} (100%) create mode 100644 static/img/social/github.svg create mode 100644 static/screenshots/drops-form-1.webp create mode 100644 static/screenshots/drops-search.webp create mode 100644 static/screenshots/drops-settings.webp create mode 100644 static/screenshots/general-chains.webp create mode 100644 static/screenshots/payments-dashboard-split.webp create mode 100644 static/screenshots/payments-profile.webp create mode 100644 static/screenshots/vesting-create-csv-uploaded.webp create mode 100644 static/screenshots/vesting-create-csv.webp create mode 100644 static/screenshots/vesting-create.webp create mode 100644 static/screenshots/vesting-dashboard.webp create mode 100644 static/screenshots/vesting-gallery.webp create mode 100644 static/screenshots/vesting-profile.webp diff --git a/.gitmodules b/.gitmodules index 40752594..9cacdcab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,8 +1,12 @@ -[submodule "repos/v2-core"] +[submodule "repos/lockup/v2-core"] branch = "release" - path = "repos/v2-core" + path = "repos/lockup/v2-core" url = "https://github.com/sablier-labs/v2-core" -[submodule "repos/v2-periphery"] +[submodule "repos/lockup/v2-periphery"] branch = "release" - path = "repos/v2-periphery" + path = "repos/lockup/v2-periphery" url = "https://github.com/sablier-labs/v2-periphery" +[submodule "repos/flow"] + branch = "release" + path = "repos/flow" + url = "https://github.com/sablier-labs/flow" diff --git a/bun.lockb b/bun.lockb index 15139a66a615d7e9c09ad0bfa89ffde9691f9eb4..f7791cb53df34cd4a650096ebc8115ba2750f42b 100755 GIT binary patch delta 5079 zcmYM133!cX7RSGAH}^(Rq0F=sOHo=us6FSk!oi;t*uvWL2B1tRBI;_ zF+^}}L1I?~FH>#u6=%Rg&Z6 z-jh1Dm{URE+IV-ByG-eIU|nGah|9(5qC12;jtyTSRuA1tED2`I5`%YvnI$W)J~}R+ zd7YI?Yyd2qMqVdceE!>qtYc$C;$P1qRrnpm1x6WAlG7+WXS6n)i`hn)3!%LkzV-MeIHFyJB0#TELonfyEH% zf-TXlmAFl;6>KXPd6l>wX2rC|hp-un6El?82A!s&GsWJAt%H>y?i6c_PEnqBmtY*Q zwBT;BcCd0{dtkP$+v8DU2bI?WmhN_(*NKNJ|J4a0##^@tRm4 z^fIyQny@cy1gsSCrtIetn2+!& zEOuGqLk%8;o+kE4d4pjSY*S#lVnfiM>9u59V_B)7=6h36knj;=MnoSEXPh_VPgM6Ul1#x`96bP6f5Xr{Z0QHKaQwO zETqAoqgSe!!eU>*0=cj?)mJp(Fm$Mji4YqO3l}RUHUf5GbCet28#Yjg*z3abROr!WQIL7rJ<6{`ueVrJv@R7`D+{RUP8*500f9l>wW z&(t#Oiuqu+opYma|E-c_)%62FH9 z^IBRfZmJ1?K+oaA)^=mX7NEz&tnD__*oEk571$hRQ!m1+!>kpz)Y!$g|6-KbN^l7Y z^~GAlsKHr^$BMO6-ZGf2r?u?%V$0FbXlB;3JBY17zZB~Tvtp9)Y*R2vXQHC``u^O zOX+LS31YpKmkP6Qhylbt%3F&bE!I~o4Q8beB=!?qCpO3)a(}_~z|B-Jm^c7t#caS! zsylzAJU=X1Y>@Ic!m?rU#39Ptgg!17FSZ%h3T7StW0=QYvMn665&S}lTVZplz`Fi0 zm=%+bXRs%&n~zZ5Hgqz~y7@@4?dTM-Q7~Jh9r!Ak**N88pcmUFx3)iCFcY1^)jlUq zfZ3b76R)L?JxO`HV0B>D^(Tw%M#m^G5oSg2!OMx+_oi*Jy?6x7z6rcDl(>(BM4BWI zByYVeaX)^z02LE`uZn6;u*v7gXmG+~-1{2A7cVipqDiJe5p!RmU*sthXFnd9+i#PxN0svgs+TRQa{r~t5zQ*#} zZhZi=ieKV$V74p;e28$Jj?PA?*O+&<9ft}RixWtOUrl9Si zhKfbNu5l47z%5o3y_@-LUQZqi=K;Qx{|HLQ`5MN#-mt~-ht_b_E$(mD(seH+EG{np z{JqKlKi?zHwWyw_w0&J*(SA>&Yj|Kl&4h7NT>f!WLbne0jCSYO*x28~?G6q03=Pje z9_#NM?rz=9H>Rh%j4y7m+mnzr(CyC}=sBL|*%8SrjqUTLM21Cqp6D>bmlGLw^bd!a BP?i7y delta 5091 zcmXZf34D!L8prWB+f8l+B~>#uc4`Y^soIBzR*8zL>D0b2wY43c)_M)2LBtmAjW)K} zLQwm)#1h0-jD(h0Y8QL8V&CTXB>(gAIM4fipYz^x?|I*IZ<4oHUbnsSj2dOb>rb4T z_2Ki;NdpR>-M6D>{Z}s=xflNwU*YEqahYE{{c>Zuwe1crOE|SWazd+=*j6cizE&yz zV?vruyAwG*I&xKu!%_YIHmd5iK^qQjj!$1w`Nq@a6`vewox3n8=Ide6`+KG5cF8_m z+%@-Zx2)9#=akKQ@y^`dGm>Tw%k~AW^`ErB&)+w#eZa}F^!<(n1V{P##|{k-B!YZH z!(CHC{m%NHlyrp$czU>;yf!V!as0?C62JQA+jPv*w}=t4nX*dQ{roZ~L1Qa(yk0h2 zR)yp8vhQS7IZi0#I2?MM?}gRC#C&wTvIuOBEKyb+d%;X?-g9I%$eY^iX+OwnlE*UE z+K;kG@=3C!JPUT5THs`Fk#er^CR227p6csxDo!?ERu}7ph0-sOy-ohW+mlOp9u*{~ zCF|5Xcq-XkiKTidF-_sK6&SCoF6tQC0+n<*_#_5pcIk8r!NHTWL( zI{gk=8}ew??UY4hX}m}=`dye!rY$jq8{`f8-KzVLe7z>UN7fG8fEB0r>=njvuu_E? zvi4XR**@7vSOwXB%x>!rM1<^!>ORJ{hd53N`lFalup@C0vvw@M&g1-pgABd9Obz}7 zJ1onR{SzxBJ1+Ya^YM;L(x1TWbSGj9X6+u>Ee$Umnmu~UWT zRoD&7(2HEa?1J5i{i?ep>wz7RUD4Q{*df_f)%C*G=#AufRM;C_sKV>AKG-6x6#WfZ zU-Bigo0v_eA2A9mO@CW;{mHvw*6zp#kQcN8w7W9TKn_N5VC{E$o7iVW2L_j={}Zz@ zgNS$*yF7ia1`j5mE_(nU&MUveW9}9*hM=@DYqAlTKQC;XY7xv%k0gRMnQ+-CEKF8RHrn3*8TL!tc8lwRW600T z{vsQT&0#XO75`OcW9`1N_NHtc`DE>SB`}-Je=KArW#h5&n8)_w(i%L0+@r!Wvj1Wu zWo2a(F`w469A@{-x5Q>yMb*V(jWqTx*(5Agb(LJKzkTYHi4?FIePtC+AurCR5=CD{ z7DpbA+1gi?O(idawWO~mizn}3v!X>{_9;vwc2Q@ohU%u<{g=Q&G+0wOgM2o*wMf}a z@>*QbcF9_@S>&l)(00k%vIO#XG212UU^a)@M3k%^W|R4jXlRqMHLS0}-;>t`Z98os z^O8T+mf292h&_}wlFh-6$QsLjz@7#2AFYY(NAg@*Q_N$tNg{3uo2hUv)>+mZv$}ai zAdjVO#Zju8PoBsN+qT<6wt##hX4`H{ja^6{sR_Q1*`<^1{nrLL+shEoiL=W+T@S_FK?e zFV(FjkCpXS-8#&^H3ri6Ro!~>ak7504VX>+Gy9PH3pWY}(+`ksBHzjkhR_ehY%)Hg zlL8{wKzCt!wbz89GnC<36RkxM=glt%zag%QY+km#ie-7HcpGLHmjnLrj*c@hH zyZ%VbCbNS`XPdCye6;FzlCQvQHy-n_UEjW|?DQUD zC9n1keJo~A?p~svcI+vt%fRYmw(G~q_K`PI-Bipby`QKc^GpNn7CS%`1?{U~mI@D& z$Az(e^tSC--67&A`{6|TM2vsV&qOKRcJnm$FxH8g+J3h{c7!~gk9Qh>ojs)uj6>W*UznT%~Qsj?H~ z%K}(`YpXQ)7xEPQd}*sy_$zrkd+W3{vXkW9Fx!gO$xe}v*VqlZUN+XA$tO%$!B3~Cm!dx2HyaC^7Pr0c>?2~bCXEso!L`(T6MR`H*>%2qCX?M zO}>V@J@jW~cgWYt&dKg#O}XE#{f7D5_ucOtR08+YUr^ya@(2}P%qw)9Kd|bu%c}bm zD}f!LzaqO&p3TEz?W!!7{5WP0(lyxw@)I$_9N|N-zwW2&vPal%Zg_i=Zpa>!*Td`q zxhZ=>e$~6S7OR@WU1jaIPCX;flHHL##}@HYcKhGO><)TCMC!J`r@EI|N6a3HKUDXM z{5s2Pck6vDZ^kT2BF3HB%Xz55eqbDEx8@_6KlYsEzlc4S1z?Y{OV|@xAZ9<~FJn(- zLD)U)ig!tES9y=!2sxa7q0=E8+hc9*rOb_O;LX`h@=6wpHDlfGS|QWp&?&%wk(jN$ zpDYZkCG(dR#4hHqug3`x76Pw;w)lav!q^x-8C%mJ*=yKd*3H(`B`bnuYjJ{QMX`8t zn^}k~ocubkVH0rYS!w<-=OBX%+J!?^7*aR?BdF`mtmCTWdtS#?_YJ>3zUr-A_k%)v z#OU*h^Hz;t(ou16xT?9zdEtQ<6XYt@xf^$-7`Y+Cl}*u5E2p` z=pGlAf1Kd^AS@)htM_&P&@$dNgG1c0I|hdMb_{g?vfh2HB#$!flsBnlXoNdNU*6@s JnI%Ir{}0jBRnPzc diff --git a/docs/api/01-overview.mdx b/docs/api/01-overview.mdx index accd87ca..17238efb 100644 --- a/docs/api/01-overview.mdx +++ b/docs/api/01-overview.mdx @@ -8,81 +8,144 @@ import LinkPreview from "@site/src/components/LinkPreview"; # The Sablier APIs -Sablier relies on specific dependencies to source data or manage off-chain flows. All of these are either public or -fully open-source, so feel free to roam around and suggest improvements or optimizations where needed. +Sablier relies on specific dependencies to source data and enable off-chain features. All of these are either public or +open-source, so feel free to roam around and suggest improvements or optimizations.open-source, so feel free to roam +around and suggest improvements or optimizations. -## Subgraphs and Indexers (GraphQL) +Below, we will cover: -As an alternative to reading data from the contracts or listening to onchain events, we use a set of subgraphs and -indexers. These act as a middleware between the chain and our interfaces and allow for caching, formatting and querying -data. +1. The [solutions](#solutions) we use to index and query data +2. The [interface-to-protocol](#products) links between these solutions +3. The raw entities emitted by the contracts -### The Graph's Subgraphs +## Solutions -[The Graph](https://thegraph.com/) has been the vendor of choice for the EVM space for the past few years. We've been -integrating The Graph since 2019 with Sablier V1. For Sablier V2, we designed a special set of feature-oriented -subgraphs used not only by us (in the official apps) but by 3rd party services (e.g. snapshot) and integrators alike. +![Banner Sablier APIs](/banner/docs-banner-apis.webp) + +As an alternative to reading data from the contracts or listening to onchain events, we use a collection of subgraphs +and indexers. These service act as a middleware between the chain and our interfaces and allow for caching, formatting +and querying data. For more advanced features like Merkle tree generation (used in Airdrops), we've written own SDKs and +open-sourced some of them. + +:::note Playground + +To preview the GraphQL APIs for subgraphs and indexers, you can plug them into +[Hasura's](https://cloud.hasura.io/public/graphiql) online explorer. +[Here](https://cloud.hasura.io/public/graphiql?endpoint=https://api.studio.thegraph.com/query/57079/sablier-v2/version/latest)'s +an example setup of a Mainnet subgraph for Sablier Lockup. + +::: + +## Subgraphs + +### The Graph + +[The Graph](https://thegraph.com/) has been the vendor of choice in the EVM space for the past few years. We've been +using The Graph since we launched Sablier Legacy in 2019. For our current apps, we created a special set of +feature-oriented subgraphs used internally and by third-party services (e.g., Snapshot) and integrators. These subgraphs are hosted on The Graph Network, as well as on the The Graph Hosted Service. They can be used to query -Sablier data from the official [endpoints](/api/subgraphs/endpoints). Every network has its own subgraph endpoints. +Sablier data from the official [endpoints](/api/lockup/endpoints). EAch network has its own subgraph endpoints. -Read more on the dedicated pages about our `protocol` and `merkle` [subgraphs](/api/subgraphs/endpoints) or check out -the [official vendor docs](https://thegraph.com/docs/en/quick-start/). +- [Lockup endpoints](/api/lockup/endpoints) +- [Lockup subgraph](https://github.com/sablier-labs/subgraphs/apps/lockup) (Vesting) +- [Flow endpoints](/api/flow/endpoints) +- [Flow subgraph](https://github.com/sablier-labs/subgraphs/apps/flow) (Payments) +- [Airdrops endpoints](/api/airdrops/endpoints) +- [Airdrops subgraph](https://github.com/sablier-labs/subgraphs/apps/merkle) (Airdrops, Airstreams) +- [The Graph docs](https://thegraph.com/docs/en/quick-start/) -### Envio's Indexers +#### Endpoints / Slugs + +Every subgraph deployment will have a `slug` generated by The Graph. The slug is derived from the subgraph name and can +be found in the Studio Development Query URL. We use the following naming convention for subgraphs: + +| Subgraph | Example | Product or Concept | +| ------------------- | ----------------------------------- | ---------------------------------------------------- | +| `sablier-v2-*` | `sablier-v2`, `sablier-v2-optimism` | [Lockup](/concepts/lockup/overview) (Vesting) | +| `sablier-v2-flow-*` | `sablier-v2-flow-arbitrum` | [Flow](/concepts/flow/overview) (Payments) | +| `sablier-v2-ms-*` | `sablier-v2-ms-base` | [Airstreams](/concepts/lockup/airstreams) (Airdrops) | +| `sablier-*` | `sablier-optimism` | [V1](/api/legacy) (Legacy) | + +There is a `v2` in the subgraph name due to historical reasons. Sablier used to be versioned as `v1` and `v2`, and the +subgraphs were named accordingly. However, we have since dropped this versioning scheme. + +### Envio [Envio](https://envio.dev/) offers a suite of fast and flexible tools to access onchain data. Their HyperIndex service -provides for a similar GraphQL driven API to access cached data and serve it into our client interfaces. +provides a similar GraphQL-driven API to access cached data and serve it into our client interfaces. -We designed a set of indexers that mimic the features and entities exposed by subgraphs and take advantage of the speed -and optimized environment configured through HyperIndex. Read more on the dedicated page about our `protocol-envio` and -`merkle-envio` [indexers](/api/indexers/endpoints). +We created indexers that mimic the features and entities exposed by subgraphs and take advantage of the speed and +optimized environment configured through HyperIndex. All networks share the same indexer endpoint (for one indexer type), as Envio promotes a cross-chain indexing architecture. -:::tip - -Before diving into integrating Envio's indexer as a data source for your application, please read the -[main differences](/api/indexers/differences) between subgraphs and indexers (generally as well as applied to the -Sablier deployments). - -::: +- [Caveats](/api/caveats) between subgraphs and indexers +- [Lockup endpoints](/api/lockup/endpoints) +- [Lockup indexer](https://github.com/sablier-labs/subgraphs/apps/lockup-envio) (Vesting) +- [Flow endpoints](/api/lockup/endpoints) +- [Flow indexer](https://github.com/sablier-labs/subgraphs/apps/flow-envio) (Payments) +- [Airdrops endpoints](/api/airdrops/endpoints) +- [Airdrops indexer](https://github.com/sablier-labs/subgraphs/apps/merkle-envio) (Airdrops, Airstreams) +- [The Graph docs](https://thegraph.com/docs/en/quick-start/) -## Merkle API (Rust) +## Sablier SDKs + +### Merkle API + +To support the Merkle distribution (see [Airdrops](/apps/features/airdrops)) system, we developed a backend service +called `@sablier/merkle-api`. This API deals with the validation, creation, and management of Merkle trees, which are +used to define eligibility and claiming rules for Sablier's Airstream campaigns. -To support our Merkle distribution (a.k.a. [Airstreams](/apps/features/airstreams)) system we developed a backend -service called `@sablier/v2-merkle-api`. This backend deals with the validation, creation and management of Merkle -trees, used to define eligibility and claiming rules for Sablier's Airstream campaigns. +The service is open-source and can be used by integrators as a plug-n-play solution to support (and even deploy) similar +campaigns. Read more on the dedicated page about the `merkle-api` service [here](/api/airdrops/merkle-api/overview). -This service is open-source and can be used by integrators as a plug-n-play solution to support (and even deploy) -similar campaigns from their own dashboards. Read more on the dedicated page about the `merkle-api` -[backend](/api/merkle-api/intro). +- [Endpoints](/api/airdrops/endpoints) -## Explorer +## Products -To preview the GraphQL APIs for subgraphs and indexers you can plug them into -[Hasura's](https://cloud.hasura.io/public/graphiql) online explorer. -[Here](https://cloud.hasura.io/public/graphiql?endpoint=https://api.studio.thegraph.com/query/57079/sablier-v2/version/latest)'s -an example setup for the `sablier-v2` mainnet subgraph inside Hasura's explorer. +### Lockup + +The [vesting](/apps/features/vesting) side of the application is powered by: + +- The `@sablier/subgraphs/apps/lockup` subgraph +- The `@sablier/subgraphs/apps/lockup-envio` indexer + +### Airdrops (Airstreams) + +The [airdrops](/apps/features/airdrops) side of the application is powered by: + +- The `@sablier/subgraphs/apps/merkle` subgraph +- The `@sablier/subgraphs/apps/merkle-envio` indexer +- The `@sablier/merkle-api` rust service for airdrops + +These will work for both Airstreams and Instant Airdrops 🔜. + +### Flow + +The [payments](/apps/features/payments) side of the application is powered by: + +- The `@sablier/subgraphs/apps/flow` subgraph +- The `@sablier/subgraphs/apps/flow-envio` indexer diff --git a/docs/api/05-development.mdx b/docs/api/05-development.mdx new file mode 100644 index 00000000..8a6f172e --- /dev/null +++ b/docs/api/05-development.mdx @@ -0,0 +1,226 @@ +--- +id: "development" +sidebar_position: 5 +title: "Development" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +## The Graph + +### Integrate + +To integrate the Sablier subgraphs or indexers into your project, start from the official `@sablier/subgraphs` +repository. We recommend using: + +- [GraphQL Code Generator](https://the-guild.dev/graphql/codegen/docs/getting-started) to create types from your GraphQL + fragments and queries. +- [TanStack Query](https://tanstack.com/query) to fetch results from the exposed endpoints. + + + +### Contribute + +To contribute to the V2 subgraphs or deploy your own, head over to the GitHub +[`subgraphs`](https://github.com/sablier-labs/subgraphs) repository. Get started by reviewing the `apps/lockup` +directory. + +To bootstrap a subgraph project, run the following commands. They will install the requisite dependencies and generate +the code for a Sepolia deployment. + +```bash +cd ./apps/lockup +yarn install +yarn setup:sepolia +``` + +To deploy a new subgraph on Sepolia: + +1. Create a new item using The Graph's hosted network +2. Add its name/endpoint under the `deploy:sepolia` script in `package.json` +3. Add your own Sablier contract addresses in `../constants/chains/sepolia.ts` +4. Make sure you're [authenticated][the-graph-auth] on your local machine +5. Run `yarn deploy:sepolia` + +You can read more about how the The Graph works in their [official docs][the-graph-docs]. + +To publish on the hosted service: + +1. [Authenticate](https://thegraph.com/docs/en/deploying/hosted-service/) with the hosted service credentials + + ```sh + graph auth --product hosted-service + ``` + +2. Generate configuration + + Run `yarn deploy:` to generate imports, configurations and deploy in the same script. + +[the-graph-auth]: https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#store-the-access-token +[the-graph-docs]: https://thegraph.com/docs/en/ + +## Envio + +### Integrate + +To integrate the Sablier indexers into your own product, start from the official `@sablier/subgraphs` repository. We +recommend using: + +- [GraphQL Code Generator](https://the-guild.dev/graphql/codegen/docs/getting-started) to create types from your GraphQL + fragments and queries +- [TanStack Query](https://tanstack.com/query) to fetch results from the exposed endpoints. + +If you're integrated the Sablier subgraphs, we recommend using request and response wrappers/middleware to format +results coming from Envio's indexer in the same shape as those from The Graph. Suggestions: + +1. Write queries in both systems (based on the [querying language specifics](/api/caveats#querying-language)) using the + same `operationName` and swap query strings between vendors based on it +2. Write response middleware that converts results into similar shapes (see these [important notes](/api/caveats)) + + + +### Test + +To ensure Envio indexers deliver the same data as The Graph's subgraphs, we've written differential tests for our +indexer configurations. + +Check them out inside the `apps/[...]/test/` folders. + + + +#### Run + +The differentials tests are powered by Jest. Inside `test/setup/constants.ts`, you will find the full configuration for +these tests. This is where you'll also be able to toggle between using the local endpoint (see +[development](/api/development) to bootstrap a project locally) and the hosted-service one, using the `REMOTE` flag. + +```bash +pnpm run test +``` + +:::info + +As the set of streams or campaigns grows, the final tests (full coverage over the entire list of elements) may time out. +We suggest either splitting them in chunks or setting a manual limit to the number of iterations the loop can cover at +once. Alternatively, you could also try increasing the timeout of the tests. + +::: + +### Contribute + +To contribute to the V2 indexers (Envio x Sablier) or deploy your own, head over to the GitHub +[`subgraphs`](https://github.com/sablier-labs/subgraphs) repository. Get started by reviewing the `apps/lockup-envio` +directory. + +To bootstrap an indexer project, run the following commands. They will install the requisite dependencies and generate +the code for a multi-chain deployment. + +```bash +cd ./apps/lockup-envio +pnpm install +pnpm run setup + +# OR + +pnpm dev +``` + +A local Hasura process will be started at `http://localhost:8080` ,which will also include a `GraphQL` endpoint to query +locally. To deploy without hosting yourself, have a look at the Envio +[Hosted Service](https://docs.envio.dev/docs/hosted-service) docs. + +:::info + +Prior to starting the `Envio` process (`pnpm dev`) please make sure your Docker app is running. For installation see the +official docs at https://docs.envio.dev/. + +::: + +## Sablier SDK: Merkle API + +### Integrate + +To integrate the Sablier Merkle API into your own product, start from the official `@sablier/merkle-api` repository. We +recommend using: + + + +### Contribute + +To contribute to the V2 Merkle API or deploy your own, head over to the GitHub +[`merkle-api`](https://github.com/sablier-labs/merkle-api) repository. Get started by reviewing the `controllers` +directory. + +### Run an instance + +#### Locally + +In order to make the API work properly, you will need to create a `.env` file by following the `.env.example` file: + +```text +PINATA_ACCESS_TOKEN= +PINATA_API_KEY= +PINATA_API_SERVER= +PINATA_SECRET_API_KEY= +IPFS_GATEWAY= +``` + +After a campaign is created via the API, we use Pinata to upload and pin the file to IPFS. In order to obtain the +`PINATA_API_KEY`, `PINATA_SECRET_API_KEY` and `PINATA_ACCESS_TOKEN`, follow these steps: + +1. Sign up or log in on https://app.pinata.cloud/ +1. Select the API Keys tab +1. Select New Key +1. The key should have the permissions `pinFileToIPFS` and `pinJSONToIPFS` +1. Set a name for the key +1. Click Create Key +1. From the popup, take the API Key and the API Secret and put them in the `.env` file. The `IPFS_GATEWAY` variable can + be any IPFS gateway but we recommend using a private one (Pinata offers this as well). For more details about the + interactions with IPFS, check + [`src/services/ipfs.rs`](https://github.com/sablier-labs/merkle-api/blob/main/src/services/ipfs.rs). +1. Select the "Access Controls" tab +1. Click on the "Request Token" button +1. Copy the token and put in th `.env` file in the `PINATA_ACCESS_TOKEN` variable + +Simulate the cloud environment by finally running: + +```sh +cargo run --bin sablier_merkle_api +``` + +This command will run a standard web API and expose it on port 3000 on localhost. + +### Vercel + +We use Vercel for hosting, and this is why we have separate binaries for each endpoint. For local development, use this +command: + +```sh +vercel dev +``` + +This command will run a standard web API and expose it on port 3000 on localhost. + +If you wish to deploy your backend to vercel, check the official +[Github Actions](https://github.com/sablier-labs/merkle-api/blob/main/.github/workflows/deploy-merkle-api.yml) workflow +for deploying. Rust is supported through Vercel's [`rust runtime`](https://github.com/vercel-community/rust). diff --git a/docs/api/indexers/02-differences.mdx b/docs/api/06-differences.mdx similarity index 97% rename from docs/api/indexers/02-differences.mdx rename to docs/api/06-differences.mdx index 063c9ac7..5ed30319 100644 --- a/docs/api/indexers/02-differences.mdx +++ b/docs/api/06-differences.mdx @@ -1,10 +1,12 @@ --- -id: "differences" -sidebar_position: 1 -title: "Differences" +id: "caveats" +sidebar_position: 6 +title: "Caveats" --- -# Differences (The Graph vs. Envio) +# Caveats + +# The Graph vs. Envio :::warning @@ -120,7 +122,7 @@ they're unique across the board. At the same time, there are some minor features differences listed below. - For Envio indexers, entities will have fully specified identifiers (meaning chainId included) - 1. `protocol-envio`: the `Action`, `Asset`, `Batch`, `Batcher`, `Contract` have a `-chainId` appended to the ID + 1. `lockup-envio`: the `Action`, `Asset`, `Batch`, `Batcher`, `Contract` have a `-chainId` appended to the ID 2. `merkle-envio`: the `Action`, `Asset` and `Factory` have a `-chainId` appended to the ID While we've tried to refactor our The Graph entities to share similar identifiers, please double check in cases when you diff --git a/docs/api/07-legacy.mdx b/docs/api/07-legacy.mdx new file mode 100644 index 00000000..7bad22b8 --- /dev/null +++ b/docs/api/07-legacy.mdx @@ -0,0 +1,69 @@ +--- +id: "legacy" +sidebar_position: 7 +title: "Legacy" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Sablier Legacy + +For the [first version](/apps/v1) of Sablier ([v1-app](https://v1-app.sablier.com), +[v1-pay](https://v1-pay.sablier.com)) here are the subgraphs powering those dashboards. + +## The Graph + +### Endpoints + +| Chain | Id | Studio | Decentralized Network [^1] | +| --------------- | ----------------- | ----------------------------- | ----------------------------------- | +| Ethereum | sablier | [Studio][v1-studio-ethereum] | [De. Network][v1-network-ethereum] | +| Arbitrum | sablier-arbitrum | [Studio][v1-studio-arbitrum] | [De. Network][v1-network-arbitrum] | +| Optimism | sablier-optimism | [Studio][v1-studio-optimism] | [De. Network][v1-network-optimism] | +| Polygon | sablier-matic | [Studio][v1-studio-polygon] | [De. Network][v1-network-polygon] | +| Avalanche | sablier-avalanche | [Studio][v1-studio-avalanche] | [De. Network][v1-network-avalanche] | +| BNB Smart Chain | sablier-bsc | [Studio][v1-studio-bsc] | [De. Network][v1-network-bsc] | + +### Code + + + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[v1-network-ethereum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DkSXWkgJD5qVqfsrfzkLC5WELVX3Dbj3ByWcYjDJieCh +[v1-network-arbitrum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/94SP9QVcxmGV9e2fxuTxUGcZfcv4tjpPCGyyPVyMfLP +[v1-network-optimism]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BEnQbvBdXnohC1DpM9rSb47C1FbowK39HfPNCEHjgrBt +[v1-network-bsc]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3Gyy7of99oBRqHcCMGJXpHw2xxxZgXxVmFPFR1vL6YhT +[v1-network-avalanche]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DK2gHCprwVaytwzwb5fUrkFS9xy7wh66NX6AFcDzMyF9 +[v1-network-polygon]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/6UMNQfMeh3pV5Qmn2NDX2UKNeUk9kh4oZhzzzn5e8rSz +[v1-studio-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-arbitrum/version/latest +[v1-studio-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-avalanche/version/latest +[v1-studio-bsc]: https://api.studio.thegraph.com/query/57079/sablier-bsc/version/latest +[v1-studio-ethereum]: https://api.studio.thegraph.com/proxy/30310/sablier/version/latest/ +[v1-studio-optimism]: https://api.studio.thegraph.com/query/57079/sablier-optimism/version/latest +[v1-studio-polygon]: https://api.studio.thegraph.com/query/57079/sablier-polygon/version/latest + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[^1]: + Endpoints could include: The Graph's Decentralized Network (paid) or Custom Nodes (e.g. Lightlink). Because the + "Decentralized Network" subgraph flavors (e.g. V1 Ethereum) operate on The Graph Network, you will need to + substitute the `YOUR_API_KEY` placeholder in the + [Query URL](https://thegraph.com/docs/en/deploying/subgraph-studio-faqs/#6-how-do-i-find-query-urls-for-subgraphs-if-im-not-the-developer-of-the-subgraph-i-want-to-use) + with your own API key. If you require assistance with managing your API keys and configuring indexer preferences, + [this article](https://thegraph.com/docs/en/studio/managing-api-keys/) serves as an excellent guide diff --git a/docs/api/airdrops/01-overview.mdx b/docs/api/airdrops/01-overview.mdx new file mode 100644 index 00000000..fd1a2016 --- /dev/null +++ b/docs/api/airdrops/01-overview.mdx @@ -0,0 +1,57 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Sablier Airdrops + +Sablier's [Lockup](/concepts/lockup/overview) streams are used for the [Vesting](/apps/features/vesting) and (part of) +the [Airdrops](/apps/features/airdrops) components of the Sablier Interfaces. The Airdrops component is supported by our +[Merkle](/concepts/lockup/airstreams) utilities and focuses on the functionality of the Merkle Factory peripheries. + +Airdrops-native functionality is powered by: + +- The `@sablier/subgraphs/apps/merkle` subgraph +- The `@sablier/subgraphs/apps/merkle-envio` indexer +- The `@sablier/merkle-api` sdk + +For the Lockup-native functionality, please check the dedicated [documentation](/api/lockup/overview). + +:::info + +[Airstreamed](/apps/features/airdrops) airdrops will create a Lockup stream once a claim is made. + +::: + + + + + +## What are Airdrops / Airstreams? + +**Airdrops** are large-scale campaigns developed to aid with token distribution towards millions of users. They rely on +**merkle trees** to efficiently store eligibility details. + +Extending the classic instant airdrop, Sablier engineered Airstreams, a way to reward users with streams which vest +rewards over time, instead of unlocking a lump-sum of assets. + +The first step before diving into this guide is to become familiar with the [concepts](/concepts/lockup/airstreams). + +#### Naming convention + +As per our endpoint [naming convention](/api/overview#endpoints--slugs), subgraph deployments of Sablier Airstreams and +Instant Airdrops will follow the `sablier-v2-ms-*` (short for "merkle subgraph") structure (e.g. `sablier-v2-ms` for +Mainnet, `sablier-v2-ms-base` for Base). diff --git a/docs/api/airdrops/02-endpoints.mdx b/docs/api/airdrops/02-endpoints.mdx new file mode 100644 index 00000000..53966c7d --- /dev/null +++ b/docs/api/airdrops/02-endpoints.mdx @@ -0,0 +1,241 @@ +--- +id: "endpoints" +sidebar_position: 2 +title: "Endpoints" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Airdrops + +## The Graph + +This subgraph tracks events emitted by the `@sablier/v2-periphery` contracts, specifically the ones in charge of merkle +distributions. It deals with airdrops-specific actions like the factory creating an airstream campaign, admin clawbacks, +or users claiming stream NFTs as defined in the attached Merkle tree. + +Airdrops work in tandem with [vesting](/apps/features/vesting) as Merkle distributions will produce new +[lockup](/api/lockup/overview) streams. Be sure to check out that part of the docs too. + +:::important + +Since The Graph has [sunset](https://thegraph.com/blog/sunsetting-hosted-service/) their Hosted Service, we've +transitioned our subgraphs to either the Studio or The Decentralized Network (see +[supported networks](https://thegraph.com/docs/en/developing/supported-networks/) and our endpoints below). + +::: + +### Endpoints + +| Chain | Explorer | Studio[^2] | Decentralized Network[^1] | +| ---------------- | ----------------------------------------------------------------- | --------------------------------------- | --------------------------------------------- | +| Ethereum | [sablier-v2-ms][v2-explorer-ms-ethereum] | [Studio][v2-studio-ms-ethereum] | [De. Network][v2-network-ms-ethereum] | +| Arbitrum | [sablier-v2-ms-arbitrum][v2-explorer-ms-arbitrum] | [Studio][v2-studio-ms-arbitrum] | [De. Network][v2-network-ms-arbitrum] | +| Arbitrum Sepolia | [sablier-v2-ms-arbitrum-sepolia][v2-explorer-ms-arbitrum-sepolia] | [Studio][v2-studio-ms-arbitrum-sepolia] | [De. Network][v2-network-ms-arbitrum-sepolia] | +| Avalanche | [sablier-v2-ms-avalanche][v2-explorer-ms-avalanche] | [Studio][v2-studio-ms-avalanche] | [De. Network][v2-network-ms-avalanche] | +| Base | [sablier-v2-ms-base][v2-explorer-ms-base] | [Studio][v2-studio-ms-base] | [De. Network][v2-network-ms-base] | +| Blast | [sablier-v2-ms-blast][v2-explorer-ms-blast] | [Studio][v2-studio-ms-blast] | [De. Network][v2-network-ms-blast] | +| BNB Chain | [sablier-v2-ms-bsc][v2-explorer-ms-bsc] | [Studio][v2-studio-ms-bsc] | [De. Network][v2-network-ms-bsc] | +| Gnosis | [sablier-v2-ms-gnosis][v2-explorer-ms-gnosis] | [Studio][v2-studio-ms-gnosis] | [De. Network][v2-network-ms-gnosis] | +| Lightlink | [sablier-v2-ms-lightlink\*][v2-explorer-ms-lightlink] | N/A | [Lightlink Node\*][v2-custom-ms-lightlink] | +| Optimism | [sablier-v2-ms-optimism][v2-explorer-ms-optimism] | [Studio][v2-studio-ms-optimism] | [De. Network][v2-network-ms-optimism] | +| Optimism Sepolia | [sablier-v2-ms-optimism-sepolia][v2-explorer-ms-optimism-sepolia] | [Studio][v2-studio-ms-optimism-sepolia] | [De. Network][v2-network-ms-optimism-sepolia] | +| Polygon | [sablier-v2-ms-polygon][v2-explorer-ms-polygon] | [Studio][v2-studio-ms-polygon] | [De. Network][v2-network-ms-polygon] | +| Scroll | [sablier-v2-ms-scroll][v2-explorer-ms-scroll] | [Studio][v2-studio-ms-scroll] | [De. Network][v2-network-ms-scroll] | +| Sepolia | [sablier-v2-ms-sepolia][v2-explorer-ms-sepolia] | [Studio][v2-studio-ms-sepolia] | [De. Network][v2-network-ms-sepolia] | +| zkSync | [sablier-v2-ms-zksync][v2-explorer-ms-zksync] | [Studio][v2-studio-ms-zksync] | [De. Network][v2-network-ms-zksync] | + +### Code + + + +## Envio + +This indexers tracks the events emitted by the `@sablier/v2-periphery` contracts, specifically the ones in charge of +merkle distributions. It deals with airdrops-specific actions like the factory creating an airstream campaign, admin +clawbacks, or users claiming stream NFTs as defined in the attached Merkle tree. + +:::tip Chains: Individual vs. Aggregated + +While subgraphs are chain-tethered (one subgraph endpoint per chain), Envio indexes all chains within the same +deployment. The data from all of chains that Sablier is deployed on can be queried from a single endpoint. + +::: + +### Endpoints + +| Chain | Endpoint on the Hosted Network | +| ---------------- | ------------------------------------------------------------------ | +| All-Networks[^3] | [https://indexer.hyperindex.xyz/[...]/v1/graphql][endpoint-merkle] | + +The endpoint is meant to be plugged into a query client. Use +[Hasura's online explorer](https://cloud.hasura.io/public/graphiql?) to view the entities and query API. + +### Code + + + +## Sablier SDK: Merkle API + +Sablier's Airdrops rely on pre-configured Merkle trees. This data structure contains the list of recipients as well as +their individual claim details. We use the following service to create the Merkle tree, as well as proofs for the +recipient's claims. + +### Endpoints + +| Host | Endpoint | +| ------- | ------------------------------ | +| Sablier | https://v2-services.vercel.app | + +### Code + + + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +{/* Chain: Arbitrum */} + +[v2-network-ms-arbitrum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CPCMKbUFEM8CzVbfic1y34qKbTrKADX9Du9QxsAMAwqU +[v2-explorer-ms-arbitrum]: https://thegraph.com/explorer/subgraphs/CPCMKbUFEM8CzVbfic1y34qKbTrKADX9Du9QxsAMAwqU +[v2-studio-ms-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-arbitrum/version/latest + +{/* Chain: Arbitrum Sepolia */} + +[v2-network-ms-arbitrum-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BBJgy9RANbViGedeWTrVpH2bwm22E3niEzWcqHPMGtna +[v2-explorer-ms-arbitrum-sepolia]: https://thegraph.com/explorer/subgraphs/BBJgy9RANbViGedeWTrVpH2bwm22E3niEzWcqHPMGtna +[v2-studio-ms-arbitrum-sepolia]: + https://api.studio.thegraph.com/query/57079/sablier-v2-ms-arbitrum-sepolia/version/latest + +{/* Chain: Avalanche */} + +[v2-network-ms-avalanche]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/2beDuAvmwbyFzJ95HAwfqNjnYT6nEnzbEfSNhfWGMyhJ +[v2-explorer-ms-avalanche]: https://thegraph.com/explorer/subgraphs/2beDuAvmwbyFzJ95HAwfqNjnYT6nEnzbEfSNhfWGMyhJ +[v2-studio-ms-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-avalanche/version/latest + +{/* Chain: Base */} + +[v2-network-ms-base]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DrfN5cbvcCmpQUSc5RE9T1UxtcnMREi1Rd2PgLzDZCo3 +[v2-explorer-ms-base]: https://thegraph.com/explorer/subgraphs/DrfN5cbvcCmpQUSc5RE9T1UxtcnMREi1Rd2PgLzDZCo3 +[v2-studio-ms-base]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-base/version/latest + +{/* Chain: Blast */} + +[v2-network-ms-blast]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/HVqkPvCRAvbxjx6YVmkk6w6rHPrqqtiymcGiQiMKPw8f +[v2-explorer-ms-blast]: https://thegraph.com/explorer/subgraphs/HVqkPvCRAvbxjx6YVmkk6w6rHPrqqtiymcGiQiMKPw8f +[v2-studio-ms-blast]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-blast/version/latest + +{/* Chain: BSC */} + +[v2-network-ms-bsc]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8uU9qAw9fSzdjqebymGRXWCjtZ5DQCmUA6QzRA14ARpz +[v2-explorer-ms-bsc]: https://thegraph.com/explorer/subgraphs/8uU9qAw9fSzdjqebymGRXWCjtZ5DQCmUA6QzRA14ARpz +[v2-studio-ms-bsc]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-bsc/version/latest + +{/* Chain: Gnosis */} + +[v2-network-ms-gnosis]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FViBHgu2TtaZZXspDBzACjuPYKtqVDysmH35pk3W3zJJ +[v2-explorer-ms-gnosis]: https://thegraph.com/explorer/subgraphs/FViBHgu2TtaZZXspDBzACjuPYKtqVDysmH35pk3W3zJJ +[v2-studio-ms-gnosis]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-gnosis/version/latest + +{/* Chain: Lightlink */} + +[v2-explorer-ms-lightlink]: + https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-ms-lightlink/graphql +[v2-custom-ms-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-ms-lightlink + +{/* Chain: Mainnet | Ethereum */} + +[v2-explorer-ms-ethereum]: https://thegraph.com/explorer/subgraphs/FigCYTmdPtXbf4tgNiy5ZrtnYefz92hsMcwM4f9N5ZeZ +[v2-studio-ms-ethereum]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms/version/latest +[v2-network-ms-ethereum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FigCYTmdPtXbf4tgNiy5ZrtnYefz92hsMcwM4f9N5ZeZ + +{/* Chain: Optimism */} + +[v2-network-ms-optimism]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/7iSmF69W4mQqtx6EfWXXn5s27Hrdh72etsPKVC9iE62U +[v2-explorer-ms-optimism]: https://thegraph.com/explorer/subgraphs/7iSmF69W4mQqtx6EfWXXn5s27Hrdh72etsPKVC9iE62U +[v2-studio-ms-optimism]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-optimism/version/latest + +{/* Chain: Optimism Sepolia */} + +[v2-network-ms-optimism-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CG5QddHKoABuN6KHZHYTHL7upg2iPTMYxi35Ey7jspkX +[v2-explorer-ms-optimism-sepolia]: https://thegraph.com/explorer/subgraphs/CG5QddHKoABuN6KHZHYTHL7upg2iPTMYxi35Ey7jspkX +[v2-studio-ms-optimism-sepolia]: + https://api.studio.thegraph.com/query/57079/sablier-v2-ms-optimism-sepolia/version/latest + +{/* Chain: Polygon */} + +[v2-network-ms-polygon]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/4r2pC3iyLbzytNa5phat3SWdMEyXG8fmnf1K89D7zP2G +[v2-explorer-ms-polygon]: https://thegraph.com/explorer/subgraphs/4r2pC3iyLbzytNa5phat3SWdMEyXG8fmnf1K89D7zP2G +[v2-studio-ms-polygon]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-polygon/version/latest + +{/* Chain: Scroll */} + +[v2-network-ms-scroll]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/F1QnrgBpsVKtiVzkLisEC2PDo6cjzLoAy5HhPdFRdjW +[v2-explorer-ms-scroll]: https://thegraph.com/explorer/subgraphs/F1QnrgBpsVKtiVzkLisEC2PDo6cjzLoAy5HhPdFRdjW +[v2-studio-ms-scroll]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-scroll/version/latest + +{/* Chain: Sepolia */} + +[v2-network-ms-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8UVeHt7rHA27XZhViugaW4nStiN332dHTDWVTNBLCqPc +[v2-explorer-ms-sepolia]: https://thegraph.com/explorer/subgraphs/8UVeHt7rHA27XZhViugaW4nStiN332dHTDWVTNBLCqPc +[v2-studio-ms-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-sepolia/version/latest + +{/* Chain: zkSync */} + +[v2-network-ms-zksync]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BboiKY7JCdznoqurdXRizL9UYD1YdQKajaj4gvUrPPEA +[v2-explorer-ms-zksync]: https://thegraph.com/explorer/subgraphs/BboiKY7JCdznoqurdXRizL9UYD1YdQKajaj4gvUrPPEA +[v2-studio-ms-zksync]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-zksync/version/latest + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[endpoint-merkle]: https://indexer.hyperindex.xyz/508d217/v1/graphql + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[^1]: + Endpoints could include the following types: (1) The Graph's Decentralized Network (paid) or (2) Custom Nodes (e.g. + LightLink). Because the "Decentralized Network" subgraph flavors (e.g., Legacy Ethereum) operate on The Graph + Network, you will need to substitute the `YOUR_API_KEY` placeholder in the + [Query URL](https://thegraph.com/docs/en/deploying/subgraph-studio-faqs/#6-how-do-i-find-query-urls-for-subgraphs-if-im-not-the-developer-of-the-subgraph-i-want-to-use) + with your own API key. If you require assistance with managing your API keys and configuring indexer preferences, + [this article](https://thegraph.com/docs/en/studio/managing-api-keys/) serves as an excellent guide + +[^2]: The Graph's Studio endpoints are considered for testing purposes and may be rate-limited + +[^3]: + All-Networks means most of the networks supported by Sablier, e.g., Mainnet, Optimism, Polygon, Sepolia. The full + list can be found [here](https://github.com/sablier-labs/subgraphs/blob/main/packages/constants/src). To add a new + chain to our Envio indexer, create a new list of contracts (`/addresses`) and import that configuration into our + bundles (see `/bundles`). diff --git a/docs/concepts/protocol/_category_.json b/docs/api/airdrops/_category_.json similarity index 56% rename from docs/concepts/protocol/_category_.json rename to docs/api/airdrops/_category_.json index dfe926f5..cfe7af0e 100644 --- a/docs/concepts/protocol/_category_.json +++ b/docs/api/airdrops/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Protocol Concepts", + "label": "Sablier Airdrops", "position": 4 } diff --git a/docs/api/airdrops/envio/01-similarities.mdx b/docs/api/airdrops/envio/01-similarities.mdx new file mode 100644 index 00000000..4d83bbb7 --- /dev/null +++ b/docs/api/airdrops/envio/01-similarities.mdx @@ -0,0 +1,16 @@ +--- +id: "similarities" +sidebar_position: 1 +title: "Similarities" +--- + +# Similarities + +Envio indexers are designed to mirror the functionality and structure of the The Graph subgraphs. + +For an introduction into the Sablier primitives and our architectural choices, check out the +[Merkle subgraph](/api/airdrops/the-graph/entities) before reading about the `merkle-envio` indexer. + +Similar entities are used between The Graph and Envio setups, as well as between the Lockup and Merkle deployments. + +- [Entities](/api/airdrops/the-graph/entities) diff --git a/docs/api/indexers/merkle/02-queries.md b/docs/api/airdrops/envio/02-queries.md similarity index 94% rename from docs/api/indexers/merkle/02-queries.md rename to docs/api/airdrops/envio/02-queries.md index 5da9a9c7..86aeb55c 100644 --- a/docs/api/indexers/merkle/02-queries.md +++ b/docs/api/airdrops/envio/02-queries.md @@ -4,8 +4,8 @@ sidebar_position: 2 title: "Queries" --- -Building on top of the [entity structure](/api/subgraphs/merkle/entities) defined earlier, here are some common GraphQL -queries for fetching data from the Sablier V2 subgraph. +Building on top of the [entity structure](/api/airdrops/the-graph/entities) defined earlier, here are some common +GraphQL queries for fetching data from the Sablier subgraph. ### Recent streams diff --git a/docs/api/airdrops/envio/_category_.json b/docs/api/airdrops/envio/_category_.json new file mode 100644 index 00000000..84b76022 --- /dev/null +++ b/docs/api/airdrops/envio/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Envio", + "position": 4 +} diff --git a/docs/api/merkle-api/01-intro.mdx b/docs/api/airdrops/merkle-api/01-overview.mdx similarity index 66% rename from docs/api/merkle-api/01-intro.mdx rename to docs/api/airdrops/merkle-api/01-overview.mdx index 34c05fc6..29e4dccb 100644 --- a/docs/api/merkle-api/01-intro.mdx +++ b/docs/api/airdrops/merkle-api/01-overview.mdx @@ -1,19 +1,17 @@ --- -id: "intro" +id: "overview" sidebar_position: 1 -title: "Introduction" +title: "Overview" --- import LinkPreview from "@site/src/components/LinkPreview"; -## Overview - -Sablier's Airstreams rely on a pre-configured Merkle tree. This data structure contains the list of recipients as well -as their individual claim details. +Sablier's Airdrops rely on pre-configured Merkle trees. This data structure contains the list of recipients as well as +their individual claim details. ### General data flow -It allows us to store minimal data at the contract level, while being able to cryptographically prove someone is +Trees allow us to store minimal data at the contract level, while being able to cryptographically prove someone is entitled to claim from the contract, using proofs generated with a separate off-chain dataset (and the onchain root). The root hash of the tree will be stored inside the deployed Airstream contract. The tree itself, as well as the initial @@ -26,7 +24,7 @@ previously. ### Open-source solution To make this functionality available to both Sablier client interfaces and 3rd party integrators we've created a Rust -backend service called `v2-merkle-api`. Through a REST API, it provides access to creating, storing and reading from +backend service called `merkle-api`. Through a REST API, it provides access to creating, storing and reading from Airstream related Merkle trees. #### Integrations @@ -36,8 +34,8 @@ the backend in your own environment. We're keen to improve and optimize this ser be flagged directly in the Github repository. diff --git a/docs/api/merkle-api/02-functionality.mdx b/docs/api/airdrops/merkle-api/02-functionality.mdx similarity index 81% rename from docs/api/merkle-api/02-functionality.mdx rename to docs/api/airdrops/merkle-api/02-functionality.mdx index 0aa3a573..c8f04a23 100644 --- a/docs/api/merkle-api/02-functionality.mdx +++ b/docs/api/airdrops/merkle-api/02-functionality.mdx @@ -1,7 +1,7 @@ --- id: "functionality" sidebar_position: 2 -title: "Functionality and API" +title: "Functionality" --- import LinkPreview from "@site/src/components/LinkPreview"; @@ -18,13 +18,7 @@ keys). Feel free to reach out for any guidance or feedback. -## Endpoints - -| Host | Endpoint | -| ------- | ------------------------------ | -| Sablier | https://v2-services.vercel.app | - ---- +The official endpoints can be seen in the [airdrops-endpoints](/api/airdrops/endpoints) registry. ## Create: `/api/create` @@ -56,13 +50,13 @@ the API deals with the padding of each value (with the decimals of the token) on ### Description -| | | -| :--------------- | --------------------------------------------------------------------------------------------------------------------------- | -| **Endpoint** | `/api/create` | -| **Method** | `POST` | -| **Query Params** | `{decimals: number}` | -| **Body** | `FormData` on `{data: File}` | -| **Response** | See in [Rust](https://github.com/sablier-labs/v2-merkle-api/blob/main/src/data_objects/response.rs#L22) Overview TS (below) | +| | | +| :--------------- | ------------------------------------------------------------------------------------------------------------------------ | +| **Endpoint** | `/api/create` | +| **Method** | `POST` | +| **Query Params** | `{decimals: number}` | +| **Body** | `FormData` on `{data: File}` | +| **Response** | See in [Rust](https://github.com/sablier-labs/merkle-api/blob/main/src/data_objects/response.rs#L22) Overview TS (below) | ```typescript type Response = { @@ -70,7 +64,7 @@ type Response = { cid: string; /** Expected number of recipients */ recipients: string; - /** HEX root fo the merkle tree */ + /** HEX root fo the Merkle tree */ root: string; /** Humanized status */ status: string; @@ -106,9 +100,9 @@ The `/api/create` route will perform the following actions: For more insight, check out the implementation details. @@ -129,20 +123,20 @@ This endpoint uses an authentication scheme. Please reach out if you need to use To check eligibility for an address, you'll be required to provide: - the address of the user -- the CID of the IPFS file (see the [create](/api/merkle-api/functionality#create-apicreate) flow above for context) the - campaign is linked to +- the CID of the IPFS file (see the [create](/api/airdrops/merkle-api/functionality#create-apicreate) flow above for + context) the campaign is linked to To get a hold of the second item you can see some options here in the -[Common flows](/api/merkle-api/examples#get-a-campaigns-cid) page. +[Common flows](/api/airdrops/merkle-api/examples#get-a-campaigns-cid) page. ### Description -| | | -| :--------------- | --------------------------------------------------------------------------------------------------------------------------- | -| **Endpoint** | `/api/eligibility` | -| **Method** | `GET` | -| **Query Params** | `{address: string, cid: string}` | -| **Response** | See in [Rust](https://github.com/sablier-labs/v2-merkle-api/blob/main/src/data_objects/response.rs#L32) Overview TS (below) | +| | | +| :--------------- | ------------------------------------------------------------------------------------------------------------------------ | +| **Endpoint** | `/api/eligibility` | +| **Method** | `GET` | +| **Query Params** | `{address: string, cid: string}` | +| **Response** | See in [Rust](https://github.com/sablier-labs/merkle-api/blob/main/src/data_objects/response.rs#L32) Overview TS (below) | ```typescript type Response = { @@ -161,7 +155,7 @@ type Response = { The `/api/eligibility` route will perform the following actions: -1. Retrieve the campaign's IPFS file and extract the recipient's list and merkle tree +1. Retrieve the campaign's IPFS file and extract the recipient's list and Merkle tree 2. Search for the provided wallet address ### Code @@ -169,9 +163,9 @@ The `/api/eligibility` route will perform the following actions: For more insight, check out the implementation details. @@ -189,17 +183,17 @@ To check eligibility for an address, you'll be required to provide: - the CID of the IPFS file the campaign is linked to -To get a hold of it you can see some options here in the [Common flows](/api/merkle-api/examples#get-a-campaigns-cid) -page. +To get a hold of it you can see some options here in the +[Common flows](/api/airdrops/merkle-api/examples#get-a-campaigns-cid) page. ### Description -| | | -| :--------------- | --------------------------------------------------------------------------------------------------------------------------- | -| **Endpoint** | `/api/validity` | -| **Method** | `GET` | -| **Query Params** | `{cid: string}` | -| **Response** | See in [Rust](https://github.com/sablier-labs/v2-merkle-api/blob/main/src/data_objects/response.rs#L41) Overview TS (below) | +| | | +| :--------------- | ------------------------------------------------------------------------------------------------------------------------ | +| **Endpoint** | `/api/validity` | +| **Method** | `GET` | +| **Query Params** | `{cid: string}` | +| **Response** | See in [Rust](https://github.com/sablier-labs/merkle-api/blob/main/src/data_objects/response.rs#L41) Overview TS (below) | ```typescript type Response = { @@ -207,7 +201,7 @@ type Response = { cid: string; /** Expected number of recipients */ recipients: string; - /** HEX root fo the merkle tree */ + /** HEX root fo the Merkle tree */ root: string; /** Expected amount of assets required by the campaign */ total: string; @@ -226,8 +220,8 @@ The `/api/validity` route will perform the following actions: For more insight, check out the implementation details. diff --git a/docs/api/merkle-api/03-examples.mdx b/docs/api/airdrops/merkle-api/03-examples.mdx similarity index 75% rename from docs/api/merkle-api/03-examples.mdx rename to docs/api/airdrops/merkle-api/03-examples.mdx index dac642ea..6d0e214e 100644 --- a/docs/api/merkle-api/03-examples.mdx +++ b/docs/api/airdrops/merkle-api/03-examples.mdx @@ -10,18 +10,19 @@ import Tabs from "@theme/Tabs"; # Examples of common flows Here are some common architectural flows you may need to integrate into your application. These include ways to gather -the prerequisite data necessary for each backend [functionality](/api/merkle-api/functionality) described earlier. +the prerequisite data necessary for each backend [functionality](/api/airdrops/merkle-api/functionality) described +earlier. ## Get a campaign's CID -To get a hold of a campaign's IPFS CID you can: +To get a hold of a campaign's IPFS CID, you can:
  1. - Check the [create](/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory#events) - events emitted by the Merkle factory + Check the [create](/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory#events) events + emitted by the Merkle factory
  2. -
  3. Use the Sablier V2 [subgraphs / indexers](/api/overview) to query for that particular piece of information.
  4. +
  5. Use the Sablier [subgraphs / indexers](/api/overview) to query for that particular piece of information.
For approach "B", run the following query against the official endpoints: @@ -64,7 +65,7 @@ For approach "B", run the following query against the official endpoints: ## Check eligibility for an address To check if an address is eligible, you'll have to use the [/api/eligibility](functionality#eligibility-apieligibility) -route provided by the v2-merkle-api backend. +route provided by the merkle-api backend. #### Steps @@ -87,10 +88,10 @@ To get a hold of a `tokenId` linked to a claim you can:
  1. - Listen to the [claim](/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL#claim) method and - the Claim event emitted by the Merkle contract instance + Listen to the [claim](/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL#claim) method and the + Claim event emitted by the Merkle contract instance
  2. -
  3. Use the Sablier V2 [subgraphs / indexers](/api/overview) to query for that particular piece of information.
  4. +
  5. Use the Sablier [subgraphs / indexers](/api/overview) to query for that particular piece of information.
For approach "B", run the following query against the official endpoints (make sure the address is lowercased): @@ -138,8 +139,8 @@ For approach "B", run the following query against the official endpoints (make s To get the Stream NFT, using the same query as in option "B", retrieve the `lockup` contract (where the Stream NFT is issued) and its `tokenId`. With them you can call the -[`tokenURI`](/contracts/v2/reference/core/contract.SablierV2NFTDescriptor#tokenuri) method, which will return the SVG -code of the onchain NFT. +[`tokenURI`](/reference/lockup/core/contract.SablierV2NFTDescriptor#tokenuri) method, which will return the SVG code of +the onchain NFT. :::note Extract the SVG tags @@ -164,20 +165,21 @@ To check if a user has already claimed their stream from a campaign you can:
  1. - Call the [hasClaimed](/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup#hasclaimed) - method form the Merkle contract instance + Call the [hasClaimed](/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup#hasclaimed) method + form the Merkle contract instance
  2. -
  3. Use the Sablier V2 [subgraphs / indexers](/api/overview) to query for that particular piece of information.
  4. +
  5. Use the Sablier [subgraphs / indexers](/api/overview) to query for that particular piece of information.
#### Approach A For approach "A" you'll need to perform the following actions: -1. Get a hold of the campaign's CID, lockup contract and user address (for the first items, see the - [Get a campaign's CID](/api/merkle-api/examples#get-a-campaigns-cid) example above) -2. Check the eligibility of a user (see [Eligibility](/api/merkle-api/examples#check-eligibility-for-an-address) example - above) and extract their `index` +1. Get a hold of the campaign's CID, Lockup contract address, and user address (for the first items, see the + [Get a campaign's CID](/api/airdrops/merkle-api/examples#get-a-campaigns-cid) example above) +2. Check the eligibility of a user (see + [Eligibility](/api/airdrops/merkle-api/examples#check-eligibility-for-an-address) example above) and extract their + `index` 3. Call the `hasClaimed` method inside the `lockup` contract using the `index` retrieved at step 2 :::note @@ -190,8 +192,8 @@ generate a proof in case the recipient is eligible and to register their claim d #### Approach B For approach "B", run the same query as in the -[Get the tokenId after a claim](/api/merkle-api/examples#get-the-tokenid-after-a-claim) example. If the query yields any -results, that means the user has claimed their stream. +[Get the tokenId after a claim](/api/airdrops/merkle-api/examples#get-the-tokenid-after-a-claim) example. If the query +yields any results, that means the user has claimed their stream. :::tip diff --git a/docs/api/airdrops/merkle-api/_category_.json b/docs/api/airdrops/merkle-api/_category_.json new file mode 100644 index 00000000..6e21f9b7 --- /dev/null +++ b/docs/api/airdrops/merkle-api/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Merkle API", + "position": 5 +} diff --git a/docs/api/subgraphs/merkle/01-entities.mdx b/docs/api/airdrops/the-graph/01-entities.mdx similarity index 83% rename from docs/api/subgraphs/merkle/01-entities.mdx rename to docs/api/airdrops/the-graph/01-entities.mdx index 01680cd2..3b0d044e 100644 --- a/docs/api/subgraphs/merkle/01-entities.mdx +++ b/docs/api/airdrops/the-graph/01-entities.mdx @@ -1,21 +1,21 @@ --- id: "entities" sidebar_position: 1 -title: "Entities (+)" +title: "Entities" --- :::info -For an introduction into the base Sablier primitives and some architectural choices, make sure to check out the -[protocol subgraph](/api/subgraphs/protocol/entities) before reading about the merkle subgraph. +For an introduction into the Sablier primitives and our architectural choices, check out the +[Lockup subgraph](/api/lockup/the-graph/entities) before reading about the Merkle subgraph. ::: ## Entity Architecture -Inside the **merkle** subgraph, the -[`schema.graphql`](https://github.com/sablier-labs/v2-subgraphs/blob/main/apps/merkle/schema.graphql) file is -responsible of defining the following Sablier entities: +Inside the **Merkle** subgraph, the +[`schema.graphql`](https://github.com/sablier-labs/subgraphs/blob/main/apps/merkle/schema.graphql) file is responsible +of defining the following Sablier entities: ### Primary @@ -36,7 +36,7 @@ responsible of defining the following Sablier entities: ## Structure The structure of these entities is built on the same rules and mindset which was applied on the -[protocol entities](/api/subgraphs/protocol/structure). +[lockup entities](/api/lockup/the-graph/entities). ### Identifying @@ -63,7 +63,7 @@ name or an alias to be used in the URL. ::: -## Data Flow +## Architecture and Data Flow The data flow applied to this subgraph is identical to the one used in the -[protocol subgraph](/api/subgraphs/protocol/flow). +[lockup subgraph](/api/lockup/the-graph/architecture). diff --git a/docs/api/subgraphs/merkle/02-queries.md b/docs/api/airdrops/the-graph/02-queries.md similarity index 93% rename from docs/api/subgraphs/merkle/02-queries.md rename to docs/api/airdrops/the-graph/02-queries.md index 2e720694..b27d4196 100644 --- a/docs/api/subgraphs/merkle/02-queries.md +++ b/docs/api/airdrops/the-graph/02-queries.md @@ -4,8 +4,8 @@ sidebar_position: 2 title: "Queries" --- -Building on top of the [entity structure](/api/subgraphs/merkle/entities) defined earlier, here are some common GraphQL -queries for fetching data from the Sablier V2 subgraph. +Building on top of the [entity structure](/api/airdrops/the-graph/entities) defined earlier, here are some common +GraphQL queries for fetching data from the Sablier subgraph. ### Recent streams diff --git a/docs/api/airdrops/the-graph/_category_.json b/docs/api/airdrops/the-graph/_category_.json new file mode 100644 index 00000000..d24628e9 --- /dev/null +++ b/docs/api/airdrops/the-graph/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "The Graph", + "position": 3 +} diff --git a/docs/api/flow/01-overview.mdx b/docs/api/flow/01-overview.mdx new file mode 100644 index 00000000..572bf873 --- /dev/null +++ b/docs/api/flow/01-overview.mdx @@ -0,0 +1,29 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Sablier Flow V1.0 + +Sablier's [Flow](/concepts/flow/overview) streams enable the [payments](/apps/features/payments) functionality of the +Sablier Interface. + +The Flow data is powered by: + +- The `@sablier/subgraphs/apps/flow` subgraph +- The `@sablier/subgraphs/apps/flow-envio` indexer + + + +#### Naming convention + +As per our endpoint [naming convention](/api/overview#endpoints--slugs), subgraph deployments of Sablier Flow will +follow the `sablier-v2-flow-*` structure (e.g. `sablier-v2-flow` for Mainnet, `sablier-v2-flow-base` for Base). diff --git a/docs/api/flow/02-endpoints.mdx b/docs/api/flow/02-endpoints.mdx new file mode 100644 index 00000000..7acb39ef --- /dev/null +++ b/docs/api/flow/02-endpoints.mdx @@ -0,0 +1,233 @@ +--- +id: "endpoints" +sidebar_position: 2 +title: "Endpoints" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Flow + +## The Graph + +This subgraph tracks events emitted by the `@sablier/flow` contracts, and deals with protocol actions like creating, +depositing or voiding flow streams. + +:::important + +Since The Graph has [sunset](https://thegraph.com/blog/sunsetting-hosted-service/) their Hosted Service we've +transitioned our subgraphs to either the Studio or The Decentralized Network (see +[supported networks](https://thegraph.com/docs/en/developing/supported-networks/) and our endpoints below). + +::: + +### Endpoints + +| Chain | Explorer | Studio[^2] | Decentralized Network[^1] | +| ---------------- | ------------------------------------------------------------------- | ----------------------------------------- | ----------------------------------------------- | +| Ethereum | [sablier-v2-fl][v2-flow-explorer-ethereum] | [Studio][v2-flow-studio-ethereum] | [De. Network][v2-flow-network-ethereum] | +| Arbitrum | [sablier-v2-fl-arbitrum][v2-flow-explorer-arbitrum] | [Studio][v2-flow-studio-arbitrum] | [De. Network][v2-flow-network-arbitrum] | +| Arbitrum Sepolia | [sablier-v2-fl-arbitrum-sepolia][v2-flow-explorer-arbitrum-sepolia] | [Studio][v2-flow-studio-arbitrum-sepolia] | [De. Network][v2-flow-network-arbitrum-sepolia] | +| Avalanche | [sablier-v2-fl-avalanche][v2-flow-explorer-avalanche] | [Studio][v2-flow-studio-avalanche] | [De. Network][v2-flow-network-avalanche] | +| Base | [sablier-v2-fl-base][v2-flow-explorer-base] | [Studio][v2-flow-studio-base] | [De. Network][v2-flow-network-base] | +| Blast | [sablier-v2-fl-blast][v2-flow-explorer-blast] | [Studio][v2-flow-studio-blast] | [De. Network][v2-flow-network-blast] | +| BNB Chain | [sablier-v2-fl-bsc][v2-flow-explorer-bsc] | [Studio][v2-flow-studio-bsc] | [De. Network][v2-flow-network-bsc] | +| Gnosis | [sablier-v2-fl-gnosis][v2-flow-explorer-gnosis] | [Studio][v2-flow-studio-gnosis] | [De. Network][v2-flow-network-gnosis] | +| Linea | [sablier-v2-fl-linea][v2-flow-explorer-linea] | [Studio][v2-flow-studio-linea] | [De. Network][v2-flow-network-linea] | +| Lightlink | [sablier-v2-fl-lightlink\*][v2-flow-explorer-lightlink] | N/A | [Lightlink Node\*][v2-flow-custom-lightlink] | +| Mode | [sablier-v2-fl-mode][v2-flow-explorer-mode] | [Studio][v2-flow-studio-mode] | [De. Network][v2-flow-network-mode] | +| Optimism | [sablier-v2-fl-optimism][v2-flow-explorer-optimism] | [Studio][v2-flow-studio-optimism] | [De. Network][v2-flow-network-optimism] | +| Optimism Sepolia | [sablier-v2-fl-optimism-sepolia][v2-flow-explorer-optimism-sepolia] | [Studio][v2-flow-studio-optimism-sepolia] | [De. Network][v2-flow-network-optimism-sepolia] | +| Polygon | [sablier-v2-fl-polygon][v2-flow-explorer-polygon] | [Studio][v2-flow-studio-polygon] | [De. Network][v2-flow-network-polygon] | +| Scroll | [sablier-v2-fl-scroll][v2-flow-explorer-scroll] | [Studio][v2-flow-studio-scroll] | [De. Network][v2-flow-network-scroll] | +| Sepolia | [sablier-v2-fl-sepolia][v2-flow-explorer-sepolia] | [Studio][v2-flow-studio-sepolia] | [De. Network][v2-flow-network-sepolia] | +| zkSync | [sablier-v2-fl-zksync][v2-flow-explorer-zksync] | [Studio][v2-flow-studio-zksync] | [De. Network][v2-flow-network-zksync] | + +### Code + + + +## Envio + +:::tip Chains: Individual vs. Aggregated + +While subgraphs are chain-tethered (one subgraph endpoint per chain), Envio indexes all chains within the same +deployment. The data from all of chains that Sablier is deployed on can be queried from the same place. + +::: + +The `flow-envio` indexer tracks events emitted by the the `@sablier/flow` contracts. It deals with core protocol actions +like creating, depositing, or voiding flow streams. + +### Endpoints + +| Chain | Endpoint (Hosted Network) | +| ---------------- | ---------------------------------------------------------------- | +| All-Networks[^3] | [https://indexer.hyperindex.xyz/[...]/v1/graphql][endpoint-flow] | + +The endpoint is meant to be plugged into a query client. Use +[Hasura's online explorer](https://cloud.hasura.io/public/graphiql?) to view the entities and query API. + +### Code + + + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +{/* Chain: Arbitrum */} + +[v2-flow-network-arbitrum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/61wTsPJr76vzcaMMrqQq7RkHSUsQmHoqiJbkFc1iaNN1 +[v2-flow-explorer-arbitrum]: https://thegraph.com/explorer/subgraphs/61wTsPJr76vzcaMMrqQq7RkHSUsQmHoqiJbkFc1iaNN1 +[v2-flow-studio-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-arbitrum/version/latest + +{/* Chain: Arbitrum Sepolia */} + +[v2-flow-network-arbitrum-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/Ai8sJzb4W6B19kPzqWxe47R29YGw5dACy9AJ97nZzm5W +[v2-flow-explorer-arbitrum-sepolia]: + https://thegraph.com/explorer/subgraphs/Ai8sJzb4W6B19kPzqWxe47R29YGw5dACy9AJ97nZzm5W +[v2-flow-studio-arbitrum-sepolia]: + https://api.studio.thegraph.com/query/57079/sablier-v2-fl-arbitrum-sepolia/version/latest + +{/* Chain: Avalanche */} + +[v2-flow-network-avalanche]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CUFanZFBBAaKcJDPLnCwWjo6gAruG92DcK38Y2PzARH8 +[v2-flow-explorer-avalanche]: https://thegraph.com/explorer/subgraphs/CUFanZFBBAaKcJDPLnCwWjo6gAruG92DcK38Y2PzARH8 +[v2-flow-studio-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-avalanche/version/latest + +{/* Chain: Base */} + +[v2-flow-network-base]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DVuHKeqguX339rd6JGav7wjXBVi5R4qneHSDNu1urTKr +[v2-flow-explorer-base]: https://thegraph.com/explorer/subgraphs/DVuHKeqguX339rd6JGav7wjXBVi5R4qneHSDNu1urTKr +[v2-flow-studio-base]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-base/version/latest + +{/* Chain: Blast */} + +[v2-flow-network-blast]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/84gjGqyeWDG2VxvRTRjTFxrnPMuZhAYF4iETBox2ix5D +[v2-flow-explorer-blast]: https://thegraph.com/explorer/subgraphs/84gjGqyeWDG2VxvRTRjTFxrnPMuZhAYF4iETBox2ix5D +[v2-flow-studio-blast]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-blast/version/latest + +{/* Chain: BSC */} + +[v2-flow-network-bsc]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/GJvqaYwX9vGXPXDFrANs6LcDALcN22bjvvPvrcNvU8rn +[v2-flow-explorer-bsc]: https://thegraph.com/explorer/subgraphs/GJvqaYwX9vGXPXDFrANs6LcDALcN22bjvvPvrcNvU8rn +[v2-flow-studio-bsc]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-bsc/version/latest + +{/* Chain: Gnosis */} + +[v2-flow-network-gnosis]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3XxHfFUMixMJTGVn1FJFFER1NFYpDDQo4QAbR2sQSpAH +[v2-flow-explorer-gnosis]: https://thegraph.com/explorer/subgraphs/3XxHfFUMixMJTGVn1FJFFER1NFYpDDQo4QAbR2sQSpAH +[v2-flow-studio-gnosis]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-gnosis/version/latest + +{/* Chain: Linea */} + +[v2-flow-network-linea]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/25Ry5DsjAKLXh6b8uXSu6H85Jk9d3MHxQbpDUJTstwvx +[v2-flow-explorer-linea]: https://thegraph.com/explorer/subgraphs/25Ry5DsjAKLXh6b8uXSu6H85Jk9d3MHxQbpDUJTstwvx +[v2-flow-studio-linea]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-linea/version/latest + +{/* Chain: Lightlink */} + +[v2-flow-explorer-lightlink]: + https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-fl-lightlink/graphql +[v2-flow-custom-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-fl-lightlink + +{/* Chain: Mainnet | Ethereum */} + +[v2-flow-explorer-ethereum]: https://thegraph.com/explorer/subgraphs/DgXaXAUMFTZdwo1aZ21dmGV2vyU1Wdb1DkHyVmy3y7xi +[v2-flow-studio-ethereum]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl/version/latest +[v2-flow-network-ethereum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DgXaXAUMFTZdwo1aZ21dmGV2vyU1Wdb1DkHyVmy3y7xi + +{/* Chain: Mode */} + +[v2-flow-network-mode]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/H9D24a58cCZmzZTnu4VNdUoFCEMhNYjHP9uohXr9Qi65 +[v2-flow-explorer-mode]: https://thegraph.com/explorer/subgraphs/H9D24a58cCZmzZTnu4VNdUoFCEMhNYjHP9uohXr9Qi65 +[v2-flow-studio-mode]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-mode/version/latest + +{/* Chain: Optimism */} + +[v2-flow-network-optimism]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/JAf9rM9bn6Z91htddJ33JAyrWdNXHmseHhvx11Bpfysg +[v2-flow-explorer-optimism]: https://thegraph.com/explorer/subgraphs/JAf9rM9bn6Z91htddJ33JAyrWdNXHmseHhvx11Bpfysg +[v2-flow-studio-optimism]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-optimism/version/latest + +{/* Chain: Optimism Sepolia */} + +[v2-flow-network-optimism-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/5tosMw7VVdE9ie3Z8Hdz6Y4SqaMaKrBb3XnM9rTYUag2 +[v2-flow-explorer-optimism-sepolia]: + https://thegraph.com/explorer/subgraphs/5tosMw7VVdE9ie3Z8Hdz6Y4SqaMaKrBb3XnM9rTYUag2 +[v2-flow-studio-optimism-sepolia]: + https://api.studio.thegraph.com/query/57079/sablier-v2-fl-optimism-sepolia/version/latest + +{/* Chain: Polygon */} + +[v2-flow-network-polygon]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/G49hZr29bZK7TAa7KK8z4sZ3ZkL93Ss6CZDG6ffCSifV +[v2-flow-explorer-polygon]: https://thegraph.com/explorer/subgraphs/G49hZr29bZK7TAa7KK8z4sZ3ZkL93Ss6CZDG6ffCSifV +[v2-flow-studio-polygon]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-polygon/version/latest + +{/* Chain: Scroll */} + +[v2-flow-network-scroll]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/2d1uvMnHnohZowpGwDdj6Gpk5gT8SNcZjbLfTA3JVRa8 +[v2-flow-explorer-scroll]: https://thegraph.com/explorer/subgraphs/2d1uvMnHnohZowpGwDdj6Gpk5gT8SNcZjbLfTA3JVRa8 +[v2-flow-studio-scroll]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-scroll/version/latest + +{/* Chain: Sepolia */} + +[v2-flow-network-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/iYRc4ETBqkeiyVhMeXktJ9jxEuQhQ1eJb2Bv68mGkQm +[v2-flow-explorer-sepolia]: https://thegraph.com/explorer/subgraphs/iYRc4ETBqkeiyVhMeXktJ9jxEuQhQ1eJb2Bv68mGkQm +[v2-flow-studio-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-sepolia/version/latest + +{/* Chain: zkSync */} + +[v2-flow-network-zksync]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/iYRc4ETBqkeiyVhMeXktJ9jxEuQhQ1eJb2Bv68mGkQm +[v2-flow-explorer-zksync]: https://thegraph.com/explorer/subgraphs/iYRc4ETBqkeiyVhMeXktJ9jxEuQhQ1eJb2Bv68mGkQm +[v2-flow-studio-zksync]: https://api.studio.thegraph.com/query/57079/sablier-v2-fl-zksync/version/latest + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[endpoint-flow]: https://indexer.hyperindex.xyz/3b4ea6b/v1/graphql + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[^1]: + Endpoints could include the following types: (1) The Graph's Decentralized Network (paid) or (2) Custom Nodes (e.g. + Lightlink). Because the "Decentralized Network" subgraph flavors (e.g. V1 Ethereum) operate on The Graph Network, + you will need to substitute the `YOUR_API_KEY` placeholder in the + [Query URL](https://thegraph.com/docs/en/deploying/subgraph-studio-faqs/#6-how-do-i-find-query-urls-for-subgraphs-if-im-not-the-developer-of-the-subgraph-i-want-to-use) + with your own API key. If you require assistance with managing your API keys and configuring indexer preferences, + [this article](https://thegraph.com/docs/en/studio/managing-api-keys/) serves as an excellent guide + +[^2]: The Graph's Studio endpoints are considered for testing purposes and may be rate-limited + +[^3]: + All-Networks means most of the networks supported by Sablier, e.g., Mainnet, Optimism, Polygon, Sepolia. The full + list can be found [here](https://github.com/sablier-labs/subgraphs/blob/main/packages/constants/src). To add a new + chain to our Envio indexer, create a new list of contracts (`/addresses`) and import that configuration into our + bundles (see `/bundles`). diff --git a/docs/api/subgraphs/merkle/_category_.json b/docs/api/flow/_category_.json similarity index 57% rename from docs/api/subgraphs/merkle/_category_.json rename to docs/api/flow/_category_.json index 00b0e30d..7368945c 100644 --- a/docs/api/subgraphs/merkle/_category_.json +++ b/docs/api/flow/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Subgraph: Merkle", + "label": "Flow v1.0", "position": 3 } diff --git a/docs/api/flow/envio/01-similarities.mdx b/docs/api/flow/envio/01-similarities.mdx new file mode 100644 index 00000000..f8faf70c --- /dev/null +++ b/docs/api/flow/envio/01-similarities.mdx @@ -0,0 +1,17 @@ +--- +id: "similarities" +sidebar_position: 1 +title: "Similarities" +--- + +# Similarities + +Envio indexers are designed to mirror the functionality and structure of the The Graph subgraphs. + +For an introduction into the Sablier primitives and our architectural choices, check out the +[Flow subgraph](/api/flow/the-graph/entities) before reading about the `flow-envio` indexer. + +Similar entities are used between The Graph and Envio setups. + +- [Entities](/api/flow/the-graph/entities) +- [Structure](/api/flow/the-graph/structure) diff --git a/docs/api/flow/envio/02-architecture.mdx b/docs/api/flow/envio/02-architecture.mdx new file mode 100644 index 00000000..4d894f88 --- /dev/null +++ b/docs/api/flow/envio/02-architecture.mdx @@ -0,0 +1,8 @@ +--- +id: "architecture" +sidebar_position: 3 +title: "Architecture" +--- + +The flow-envio architecture respects the same principles with lockup-envio. You can find more information +[here](/api/lockup/envio/architecture) diff --git a/docs/api/flow/envio/03-queries.mdx b/docs/api/flow/envio/03-queries.mdx new file mode 100644 index 00000000..71bf4432 --- /dev/null +++ b/docs/api/flow/envio/03-queries.mdx @@ -0,0 +1,158 @@ +--- +id: "queries" +sidebar_position: 4 +title: "Queries" +--- + +Building on top of the [entity structure](/api/flow/the-graph/structure) defined earlier, here are some common GraphQL +queries for fetching data from the Sablier subgraph. + +### Recent streams + +```graphql title="The 10 most recent streams" +query getStreams { + Stream(limit: 10, distinct_on: [subgraphId], order_by: { subgraphId: desc }) { + id + alias + category + asset { + id + symbol + } + } +} +``` + +### Paginated streams + +To query streams in sets/pages (and avoid edge cases where using timestamps may skip simultaneous batched streams), we +can use the unique `subgraphId`. + +This query includes pagination. + +```graphql title="The next streams indexed before the last seen subgraphId" +query getStreams($first: Int!, $subgraphId: numeric!) { + Stream( + limit: $first + distinct_on: [subgraphId] + order_by: { subgraphId: desc } + where: { subgraphId: { _lt: $subgraphId } } + ) { + id + alias + category + asset { + id + symbol + } + } +} +``` + +### Streams by sender + +This query includes pagination. + +:::warning + +Some queries, especially those using `OR` will potentially yield duplicate results. To make sure we only retrieve unique +streams/entities with a query, we make use of the `distinct_on` filter (and apply it on keys included in `order_by`). + +::: + +```graphql title="The next streams created by an address" +Stream( + limit: $first + offset: $skip + distinct_on: [subgraphId] + order_by: { subgraphId: desc } + where: { + _and: [{ sender: {_eq: $sender} }, { subgraphId: {_lt: $subgraphId} }] + } +) { + id + alias + category +} +``` + +### Streams by sender or recipient + +To show all streams that have an address marked as a sender (all cases) or a recipient, extend the example above to +account for the recipient aspect. + +This query includes pagination. + +```graphql title="The next streams related to an address, as a sender or recipient" +Stream( + limit: $first + offset: $skip + distinct_on: [subgraphId] + order_by: { subgraphId: desc } + where: { + or: [ + { _and: [{ sender: {_eq: $sender} }, { subgraphId: {_lt: $subgraphId} }] } + { _and: [{ recipient: {_eq: $recipient} }, { subgraphId: {_lt: $subgraphId} }] } + ] + } +) { + id + alias + category + } +``` + +### Streams by filters + +The official V2 Interfaces will provide a search interface where one may query for a list of streams using the following +filters (the conditions will be combined) + +- the sender address +- the recipient address +- a list of stream identifiers + +This query includes pagination. + +```graphql title="The 'where' clause for a complex paginated search filter" +where: { + _or: [ + { + _and: [ + { chainId: { _eq: $chainId } } + { sender: { _eq: $sender } } + { subgraphId: { _lt: $subgraphId } } + ] + } + { + _and: [ + { chainId: { _eq: $chainId } } + { recipient: { _eq: $recipient } } + { subgraphId: { _lt: $subgraphId } } + ] + } + ] + } +``` + +### Actions by stream + +:::tip + +To avoid writing the same entity definitions over and over again, check out Fragments. + +::: + +```graphql title="Most recent 100 stream actions such as withdrawals or transfers" +Action( + limit: 100 + distinct_on: [subgraphId] + order_by: { subgraphId: desc } + where: { stream_id: {_eq: $streamId} } +) { + id + category + stream { + ...StreamFragment + } +} +``` diff --git a/docs/api/flow/envio/_category_.json b/docs/api/flow/envio/_category_.json new file mode 100644 index 00000000..84b76022 --- /dev/null +++ b/docs/api/flow/envio/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Envio", + "position": 4 +} diff --git a/docs/api/flow/the-graph/01-entities.mdx b/docs/api/flow/the-graph/01-entities.mdx new file mode 100644 index 00000000..f5289b5e --- /dev/null +++ b/docs/api/flow/the-graph/01-entities.mdx @@ -0,0 +1,32 @@ +--- +id: "entities" +sidebar_position: 1 +title: "Entities" +--- + +## Entity Architecture + +GraphQL entities defined by the Sablier subgraphs are meant to mirror the functionality exposed by our core flow +contracts. To achieve this, events are stored as historical entries (e.g. Action) while also being used to mutate +attributes for live entities (e.g. Stream). + +Inside the **flow** subgraph, the +[`schema.graphql`](https://github.com/sablier-labs/subgraphs/blob/main/apps/flow/schema.graphql) file is responsible of +defining the following Sablier entities: + +### Primary + +| Entity | Description | +| -------- | ------------------------------------------------------------------------------------------- | +| Contract | Instances of `SablierFlow` | +| Action | Emitted events transformed into historical entries (e.g. Create, Withdraw, Adjust, Deposit) | +| Stream | Primary entity tracking the up to date state of a stream | +| Asset | The ERC20 asset that is being streamed | + +### Secondary + +| Entity | Description | +| ------- | ------------------------------------------------------------------------------------------------------------------------- | +| Batch | An entity grouping a set of stream created all at once (action done through the batch interface of SablierFlow contracts) | +| Batcher | An entity resolving 1:1 to a stream sender, in charge of managing the count of "batches" of streams one creates | +| Watcher | A singleton data store for subgraph-level unique indexes such as the stream or action index | diff --git a/docs/api/flow/the-graph/02-structure.mdx b/docs/api/flow/the-graph/02-structure.mdx new file mode 100644 index 00000000..46f253f3 --- /dev/null +++ b/docs/api/flow/the-graph/02-structure.mdx @@ -0,0 +1,138 @@ +--- +id: "structure" +sidebar_position: 2 +title: "Structure" +--- + +We'll break down the [schema](https://github.com/sablier-labs/subgraphs/blob/main/apps/flow/schema.graphql) into primary +and secondary entities. + +| Type | Entities | +| --------- | ------------------------------- | +| Primary | Contract, Action, Stream, Asset | +| Secondary | Batch, Batcher, Watcher | + +## Contract + +The subgraph is designed to track multiple deployments. Therefore, at any given time the indexer may listen for updates +on many instances of `SablierFlow` contracts . + +A unique `alias` will be attributed to every contract, such that contracts (and later streams) will be identifiable +through both a long form and a short form identifier. See the [Stream](#stream) for details. + +--- + +## Action + +Events emitted by the Sablier Flow contracts will: + +1. Be used to mutate the data stored in the individual `Stream` entities +2. Be stored as historical logs (list of `Action`) to show the evolution of a related stream + +Based on the schema defined `ActionCategory`, the following actions will be tracked by the subgraph: + +| Action | Contract Events | +| -------------- | ---------------------- | +| Approval | Approval | +| ApprovalForAll | ApprovalForAll | +| Adjust | AdjustFlowStream | +| Create | CreateFlowStream | +| Deposit | DepositFlowStream | +| Pause | PauseFlowStream | +| Refund | RefundFromFlowStream | +| Restart | RestartFlowStream | +| Transfer | Transfer | +| Void | VoidFlowStream | +| Withdraw | WithdrawFromFlowStream | + +To keep all actions under the same umbrella, some details will be stored under general purpose attributes like +`amountA`, `amountB`, `addressA`, `addressB` which based on the type of action can be resolved to context-specific +values. Am example can be found +[here](https://github.com/sablier-labs/subgraphs/blob/52f00f31a89c91dcf24480a5d7d8b25c84467f15/apps/flow/src/mappings/handle-stream.ts#L53-L56) +for the Adjust event. + +--- + +## Stream + +### Identifying + +Inside the contracts, streams will be assigned a unique `tokenId` (or `streamId`). While this makes it easy to identify +items at the contract level, we need to consider the following for both subgraphs and client interfaces: + +- items should be uniquely recognizable across multiple contract instances +- items should be uniquely identifiable across multiple chains +- items should be identifiable with short, easy to digest names + +To address these observations, the subgraph uses two related identifiers for a Stream. + +| Type | Description | Example | +| -------------- | --------------------------------------------------------------------------------------------------- | ------------------------------ | +| `Stream.id` | A self-explanatory structure built using the following structure: `contractAddress-chainId-tokenId` | `0xAB..12-137-21` | +| `Stream.alias` | A short version of the `id` where the contract is aliased: `contractAlias-chainId-tokenId` | `FL-137-21` | + +Both examples from the table above translate to: **_a stream on Polygon (chain id `137`), within the Flow contract at +address `0xAB..12`, with the tokenId `21`_**. + +:::note + +The aliases defined in the subgraph will be used by client apps to resolve data about a stream. Make sure to keep them +in sync, avoid conflicts and regard them as immutable (once decided, never change them). + +::: + +### Aliases + +To provide a simple visual structure, while also accounting for future stream curves (backwards compatibility) we use +the following abbreviations as aliases: + +- FLOW V1.0 contracts become `FL`, e.g. `FL-137-1` + +### Relevant parties + +#### The recipient (gets paid\*) + +As funds are being streamed, they will slowly become eligible to withdraw and spend unlocked assets. The `recipient` is +defined at the start of the stream but can change as a result of a transfer. + +On transfer, the old recipient moves the NFT (the stream itself) to another address, which becomes the new recipient. +Rights to withdraw and claim future streamed funds are naturally transferred to this new address. + +#### The sender (will pay\*) + +They are an immutable party, defined at the start of the stream. Based on the configuration chosen for the stream, they +will be entitled to later pause the stream, void it (stop and erased any accrued debt), withdraw on behalf of the +recipient or refund any of the unstreamed assets. + +## Asset + +Tokens (ERC20) streamed through the protocol will be defined through an `Asset` entity. + +:::info + +As a development caveat, some ERC20 contracts are designed to store details (e.g. name, symbol) as `bytes32` and not +`string`. Prior to deploying a subgraph, make sure you take into account these details as part of any Asset entity +implementation. For examples, see the asset "helper" files inside this subgraph's repository code. + +::: + +--- + +## Batch and Batcher + +The SablierFlow contracts through the implementation of the IBatch interface allow executing multiple actions in the +same transaction. One of these functionalities will be **batch stream creation** (or **stream grouping**). Using the +`batch` that receives the encoded data of multiple `create` function calls, a sender will be able to create multiple +streams at once - considered part of the same batch. This is similar with the +[lockup create multiple functions](/api/lockup/the-graph/structure#batch-and-batcher) + +To identify these relationships between stream items, the `Batch` entity will group items created in the same +transaction, by finding events emitted with the same tx hash. The `Batcher` will then assign a user-specific unique +index to every group. + +--- + +## Watcher + +The Watcher (one for the entire subgraph) will provide specific utilities to the entire system, like global stream +identifiers (a numeric id unique to a stream across all contract instances) and global action identifiers. diff --git a/docs/api/flow/the-graph/03-architecture.mdx b/docs/api/flow/the-graph/03-architecture.mdx new file mode 100644 index 00000000..74e824dc --- /dev/null +++ b/docs/api/flow/the-graph/03-architecture.mdx @@ -0,0 +1,58 @@ +--- +id: "architecture" +sidebar_position: 3 +title: "Architecture" +--- + +## Preparations + +In order to start indexing all whitelisted Flow contracts we need a genesis event. With Sablier Flow, there is no +factory pattern so we couldn't rely on a +[data source](https://thegraph.com/docs/en/developing/creating-a-subgraph/#data-source-templates) contract. The next +best things for a "genesis" point was to rely on the first event triggered by the earliest registered onchain contract + +To reduce the number of dependencies required to kickstart a subgraph, we chose to rely on this approach instead of +implementing a separate registry contract. You should extend the file described +[here](/api/lockup/the-graph/architecture#preparations) with the following + +```ts title="packages/constants/.../sepolia.ts" +... +export let startBlock_flow = 6618000; + +/** Rule: keep addresses lowercased */ + +/** + * Keep aliases unique and always in sync with the frontend + * @example export let linear = [[address1, alias1, version1], [address2, alias2, version2]] + */ + +... + +export let flow: string[][] = [ + ["0x83dd52fca44e069020b58155b761a590f12b59d3", "FL", "V10"], +]; + +// highlight-start +/** + * The initializer contract is used to trigger the indexing of all other contracts. + * It should be a linear contract, the oldest/first one deployed on this chain. + * ↪ 🚨 On any new chain, please create a Flow stream to kick-off the indexing flow + */ + +export let initializer_flow = flow[0][0]; +//highlight-end +``` + +## Configurations + +Using this data, we'll call the `yarn deploy:` script. In turn it will: + +0. **[Chain]** Lock onto a specified chain +1. **[Setup]** Clean artifacts and older files +2. **[Template]** Convert TS files into JS for mustache to use in the next step +3. **[Template]** Use mustache to create a specific `subgraph.yaml` (from `subgraph.template.yaml`) using the selected + chain's details +4. **[Template]** Duplicate the selected chain's configuration file as the "current" `env.ts` (for possible imports + directly in Assembly Script) +5. **[Codegen]** Run codegen using the files prepared above, as well as the handlers implementation +6. **[Deploy]** Deploy the code to the endpoint selected based on the specified chain diff --git a/docs/api/flow/the-graph/04-queries.md b/docs/api/flow/the-graph/04-queries.md new file mode 100644 index 00000000..3e1ebbde --- /dev/null +++ b/docs/api/flow/the-graph/04-queries.md @@ -0,0 +1,144 @@ +--- +id: "queries" +sidebar_position: 4 +title: "Queries" +--- + +Building on top of the [entity structure](/api/flow/the-graph/structure) defined earlier, here are some common GraphQL +queries for fetching data from the Sablier subgraph. + +### Recent streams + +```graphql title="The 10 most recent streams" +query getStreams { + streams(first: 10, orderBy: subgraphId, orderDirection: desc) { + id + alias + category + asset { + id + symbol + } + } +} +``` + +### Paginated streams + +To query streams in sets/pages (and avoid edge cases where using timestamps may skip simultaneous batched streams), we +can use the unique `subgraphId`. + +This query includes pagination. + +```graphql title="The next streams indexed before the last seen subgraphId" +query getStreams($first: Int!, $subgraphId: numeric!) { + streams(first: $first, orderBy: subgraphId, orderDirection: desc, where: { subgraphId_lt: $subgraphId }) { + id + alias + category + asset { + id + symbol + } + } +} +``` + +### Streams by sender + +```graphql title="The next streams created by an address" +streams( + first: $first + skip: $skip + orderBy: $subgraphId + orderDirection: desc + where: { + and: [{ sender: $sender }, { subgraphId_lt: $subgraphId }] + } +) { + id + alias + category +} +``` + +### Streams by sender or recipient + +To show all streams that have an address marked as a sender or a recipient, extend the example above to account for the +recipient aspect. + +This query includes pagination. + +```graphql title="The next streams related to an address, as a sender or recipient" +streams( + first: $first + skip: $skip + orderBy: $subgraphId + orderDirection: desc + where: { + or: [ + { and: [{ sender: $sender }, { subgraphId_lt: $subgraphId }] } + { and: [{ recipient: $recipient }, { subgraphId_lt: $subgraphId }] } + ] + } +) { + id + alias + category + } +``` + +### Streams by filters + +The official V2 Interfaces will provide a search interface where one may query for a list of streams using the following +filters (the conditions will be combined) + +- the sender address +- the recipient address +- a list of stream identifiers + +This query includes pagination. + +```graphql title="The 'where' clause for a complex paginated search filter" +where: { + or: [ + { + and: [ + { sender: $sender } + { id_in: $streamIds } + { subgraphId_lt: $subgraphId } + ] + } + { + and: [ + { recipient: $recipient } + { id_in: $streamIds } + { subgraphId_lt: $subgraphId } + ] + } + ] +} +``` + +### Actions by stream + +:::tip + +To avoid writing the same entity definitions over and over again, check out Fragments. + +::: + +```graphql title="Most recent 100 stream actions such as withdrawals or transfers" +actions( + first: 100 + orderBy: subgraphId # Action's subgraph id + orderDirection: desc + where: { stream: $streamId } +) { + id + category + stream { + ...StreamFragment + } +} +``` diff --git a/docs/api/flow/the-graph/_category_.json b/docs/api/flow/the-graph/_category_.json new file mode 100644 index 00000000..d24628e9 --- /dev/null +++ b/docs/api/flow/the-graph/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "The Graph", + "position": 3 +} diff --git a/docs/api/indexers/01-endpoints.mdx b/docs/api/indexers/01-endpoints.mdx deleted file mode 100644 index 9de9eb52..00000000 --- a/docs/api/indexers/01-endpoints.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -id: "endpoints" -sidebar_position: 1 -title: "Endpoints" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -:::tip Chains: Individual vs. Aggregated - -While subgraphs are chain-tethered (one subgraph endpoint per chain), Envio indexes all chains within the same -deployment. The data from all of chains that Sablier is deployed on can be queried from the same place. - -::: - -## Protocol-Envio - -The `protocol-envio` indexer mainly tracks events emitted by the -[`@sablier/v2-core`](/contracts/v2/reference/overview#core) contracts. It deals with core protocol actions like -creating, withdrawing, or transferring streams. - -### Endpoints - -| Chain | Endpoint (Hosted Network) | -| ---------------- | -------------------------------------------------------------------- | -| All-Networks[^1] | [https://indexer.hyperindex.xyz/[...]/v1/graphql][endpoint-protocol] | - -The endpoint is meant to be plugged into a query client. Use -[Hasura's online explorer](https://cloud.hasura.io/public/graphiql?) to view the entities and query API. - -### Code - - - -## Merkle-Envio (Airstreams) - -This subgraph tracks events emitted by the [`@sablier/v2-periphery`](/contracts/v2/reference/overview#periphery) -contracts, specifically the [`Merkle Factory`](/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory). -It deals with airstream-specific actions like the factory creating a campaign, admin clawbacks, or users claiming -streams as defined in the attached Merkle tree. - -[endpoint-protocol]: https://indexer.hyperindex.xyz/53b7e25/v1/graphql - -### Endpoints - -| Chain | Endpoint on the Hosted Network | -| ------------ | ------------------------------------------------------------------ | -| All-Networks | [https://indexer.hyperindex.xyz/[...]/v1/graphql][endpoint-merkle] | - -The endpoint is meant to be plugged into a query client. Use -[Hasura's online explorer](https://cloud.hasura.io/public/graphiql?) to view the entities and query API. - -[endpoint-merkle]: https://indexer.hyperindex.xyz/508d217/v1/graphql - -### Code - - - -[^1]: - All-Networks = most of the networks supported by Sablier, e.g., Mainnet, Optimism, Polygon, Sepolia. The full list - can be found [here](https://github.com/sablier-labs/v2-subgraphs/tree/main/packages/constants/src). To add a new - chain to our Envio indexer, create a new list of contracts (`/addresses`) and import that configuration into our - bundles (see `/bundles`). diff --git a/docs/api/indexers/05-development.mdx b/docs/api/indexers/05-development.mdx deleted file mode 100644 index 19567e3f..00000000 --- a/docs/api/indexers/05-development.mdx +++ /dev/null @@ -1,60 +0,0 @@ ---- -id: "development" -sidebar_position: 5 -title: "Development" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -## Integrating - -To integrate the Sablier V2 indexers into your own product, start from the official `@sablier/v2-subgraphs` repository. -We recommend using: - -- [GraphQL Code Generator](https://the-guild.dev/graphql/codegen/docs/getting-started) to create types from your GraphQL - fragments and queries -- [TanStack Query](https://tanstack.com/query) to fetch results from the exposed endpoints. - -If you're integrated the Sablier V2 subgraphs, we recommend using request and response wrappers/middleware to format -results coming from Envio's indexer in the same shape as those from The Graph. Suggestions: - -1. Write queries in both systems (based on the [querying language specifics](differences#querying-language)) using the - same `operationName` and swap query strings between vendors based on it -2. Write response middleware that converts results into similar shapes (see these [important notes](differences)) - - - -## Contributing - -To contribute to the V2 indexers (Envio x Sablier) or deploy your own, head over to the GitHub -[`v2-subgraphs`](https://github.com/sablier-labs/v2-subgraphs) repository. Get started by reviewing the -`apps/protocol-envio` directory. - -To bootstrap an indexer project, run the following commands. They will install the requisite dependencies and generate -the code for a multi-chain deployment. - -```bash -cd ./packages/core -pnpm install -pnpm run setup - -# OR - -pnpm dev -``` - -You'll find a local Hasura process at `http://localhost:8080` which also includes a `GraphQL` endpoint to query locally. -To deploy without hosting yourself, have a look at the Envio -[Hosted Service](https://docs.envio.dev/docs/hosted-service) docs. - -:::info - -Prior to starting the `Envio` process (`pnpm dev`) please make sure your Docker app is running. For installation see the -official docs at https://docs.envio.dev/. - -::: diff --git a/docs/api/indexers/06-testing.mdx b/docs/api/indexers/06-testing.mdx deleted file mode 100644 index c7b53046..00000000 --- a/docs/api/indexers/06-testing.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: "testing" -sidebar_position: 6 -title: "Testing" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -## Integrating - -To ensure Envio indexers deliver the same data as The Graph's subgraphs, we've written differential tests over our -`merkle` and `protocol` configurations. - -Check them out inside the `apps/[...]/test/` folders. - - - -## Running - -The differentials tests are powered by Jest. Inside `test/setup/constants.ts`, you will find the full configuration for -these tests. This is where you'll also be able to toggle between using the local endpoint (see -[development](/api/indexers/development) to bootstrap a project locally) and the hosted-service one, using the `REMOTE` -flag. - -```bash -pnpm run test -``` - -:::info - -As the set of streams or campaigns grows, the final tests (full coverage over the entire list of elements) may time out. -We suggest either splitting them in chunks or setting a manual limit to the number of iterations the loop can cover at -once. Alternatively, you could also try increasing the timeout of the tests. - -::: diff --git a/docs/api/indexers/merkle/01-entities.mdx b/docs/api/indexers/merkle/01-entities.mdx deleted file mode 100644 index 90cdb549..00000000 --- a/docs/api/indexers/merkle/01-entities.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: "entities" -sidebar_position: 1 -title: "Entities (+)" ---- - -:::info - -For an introduction into the base Sablier primitives and some architectural choices, make sure to check out the -[protocol subgraph](/api/subgraphs/protocol/entities) before reading about the merkle indexer. - -The same (or similar) entities are used throughout both The Graph and Envio setups, as well as protocol and merkle -deployments. - -::: - -## Entity Architecture - -Entities mirror those used inside the `merkle` subgraph. Read more in the -[dedicated section](/api/subgraphs/merkle/entities). - -These are also defined in the `schema.graphql` file of each indexer. diff --git a/docs/api/indexers/merkle/_category_.json b/docs/api/indexers/merkle/_category_.json deleted file mode 100644 index 6cedbfd5..00000000 --- a/docs/api/indexers/merkle/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "collapsed": false, - "label": "Indexer: Merkle-Envio", - "position": 4 -} diff --git a/docs/api/indexers/protocol/01-entities.mdx b/docs/api/indexers/protocol/01-entities.mdx deleted file mode 100644 index dc7cf417..00000000 --- a/docs/api/indexers/protocol/01-entities.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -id: "entities" -sidebar_position: 1 -title: "Entities" ---- - -:::info - -For an introduction into the base Sablier primitives and some architectural choices, make sure to check out the -[protocol subgraph](/api/subgraphs/protocol/entities) before reading about the protocol-envio indexer. - -The same (or similar) entities are used throughout both The Graph and Envio setups, as well as protocol and merkle -deployments. - -::: - -## Entity Architecture - -Entities mirror those used inside the `protocol` subgraph. Read more in the -[dedicated section](/api/subgraphs/protocol/entities). - -These are also defined in the `schema.graphql` file of each indexer. diff --git a/docs/api/indexers/protocol/02-structure.mdx b/docs/api/indexers/protocol/02-structure.mdx deleted file mode 100644 index d90055f6..00000000 --- a/docs/api/indexers/protocol/02-structure.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -id: "structure" -sidebar_position: 2 -title: "Structure" ---- - -The relationships between entities mirror those used inside the `protocol` subgraph. Read more in the -[dedicated section](/api/subgraphs/protocol/structure). diff --git a/docs/api/lockup/01-overview.mdx b/docs/api/lockup/01-overview.mdx new file mode 100644 index 00000000..14dc5000 --- /dev/null +++ b/docs/api/lockup/01-overview.mdx @@ -0,0 +1,29 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Sablier Lockup V1.2 + +Sablier's [Lockup](/concepts/lockup/overview) streams are used for the [vesting](/apps/features/vesting) and some of the +[airdrops](/apps/features/airdrops) functionality of the Sablier Interfaces. + +Lockup-native functionality is powered by: + +- The `@sablier/subgraphs/apps/lockup` subgraph +- The `@sablier/subgraphs/apps/lockup-envio` indexer + + + +#### Naming convention + +As per our endpoint [naming convention](/api/overview#endpoints--slugs), subgraph deployments of Sablier Lockup will +follow the `sablier-v2-*` structure (e.g. `sablier-v2` for Mainnet, `sablier-v2-base` for Base). diff --git a/docs/api/lockup/02-endpoints.mdx b/docs/api/lockup/02-endpoints.mdx new file mode 100644 index 00000000..641f883d --- /dev/null +++ b/docs/api/lockup/02-endpoints.mdx @@ -0,0 +1,212 @@ +--- +id: "endpoints" +sidebar_position: 2 +title: "Endpoints" +--- + +import LinkPreview from "@site/src/components/LinkPreview"; + +# Lockup + +## The Graph + +This subgraph tracks events emitted by the `@sablier/lockup-core` contracts. It deals with base protocol actions like +creating, withdrawing or transferring Lockup streams. + +:::important + +Since The Graph has [sunset](https://thegraph.com/blog/sunsetting-hosted-service/) their Hosted Service we've +transitioned our subgraphs to either the Studio or The Decentralized Network (see +[supported networks](https://thegraph.com/docs/en/developing/supported-networks/) and our endpoints below). + +::: + +### Endpoints + +| Chain | Explorer | Studio[^2] | Decentralized Network[^1] | +| ---------------- | ----------------------------------------------------------- | ------------------------------------ | ------------------------------------------ | +| Ethereum | [sablier-v2][v2-explorer-ethereum] | [Studio][v2-studio-ethereum] | [De. Network][v2-network-ethereum] | +| Arbitrum | [sablier-v2-arbitrum][v2-explorer-arbitrum] | [Studio][v2-studio-arbitrum] | [De. Network][v2-network-arbitrum] | +| Arbitrum Sepolia | [sablier-v2-arbitrum-sepolia][v2-explorer-arbitrum-sepolia] | [Studio][v2-studio-arbitrum-sepolia] | [De. Network][v2-network-arbitrum-sepolia] | +| Avalanche | [sablier-v2-avalanche][v2-explorer-avalanche] | [Studio][v2-studio-avalanche] | [De. Network][v2-network-avalanche] | +| Base | [sablier-v2-base][v2-explorer-base] | [Studio][v2-studio-base] | [De. Network][v2-network-base] | +| Blast | [sablier-v2-blast][v2-explorer-blast] | [Studio][v2-studio-blast] | [De. Network][v2-network-blast] | +| BNB Chain | [sablier-v2-bsc][v2-explorer-bsc] | [Studio][v2-studio-bsc] | [De. Network][v2-network-bsc] | +| Gnosis | [sablier-v2-gnosis][v2-explorer-gnosis] | [Studio][v2-studio-gnosis] | [De. Network][v2-network-gnosis] | +| Lightlink | [sablier-v2-lightlink\*][v2-explorer-lightlink] | N/A | [Lightlink Node\*][v2-custom-lightlink] | +| Optimism | [sablier-v2-optimism][v2-explorer-optimism] | [Studio][v2-studio-optimism] | [De. Network][v2-network-optimism] | +| Optimism Sepolia | [sablier-v2-optimism-sepolia][v2-explorer-optimism-sepolia] | [Studio][v2-studio-optimism-sepolia] | [De. Network][v2-network-optimism-sepolia] | +| Polygon | [sablier-v2-polygon][v2-explorer-polygon] | [Studio][v2-studio-polygon] | [De. Network][v2-network-polygon] | +| Scroll | [sablier-v2-scroll][v2-explorer-scroll] | [Studio][v2-studio-scroll] | [De. Network][v2-network-scroll] | +| Sepolia | [sablier-v2-sepolia][v2-explorer-sepolia] | [Studio][v2-studio-sepolia] | [De. Network][v2-network-sepolia] | +| zkSync | [sablier-v2-zksync][v2-explorer-zksync] | [Studio][v2-studio-zksync] | [De. Network][v2-network-zksync] | + +### Code + + + +## Envio + +:::tip Chains: Individual vs. Aggregated + +While subgraphs are chain-tethered (one subgraph endpoint per chain), Envio indexes all chains within the same +deployment. The data from all of chains that Sablier is deployed on can be queried from the same place. + +::: + +The `lockup-envio` indexer tracks events emitted by the the `@sablier/lockup-core` contracts. It deals with core +protocol actions like creating, withdrawing, or transferring Lockup streams. + +### Endpoints + +| Chain | Endpoint (Hosted Network) | +| ---------------- | ------------------------------------------------------------------ | +| All-Networks[^3] | [https://indexer.hyperindex.xyz/[...]/v1/graphql][endpoint-lockup] | + +The endpoint is meant to be plugged into a query client. Use +[Hasura's online explorer](https://cloud.hasura.io/public/graphiql?) to view the entities and query API. + +### Code + + + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +{/* Chain: Arbitrum */} + +[v2-network-arbitrum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB +[v2-explorer-arbitrum]: https://thegraph.com/explorer/subgraphs/8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB +[v2-studio-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-v2-arbitrum/version/latest + +{/* Chain: Arbitrum Sepolia */} + +[v2-network-arbitrum-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BZYXgTYGe51dy5rW6LhrLN7PWSiAgRQoqSBJEiPpRN9K +[v2-explorer-arbitrum-sepolia]: https://thegraph.com/explorer/subgraphs/BZYXgTYGe51dy5rW6LhrLN7PWSiAgRQoqSBJEiPpRN9K +[v2-studio-arbitrum-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-arbitrum-sepolia/version/latest + +{/* Chain: Avalanche */} + +[v2-network-avalanche]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc +[v2-explorer-avalanche]: https://thegraph.com/explorer/subgraphs/FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc +[v2-studio-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-v2-avalanche/version/latest + +{/* Chain: Base */} + +[v2-network-base]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K +[v2-explorer-base]: https://thegraph.com/explorer/subgraphs/3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K +[v2-studio-base]: https://api.studio.thegraph.com/query/57079/sablier-v2-base/version/latest + +{/* Chain: Blast */} + +[v2-network-blast]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY +[v2-explorer-blast]: https://thegraph.com/explorer/subgraphs/BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY +[v2-studio-blast]: https://api.studio.thegraph.com/query/57079/sablier-v2-blast/version/latest + +{/* Chain: BSC */} + +[v2-network-bsc]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF +[v2-explorer-bsc]: https://thegraph.com/explorer/subgraphs/BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF +[v2-studio-bsc]: https://api.studio.thegraph.com/query/57079/sablier-v2-bsc/version/latest + +{/* Chain: Gnosis */} + +[v2-network-gnosis]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu +[v2-explorer-gnosis]: https://thegraph.com/explorer/subgraphs/EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu +[v2-studio-gnosis]: https://api.studio.thegraph.com/query/57079/sablier-v2-gnosis/version/latest + +{/* Chain: Lightlink */} + +[v2-explorer-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-lightlink/graphql +[v2-custom-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-lightlink + +{/* Chain: Mainnet | Ethereum */} + +[v2-explorer-ethereum]: https://thegraph.com/explorer/subgraphs/EuZZnhFtdCGqN2Zt7EMGYDqQKNrVuhJL63KAfwvF35bL +[v2-studio-ethereum]: https://api.studio.thegraph.com/query/57079/sablier-v2/version/latest +[v2-network-ethereum]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/EuZZnhFtdCGqN2Zt7EMGYDqQKNrVuhJL63KAfwvF35bL + +{/* Chain: Optimism */} + +[v2-network-optimism]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp +[v2-explorer-optimism]: https://thegraph.com/explorer/subgraphs/6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp +[v2-studio-optimism]: https://api.studio.thegraph.com/query/57079/sablier-v2-optimism/version/latest + +{/* Chain: Optimism Sepolia */} + +[v2-network-optimism-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/2a2JpbmBfQs78UEvQYXgweHetcZUPm9zXCjP69o5mTed +[v2-explorer-optimism-sepolia]: https://thegraph.com/explorer/subgraphs/2a2JpbmBfQs78UEvQYXgweHetcZUPm9zXCjP69o5mTed +[v2-studio-optimism-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-optimism-sepolia/version/latest + +{/* Chain: Polygon */} + +[v2-network-polygon]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx +[v2-explorer-polygon]: https://thegraph.com/explorer/subgraphs/CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx +[v2-studio-polygon]: https://api.studio.thegraph.com/query/57079/sablier-v2-polygon/version/latest + +{/* Chain: Scroll */} + +[v2-network-scroll]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh +[v2-explorer-scroll]: https://thegraph.com/explorer/subgraphs/HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh +[v2-studio-scroll]: https://api.studio.thegraph.com/query/57079/sablier-v2-scroll/version/latest + +{/* Chain: Sepolia */} + +[v2-network-sepolia]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3JR9ixhdUxX5oc2Yjr6jkG4XUqDd4guy8niL6AYzDKss +[v2-explorer-sepolia]: https://thegraph.com/explorer/subgraphs/3JR9ixhdUxX5oc2Yjr6jkG4XUqDd4guy8niL6AYzDKss +[v2-studio-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-sepolia/version/latest + +{/* Chain: zkSync */} + +[v2-network-zksync]: + https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY +[v2-explorer-zksync]: https://thegraph.com/explorer/subgraphs/GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY +[v2-studio-zksync]: https://api.studio.thegraph.com/query/57079/sablier-v2-zksync/version/latest + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[endpoint-lockup]: https://indexer.hyperindex.xyz/53b7e25/v1/graphql + +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} +{/* --------------------------------------------------------------------------------------------------------------------------------- */} + +[^1]: + Endpoints could include the following types: (1) The Graph's Decentralized Network (paid) or (2) Custom Nodes (e.g. + Lightlink). Because the "Decentralized Network" subgraph flavors (e.g. V1 Ethereum) operate on The Graph Network, + you will need to substitute the `YOUR_API_KEY` placeholder in the + [Query URL](https://thegraph.com/docs/en/deploying/subgraph-studio-faqs/#6-how-do-i-find-query-urls-for-subgraphs-if-im-not-the-developer-of-the-subgraph-i-want-to-use) + with your own API key. If you require assistance with managing your API keys and configuring indexer preferences, + [this article](https://thegraph.com/docs/en/studio/managing-api-keys/) serves as an excellent guide + +[^2]: The Graph's Studio endpoints are considered for testing purposes and may be rate-limited + +[^3]: + All-Networks means most of the networks supported by Sablier, e.g., Mainnet, Optimism, Polygon, Sepolia. The full + list can be found [here](https://github.com/sablier-labs/subgraphs/blob/main/packages/constants/src). To add a new + chain to our Envio indexer, create a new list of contracts (`/addresses`) and import that configuration into our + bundles (see `/bundles`). diff --git a/docs/api/indexers/_category_.json b/docs/api/lockup/_category_.json similarity index 57% rename from docs/api/indexers/_category_.json rename to docs/api/lockup/_category_.json index 433a19bf..50aff53a 100644 --- a/docs/api/indexers/_category_.json +++ b/docs/api/lockup/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Indexers - Envio", + "label": "Lockup V1.2", "position": 2 } diff --git a/docs/api/lockup/envio/01-similarities.mdx b/docs/api/lockup/envio/01-similarities.mdx new file mode 100644 index 00000000..89595967 --- /dev/null +++ b/docs/api/lockup/envio/01-similarities.mdx @@ -0,0 +1,17 @@ +--- +id: "similarities" +sidebar_position: 1 +title: "Similarities" +--- + +# Similarities + +Envio indexers are designed to mirror the functionality and structure of the The Graph subgraphs. + +For an introduction into the Sablier primitives and our architectural choices, check out the +[Lockup subgraph](/api/lockup/the-graph/entities) before reading about the `lockup-envio` indexer. + +Similar entities are used between The Graph and Envio setups, as well as between the Lockup and Merkle deployments. + +- [Entities](/api/lockup/the-graph/entities) +- [Structure](/api/lockup/the-graph/structure) diff --git a/docs/api/indexers/protocol/03-flow.mdx b/docs/api/lockup/envio/02-architecture.mdx similarity index 83% rename from docs/api/indexers/protocol/03-flow.mdx rename to docs/api/lockup/envio/02-architecture.mdx index 539e21b9..77bfd124 100644 --- a/docs/api/indexers/protocol/03-flow.mdx +++ b/docs/api/lockup/envio/02-architecture.mdx @@ -1,13 +1,13 @@ --- -id: "flow" +id: "architecture" sidebar_position: 3 -title: "Data flow" +title: "Architecture" --- ## Preparations The data flow applied to this indexer is identical to the one used in the -[protocol subgraph](/api/subgraphs/protocol/flow). +[lockup subgraph](/api/lockup/the-graph/architecture). Similar to The Graph, we start by pre-configuring a set of contracts. While Envio's indexer doesn't have the same [requirement](https://discord.com/channels/438038660412342282/438070183794573313/1153155902933831811) of pre-configuring @@ -17,14 +17,16 @@ at start. We'll ensure contracts have been initialized (see the `watcher.ts` helper) by making a call against the initializer at the start of each method. It should only come into play within the create handlers. -```ts title="protocol-envio/src/constants/chains/sepolia.ts" +```ts title="packages/constants/.../sepolia.ts" export let chainId = 11155111; /** It uses the same structure as the configuration files of the subgraphs */ ... ``` After setting up each chain, we'll aggregate configuration to feed into the `config.yaml` all at once, as Envio uses a -multi-chain approach instead of establishing a separate endpoint for each indexed chain. +multi-chain approach instead of establishing a separate endpoint for each indexed chain. Check +[`packages/constants/.../bundles`](https://github.com/sablier-labs/v2-subgraphs/blob/main/packages/constants/src/bundles) +to see how this works. to ## Configurations @@ -46,11 +48,11 @@ booting up the Envio dependencies and local node. Check the official Envio docs Sablier is a fast moving protocol, with a new deployment every few months. Up to this point we can already see V2.0 and V2.1 supported by the client interface and integrators. -To offer a backwards compatible subgraph (between Sablier Core/ Sablier Periphery **v2.0** and **v2.1**) we'll aggregate +To offer a backwards compatible subgraph (between Sablier Core/ Sablier Periphery **v2.0** and **v2.x**) we'll aggregate the ABIs of the two versions. This will cause the configuration file to contain similar events between different versions of Lockup contract. -Different from how we handle this for [subgraphs](/api/subgraphs/protocol/flow), `Lockup Linear`, `Lockup Dynamic` and +Different from how we handle this for [subgraphs](/api/lockup/the-graph/entities), `Lockup Linear`, `Lockup Dynamic` and `Lockup Tranched` will be bundled under the same `Lockup` contract tracker `config.yaml`. Versions of the protocol will be tracked separately, which is why we have `Lockup_V20` (v2.0) and `Lockup_V21` (v2.1) in our configuration. Later on, inside the handler logic, we'll separate contracts by flavor. diff --git a/docs/api/indexers/protocol/04-queries.md b/docs/api/lockup/envio/03-queries.mdx similarity index 89% rename from docs/api/indexers/protocol/04-queries.md rename to docs/api/lockup/envio/03-queries.mdx index b536861f..f1dfb379 100644 --- a/docs/api/indexers/protocol/04-queries.md +++ b/docs/api/lockup/envio/03-queries.mdx @@ -4,14 +4,14 @@ sidebar_position: 4 title: "Queries" --- -Building on top of the [entity structure](/api/indexers/protocol/structure) defined earlier, here are some common -GraphQL queries for fetching data from the Sablier V2 subgraph. +Building on top of the [entity structure](/api/lockup/the-graph/structure) defined earlier, here are some common GraphQL +queries for fetching data from the Sablier subgraph. ### Recent streams ```graphql title="The 10 most recent streams" query getStreams { - stream(limit: 10, order_by: { subgraphId: desc }) { + Stream(limit: 10, distinct_on: [subgraphId], order_by: { subgraphId: desc }) { id alias category @@ -32,7 +32,7 @@ This query includes pagination. ```graphql title="The next streams indexed before the last seen subgraphId" query getStreams($first: Int!, $subgraphId: numeric!) { - streams( + Stream( limit: $first distinct_on: [subgraphId] order_by: { subgraphId: desc } @@ -51,8 +51,8 @@ query getStreams($first: Int!, $subgraphId: numeric!) { ### Streams by sender (with support for the old V2.0) -To support both [proxy senders](/api/subgraphs/protocol/structure) (case 3) and -[native senders](/api/subgraphs/protocol/structure) (case 2) we query for: +To support both [proxy senders](/api/lockup/the-graph/structure) (case 3) and +[native senders](/api/lockup/the-graph/structure) (case 2) we query for: - streams where the connected account is the native sender - streams where the connected account is the proxender - the owner of the proxy labeled as a sender @@ -164,7 +164,7 @@ Action( limit: 100 distinct_on: [subgraphId] order_by: { subgraphId: desc } - where: { stream: {_eq: $streamId} } + where: { stream_id: {_eq: $streamId} } ) { id category diff --git a/docs/api/lockup/envio/_category_.json b/docs/api/lockup/envio/_category_.json new file mode 100644 index 00000000..84b76022 --- /dev/null +++ b/docs/api/lockup/envio/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Envio", + "position": 4 +} diff --git a/docs/api/subgraphs/protocol/01-entities.mdx b/docs/api/lockup/the-graph/01-entities.mdx similarity index 84% rename from docs/api/subgraphs/protocol/01-entities.mdx rename to docs/api/lockup/the-graph/01-entities.mdx index c8978108..d713e225 100644 --- a/docs/api/subgraphs/protocol/01-entities.mdx +++ b/docs/api/lockup/the-graph/01-entities.mdx @@ -6,13 +6,13 @@ title: "Entities" ## Entity Architecture -GraphQL entities defined by the Sablier subgraphs are meant to mirror the functionality exposed by our v2-core +GraphQL entities defined by the Sablier subgraphs are meant to mirror the functionality exposed by our core lockup contracts. To achieve this, events are stored as historical entries (e.g. Action) while also being used to mutate attributes for live entities (e.g. Stream). -Inside the **protocol** subgraph, the -[`schema.graphql`](https://github.com/sablier-labs/v2-subgraphs/blob/main/apps/protocol/schema.graphql) file is -responsible of defining the following Sablier entities: +Inside the **lockup** subgraph, the +[`schema.graphql`](https://github.com/sablier-labs/subgraphs/blob/main/apps/lockup/schema.graphql) file is responsible +of defining the following Sablier entities: ### Primary @@ -29,6 +29,6 @@ responsible of defining the following Sablier entities: | Entity | Description | | ------- | --------------------------------------------------------------------------------------------------------------- | -| Batch | An entity grouping a set of stream created all at once (action done through the `v2-periphery`) | +| Batch | An entity grouping a set of stream created all at once (action done through the `lockup-periphery`) | | Batcher | An entity resolving 1:1 to a stream sender, in charge of managing the count of "batches" of streams one creates | | Watcher | A singleton data store for subgraph-level unique indexes such as the stream or action index | diff --git a/docs/api/subgraphs/protocol/02-structure.mdx b/docs/api/lockup/the-graph/02-structure.mdx similarity index 78% rename from docs/api/subgraphs/protocol/02-structure.mdx rename to docs/api/lockup/the-graph/02-structure.mdx index aabbcf38..87d1a0d0 100644 --- a/docs/api/subgraphs/protocol/02-structure.mdx +++ b/docs/api/lockup/the-graph/02-structure.mdx @@ -4,7 +4,7 @@ sidebar_position: 2 title: "Structure" --- -We'll break down the [schema](https://github.com/sablier-labs/v2-subgraphs/blob/main/apps/core/schema.graphql) into +We'll break down the [schema](https://github.com/sablier-labs/subgraphs/blob/main/apps/lockup/schema.graphql) into primary and secondary entities. | Type | Entities | @@ -44,8 +44,8 @@ Based on the schema defined `ActionCategory`, the following actions will be trac To keep all actions under the same umbrella, some details will be stored under general purpose attributes like `amountA`, `amountB`, `addressA`, `addressB` which based on the type of action can be resolved to context-specific values. Am example can be found -[here](https://github.com/sablier-labs/v2-subgraphs/blob/main/apps/protocol/src/mappings/handle-stream.ts#L79-L82) for -the Cancel event. +[here](https://github.com/sablier-labs/subgraphs/blob/main/apps/lockup/src/mappings/handle-stream.ts#L79-L82) for the +Cancel event. --- @@ -79,8 +79,8 @@ in sync, avoid conflicts and regard them as immutable (once decided, never chang ### Aliases -To provide a simple visual structure, while also accounting for future stream types (backwards compatibility) we use the -following abbreviations as aliases: +To provide a simple visual structure, while also accounting for future stream curves (backwards compatibility) we use +the following abbreviations as aliases: - Lockup Linear V2.0 contracts become `LL`, e.g. `LL-137-1` - Lockup Linear V2.1 contracts become `LL2`, e.g. `LL2-137-1` @@ -89,9 +89,9 @@ following abbreviations as aliases: ### Relevant parties -Within the larger Sablier V2 ecosystem, the number of relevant entities participating in a stream (and the dynamics -between them) has grown past the immutable `sender` and `recipient` (as in V1). Therefore, we identify the following -parties involved in a stream. +Within the larger Sablier ecosystem, the number of relevant entities participating in a stream (and the dynamics between +them) has grown past the immutable `sender` and `recipient` (as in V1). Therefore, we identify the following parties +involved in a stream. #### The recipient (gets paid\*) @@ -115,19 +115,19 @@ same entity as the sender. However, there may be cases when someone wishes to cr while also marking them as the sender. In that case, this initial address will be accounted for as the stream's `funder`. -#### The proxender (relevant only for V2.0, deprecated with V2.1+) +#### The proxender (relevant only for Lockup V1.0, deprecated with Lockup V1.1+) :::warning Warning: Deprecated -Sablier V2.0 involved users deploying a "PRBProxy" contract through which they interacted with the Sablier contracts. -With Sablier V2.1+, this is not the case any more as streams are now designed without any proxy contracts. Therefore, -you don't need to worry about `proxenders` and `proxy` if you're not looking to support old versions of the protocol. +Sablier Lockup V1.0 involved users deploying a "PRBProxy" contract through which they interacted with the Sablier +contracts. With LOckup V1.1+, this is not the case any more because no proxy contracts are used anymore. Therefore, if +you're not looking to support old versions of the protocol, you don't need to worry about `proxenders` and `proxy`. ::: -[In V2.0] While not mandatory for the core functionality, Sablier made use of [PRBProxy](https://github.com/paulrberg/prb-proxy) -in its [periphery](https://github.com/sablier-labs/v2-periphery. The official client interfaces provided support for functionality -exposed through both EOAs and this proxy integration, at the same time. +[In V2.0], while not mandatory for the core functionality, Sablier used [PRBProxy](https://github.com/paulrberg/prb-proxy) +in its architecture. The official client interfaces provided support for functionality exposed through both EOAs and this +proxy integration. For streams created within this "extended" ecosystem, a few attributes and entities will change meaning as such: @@ -147,7 +147,7 @@ example #3. :::warning -For Sablier V2.1 and above, you should only rely on the `recipient` and `sender` parties. +For Lockup V1.1 and above, you should only rely on the `recipient` and `sender` parties. ::: @@ -170,16 +170,16 @@ implementation. For examples, see the asset "helper" files inside this subgraph' ## Segment The custom emission curve used by Lockup Dynamic streams will be defined as a sequence of -[segments](/concepts/protocol/segments). This entity will store data regarding those segments, which will be later used -to reconstruct the shape of the curve client side. +[segments](/concepts/lockup/segments). This entity will store data regarding those segments, which will be later used to +reconstruct the shape of the curve client side. --- ## Tranche The custom emission curve used by Lockup Tranched streams will be defined as a sequence of -[tranches](/concepts/protocol/tranches). This entity will store data regarding those tranches, which will be later used -to reconstruct the shape of the curve client side. +[tranches](/concepts/lockup/tranches). This entity will store data regarding those tranches, which will be later used to +reconstruct the shape of the curve client side. :::tip @@ -192,10 +192,10 @@ artificially creating segments from tranches. ## Batch and Batcher -The v2-periphery, while not explicitly tracked by the subgraph will offer some extra functionality to proxy-sourced +The lockup-periphery, while not explicitly tracked by the subgraph will offer some extra functionality to proxy-sourced streams. One of these functionalities will be **batch stream creation** (or **stream grouping**). Using methods like -[`batchCreateWithRange`](https://github.com/sablier-labs/v2-periphery/blob/main/src/SablierV2ProxyTarget.sol) or -`batchCreateWithDeltas` a sender will be able to create multiple streams at once - considered part of the same batch. +`createWithDurations` or `createWithTimestamps` a sender will be able to create multiple streams at once - considered +part of the same batch. To identify these relationships between stream items, the `Batch` entity will group items created in the same transaction, by finding events emitted with the same tx hash. The `Batcher` will then assign a user-specific unique diff --git a/docs/api/subgraphs/protocol/03-flow.mdx b/docs/api/lockup/the-graph/03-architecture.mdx similarity index 89% rename from docs/api/subgraphs/protocol/03-flow.mdx rename to docs/api/lockup/the-graph/03-architecture.mdx index 789d385e..8a232b42 100644 --- a/docs/api/subgraphs/protocol/03-flow.mdx +++ b/docs/api/lockup/the-graph/03-architecture.mdx @@ -1,21 +1,20 @@ --- -id: "flow" +id: "architecture" sidebar_position: 3 -title: "Data flow" +title: "Architecture" --- ## Preparations -In order to start indexing all whitelisted Lockup contracts we need a genesis event. With Sablier V2, there is no +In order to start indexing all whitelisted Lockup contracts we need a genesis event. With Sablier Lockup, there is no factory pattern so we couldn't rely on a [data source](https://thegraph.com/docs/en/developing/creating-a-subgraph/#data-source-templates) contract. The next best things for a "genesis" point was to rely on the first event triggered by the earliest registered onchain contract To reduce the number of dependencies required to kickstart a subgraph, we chose to rely on this approach instead of -implementing a separate registry contract. Therefore, when setting up a deployment, you'll need to follow a few -[rules](https://github.com/sablier-labs/v2-subgraphs/blob/main/apps/protocol/src/constants/chains/sepolia.ts). +implementing a separate registry contract. Therefore, when setting up a deployment, you'll need to follow a few rules. -```ts title="protocol/src/constants/chains/sepolia.ts" +```ts title="packages/constants/.../sepolia.ts" export let chainId = 11155111; export let chain = "sepolia"; export let startBlock = 4067889; @@ -70,7 +69,7 @@ Using this data, we'll call the `yarn deploy:` script. In turn it wi Sablier is a fast moving protocol, with a new deployment every few months. Up to this point we can already see V2.0 and V2.1 supported by the client interface and integrators. -To offer a backwards compatible subgraph (between Sablier Core/ Sablier Periphery **v2.0** and **v2.1**) we'll aggregate +To offer a backwards compatible subgraph (between Sablier Core/ Sablier Periphery **v2.0** and **v2.x**) we'll aggregate the ABIs of the two versions. This will cause the Lockup Linear and Dynamic ABIs to contain multiple events with the same name, but different signatures (due to event parameters). diff --git a/docs/api/subgraphs/protocol/04-queries.md b/docs/api/lockup/the-graph/04-queries.md similarity index 83% rename from docs/api/subgraphs/protocol/04-queries.md rename to docs/api/lockup/the-graph/04-queries.md index d301238a..38aec8e0 100644 --- a/docs/api/subgraphs/protocol/04-queries.md +++ b/docs/api/lockup/the-graph/04-queries.md @@ -4,8 +4,8 @@ sidebar_position: 4 title: "Queries" --- -Building on top of the [entity structure](/api/subgraphs/protocol/structure) defined earlier, here are some common -GraphQL queries for fetching data from the Sablier V2 subgraph. +Building on top of the [entity structure](/api/lockup/the-graph/structure) defined earlier, here are some common GraphQL +queries for fetching data from the Sablier subgraph. ### Recent streams @@ -46,30 +46,14 @@ query getStreams($first: Int!, $subgraphId: numeric!) { ### Streams by sender (with support for the old V2.0) -To support both [proxy senders](/api/subgraphs/protocol/structure) (case 3) and -[native senders](/api/subgraphs/protocol/structure) (case 2) we query for: +To support both [proxy senders](/api/lockup/the-graph/structure) (case 3) and +[native senders](/api/lockup/the-graph/structure) (case 2) we query for: - streams where the connected account is the native sender - streams where the connected account is the proxender - the owner of the proxy labeled as a sender This query includes pagination. -```graphql title="The next streams indexed before the last seen subgraphId" -query getStreams($first: Int!, $skip: Int!, $subgraphId: BigInt!) { - streams( - first: $first - skip: $skip - orderBy: $subgraphId - orderDirection: desc - where: { subgraphId_lt: $subgraphId } - ) { - id - alias - category - } -} -``` - ```graphql title="The next streams created by an address (natively or through a proxy)" streams( first: $first diff --git a/docs/api/lockup/the-graph/_category_.json b/docs/api/lockup/the-graph/_category_.json new file mode 100644 index 00000000..d24628e9 --- /dev/null +++ b/docs/api/lockup/the-graph/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "The Graph", + "position": 3 +} diff --git a/docs/api/merkle-api/04-development.mdx b/docs/api/merkle-api/04-development.mdx deleted file mode 100644 index 33cfda78..00000000 --- a/docs/api/merkle-api/04-development.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -id: "development" -sidebar_position: 4 -title: "Development" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -## Integrating - -To integrate the Sablier V2 Merkle API into your own product, start from the official `@sablier/v2-merkle-api` -repository. We recommend using: - - - -## Contributing - -To contribute to the V2 Merkle API or deploy your own, head over to the GitHub -[`v2-merkle-api`](https://github.com/sablier-labs/v2-merkle-api) repository. Get started by reviewing the `controllers` -directory. - -## Running an instance - -### Locally - -In order to make the API work properly, you will need to create a `.env` file by following the `.env.example` file: - -```text -PINATA_ACCESS_TOKEN= -PINATA_API_KEY= -PINATA_API_SERVER= -PINATA_SECRET_API_KEY= -IPFS_GATEWAY= -``` - -After a campaign is created via the API, we use Pinata to upload and pin the file to IPFS. In order to obtain the -`PINATA_API_KEY`, `PINATA_SECRET_API_KEY` and `PINATA_ACCESS_TOKEN`, follow these steps: - -1. Sign up or log in on https://app.pinata.cloud/ -1. Select the API Keys tab -1. Select New Key -1. The key should have the permissions `pinFileToIPFS` and `pinJSONToIPFS` -1. Set a name for the key -1. Click Create Key -1. From the popup, take the API Key and the API Secret and put them in the `.env` file. The `IPFS_GATEWAY` variable can - be any IPFS gateway but we recommend using a private one (Pinata offers this as well). For more details about the - interactions with IPFS, check - [`src/services/ipfs.rs`](https://github.com/sablier-labs/v2-merkle-api/blob/main/src/services/ipfs.rs). -1. Select the "Access Controls" tab -1. Click on the "Request Token" button -1. Copy the token and put in th `.env` file in the `PINATA_ACCESS_TOKEN` variable - -Simulate the cloud environment by finally running: - -```sh -$ cargo run --bin sablier_merkle_api -``` - -This command will run a standard web API and expose it on port 3000 on localhost. - -### Vercel - -We use Vercel for hosting, and this is why we have separate binaries for each endpoint. For local development, use this -command: - -```sh -$ vercel dev -``` - -This command will run a standard web API and expose it on port 3000 on localhost. - -If you wish to deploy your backend to vercel, check the official -[Github Actions](https://github.com/sablier-labs/v2-merkle-api/blob/main/.github/workflows/deploy-merkle-api.yml) -workflow for deploying. Rust is supported through Vercel's [`rust runtime`](https://github.com/vercel-community/rust). diff --git a/docs/api/merkle-api/_category_.json b/docs/api/merkle-api/_category_.json deleted file mode 100644 index 03420cc2..00000000 --- a/docs/api/merkle-api/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "collapsed": false, - "label": "Merkle API - Airstreams", - "position": 4 -} diff --git a/docs/api/subgraphs/01-endpoints.mdx b/docs/api/subgraphs/01-endpoints.mdx deleted file mode 100644 index ba3d8c26..00000000 --- a/docs/api/subgraphs/01-endpoints.mdx +++ /dev/null @@ -1,377 +0,0 @@ ---- -id: "endpoints" -sidebar_position: 1 -title: "Endpoints" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -## Sablier V2 - Protocol - -This subgraph tracks events mainly emitted by the [`@sablier/v2-core`](/contracts/v2/reference/overview#core) contracts. -It deals with core protocol actions like creating, withdrawing or transferring streams. - -:::important - -Since The Graph is [sunsetting](https://thegraph.com/blog/sunsetting-hosted-service/) their Hosted Service we've -transitioned our subgraphs to either the Studio or The Decentralized Network (see -[supported networks](https://thegraph.com/docs/en/developing/supported-networks/) and our endpoints below). - -::: - -### Endpoints - -| Chain | Explorer | Studio[^2] | Decentralized Network[^1] | -| ---------------- | ----------------------------------------------------------- | ------------------------------------ | ------------------------------------------ | -| Ethereum | [sablier-v2][v2-explorer-ethereum] | [Studio][v2-studio-ethereum] | [De. Network][v2-network-ethereum] | -| Arbitrum | [sablier-v2-arbitrum][v2-explorer-arbitrum] | [Studio][v2-studio-arbitrum] | [De. Network][v2-network-arbitrum] | -| Arbitrum Sepolia | [sablier-v2-arbitrum-sepolia][v2-explorer-arbitrum-sepolia] | [Studio][v2-studio-arbitrum-sepolia] | [De. Network][v2-network-arbitrum-sepolia] | -| Avalanche | [sablier-v2-avalanche][v2-explorer-avalanche] | [Studio][v2-studio-avalanche] | [De. Network][v2-network-avalanche] | -| Base | [sablier-v2-base][v2-explorer-base] | [Studio][v2-studio-base] | [De. Network][v2-network-base] | -| Blast | [sablier-v2-blast][v2-explorer-blast] | [Studio][v2-studio-blast] | [De. Network][v2-network-blast] | -| BNB Chain | [sablier-v2-bsc][v2-explorer-bsc] | [Studio][v2-studio-bsc] | [De. Network][v2-network-bsc] | -| Gnosis | [sablier-v2-gnosis][v2-explorer-gnosis] | [Studio][v2-studio-gnosis] | [De. Network][v2-network-gnosis] | -| Lightlink | [sablier-v2-lightlink\*][v2-explorer-lightlink] | N/A | [Lightlink Node\*][v2-custom-lightlink] | -| Optimism | [sablier-v2-optimism][v2-explorer-optimism] | [Studio][v2-studio-optimism] | [De. Network][v2-network-optimism] | -| Optimism Sepolia | [sablier-v2-optimism-sepolia][v2-explorer-optimism-sepolia] | [Studio][v2-studio-optimism-sepolia] | [De. Network][v2-network-optimism-sepolia] | -| Polygon | [sablier-v2-polygon][v2-explorer-polygon] | [Studio][v2-studio-polygon] | [De. Network][v2-network-polygon] | -| Scroll | [sablier-v2-scroll][v2-explorer-scroll] | [Studio][v2-studio-scroll] | [De. Network][v2-network-scroll] | -| Sepolia | [sablier-v2-sepolia][v2-explorer-sepolia] | [Studio][v2-studio-sepolia] | [De. Network][v2-network-sepolia] | -| zkSync | [sablier-v2-zksync][v2-explorer-zksync] | [Studio][v2-studio-zksync] | [De. Network][v2-network-zksync] | -| Mode | [sablier-v2-mode][v2-explorer-mode] | [Studio][v2-studio-mode] | [De. Network][v2-network-mode] | -| Linea | [sablier-v2-linea][v2-explorer-linea] | [Studio][v2-studio-linea] | [De. Network][v2-network-linea] | - -{/* Chain: Arbitrum */} - -[v2-network-arbitrum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB -[v2-explorer-arbitrum]: https://thegraph.com/explorer/subgraphs/8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB -[v2-studio-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-v2-arbitrum/version/latest - -{/* Chain: Arbitrum Sepolia */} - -[v2-network-arbitrum-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BZYXgTYGe51dy5rW6LhrLN7PWSiAgRQoqSBJEiPpRN9K -[v2-explorer-arbitrum-sepolia]: https://thegraph.com/explorer/subgraphs/BZYXgTYGe51dy5rW6LhrLN7PWSiAgRQoqSBJEiPpRN9K -[v2-studio-arbitrum-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-arbitrum-sepolia/version/latest - -{/* Chain: Avalanche */} - -[v2-network-avalanche]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc -[v2-explorer-avalanche]: https://thegraph.com/explorer/subgraphs/FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc -[v2-studio-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-v2-avalanche/version/latest - -{/* Chain: Base */} - -[v2-network-base]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K -[v2-explorer-base]: https://thegraph.com/explorer/subgraphs/3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K -[v2-studio-base]: https://api.studio.thegraph.com/query/57079/sablier-v2-base/version/latest - -{/* Chain: Blast */} - -[v2-network-blast]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY -[v2-explorer-blast]: https://thegraph.com/explorer/subgraphs/BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY -[v2-studio-blast]: https://api.studio.thegraph.com/query/57079/sablier-v2-blast/version/latest - -{/* Chain: BSC */} - -[v2-network-bsc]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF -[v2-explorer-bsc]: https://thegraph.com/explorer/subgraphs/BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF -[v2-studio-bsc]: https://api.studio.thegraph.com/query/57079/sablier-v2-bsc/version/latest - -{/* Chain: Gnosis */} - -[v2-network-gnosis]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu -[v2-explorer-gnosis]: https://thegraph.com/explorer/subgraphs/EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu -[v2-studio-gnosis]: https://api.studio.thegraph.com/query/57079/sablier-v2-gnosis/version/latest - -{/* Chain: Lightlink */} - -[v2-explorer-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-lightlink/graphql -[v2-custom-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-lightlink - -{/* Chain: Mainnet | Ethereum */} - -[v2-explorer-ethereum]: https://thegraph.com/explorer/subgraphs/EuZZnhFtdCGqN2Zt7EMGYDqQKNrVuhJL63KAfwvF35bL -[v2-studio-ethereum]: https://api.studio.thegraph.com/query/57079/sablier-v2/version/latest -[v2-network-ethereum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/EuZZnhFtdCGqN2Zt7EMGYDqQKNrVuhJL63KAfwvF35bL - -{/* Chain: Optimism */} - -[v2-network-optimism]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp -[v2-explorer-optimism]: https://thegraph.com/explorer/subgraphs/6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp -[v2-studio-optimism]: https://api.studio.thegraph.com/query/57079/sablier-v2-optimism/version/latest - -{/* Chain: Optimism Sepolia */} - -[v2-network-optimism-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/2a2JpbmBfQs78UEvQYXgweHetcZUPm9zXCjP69o5mTed -[v2-explorer-optimism-sepolia]: https://thegraph.com/explorer/subgraphs/2a2JpbmBfQs78UEvQYXgweHetcZUPm9zXCjP69o5mTed -[v2-studio-optimism-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-optimism-sepolia/version/latest - -{/* Chain: Polygon */} - -[v2-network-polygon]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx -[v2-explorer-polygon]: https://thegraph.com/explorer/subgraphs/CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx -[v2-studio-polygon]: https://api.studio.thegraph.com/query/57079/sablier-v2-polygon/version/latest - -{/* Chain: Scroll */} - -[v2-network-scroll]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh -[v2-explorer-scroll]: https://thegraph.com/explorer/subgraphs/HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh -[v2-studio-scroll]: https://api.studio.thegraph.com/query/57079/sablier-v2-scroll/version/latest - -{/* Chain: Sepolia */} - -[v2-network-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3JR9ixhdUxX5oc2Yjr6jkG4XUqDd4guy8niL6AYzDKss -[v2-explorer-sepolia]: https://thegraph.com/explorer/subgraphs/3JR9ixhdUxX5oc2Yjr6jkG4XUqDd4guy8niL6AYzDKss -[v2-studio-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-sepolia/version/latest - -{/* Chain: zkSync */} - -[v2-network-zksync]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY -[v2-explorer-zksync]: https://thegraph.com/explorer/subgraphs/GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY -[v2-studio-zksync]: https://api.studio.thegraph.com/query/57079/sablier-v2-zksync/version/latest - -{/* Chain: Mode */} - -[v2-network-mode]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/5ezGnVwNucVTW45WCb91VBiKBEdiqT4ceHDhh1KGigYG -[v2-explorer-mode]: https://thegraph.com/explorer/subgraphs/5ezGnVwNucVTW45WCb91VBiKBEdiqT4ceHDhh1KGigYG -[v2-studio-mode]: https://api.studio.thegraph.com/query/57079/sablier-v2-mode/version/latest - -{/* Chain: Linea */} - -[v2-network-linea]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FoJnatzCZKyp9XjZyUBaw1juTb5ydnFvJvWUxS3oRCHZ -[v2-explorer-linea]: https://thegraph.com/explorer/subgraphs/FoJnatzCZKyp9XjZyUBaw1juTb5ydnFvJvWUxS3oRCHZ -[v2-studio-linea]: https://api.studio.thegraph.com/query/57079/sablier-v2-linea/version/latest - -### Code - - - -## Sablier V2 - Airstreams - -This subgraph tracks the events emitted by the [`@sablier/v2-periphery`](/contracts/v2/reference/overview#periphery) -contracts, specifically [`MerkleFactory`](/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory). It -deals with airstream-specific actions like the factory creating a campaign, admin clawbacks, or users claiming stream -NFTs as defined in the attached Merkle tree. - -### Endpoints - -| Chain | Explorer | Studio[^2] | Decentralized Network[^1] | -| ---------------- | ----------------------------------------------------------------- | --------------------------------------- | --------------------------------------------- | -| Ethereum | [sablier-v2-ms][v2-explorer-ms-ethereum] | [Studio][v2-studio-ms-ethereum] | [De. Network][v2-network-ms-ethereum] | -| Arbitrum | [sablier-v2-ms-arbitrum][v2-explorer-ms-arbitrum] | [Studio][v2-studio-ms-arbitrum] | [De. Network][v2-network-ms-arbitrum] | -| Arbitrum Sepolia | [sablier-v2-ms-arbitrum-sepolia][v2-explorer-ms-arbitrum-sepolia] | [Studio][v2-studio-ms-arbitrum-sepolia] | [De. Network][v2-network-ms-arbitrum-sepolia] | -| Avalanche | [sablier-v2-ms-avalanche][v2-explorer-ms-avalanche] | [Studio][v2-studio-ms-avalanche] | [De. Network][v2-network-ms-avalanche] | -| Base | [sablier-v2-ms-base][v2-explorer-ms-base] | [Studio][v2-studio-ms-base] | [De. Network][v2-network-ms-base] | -| Blast | [sablier-v2-ms-blast][v2-explorer-ms-blast] | [Studio][v2-studio-ms-blast] | [De. Network][v2-network-ms-blast] | -| BNB Chain | [sablier-v2-ms-bsc][v2-explorer-ms-bsc] | [Studio][v2-studio-ms-bsc] | [De. Network][v2-network-ms-bsc] | -| Gnosis | [sablier-v2-ms-gnosis][v2-explorer-ms-gnosis] | [Studio][v2-studio-ms-gnosis] | [De. Network][v2-network-ms-gnosis] | -| Lightlink | [sablier-v2-ms-lightlink\*][v2-explorer-ms-lightlink] | N/A | [Lightlink Node\*][v2-custom-ms-lightlink] | -| Optimism | [sablier-v2-ms-optimism][v2-explorer-ms-optimism] | [Studio][v2-studio-ms-optimism] | [De. Network][v2-network-ms-optimism] | -| Optimism Sepolia | [sablier-v2-ms-optimism-sepolia][v2-explorer-ms-optimism-sepolia] | [Studio][v2-studio-ms-optimism-sepolia] | [De. Network][v2-network-ms-optimism-sepolia] | -| Polygon | [sablier-v2-ms-polygon][v2-explorer-ms-polygon] | [Studio][v2-studio-ms-polygon] | [De. Network][v2-network-ms-polygon] | -| Scroll | [sablier-v2-ms-scroll][v2-explorer-ms-scroll] | [Studio][v2-studio-ms-scroll] | [De. Network][v2-network-ms-scroll] | -| Sepolia | [sablier-v2-ms-sepolia][v2-explorer-ms-sepolia] | [Studio][v2-studio-ms-sepolia] | [De. Network][v2-network-ms-sepolia] | -| zkSync | [sablier-v2-ms-zksync][v2-explorer-ms-zksync] | [Studio][v2-studio-ms-zksync] | [De. Network][v2-network-ms-zksync] | -| Mode | [sablier-v2-ms-mode][v2-explorer-ms-mode] | [Studio][v2-studio-ms-mode] | [De. Network][v2-network-ms-mode] | -| Linea | [sablier-v2-ms-linea][v2-explorer-ms-linea] | [Studio][v2-studio-ms-linea] | [De. Network][v2-network-ms-linea] | - -{/* Chain: Arbitrum */} - -[v2-network-ms-arbitrum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CPCMKbUFEM8CzVbfic1y34qKbTrKADX9Du9QxsAMAwqU -[v2-explorer-ms-arbitrum]: https://thegraph.com/explorer/subgraphs/CPCMKbUFEM8CzVbfic1y34qKbTrKADX9Du9QxsAMAwqU -[v2-studio-ms-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-arbitrum/version/latest - -{/* Chain: Arbitrum Sepolia */} - -[v2-network-ms-arbitrum-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BBJgy9RANbViGedeWTrVpH2bwm22E3niEzWcqHPMGtna -[v2-explorer-ms-arbitrum-sepolia]: https://thegraph.com/explorer/subgraphs/BBJgy9RANbViGedeWTrVpH2bwm22E3niEzWcqHPMGtna -[v2-studio-ms-arbitrum-sepolia]: - https://api.studio.thegraph.com/query/57079/sablier-v2-ms-arbitrum-sepolia/version/latest - -{/* Chain: Avalanche */} - -[v2-network-ms-avalanche]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/2beDuAvmwbyFzJ95HAwfqNjnYT6nEnzbEfSNhfWGMyhJ -[v2-explorer-ms-avalanche]: https://thegraph.com/explorer/subgraphs/2beDuAvmwbyFzJ95HAwfqNjnYT6nEnzbEfSNhfWGMyhJ -[v2-studio-ms-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-avalanche/version/latest - -{/* Chain: Base */} - -[v2-network-ms-base]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DrfN5cbvcCmpQUSc5RE9T1UxtcnMREi1Rd2PgLzDZCo3 -[v2-explorer-ms-base]: https://thegraph.com/explorer/subgraphs/DrfN5cbvcCmpQUSc5RE9T1UxtcnMREi1Rd2PgLzDZCo3 -[v2-studio-ms-base]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-base/version/latest - -{/* Chain: Blast */} - -[v2-network-ms-blast]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/HVqkPvCRAvbxjx6YVmkk6w6rHPrqqtiymcGiQiMKPw8f -[v2-explorer-ms-blast]: https://thegraph.com/explorer/subgraphs/HVqkPvCRAvbxjx6YVmkk6w6rHPrqqtiymcGiQiMKPw8f -[v2-studio-ms-blast]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-blast/version/latest - -{/* Chain: BSC */} - -[v2-network-ms-bsc]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8uU9qAw9fSzdjqebymGRXWCjtZ5DQCmUA6QzRA14ARpz -[v2-explorer-ms-bsc]: https://thegraph.com/explorer/subgraphs/8uU9qAw9fSzdjqebymGRXWCjtZ5DQCmUA6QzRA14ARpz -[v2-studio-ms-bsc]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-bsc/version/latest - -{/* Chain: Gnosis */} - -[v2-network-ms-gnosis]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FViBHgu2TtaZZXspDBzACjuPYKtqVDysmH35pk3W3zJJ -[v2-explorer-ms-gnosis]: https://thegraph.com/explorer/subgraphs/FViBHgu2TtaZZXspDBzACjuPYKtqVDysmH35pk3W3zJJ -[v2-studio-ms-gnosis]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-gnosis/version/latest - -{/* Chain: Lightlink */} - -[v2-explorer-ms-lightlink]: - https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-ms-lightlink/graphql -[v2-custom-ms-lightlink]: https://graph.phoenix.lightlink.io/query/subgraphs/name/lightlink/sablier-v2-ms-lightlink - -{/* Chain: Mainnet | Ethereum */} - -[v2-explorer-ms-ethereum]: https://thegraph.com/explorer/subgraphs/FigCYTmdPtXbf4tgNiy5ZrtnYefz92hsMcwM4f9N5ZeZ -[v2-studio-ms-ethereum]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms/version/latest -[v2-network-ms-ethereum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/FigCYTmdPtXbf4tgNiy5ZrtnYefz92hsMcwM4f9N5ZeZ - -{/* Chain: Optimism */} - -[v2-network-ms-optimism]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/7iSmF69W4mQqtx6EfWXXn5s27Hrdh72etsPKVC9iE62U -[v2-explorer-ms-optimism]: https://thegraph.com/explorer/subgraphs/7iSmF69W4mQqtx6EfWXXn5s27Hrdh72etsPKVC9iE62U -[v2-studio-ms-optimism]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-optimism/version/latest - -{/* Chain: Optimism Sepolia */} - -[v2-network-ms-optimism-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/CG5QddHKoABuN6KHZHYTHL7upg2iPTMYxi35Ey7jspkX -[v2-explorer-ms-optimism-sepolia]: https://thegraph.com/explorer/subgraphs/CG5QddHKoABuN6KHZHYTHL7upg2iPTMYxi35Ey7jspkX -[v2-studio-ms-optimism-sepolia]: - https://api.studio.thegraph.com/query/57079/sablier-v2-ms-optimism-sepolia/version/latest - -{/* Chain: Polygon */} - -[v2-network-ms-polygon]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/4r2pC3iyLbzytNa5phat3SWdMEyXG8fmnf1K89D7zP2G -[v2-explorer-ms-polygon]: https://thegraph.com/explorer/subgraphs/4r2pC3iyLbzytNa5phat3SWdMEyXG8fmnf1K89D7zP2G -[v2-studio-ms-polygon]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-polygon/version/latest - -{/* Chain: Scroll */} - -[v2-network-ms-scroll]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/F1QnrgBpsVKtiVzkLisEC2PDo6cjzLoAy5HhPdFRdjW -[v2-explorer-ms-scroll]: https://thegraph.com/explorer/subgraphs/F1QnrgBpsVKtiVzkLisEC2PDo6cjzLoAy5HhPdFRdjW -[v2-studio-ms-scroll]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-scroll/version/latest - -{/* Chain: Sepolia */} - -[v2-network-ms-sepolia]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/8UVeHt7rHA27XZhViugaW4nStiN332dHTDWVTNBLCqPc -[v2-explorer-ms-sepolia]: https://thegraph.com/explorer/subgraphs/8UVeHt7rHA27XZhViugaW4nStiN332dHTDWVTNBLCqPc -[v2-studio-ms-sepolia]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-sepolia/version/latest - -{/* Chain: zkSync */} - -[v2-network-ms-zksync]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BboiKY7JCdznoqurdXRizL9UYD1YdQKajaj4gvUrPPEA -[v2-explorer-ms-zksync]: https://thegraph.com/explorer/subgraphs/BboiKY7JCdznoqurdXRizL9UYD1YdQKajaj4gvUrPPEA -[v2-studio-ms-zksync]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-zksync/version/latest - -{/* Chain: Mode */} - -[v2-network-ms-mode]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/4Vt5DdffTwYyeoJYBQ9hwgjaTY2ygG11iRMaAH66pxCr -[v2-explorer-ms-mode]: https://thegraph.com/explorer/subgraphs/4Vt5DdffTwYyeoJYBQ9hwgjaTY2ygG11iRMaAH66pxCr -[v2-studio-ms-mode]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-mode/version/latest - -{/* Chain: Linea */} - -[v2-network-ms-linea]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/D7T8YEoYGgyufRQ9889kqFSh17AutDA6ohE59fTg7Bdb -[v2-explorer-ms-linea]: https://thegraph.com/explorer/subgraphs/D7T8YEoYGgyufRQ9889kqFSh17AutDA6ohE59fTg7Bdb -[v2-studio-ms-linea]: https://api.studio.thegraph.com/query/57079/sablier-v2-ms-linea/version/latest - -### Code - - - -## Sablier V1 - -### Endpoints - -| Chain | Id | Studio | Decentralized Network [^1] | -| --------------- | ----------------- | ----------------------------- | ----------------------------------- | -| Ethereum | sablier | [Studio][v1-studio-ethereum] | [De. Network][v1-network-ethereum] | -| Arbitrum | sablier-arbitrum | [Studio][v1-studio-arbitrum] | [De. Network][v1-network-arbitrum] | -| Optimism | sablier-optimism | [Studio][v1-studio-optimism] | [De. Network][v1-network-optimism] | -| Polygon | sablier-matic | [Studio][v1-studio-polygon] | [De. Network][v1-network-polygon] | -| Avalanche | sablier-avalanche | [Studio][v1-studio-avalanche] | [De. Network][v1-network-avalanche] | -| BNB Smart Chain | sablier-bsc | [Studio][v1-studio-bsc] | [De. Network][v1-network-bsc] | - -[v1-network-ethereum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DkSXWkgJD5qVqfsrfzkLC5WELVX3Dbj3ByWcYjDJieCh -[v1-network-arbitrum]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/94SP9QVcxmGV9e2fxuTxUGcZfcv4tjpPCGyyPVyMfLP -[v1-network-optimism]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/BEnQbvBdXnohC1DpM9rSb47C1FbowK39HfPNCEHjgrBt -[v1-network-bsc]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/3Gyy7of99oBRqHcCMGJXpHw2xxxZgXxVmFPFR1vL6YhT -[v1-network-avalanche]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/DK2gHCprwVaytwzwb5fUrkFS9xy7wh66NX6AFcDzMyF9 -[v1-network-polygon]: - https://gateway-arbitrum.network.thegraph.com/api/API_KEY/subgraphs/id/6UMNQfMeh3pV5Qmn2NDX2UKNeUk9kh4oZhzzzn5e8rSz -[v1-studio-arbitrum]: https://api.studio.thegraph.com/query/57079/sablier-arbitrum/version/latest -[v1-studio-avalanche]: https://api.studio.thegraph.com/query/57079/sablier-avalanche/version/latest -[v1-studio-bsc]: https://api.studio.thegraph.com/query/57079/sablier-bsc/version/latest -[v1-studio-ethereum]: https://api.studio.thegraph.com/proxy/30310/sablier/version/latest/ -[v1-studio-optimism]: https://api.studio.thegraph.com/query/57079/sablier-optimism/version/latest -[v1-studio-polygon]: https://api.studio.thegraph.com/query/57079/sablier-polygon/version/latest - -### Code - - - -[^1]: - Endpoints could include: The Graph's Decentralized Network (paid) or Custom Nodes (e.g. Lightlink). Because the - "Decentralized Network" subgraph flavors (e.g. V1 Ethereum) operate on The Graph Network, you will need to - substitute the `YOUR_API_KEY` placeholder in the - [Query URL](https://thegraph.com/docs/en/deploying/subgraph-studio-faqs/#6-how-do-i-find-query-urls-for-subgraphs-if-im-not-the-developer-of-the-subgraph-i-want-to-use) - with your own API key. If you require assistance with managing your API keys and configuring indexer preferences, - [this article](https://thegraph.com/docs/en/studio/managing-api-keys/) serves as an excellent guide - -[^2]: The Graph's Studio endpoints are considered for testing purposes and may be rate-limited diff --git a/docs/api/subgraphs/04-development.mdx b/docs/api/subgraphs/04-development.mdx deleted file mode 100644 index b645ef9e..00000000 --- a/docs/api/subgraphs/04-development.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -id: "development" -sidebar_position: 4 -title: "Development" ---- - -import LinkPreview from "@site/src/components/LinkPreview"; - -## Integrating - -To integrate the Sablier V2 subgraph or indexers into your own product, start from the official `@sablier/v2-subgraphs` -repository. We recommend using: - -- [GraphQL Code Generator](https://the-guild.dev/graphql/codegen/docs/getting-started) to create types from your GraphQL - fragments and queries -- [TanStack Query](https://tanstack.com/query) to fetch results from the exposed endpoints. - - - -## Contributing - -To contribute to the V2 subgraphs or deploy your own, head over to the GitHub -[`v2-subgraphs`](https://github.com/sablier-labs/v2-subgraphs) repository. Get started by reviewing the `apps/protocol` -directory. - -To bootstrap a subgraph project, run the following commands. They will install the requisite dependencies and generate -the code for a Sepolia deployment. - -```bash -cd ./packages/core -yarn install -yarn setup:sepolia -``` - -To deploy a new subgraph on Sepolia: - -1. Create a new item using The Graph's hosted network -2. Add its name/endpoint under the `deploy:sepolia` script in `package.json` -3. Add your own Sablier V2 contract addresses in `../constants/chains/sepolia.ts` -4. Make sure you're [authenticated][the-graph-auth] on your local machine -5. Run `yarn deploy:sepolia` - -You can read more about how the The Graph works in their [official docs][the-graph-docs]. - -To publish on the hosted service: - -1. [Authenticate](https://thegraph.com/docs/en/deploying/hosted-service/) with the hosted service credentials - - ``` - graph auth --product hosted-service - ``` - -2. Generate configuration - - Run `yarn deploy:` to generate imports, configurations and deploy in the same script. - -[the-graph-auth]: https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/#store-the-access-token -[the-graph-docs]: https://thegraph.com/docs/en/ diff --git a/docs/api/subgraphs/_category_.json b/docs/api/subgraphs/_category_.json deleted file mode 100644 index a729c60f..00000000 --- a/docs/api/subgraphs/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "collapsed": false, - "label": "Subgraphs - The Graph", - "position": 1 -} diff --git a/docs/apps/01-overview.mdx b/docs/apps/01-overview.mdx deleted file mode 100644 index 9d63fdad..00000000 --- a/docs/apps/01-overview.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: "overview" -sidebar_position: 1 -title: "Overview" ---- - -# The Sablier Interface - -The best way to interact with the Sablier V2 Protocol is through the official client interface. Visit our landing page -at [sablier.com](https://sablier.com) for a presentation of what the protocol can do, or go directly to -[app.sablier.com](https://app.sablier.com) to create your first stream. - -| [Example stream](https://app.sablier.com/stream/LL2-11155111-3/) | [Create stream](https://app.sablier.com/gallery/) | -| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------ | -| Stream profile | Create stream | - -## Features - -To get a grasp of what's possible with the V2 interface, we've put together a primer on the core features of the -protocol which you can find [here](/apps/features/streams). - -## Guides - -We've created a couple of tutorials and guides to help you interact with the client applications. From creating a stream -to withdrawing or setting up a group of stream with a [Safe multisig](https://safe.global), we've got you covered. - -[Go to guides](/apps/guides/url-schemes) - -## Sablier V1 - -The first version of the Sablier protocol will keep running in perpetuity thanks to the Ethereum blockchain, but the V2 -interface is not compatible with the V1 protocol. We will keep hosting the legacy apps so that you can manage any -streams previously created on V1. - -- Sender interface: [v1-pay.sablier.com](https://v1-pay.sablier.com) -- Recipient interface: [v1-app.sablier.com](https://v1-app.sablier.com) diff --git a/docs/apps/03-branding.mdx b/docs/apps/03-branding.mdx index 95afea93..9d78e863 100644 --- a/docs/apps/03-branding.mdx +++ b/docs/apps/03-branding.mdx @@ -22,4 +22,4 @@ If you have any special requests, reach out on [Discord](https://discord.sablier ### Promo video -[![Introducing Sablier V2](/img/youtube-cover.webp)](https://youtu.be/0XvJ112Jf1k "Introducing Sablier V2") +[![Introducing Sablier Lockup](/img/youtube-cover.webp)](https://youtu.be/0XvJ112Jf1k "Introducing Sablier Lockup") diff --git a/docs/apps/04-legacy-v1.mdx b/docs/apps/04-legacy-v1.mdx new file mode 100644 index 00000000..fe9eb1aa --- /dev/null +++ b/docs/apps/04-legacy-v1.mdx @@ -0,0 +1,14 @@ +--- +id: "v1" +sidebar_position: 4 +title: "Legacy" +--- + +## Sablier Legacy + +The first version of the Sablier protocol will keep running in perpetuity thanks to the Ethereum blockchain, but the +current Sablier Interfaces are not compatible with the Legacy protocol. We will keep hosting the legacy apps so that you +can manage any streams previously created on V1. + +- Sender interface: [v1-pay.sablier.com](https://v1-pay.sablier.com) +- Recipient interface: [v1-app.sablier.com](https://v1-app.sablier.com) diff --git a/docs/apps/features/01-overview.mdx b/docs/apps/features/01-overview.mdx new file mode 100644 index 00000000..a29d0a9c --- /dev/null +++ b/docs/apps/features/01-overview.mdx @@ -0,0 +1,53 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +# The Sablier Interface + +The app has been redesigned from the ground up around Lockup, Flow, Airstreams and the Sablier Protocols as a whole. +Start exploring at [app.sablier.com](https://app.sablier.com) or dive into some of the main features below. + +## Use-case centric + +![Banner Menu](/banner/docs-banner-app-menu.webp) + +As you may have noticed the protocol support two types of streams: + +- Lockup streams - fixed duration, amount required upfront, strict distribution curve +- Flow streams - no end time, amount can be topped-up, rate-per-second can be adjusted + +Therefore, we have mapped Sablier's two underlying protocols to dedicated use-cases our customers may choose them for. +Our approach is to consider: + +| Feature | Underlying System | Reason | +| -------- | -------------------------- | ----------------------------------------------------------------------- | +| Vesting | Sablier Lockup | Well defined rules and strict schedules | +| Payments | Sablier Flow | Adapts with time, less collateral-intensive for senders | +| Airdrops | Sablier Lockup, Airstreams | Instant or vested over time, with pre-configured recipients and amounts | + +However, we invite everyone to use these features without any constraints and adapt them to their own unique use-case. + +## Vesting + +Read about the business use-case on the [dedicated webpage](https://sablier.com/vesting) or dive deeper into the +vesting-related features documented in [this section](/apps/features/vesting). + +## Payments / Payroll + +Read about the business use-case on the [dedicated webpage](https://sablier.com/payroll) or dive deeper into the +vesting-related features documented in [this section](/apps/features/payments). + +## Airdrops / Airstreams + +Regardless of the type (Instant 🔜 or Airstreams) read more about the business use-case on the +[dedicated webpage](https://sablier.com/airdrops) or dive deeper into the vesting-related features documented in +[this section](/apps/features/airdrops). + +## Others + +Given how flexible Sablier is in adapting to any processes involving token distribution, we've also documented the +business case for: + +- Leveraging the protocol to enable [Grants](https://sablier.com/grants) diff --git a/docs/apps/features/01-streams.mdx b/docs/apps/features/01-streams.mdx deleted file mode 100644 index c8421cc5..00000000 --- a/docs/apps/features/01-streams.mdx +++ /dev/null @@ -1,127 +0,0 @@ ---- -id: "streams" -sidebar_position: 1 -title: "Streams" ---- - -# Sablier Streams - -import NFTSVG from "@site/static/img/nft.svg"; - -The Sablier Interface has been redesigned from the ground up to support all the new features of the protocol, and then -some. Start exploring at [app.sablier.com](https://app.sablier.com). - -## Flexible payments - -Almost any payment schedule can be expressed as a stream. Sablier V2 supports multiple options out of the box, -including: - -- Linear -- Cliff-Linear -- Unlock in Steps -- Unlock Monthly -- Timelock -- Unlock-Linear -- Unlock-Dynamic -- Exponential -- Cliff-Exponential - -But programmatically, you can create any schedule you want. See the [Types of Streams](/concepts/protocol/stream-types) -for more details on how we design these shapes. - -| | -| --------------------------------------- | -| ![Gallery](/screenshots/gallery-2.webp) | - -## NFT Representation - -Each stream in wrapped in an ERC-721 non-fungible token (NFT), making the stream recipient the owner of the NFT. - -Thus streams can be transferred, traded, and used as collateral in NFT lending protocols. - -| | -| ----------------------------------- | -| | - -## Dashboard for your streams - -Enter the Dashboard and discover a detailed overview of your incoming and outgoing streams. - -Take advantage of the Search functionality to explore the chain and gain more insight into how others are using Sablier. - -| | | -| --------------------------------------- | --------------------------------------------- | -| ![All](/screenshots/dashboard-all.webp) | ![Search](/screenshots/dashboard-search.webp) | - -## Multi-chain experience - -Streaming, everywhere. We support 8+ EVM chains and testnets where you can stream or get paid using Sablier V2. - -| | -| ------------------------------------------ | -| ![ChainList](/screenshots/chain-list.webp) | - -## Group streams - -Save time by creating up to 60 streams in bulk for your employees, investors, or community members. Use the forms or -upload a CSV! - -| | -| ---------------------------------------- | -| ![Group](/screenshots/create-group.webp) | - -## Support for any ERC-20 token - -Stream your favorite token! Thanks to our integration of Token Lists, any ERC-20 token can be streamed on Sablier. - -| | | -| ----------------------------------------------- | -------------------------------------------------------- | -| ![Token List](/screenshots/tokenlist-home.webp) | ![Token List Search](/screenshots/tokenlist-search.webp) | - -## Simulations - -Eager to see what your chosen distribution will look like? Use our simulation tool right from the create-stream forms -(or later on, from the stream profile). - -![Simulate](/screenshots/simulation.webp) - -## Detailed panels - -Explore each available stream in detail. Simulate future payouts, understand historical events, or simply enjoy cool -representations of a monetized passage of time (NFTs 🔥). - -|
|
| -| :---------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | -| ![Details](/screenshots/details.webp) | ![App](/screenshots/stream-profile.webp) ![Simulate](/screenshots/simulation.webp) ![Preview](/screenshots/preview.webp) | - -## Be in control of your future - -Manage your streams 24/7 as you see fit. The app will guide you through every supported process and help you keep an eye -on your payouts. Remember, you can always be both a sender and a recipient. - -| | | -| --------------------------------------------- | ----------------------------------------- | -| ![Withdraw](/screenshots/cover-withdraw.webp) | ![Cancel](/screenshots/cover-cancel.webp) | - -## Interact with the Sablier contracts - -We've mapped the most important utilities from the V2 contracts into in-app features. Interact with streams that -reference you as a key participant (e.g. sender, recipient) directly from the interfaces. - -| Feature | Sender | Recipient | -| ---------------------- | :----: | :-------: | -| Create Streams | ✅ | ❌ | -| Renounce Cancelability | ✅ | ❌ | -| Cancel | ✅ | ❌ | -| Cancel Multiple | ✅ | ❌ | -| Transfer | ❌ | ✅ | -| Withdraw | ✅ | ✅ | - -## Stream from your Safe multisig - -Sablier is fully integrated with [Safe](https://safe.global). Start streaming from the safety and comfort of your -multisig wallet. - -## Do it with style! - -Yes, the app works on mobile. And yes, we support dark mode by default (light mode coming soon). diff --git a/docs/apps/features/02-airstreams.mdx b/docs/apps/features/02-airstreams.mdx deleted file mode 100644 index ff55840a..00000000 --- a/docs/apps/features/02-airstreams.mdx +++ /dev/null @@ -1,76 +0,0 @@ ---- -id: "airstreams" -sidebar_position: 2 -title: "Airstreams" ---- - -# Sablier Airstreams - -The Sablier Interface can handle more than native streams. We developed a solution for distributing token streams to -millions of users called **Airstreams**. Start exploring at [app.sablier.com](https://app.sablier.com/airstreams/). - -## Easy 3-step process - -Create a campaign by following these three simple steps: - -1. Configure the initial details (e.g., token, cancelability) -2. Upload the CSV containing a list of recipients -3. Deploy and fund the Airstream campaign contract - -| | | -| --------------------------------------------- | -------------------------------------------------------- | -| ![Step 1](/screenshots/airstream-create.webp) | ![Step 2](/screenshots/airstream-create-recipients.webp) | - -:::warning Timezone Caveat - -All the dates and times in the CSV are considered to be in the same timezone as the locales of the airstream creator's -device. - -::: - -:::info - -With the official app, you can distribute up to 50k+ streams per campaign. If you'd like to support more, you can do so -by using a self-hosted [Merkle service](/api/merkle-api/intro). Feel free to get in touch for more details or premium -support. - -::: - -## Dashboard for Airstreams - -Enter the Dashboard and discover a detailed overview of the Airstreams you may be eligible for. - -Take advantage of the Search functionality to explore the chain and gain more insight into how others are using Sablier. - -| | -| --------------------------------------------- | -| ![All](/screenshots/airstream-dashboard.webp) | - -## Support for any ERC-20 token - -Stream your favorite token! Thanks to our integration of Token Lists, any ERC-20 token can be streamed on Sablier. - -| | | -| ----------------------------------------------- | -------------------------------------------------------- | -| ![Token List](/screenshots/tokenlist-home.webp) | ![Token List Search](/screenshots/tokenlist-search.webp) | - -## Oversight - -Have a clear view of how your campaign is performing. Check eligibility or manage your own campaign from a dedicated -interface. - -| | -| ------------------------------------------- | -| ![All](/screenshots/airstream-profile.webp) | - -:::info - -To integrate this functionality into your own products/apps, have a look at the [API guides](/api/overview), especially -the [v2-merkle-api](/api/merkle-api/intro) and the merkle subgraphs. - -::: - -## Advanced Settings - -For campaign admins, the interface enables advanced settings like in-app visibility, in-app geographical restrictions, -and campaign-specific items like an eligibility criteria link. diff --git a/docs/apps/features/02-vesting.mdx b/docs/apps/features/02-vesting.mdx new file mode 100644 index 00000000..1bb0fece --- /dev/null +++ b/docs/apps/features/02-vesting.mdx @@ -0,0 +1,150 @@ +--- +id: "vesting" +sidebar_position: 2 +title: "Vesting" +--- + +# Vesting + +import LockupNFTSVG from "@site/static/img/lockup-nft.svg"; + +The Sablier Interface will showcase [Lockup](/concepts/lockup/overview) streams under the Vesting tab. These are token +streams with a fixed duration, predefined amount and strict distribution curve. + +![Banner Vesting](/banner/docs-banner-vesting.webp) + +In Q4 2024 the app has undergone a use-case centric redesign. For past users, all streams created before this update +will show up in the Vesting page. + +| [Vesting streams](https://app.sablier.com/vesting/gallery) | +| ---------------------------------------------------------------------------------------- | +| Vesting stream profile | + +## Features + +### Flexible curves + +Almost any vesting schedule can be expressed as a stream. Sablier supports multiple options out of the box, including: + +- Linear +- Cliff-Linear +- Unlock in Steps +- Unlock Monthly +- Backweighted +- Timelock +- Unlock-Linear +- Unlock-Dynamic +- Exponential +- Cliff-Exponential + +But programmatically, you can create any schedule you want. See the [Stream Shapes](/concepts/lockup/stream-shapes) for +more details on how we design these shapes. + +### Explore the dashboard + +Enter the Dashboard and discover a detailed overview of your incoming and outgoing streams. + +Take advantage of the Search functionality to explore the chain and gain more insight into how others are using Lockup +for vesting. + +| | +| ------------------------------------------- | +| ![All](/screenshots/vesting-dashboard.webp) | + +### Preview any stream + +Gain insight into any stream. Track progress using our very own stream circle. Share the unique URL with recipients or +anyone really to increase transparency of your day to day token distribution. + +| | +| ----------------------------------------- | +| ![All](/screenshots/vesting-profile.webp) | + +### NFT representation + +Each stream in wrapped in an ERC-721 non-fungible token (NFT), making the stream recipient the owner of the NFT. + +Thus streams can be transferred, traded, and used as collateral in NFT lending protocols. + +| | +| ----------------------------------------- | +| | + +### Multi-chain experience + +Streaming, everywhere. We support 11+ EVM chains and testnets where you can stream or get paid using Sablier. + +| | +| ---------------------------------------------- | +| ![ChainList](/screenshots/general-chains.webp) | + +### Create in batches + +Save time by creating up to 60 streams in bulk for your employees, investors, or community members. Use the forms for a +clean and straightforward UX. + +| | +| ------------------------------------------ | +| ![Group](/screenshots/vesting-create.webp) | + +### Create from CSVs + +Save even more time by using our CSV upload, dedicated to power-users. Under the hood, it works the same as the visual +forms. + +| | +| ---------------------------------------------- | +| ![Group](/screenshots/vesting-create-csv.webp) | + +### Simulations + +Eager to see what your chosen distribution will look like? Use our simulation tool right from the create-stream forms +(or later on, from the stream profile). + +![Simulate](/screenshots/simulation.webp) + +### Detailed panels + +Explore each available stream in detail. Simulate future payouts, understand historical events, or simply enjoy cool +representations of a monetized passage of time (NFTs 🔥). + +### Granular management + +Manage your streams 24/7 as you see fit. The app will guide you through every supported process and help you keep an eye +on your payouts. Remember, you can always be both a sender and a recipient. + +| | | +| --------------------------------------------- | ----------------------------------------- | +| ![Withdraw](/screenshots/cover-withdraw.webp) | ![Cancel](/screenshots/cover-cancel.webp) | + +### Any ERC-20 token + +Stream your favorite token! Thanks to our integration of Token Lists, any ERC-20 token can be streamed on Sablier +Lockup. + +| | | +| ----------------------------------------------- | -------------------------------------------------------- | +| ![Token List](/screenshots/tokenlist-home.webp) | ![Token List Search](/screenshots/tokenlist-search.webp) | + +### Permissions + +We've mapped the most important utilities from the Lockup contracts into in-app features. Interact with streams that +reference you as a key participant (e.g. sender, recipient) directly from the interfaces. + +| Feature | Sender | Recipient | Public | +| ---------------------- | :----: | :-------: | :----: | +| Create Streams | ✅ | - | - | +| Renounce Cancelability | ✅ | ❌ | - | +| Cancel | ✅ | ❌ | - | +| Cancel Multiple | ✅ | ❌ | - | +| Transfer | ❌ | ✅ | - | +| Withdraw | ✅ | ✅ | ✅ | + +### Safe multisig support + +Vesting is fully integrated with [Safe](https://safe.global). Start streaming from the safety and comfort of your +multisig wallet. + +### Mobile-ready layout + +Stream in style! Yes, the app works on mobile. And yes, we support dark mode by default (light mode coming soon). diff --git a/docs/apps/features/03-payments.mdx b/docs/apps/features/03-payments.mdx new file mode 100644 index 00000000..941da6bf --- /dev/null +++ b/docs/apps/features/03-payments.mdx @@ -0,0 +1,88 @@ +--- +id: "payments" +sidebar_position: 3 +title: "Payments" +--- + +The Sablier Interface will showcase [Flow](/concepts/flow/overview) streams under the Payments tab. These are token +streams with a no end-date, an ever increasing amount (can be topped up) and a flexible rate per second. + +![Banner Vesting](/banner/docs-banner-payments.webp) + +## Features + +### Flexible terms + +Increase the rate/second, fund the stream with more assets and keep it alive indefinitely! With Flow streams in the +Payments tab you have the freedom to adapt your distribution schedule based on external KPIs, pivots or executive +decisions. + +### Explore the dashboard + +Enter the Dashboard and discover a detailed overview of your incoming and outgoing flow streams. + +Take advantage of the Search functionality to explore the chain and gain more insight into how others are using Flow for +continuous payments, grants, salaries and more. + +| | +| -------------------------------------------------- | +| ![All](/screenshots/payments-dashboard-split.webp) | + +### Preview any stream + +Gain insight into any stream. Track progress using our very own stream circle. Share the unique URL with recipients or +anyone really to increase transparency of your day to day token distribution. + +| | +| ------------------------------------------ | +| ![All](/screenshots/payments-profile.webp) | + +### NFT representation + +Each stream in wrapped in an ERC-721 non-fungible token (NFT), making the stream recipient the owner of the NFT. + +Thus streams can be transferred, traded, and used as collateral in NFT lending protocols. + +### Multi-chain experience + +Streaming, everywhere. We enable payments on 11+ EVM chains and testnets where you can stream or get paid using Sablier. + +| | +| ---------------------------------------------- | +| ![ChainList](/screenshots/general-chains.webp) | + +### Create in batches + +Save time by creating up to 60 streams in bulk for your employees, investors, or community members. Use the forms for a +clean and straightforward UX. + +### Create from CSVs + +Save even more time by using our CSV upload, dedicated to power-users. Under the hood, it works the same as the visual +forms. + +### Safe multisig support + +Payments are fully integrated with [Safe](https://safe.global). Start streaming from the safety and comfort of your +multisig wallet. + +### Mobile-ready layout + +Stream in style! Yes, the app works on mobile. And yes, we support dark mode by default (light mode coming soon). + +### Permissions + +We've mapped the most important utilities from the Flow contracts into in-app features. Interact with streams that +reference you as a key participant (e.g. sender, recipient) directly from the interfaces. + +| Feature | Sender | Recipient | Public | +| ---------------- | :----: | :-------: | :----: | +| Create Streams | ✅ | ❌ | - | +| Deposit / Top-up | ✅ | - | ✅ | +| Adjust rate | ✅ | ❌ | - | +| Refund | ✅ | ❌ | - | +| Void | ✅ | ✅ | - | +| Pause | ✅ | ❌ | - | +| Restart | ✅ | ❌ | - | +| Transfer | ❌ | ✅ | - | +| Withdraw | ✅ | ✅ | ✅ | diff --git a/docs/apps/features/04-airdrops.mdx b/docs/apps/features/04-airdrops.mdx new file mode 100644 index 00000000..1228fdfa --- /dev/null +++ b/docs/apps/features/04-airdrops.mdx @@ -0,0 +1,121 @@ +--- +id: "airdrops" +sidebar_position: 4 +title: "Airdrops" +--- + +# Airdrops + +The Sablier Interface can handle more than native streams. We developed a solution for distributing token streams to +millions of users called **Airdrops**. Start exploring at [app.sablier.com](https://app.sablier.com/airdrops/) or read +more about it on [sablier.com/airdrops](https://sablier.com/airdrops). + +:::note + +Airdrops allow for millions of recipients to receive an allocation. To see how they differ from +[group streams](/apps/features/vesting#create-in-batches) (~60 streams at once) read our [FAQ](/support/faq). + +::: + +## Airstreams + +![Banner Airstreams](/banner/docs-banner-drops-airstreams.webp) + +**Airdrops should be vested!** + +Here at Sablier we believe in long-term distributions that align incentives. That's why we engineered Airstreams, a +solution which allows you to airdrop streams to a very large number of recipients. + +Pick a vesting curve (e.g. linear or stepper), define the rules (e.g. duration, clawback window) and allow recipients to +claim their allocations as streams. + +## Instant Airdrops (Coming Soon 🔜) + +![Banner Instant Airdrops](/banner/docs-banner-drops-instant.webp) + +For communities that are still looking to distribute value quickly and efficiently, Sablier offers a one-time instant +airdrop solution. This facilitates and easy onboarding of millions of users into the campaign creator's ecosystem, while +exposing everyone to the amazing features our products can offer. + +## Features + +### Create from CSVs + +Pre-generate the list of recipients and drop the file right into our app. We sanitize, validate and triple-check the +data to ensure everything is formatted correctly. + +:::caution Timezone Caveat + +All the dates and times in the CSV are considered to be in the same timezone as the locales of the airstream creator's +device. Visit out [Guide for CSV Support](/apps/guides/csv-support) to read about timezones, date or amount formats and +more. + +::: + +### Easy 3-step process + +Create a campaign by following these three simple steps: + +1. Configure the initial details (e.g., token, cancelability) +2. Upload the CSV containing a list of recipients +3. Deploy and fund the Airstream campaign contract (can be funded later) + +| | +| -------------------------------------------------------- | +| ![Step 1](/screenshots/drops-form-1.webp) | +| ![Step 2](/screenshots/airstream-create-recipients.webp) | + +### Public source + +You can distribute a large number of streams per campaign through our app. If you'd like to support Airdrops in your own +UI or have additional requirements, you can do so by using a self-hosted +[Merkle service](/api/airdrops/merkle-api/overview). Feel free to get in touch for more details or premium support. + +### Explore the dashboard + +Enter the Dashboard and discover a detailed overview of the Airdrops you may be eligible for. + +Take advantage of the Search functionality to explore the chain and gain more insight into how others are using Sablier. + +| | +| -------------------------------------- | +| ![All](/screenshots/drops-search.webp) | + +### Support for any ERC-20 token + +Drop your own token! Thanks to our integration of Token Lists, any ERC-20 token can be airdropped on Sablier. Add your +new token to the community sourced list for instant access, or test first using the token-address and onchain data. + +| | +| ---------------------------------------------- | +| ![ChainList](/screenshots/general-chains.webp) | + +### Oversight + +Have a clear view of how your campaign is performing. Check eligibility or manage your own campaign from a dedicated +interface. + +| | +| ------------------------------------------- | +| ![All](/screenshots/airstream-profile.webp) | + +:::info + +To integrate this functionality into your own products/apps, have a look at the [API guides](/api/overview), especially +the [v2-merkle-api](/api/airdrops/merkle-api/overview) and the Merkle subgraphs. + +::: + +### Advanced Settings + +For campaign admins, the interface enables advanced settings like in-app visibility, in-app geographical restrictions, +and campaign-specific items like an eligibility criteria link. + +| | +| ---------------------------------------- | +| ![All](/screenshots/drops-settings.webp) | + +### Geo-fencing / Geographical Restrictions + +You can choose a set of countries where access to the campaign will be restricted through the Sablier interface +(app.sablier.com). By default, some jurisdictions may already be restricted by the hosting provider or your ISP. diff --git a/docs/apps/features/03-general.mdx b/docs/apps/features/05-generic.mdx similarity index 77% rename from docs/apps/features/03-general.mdx rename to docs/apps/features/05-generic.mdx index 46b7eec1..407da742 100644 --- a/docs/apps/features/03-general.mdx +++ b/docs/apps/features/05-generic.mdx @@ -1,15 +1,15 @@ --- -id: "general" -sidebar_position: 3 -title: "General" +id: "generic" +sidebar_position: 5 +title: "Generic" --- -# General +# Generic features -The Sablier Interface includes a ton of cool features, from small design aspects to popular integrations (e.g. with -Farcaster [Frames](https://docs.farcaster.xyz/learn/what-is-farcaster/frames)). Here are a couple of our favorite ones: +The Sablier Interface includes a ton of smaller (but cool) features, from small design aspects to popular integrations +(e.g. Farcaster [Frames](https://docs.farcaster.xyz/learn/what-is-farcaster/frames)). -## Auto-Generated Preview Images +### Auto-Generated Preview Images For the stars of our show, we generated special preview images based on the qualities of each entity. Share these on social media for an extra bit of glamour. Here's an [example](https://x.com/Sablier/status/1798010170133692730) on X. @@ -19,9 +19,9 @@ the "Share custom image feature" button (Stream Profile → More Options → Sha ![Preview](/screenshots/preview.webp) -## Farcaster Frames +### Farcaster Frames -![Preview](/img/frame/farcaster.jpg) +![Preview](/img/frame/farcaster.webp) We [developed](https://x.com/razgraf/status/1779208294264955316) our own set of Farcaster Frames! Share these in your favorite client and interact with Sablier directly from the app. diff --git a/docs/apps/guides/03-csv-support.mdx b/docs/apps/guides/01-csv-support.mdx similarity index 84% rename from docs/apps/guides/03-csv-support.mdx rename to docs/apps/guides/01-csv-support.mdx index fb6ed564..bf9356f9 100644 --- a/docs/apps/guides/03-csv-support.mdx +++ b/docs/apps/guides/01-csv-support.mdx @@ -1,6 +1,6 @@ --- id: "csv-support" -sidebar_position: 3 +sidebar_position: 1 title: "CSV Support" --- @@ -35,8 +35,8 @@ in rows with addresses, amounts and other details. Finally, create batches/group In order to access this feature you will need to: -1. Access the create streams [gallery](https://app.sablier.com/gallery/group/) - make sure you're on the group tab (top - right) +1. Access the create streams [gallery](https://app.sablier.com/vesting/gallery/) - make sure you're on the group tab + (top right) 2. Click on the the desired stream shape card 3. At the top (top-right) of the page you will find a button guiding you towards the CSV feature @@ -120,20 +120,19 @@ the app itself. We suggest double-checking in the Sablier app that the dates hav ::: -| Column | Description | Examples | -| :------------- | :----------------------------------------------------------------------------------------- | :------------------------------------------------ | -| address | String - recipient's address | `0x12...AB` | -| amount | Number - the amount that will be streamed | `100`, `2500`, `42161` or any other valid amount. | -| duration | Duration type - string that denotes the duration of the stream | `1 year 20 days`, `3 years 20 days 4 hours` | -| start | Date type - string that denotes the start date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | -| end | Date type - string that denotes the end date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | -| cliffDuration | Duration type - string that denotes the cliff duration of the stream | `2 years 20 days`, `3 years 20 days 4 hours` | -| cliffEnd | Date type - string that denotes the cliff end date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | -| months | Number - the number of months for the unlock monthly | `4`, `5`, `12` or any other valid integer. | -| steps | Number - the number of steps for the unlock in steps | `4`, `5`, `12` or any other valid integer. | -| unlockDuration | Duration type - string that denotes the cliff duration of the stream, for the unlock cliff | `2 years 20 days`, `3 years 20 days 4 hours` | -| unlockEnd | Date type - string that denotes the cliff end date of the stream, for the unlock cliff | `2024-02-24 16:15`, `2026-02-14 17:25` | -| unlock | Number - the amount that will be initially unlocked | `100`, `2500`, `42161` or any other valid amount. | +| Column | Description | Examples | +| :------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------ | +| address | String - recipient's address | `0x12...AB` | +| amount | Number - the amount that will be streamed | `100`, `2500`, `42161` or any other valid amount. | +| duration | Duration type - string that denotes the duration of the stream | `1 year 20 days`, `3 years 20 days 4 hours` | +| start | Date type - string that denotes the start date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | +| end | Date type - string that denotes the end date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | +| cliffDuration | Duration type - string that denotes the cliff duration of the stream | `2 years 20 days`, `3 years 20 days 4 hours` | +| cliffEnd | Date type - string that denotes the cliff end date of the stream | `2024-02-24 16:15`, `2026-02-14 17:25` | +| months | Number - the number of months for the unlock monthly | `4`, `5`, `12` or any other valid integer. | +| steps | Number - the number of steps for the unlock in steps | `4`, `5`, `12` or any other valid integer. | +| unlock | Number - the amount that will be initially unlocked | `100`, `2500`, `42161` or any other valid amount. | +| initial | Initial unlock type - wether the first unlock should occur at the stream start date or at the end of the first month | `at start` or `end of first month` | ## Airstreams: Create diff --git a/docs/apps/guides/02-url-schemes.mdx b/docs/apps/guides/02-url-schemes.mdx index 522603ef..b7408882 100644 --- a/docs/apps/guides/02-url-schemes.mdx +++ b/docs/apps/guides/02-url-schemes.mdx @@ -15,7 +15,7 @@ cover a number of resource locators used by the apps, as well as dive into how y ### Elements -Every stream created through the Sablier Protocol is identified through three parameters: +Every stream created through the Sablier Protocols is identified through three parameters: - a **chainId** (e.g. `1` for Ethereum, `10` for [Optimism](https://chainlist.org/) ) - a **contract** address (e.g. `0x12..AB`) OR an **alias** (e.g. `LL`) @@ -23,8 +23,8 @@ Every stream created through the Sablier Protocol is identified through three pa #### Contract Aliases -Sablier V2 supports multiple versions and variants of streaming contracts, e.g. `SablierV2LockupLinear` and -`SablierV2LockupDynamic`. To provide a visual resolver, while also accounting for future stream types (backwards +Sablier Lockup supports multiple versions and variants of streaming contracts, e.g. `SablierV2LockupLinear` and +`SablierV2LockupDynamic`. To provide a visual resolver, while also accounting for future stream curves (backwards compatibility), we alias the contract addresses with the following abbreviations: - Lockup Linear V2.0 contracts become `LL`, e.g. `LL-137-1` @@ -50,7 +50,7 @@ contract `alias`, the `chainId`, and the `streamId`, and then you add them to th As you can see, the main format is `contractA-chainId-streamId`. This is supported both at the app and the subgraph level. For situations when an alias cannot be used, we fallback to the following format: `contractAddress-chainId-streamId`. Read more about identifiers and aliases in our -[subgraph documentation](/api/subgraphs/protocol/structure#identifying). +[subgraph documentation](/api/lockup/the-graph/structure#identifying). --- @@ -61,14 +61,14 @@ level. For situations when an alias cannot be used, we fallback to the following The Sablier Interface comes with an advanced search view that can be accessed directly through URL parameters. If you want to use this feature, here is a table with all the available parameters: -| Parameter | Type | Description | Values | -| :-------- | :----------- | :------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -| t | String | The active tab in the dashboard. For global queries, use `search`. | `search`, `sender`, or `recipient` | -| c | Number | The chain of the streams in the search result. This parameter is required. | `1`, `10`, `42161` or other [supported chain](/contracts/v2/deployments) | -| s | String | The address of the stream sender by which to filter | `0x12...AB`, `vitalik.eth` | -| r | String | The address of the stream recipient by which to filter | `0x12...AB`, `vitalik.eth` | -| a | String | The address of the asset to filter for | `0x12...CD` for DAI | -| i | String array | An array of IDs to look up | `LL-5-1`, `LD-5-14` etc. | +| Parameter | Type | Description | Values | +| :-------- | :----------- | :------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| t | String | The active tab in the dashboard. For global queries, use `search`. | `search`, `sender`, or `recipient` | +| c | Number | The chain of the streams in the search result. This parameter is required. | `1`, `10`, `42161` or other [supported chain](/guides/lockup/deployments) | +| s | String | The address of the stream sender by which to filter | `0x12...AB`, `vitalik.eth` | +| r | String | The address of the stream recipient by which to filter | `0x12...AB`, `vitalik.eth` | +| a | String | The address of the asset to filter for | `0x12...CD` for DAI | +| i | String array | An array of IDs to look up | `LL-5-1`, `LD-5-14` etc. | ### Building the URL @@ -93,7 +93,7 @@ Here are some examples of URLs and the associated search modal for each: ### Elements -Every airstream created through the Sablier Protocol is identified through three parameters: +Every airstream created through the Lockup protocol is identified through three parameters: - a **chainId** (e.g. `1` for Ethereum, `10` for [Optimism](https://chainlist.org/) ) - a **contract** address (e.g. `0x12..AB`) @@ -116,7 +116,7 @@ contract `alias`, the `chainId`, and the `streamId`, and then you add them to th | [app.sablier.com/stream/0xe72[...]bbabc-11155111](https://app.sablier.com/airstream/0xe72175dd12ac7efca6b7d12dfc913a5f661bbabc-11155111/) | Airstream on Sepolia | As you can see, the main format is `contractA-chainId`. This is supported both at the app and the subgraph level. Read -more about identifiers and aliases in our [subgraph documentation](/api/subgraphs/merkle/entities#identifying). +more about identifiers and aliases in our [subgraph documentation](/api/airdrops/the-graph/entities#identifying). ## Search Airstreams @@ -125,12 +125,12 @@ more about identifiers and aliases in our [subgraph documentation](/api/subgraph The Sablier Interface comes with an advanced search view that can be accessed directly through URL parameters. If you want to use this feature, here is a table with all the available parameters: -| Parameter | Type | Description | Values | -| :-------- | :----- | :---------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -| t | String | The active tab in the dashboard. For global queries, use `search`. | `search` | -| c | Number | The chain of the airstreams in the search result. This parameter is required. | `1`, `10`, `42161` or other [supported chain](/contracts/v2/deployments) | -| m | String | The address of the campaign admin by which to filter | `0x12...AB`, `vitalik.eth` | -| a | String | The address of the asset to filter for | `0x12...CD` for DAI | +| Parameter | Type | Description | Values | +| :-------- | :----- | :---------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| t | String | The active tab in the dashboard. For global queries, use `search`. | `search` | +| c | Number | The chain of the airstreams in the search result. This parameter is required. | `1`, `10`, `42161` or other [supported chain](/guides/lockup/deployments) | +| m | String | The address of the campaign admin by which to filter | `0x12...AB`, `vitalik.eth` | +| a | String | The address of the asset to filter for | `0x12...CD` for DAI | ### Building the URL diff --git a/docs/apps/guides/03-how-to.mdx b/docs/apps/guides/03-how-to.mdx new file mode 100644 index 00000000..a3b5bd5e --- /dev/null +++ b/docs/apps/guides/03-how-to.mdx @@ -0,0 +1,7 @@ +--- +id: "how-to" +sidebar_position: 2 +title: "How-to Videos" +--- + +For an extensive set of video explanations please check out the [Support](/support/how-to) section. diff --git a/docs/apps/guides/_category_.json b/docs/apps/guides/_category_.json index eb546556..5a94839e 100644 --- a/docs/apps/guides/_category_.json +++ b/docs/apps/guides/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Guides", - "position": 4 + "label": "User Guides", + "position": 2 } diff --git a/docs/concepts/01-what-is-sablier.mdx b/docs/concepts/01-what-is-sablier.mdx index b7026695..017de8c2 100644 --- a/docs/concepts/01-what-is-sablier.mdx +++ b/docs/concepts/01-what-is-sablier.mdx @@ -7,29 +7,114 @@ title: "What Is Sablier?" import Link from "@docusaurus/Link"; import { links } from "@site/src/constants"; -## Protocol, Interface, Labs. - Sablier is the powerhouse of token distribution protocols. We build decentralized applications to distribute your tokens from one account to another, in realtime. -- **The Sablier Protocol**: A collection of persistent, non-upgradeable smart contracts that together create a protocol - which facilitates streaming of ERC-20 assets on Ethereum and other EVM blockchains. -- **The Sablier Interface**: A web interface that allows for easy interaction with the Sablier Protocol. The interface - is only one of many ways to interact with the Sablier Protocol. -- **Sablier Labs**: The company that develops the Sablier Protocol, the user interfaces associated with it, and the - documentation website you are reading right now. +- **The Sablier Protocols**: A collection of persistent, non-upgradeable smart contracts to facilitate streaming of + ERC-20 tokens on Ethereum and other EVM blockchains. The Sablier Protocols consist of Lockup and Flow. +- **The Sablier Interface**: A web interface that allows for easy interaction with the Sablier Protocols. The interface + is only one of many ways to interact with the Sablier Protocols. +- **The Sablier Labs**: The company that develops the Sablier Protocols, the Sablier Interface, and the documentation + website you are reading right now. + +:::info + +Fun fact: "sablier" means "hourglass" in French. + +::: + +## Sablier Protocols + +Sablier protocols are a collection of token distribution protocols developed with [Ethereum](https://ethereum.org/) +smart contracts, designed to facilitate by-the-second payments for cryptocurrencies, specifically +[ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) tokens. The protocols employ a set of +persistent and non-upgradable smart contracts that prioritize security, censorship resistance, self-custody, and +functionality without the need for trusted intermediaries who may selectively restrict access. + +Currently, it consists of two different protocols: **Lockup**, which facilitates vesting and airstreams, and **Flow**, +which facilitates payroll, grants etc. Both of these are licensed under BUSL-1.1. Both Lockup and Flow are open-source +and can be accessed on Sablier's [GitHub page](https://github.com/sablier-labs). Detailed technical reference for each +protocol can be found in the [Technical References](/reference/overview) section of this website. + +As long as Ethereum and the other EVM chains continue to exist, every version of Sablier protocols that gets deployed +will operate continuously and without interruption, with a guarantee of 100% uptime. + +:::info + +Sablier is the first token streaming protocol ever built, tracing its roots back to 2019. + +::: + +## How does Sablier differ from traditional payment systems? + +To understand the unique characteristics of Sablier, it is helpful to examine two aspects: the concept of streaming as +an alternative to conventional payment methods, and the permissionless nature of the protocol compared to traditional +systems. + +### Streaming vs conventional payments + +Traditional payment systems generally involve lump-sum transfers, which rely on trust between parties, have slow +processing times, and are prone to errors. In the context of bank transfers, payments are also subject to substantial +fees and can face delays due to intermediaries. -### Release history +By contrast, Sablier introduces the concept of token streaming, enabling users to make continuous, real-time payments on +a per-second basis. This innovative approach enables seamless, frictionless transactions and promotes increased +financial flexibility for users, businesses, and other entities. Sablier makes the passage of time itself the +trust-binding mechanism, unlocking business opportunities that were previously unavailable. -See the full changelog on [GitHub](https://github.com/sablier-labs/v2-core/blob/main/CHANGELOG.md). +A good mental model to contrast streaming with conventional payment models is to view the former as "real-time finance" +or "continuous finance", and the latter as of "discrete finance". -- **Sablier V2.2**: The latest version of **The Sablier Protocol**. -- **Sablier V2.1**: Minor update released in December 2023. -- **Sablier V2.0**: The second big version of **The Sablier Protocol**, released in July 2023. -- **Sablier V1.1**: Minor update for V1, released in July 2021. -- **Sablier V1.0**: The first big version of **The Sablier Protocol**, originally released in 2019. +### Permissionless systems + +Sablier is rooted in the essential ideas of open access and immutability, deriving inspiration from Ethereum's +foundational principles and the core values of the DeFi[^1] movement. These concepts are crucial in shaping a future +where financial services are accessible to everyone, irrespective of their geographical location or economic standing, +without prejudice or exposure to counterparty risks. + +The permissionless design ensures that the protocol's services are open to the public, without any restrictions on who +can use them. Users have the liberty to establish new streams with any ERC-20 token, or interact with existing streams +as they wish. This feature stands in sharp contrast to conventional financial services that frequently impose +restrictions based on factors such as location, financial status, or age. + +As an immutable system, Sablier protocols are not upgradeable, meaning that no party can pause the contracts, reverse +transactions, or alter the users' streams in any way. This ensures the system remains transparent, secure, and resistant +to manipulation or abuse. + +It is worth noting that the Protocol Admin has the right (but not the obligation) to impose a fee on every stream +created using specific ERC-20 tokens. However, this capability is known to all participants in advance, and to avert +misuse, the fee percentage is restricted to a range of 0% to 10%. + +## Where can I find more information? + +For more details on the Sablier Protocols, their features, and potential use cases, explore this documentation site and +visit the official [Sablier website](https://sablier.com) as well. :::tip If you have any questions along the way, please join the #dev channel in our Discord -server. Our team and members of the community are looking forward to help you.‌ ::: +server. Our team and members of the community are looking forward to help you.‌ + +::: + +## Release history + +### Flow + +- **v1.0 (latest)**: The first version of Sablier Flow, released in December 2024. + +### Lockup + +- **v1.2 (latest)**: The third version of Sablier Lockup, released in July 2024. +- **v1.1**: The second version of Sablier Lockup which was a minor upgrade, released in December 2023. +- **v1.0**: The first version of Sablier Lockup, released in July 2023. + +### Legacy + +- **v1.1**: Minor upgrade, released in July 2021. +- **v1.0**: The first version of Sablier, released in November 2019. + +[^1]: + Short for Decentralized Finance: an ecosystem of financial applications and services built on blockchain networks, + primarily Ethereum, that leverage smart contracts to enable trustless, permissionless, and transparent financial + transactions without relying on traditional intermediaries like banks or financial institutions. diff --git a/docs/concepts/02-sablier-protocol.md b/docs/concepts/02-sablier-protocol.md deleted file mode 100644 index 32f3adf7..00000000 --- a/docs/concepts/02-sablier-protocol.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -id: "sablier-protocol" -sidebar_position: 2 -title: "The Sablier Protocol" ---- - -Sablier is a token distribution protocol developed with [Ethereum](https://ethereum.org/) smart contracts, designed to -facilitate by-the-second payments for cryptocurrencies, specifically -[ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) assets. The protocol employs a set of -persistent and non-upgradable smart contracts that prioritize security, censorship resistance, self-custody, and -functionality without the need for trusted intermediaries who may selectively restrict access. - -Currently, there are two major versions of the protocol: V1, which is available under GNU V3, and V2, which is licensed -under BUSL-1.1. Both protocol versions are open-source and can be accessed on Sablier's -[GitHub page](https://github.com/sablier-labs). Detailed technical reference for each version can be found in the -[Contracts](/contracts/v2/overview) section of this website. - -As long as Ethereum and the other EVM chains continue to exist, every version of Sablier that gets deployed will operate -continuously and without interruption, with a guarantee of 100% uptime. - -:::info - -Sablier is the first token streaming protocol ever built, tracing its roots back to 2019. - -::: - -## How does Sablier differ from traditional payment systems? - -To understand the unique characteristics of Sablier, it is helpful to examine two aspects: the concept of streaming as -an alternative to conventional payment methods, and the permissionless nature of the protocol compared to traditional -systems. - -### Streaming vs conventional payments - -Traditional payment systems generally involve lump-sum transfers, which rely on trust between parties, have slow -processing times, and are prone to errors. In the context of bank transfers, payments are also subject to substantial -fees and can face delays due to intermediaries. - -By contrast, Sablier introduces the concept of asset streaming, enabling users to make continuous, real-time payments on -a per-second basis. This innovative approach enables seamless, frictionless transactions and promotes increased -financial flexibility for users, businesses, and other entities. Sablier makes the passage of time itself the -trust-binding mechanism, unlocking business opportunities that were previously unavailable. - -A good mental model to contrast streaming with conventional payment models is to view the former as "real-time finance" -or "continuous finance", and the latter as of "discrete finance". - -### Permissionless systems - -Sablier is rooted in the essential ideas of open access and immutability, deriving inspiration from Ethereum's -foundational principles and the core values of the DeFi[^1] movement. These concepts are crucial in shaping a future -where financial services are accessible to everyone, irrespective of their geographical location or economic standing, -without prejudice or exposure to counterparty risks. - -The permissionless design ensures that the protocol's services are open to the public, without any restrictions on who -can use them. Users have the liberty to establish new streams with any ERC-20 asset, or interact with existing streams -as they wish. This feature stands in sharp contrast to conventional financial services that frequently impose -restrictions based on factors such as location, financial status, or age. - -As an immutable protocol, Sablier is not upgradeable, meaning that no party can pause the contracts, reverse -transactions, or alter the users' streams in any way. This ensures the system remains transparent, secure, and resistant -to manipulation or abuse. - -It is worth noting that the Protocol Admin has the right (but not the obligation) to impose a fee on every stream -created using specific ERC-20 assets. However, this capability is known to all participants in advance, and to avert -misuse, the fee percentage is restricted to a range of 0% to 10%. - -## Where can I find more information? - -For more details on the Sablier Protocol, its features, and potential use cases, explore this documentation site and -visit the official [Sablier website](https://sablier.com) as well. - -[^1]: - Short for Decentralized Finance: an ecosystem of financial applications and services built on blockchain networks, - primarily Ethereum, that leverage smart contracts to enable trustless, permissionless, and transparent financial - transactions without relying on traditional intermediaries like banks or financial institutions. diff --git a/docs/concepts/protocol/01-streaming.md b/docs/concepts/02-streaming.md similarity index 75% rename from docs/concepts/protocol/01-streaming.md rename to docs/concepts/02-streaming.md index 0d06836f..da0c4e5e 100644 --- a/docs/concepts/protocol/01-streaming.md +++ b/docs/concepts/02-streaming.md @@ -1,28 +1,12 @@ --- id: "streaming" -sidebar_position: 1 +sidebar_position: 2 title: "Streaming" --- -Asset streaming means the ability to make continuous, real-time payments on a per-second basis. This novel approach to +Token streaming means the ability to make continuous, real-time payments on a per-second basis. This novel approach to making payments is the core concept of Sablier. -Let's take an example. Imagine Alice wants to stream 3,000 DAI to Bob during the whole month of January. - -1. Alice deposits the 3,000 DAI in Sablier before Jan 1, setting the end time to Feb 1. -2. Bob's allocation of the DAI deposit increases every second beginning Jan 1. -3. On Jan 10, Bob will have earned approximately 1,000 DAI. He can send a transaction to Sablier to withdraw the tokens. -4. If at any point during January Alice wishes to get back her tokens, she can cancel the stream and recover what has - not been streamed yet. - -This streaming model is especially useful for use cases like vesting, payroll and airdrops. - -:::info - -Fun fact: "sablier" means "hourglass" in French. - -::: - ## Brief history Andreas Antonopoulos introduced the concept of money streaming in his keynote talk @@ -38,10 +22,12 @@ then be released to a recipient at a predetermined rate per second. Sablier was born in 2019 when Paul and his co-founder, Gabriel Apostu, decided to build a protocol implementing the ERC-1620 standard. The first iteration of Sablier was successfully deployed on Ethereum Mainnet in December 2019. +In 2024, Sablier protocol got renamed to Lockup when Flow was introduced. + ## What are the benefits? Conventional lump-sum payments come with inherent challenges such as the need for trust between parties, slow processing -times, and susceptibility to errors. Asset streaming, or continuous by-the-second payments, addresses these issues and +times, and susceptibility to errors. Token streaming, or continuous by-the-second payments, addresses these issues and offers additional benefits (see [Use Cases](/concepts/use-cases)). First, streaming involves a significantly smaller degree of trust compared to lump-sum payments, as it eliminates the @@ -51,7 +37,7 @@ promised. By streaming money to the worker instead, your potential loss is limit short term. If the remote worker disappears, you can simply cancel the stream and reclaim any unstreamed funds. Secondly, money streaming is substantially faster than lump-sum payments for evident reasons. Streaming transactions -settle in real-time, with small amounts of assets being released from the sender to the recipient every second. This +settle in real-time, with small amounts of tokens being released from the sender to the recipient every second. This automates the payment process and ensures a continuous flow of funds. Lastly, streaming is more secure than lump-sum payments, because it makes it possible to correct errors. Suppose you @@ -63,4 +49,7 @@ recipient is willing to return it. ## Diversity of streams Over time, we have come to realize that there is no one-size-fits-all streaming model that can address the diverse range -of use cases. In the upcoming section, we will explore the various types of streams supported by Sablier. +of use cases. In the upcoming section, we will explore the various token distribution curves supported by Lockup and +Flow. + +But first, let's dive into the use cases. diff --git a/docs/concepts/03-use-cases.mdx b/docs/concepts/03-use-cases.mdx index 1aacf996..212065b4 100644 --- a/docs/concepts/03-use-cases.mdx +++ b/docs/concepts/03-use-cases.mdx @@ -7,14 +7,18 @@ title: "Use Cases" import Link from "@docusaurus/Link"; import { links } from "@site/src/constants"; -While Sablier is a general-purpose protocol that can be used for a -[wide variety](https://twitter.com/Sablier/status/1205533344886411264) of applications, some use cases are more popular -than others. In this article, we will cover the three primary reasons people are using Sablier at the moment: vesting, -payroll, and airdrops. +While Lockup and Flow both are general-purpose protocols that can be used for a wide variety of applications, some use +cases are more popular than others. In this article, we will cover the primary reasons people are using Sablier Lockup +and Flow. -## Vesting +## Sablier Lockup -### 1. Efficiency +Sablier Lockup requires upfront deposit of the tokens into the streams. They have a start time, and an end time, and +therefore are a great fit for Vesting and Airdrops. + +### Vesting + +#### 1. Efficiency Traditional vesting schemes require a lot of manual input. Payments must be processed manually over an extended period, demanding continuous dedication from the treasury management team. The treasury admin has to initiate numerous @@ -35,7 +39,7 @@ of their allocated compensation. This model aligns with the incentives of both p spend time once, to create the streams, while recipients receive the funds gradually over time, allowing them to manage their finances as they wish. -### 2. Schelling points +#### 2. Schelling points :::info @@ -51,7 +55,7 @@ receive them. By contrast, Sablier streams distribute a fraction of the total payment every second to recipients, enabling them to withdraw a portion of funds at any time. This effectively addresses the problem of coordinated dumping. -### 3. Transparency +#### 3. Transparency It's hard to aggregate discrete payments, which is why they typically lack transparency. Just by looking at a transaction on Etherscan, it's difficult to pin down to whom it was made, or for what purpose. This issue is @@ -63,11 +67,11 @@ streams created by a particular address, as well as all transactions associated To illustrate this, here's an example of a stream as viewed on the Sablier Interface. -## Airdrops +### Airdrops This section explores why streaming provides a superior method of distributing tokens compared to simple airdrops. -### 1. Flaws in simple airdrops +#### 1. Flaws in simple airdrops [Retroactive airdrops](https://members.delphidigital.io/learn/retroactive-airdrops) have become a common practice in the cryptocurrency industry. They are often used to launch new tokens, and for good reason: it allows for the distribution @@ -84,7 +88,7 @@ Fortunately, there is an elegant solution that encourages long-term thinking amo airdrop with Sablier, you can ensure that community members prioritize the project's future. This approach creates the right incentives for members to think about the project's long-term success. -### 2. Streaming airdrops +#### 2. Streaming airdrops Instead of airdropping the entirety of the token allocation all at once, airdrop recipients receive a fraction of the tokens every second through a Sablier stream. @@ -105,16 +109,24 @@ which you can use to create an airdrop campaign using Merkle tree. ::: -## Payroll +## Sablier Flow + +Unlike Lockup, Sablier Flow does not require upfront deposits, have no specific start and end time, and therefore offers +more flexibility. This is best suited for payrolls and grant payments as described below. + +### Payroll We all receive our salaries at the end of every month. What if your salary can be streamed to you in real time? Why should you wait for a month when you can get it every second? You can ask your employer to pay you using Sablier. Streaming salaries through Sablier can significantly enhance employee satisfaction and retention. +Your employer can create a Flow stream and keep funding it at the end of every month or in advance for you to withdraw +your money. + The benefits outlined in the "Efficiency" section earlier apply equally to this use case, since traditional payroll solutions, like vesting schemes, can be both labor-intensive and prone to errors. -## Grants +### Grants Grants are a powerful use case for Sablier, allowing for efficient, transparent, and flexible distribution of funds to grant recipients. @@ -126,18 +138,18 @@ Uniswap Governance used Sablier to distribute grant to DeFi Education Fund. You ::: -### 1. Transparency +#### 1. Transparency Sablier enables real-time streaming of funds, ensuring transparency in how grants are distributed. Your stakeholders can monitor the flow of funds, providing assurance that the money is being used as intended. -### 2. Pay as they deliver +#### 2. Pay as they deliver Instead of lump-sum payments, you can use Sablier to stream funds continuously over a specified period. This ensures recipients have a steady cash flow and reduces the risk of mismanagement of funds. If grant recipient stops working on their project, you can cancel the stream and retrieve back the remaining funds. -### 3. No Administrative Overhead +#### 3. No Administrative Overhead All streamings through Sablier are automated, which means, you don't have to send funds manually at the end of every month. diff --git a/docs/concepts/protocol/05-nft.mdx b/docs/concepts/06-nft.mdx similarity index 57% rename from docs/concepts/protocol/05-nft.mdx rename to docs/concepts/06-nft.mdx index 7817fd7c..2167e8ed 100644 --- a/docs/concepts/protocol/05-nft.mdx +++ b/docs/concepts/06-nft.mdx @@ -1,28 +1,50 @@ --- id: "nft" -sidebar_position: 5 +sidebar_position: 6 title: "NFTs" --- import Link from "@docusaurus/Link"; import { links } from "@site/src/constants"; -import NFTGalleryURL from "@site/static/img/nft-gallery.webp"; -import NFTSVG from "@site/static/img/nft.svg"; +import FlowNFTSVG from "@site/static/img/flow-nft.svg"; +import LockupNFTGalleryURL from "@site/static/img/lockup-gallery.webp"; +import LockupNFTSVG from "@site/static/img/lockup-nft.svg"; -The Sablier Protocol wraps every stream in an ERC-721 non-fungible token (NFT), making the stream recipient the owner of -the NFT. The recipient can transfer the NFT to another address, and this also transfers the right to withdraw funds from -the stream, including any funds already streamed. +Both Lockup and Flow Protocols wrap every stream in an ERC-721 non-fungible token (NFT), making the stream recipient the +owner of the NFT. The recipient can transfer the NFT to another address, and this also transfers the right to withdraw +funds from the stream, including any funds already streamed. + +## Lockup NFT + +Sablier Lockup streams are represented as unique onchain generated hourglass SVGs, which change their color and content +based on user data. Here's an example for a stream that is 42.35% way through: + + + +### Gallery of Multiple Sablier NFT SVGs + + + +If you prefer the granularity of a blockchain explorer, you can also view the stream NFTs on +[Etherscan](https://etherscan.io/token/0xB10daee1FCF62243aE27776D7a92D39dC8740f95). See the +[Deployments](/guides/lockup/deployments) page for the full list of addresses. + +## Flow NFT + +Unlike Lockup streams, the first release of Flow streams are represented by Sablier Logo. + + ## Integrations The transferability of the NFT makes Sablier streams tradable and usable as collateral in DeFi. Imagine an NFT lending marketplace that allows users to borrow funds by locking their streams as collateral (effectively borrowing against -their future income). Or a decentralized exchange that allows users to trade streams for other assets. +their future income). Or a decentralized exchange that allows users to trade streams for other tokens. :::note -Not all Sablier streams are transferable. The stream creator can choose to make the stream -[non-transferable](/contracts/v2/guides/stream-management/transfer). +Not all Sablier streams are transferable. The stream creator can choose to make the stream non-transferable. You can +find more details on it in the [Transferability](/concepts/transferability) section. ::: @@ -35,6 +57,13 @@ will try to respond as soon as possible. ## Marketplaces +:::caution + +Be careful when buying Lockup NFTs that represent cancelable stream. When these streams are canceled, the unstreamed +amount is returned to the sender. + +::: + Thanks to adhering to the ERC-721 standard, Sablier streams can be traded and viewed on any NFT marketplace. Here are some of the marketplaces that support Sablier streams: @@ -44,36 +73,14 @@ some of the marketplaces that support Sablier streams: - [SuperRare](https://superrare.com) - [LooksRare](https://looksrare.org) -If you prefer the granularity of a blockchain explorer, you can also view the stream NFTs on -[Etherscan](https://etherscan.io/token/0xB10daee1FCF62243aE27776D7a92D39dC8740f95). See the -[Deployments](/contracts/v2/deployments) page for the full list of addresses. - -:::caution - -Be careful when buying NFTs that represent cancelable stream. When these streams are canceled, the unstreamed amount is -returned to the sender. - -::: - -### Caching +## Caching The SVG artwork is generated using certain real-time values, such as the current time on the blockchain. However, NFT marketplaces cache the NFT metadata, and this may cause the SVGs might not always be up to date. -The Sablier Protocol triggers [ERC-4906](https://eips.ethereum.org/EIPS/eip-4906) events whenever there's an update in a +Sablier Protocols trigger [ERC-4906](https://eips.ethereum.org/EIPS/eip-4906) events whenever there's an update in a stream (for instance, when a withdrawal is made). However, it's worth noting that some streams might remain unchanged for an extended period. To ensure you're viewing the most recent version of the NFT SVG, it's recommended to check the stream directly via the [Sablier Interface](https://app.sablier.com). - -## Hourglass SVG - -Sablier V2 streams are represented as unique onchain generated hourglass SVGs, which change their color and content -based on user data. Here's an example for a stream that is 42.35% way through: - - - -### Gallery of Multiple Sablier NFT SVGs - - diff --git a/docs/concepts/protocol/11-transferability.md b/docs/concepts/07-transferability.md similarity index 84% rename from docs/concepts/protocol/11-transferability.md rename to docs/concepts/07-transferability.md index 8a455110..1b5a9df8 100644 --- a/docs/concepts/protocol/11-transferability.md +++ b/docs/concepts/07-transferability.md @@ -1,11 +1,11 @@ --- id: "transferability" -sidebar_position: 11 +sidebar_position: 7 title: "Transferability" --- -As you may know, all Sablier streams [are represented by NFTs](/concepts/protocol/nft). The NFT representing a stream is -owned by the stream recipient. Whoever owns the stream NFT becomes the stream recipient. +As you may know, all Sablier streams [are represented by NFTs](/concepts/nft). The NFT representing a stream is owned by +the stream recipient. Whoever owns the stream NFT becomes the stream recipient. When creating the stream, users have the ability to set it as transferable or untransferable. diff --git a/docs/concepts/05-governance.md b/docs/concepts/08-governance.md similarity index 62% rename from docs/concepts/05-governance.md rename to docs/concepts/08-governance.md index 84513cc0..7f9d1e7f 100644 --- a/docs/concepts/05-governance.md +++ b/docs/concepts/08-governance.md @@ -1,21 +1,15 @@ --- id: "governance" -sidebar_position: 5 +sidebar_position: 8 title: "Governance" --- -The Protocol Admin is an account with exclusive access to specific functions of the protocol. More concretely, the Admin -is a collection of multisig wallets currently in control of Sablier Labs, which have the following permissions on each -chain where Sablier is deployed: - -| Permission | Function | Contract(s) | -| ------------------ | ------------------ | ---------------------------------------------------------------------------- | -| Allow to Hook | `allowToHook` | `SablierV2LockupLinear`, `SablierV2LockupDynamic`, `SablierV2LockupTranched` | -| Set NFT Descriptor | `setNFTDescriptor` | `SablierV2LockupLinear`, `SablierV2LockupDynamic`, `SablierV2LockupTranched` | +The Protocol Admin is an account with exclusive access to specific functions of the protocols. More concretely, the +Admin is a collection of multisig wallets currently in control of Sablier Labs. ## Admins -Here are the addresses that are currently administering the Sablier Protocol. Most of them are Safe multi-signature +Here are the addresses that are currently administering the Sablier Protocols. Most of them are Safe multi-signature wallets. | Chain | Address | @@ -33,12 +27,32 @@ wallets. | Scroll | [0x0F7Ad835235Ede685180A5c611111610813457a9](https://scrollscan.com/address/0x0F7Ad835235Ede685180A5c611111610813457a9) | | zkSync Era | [0xaFeA787Ef04E280ad5Bb907363f214E4BAB9e288](https://era.zksync.network/address/0xaFeA787Ef04E280ad5Bb907363f214E4BAB9e288) | +## Lockup + +Admin has the following permissions on each chain where Lockup is deployed: + +| Permission | Function | +| ------------------ | ------------------------------------------------------------------------------------------------ | +| Allow to Hook | [allowToHook](../reference/lockup/core/abstracts/abstract.SablierV2Lockup#allowtohook) | +| Set NFT Descriptor | [setNFTDescriptor](../reference/lockup/core/abstracts/abstract.SablierV2Lockup#setnftdescriptor) | + +## Flow + +Admin has the following permissions on each chain where Flow is deployed: + +| Permission | Function | +| ------------------------ | --------------------------------------------------------------------------------------------------------------- | +| Collect Protocol Revenue | [collectProtocolRevenue](../reference/flow/contracts/abstracts/abstract.SablierFlowBase#collectprotocolrevenue) | +| Recover ERC20 token | [recover](../reference/flow/contracts/abstracts/abstract.SablierFlowBase#recover) | +| Set NFT Descriptor | [setNFTDescriptor](../reference/flow/contracts/abstracts/abstract.SablierFlowBase#setnftdescriptor) | +| Set Protocol Fee | [setProtocolFee](../reference/flow/contracts/abstracts/abstract.SablierFlowBase#setprotocolfee) | + ## Trustlessness -Despite having an admin, the Sablier Protocol remains trustless. Here are the reasons why: +Despite having an admin, the Sablier Protocols remain trustless. Here are the reasons why: -1. The protocol is permissionless, i.e. it can be freely accessed by anyone with an Internet connection. -2. The protocol is persistent, i.e. the admin cannot pause it. +1. The protocols are permissionless, i.e. it can be freely accessed by anyone with an Internet connection. +2. The protocols are persistent, i.e. the admin cannot pause it. 3. The streaming logic is non-upgradeable, i.e. the admin cannot tamper with the streams created by users. 4. There are no escape hatches that allow the admin to claim user funds. 5. There is a hard-coded upper limit of 10% to the fees that the admin can charge. diff --git a/docs/concepts/09-fees.mdx b/docs/concepts/09-fees.mdx new file mode 100644 index 00000000..7fe8fd7f --- /dev/null +++ b/docs/concepts/09-fees.mdx @@ -0,0 +1,77 @@ +--- +id: "fees" +sidebar_position: 9 +title: "Fees" +--- + +import Link from "@docusaurus/Link"; +import { links } from "@site/src/constants"; + +There are two types of fees in the Sablier ecosystem: **Protocol Fee** and **Broker Fee**. + +## Protocol fee + +This is a fee that can be charged at the protocol level, capped at 10%. Only the protocol admin has the authority to +change it. + +### Lockup + +Lockup doesn't implement protocol fees. + +### Flow + +While Flow has the ability to charge a protocol fee, no fee is set at the moment. If a fee is introduced in the future, +users will be notified in advance. When active, the fee will be deducted as a percentage from the withdrawn amount. + +## Broker fee + +A "broker" is any third-party entity that interacts with the Sablier Protocol on behalf of other users. These brokers +have the ability to charge service fees for facilitating such interactions. + +Broker fees are particularly useful for front-end applications that integrate the Sablier Protocol. They enable +front-end operators to levy a fee on each interaction facilitated through their platform. + +### Lockup + +The broker fee can be charged as a percentage of the streamed amount, and it cannot be higher than 10%. In the event of +cancellation, broker fee is non-refundable. + +### Flow + +The broker fee can be charged as a percentage of the deposit amount, and it cannot be higher than 10%. In case of +refund, broker fee is non-refundable. + +:::info + +The official [Sablier Interface](https://app.sablier.com) does NOT currently charge any broker fees. + +::: + +:::note + +Interested in becoming a broker? Please fill out this form and we will respond as +soon as possible. + +::: + +## Gas Fees + +### Q: What are gas fees? + +A: [Gas fees](https://www.investopedia.com/terms/g/gas-ethereum.asp) are transaction fees paid to the blockchain +validators in native tokens such as ETH. Sablier Labs does not take any cut from this. + +### Q: When are gas fees paid? + +A: Gas is paid only when streams are created, canceled, transferred, or withdrawn from. It does not accrue in real-time. + +### Q: Does Sablier receive any portion of the gas fee? + +A: No. 100% of the gas fee goes to the blockchain validators, which are not affiliated with Sablier Labs. + +:::tip + +To find how much gas each function costs, check out these [gas benchmark reports](/guides/lockup/gas-benchmarks) for +Lockup. + +::: diff --git a/docs/concepts/10-security.md b/docs/concepts/10-security.md new file mode 100644 index 00000000..f6d80a52 --- /dev/null +++ b/docs/concepts/10-security.md @@ -0,0 +1,27 @@ +--- +id: "security" +sidebar_position: 10 +title: "Security" +--- + +Ensuring the security of the Sablier Protocols is our utmost priority. We have dedicated significant efforts towards the +design and testing of the protocol to guarantee its safety and reliability. + +The Sablier contracts have undergone rigorous audits by leading security experts from [Cantina](https://cantina.xyz/), +[CodeHawks](https://codehawks.cyfrin.io/), and many independent auditors. For a comprehensive list of all audits +conducted, check out [the audit repo](https://github.com/sablier-labs/audits/) + +## Lockup Audits + +All the audits of Lockup contracts can be found [here](https://github.com/sablier-labs/audits/blob/main/lockup). + +## Flow Audits + +All the audits of Lockup contracts can be found [here](https://github.com/sablier-labs/audits/blob/main/flow). + +## Bug Bounty + +The Sablier Protocols are subject to a bug bounty program per the terms outlined +[here for Lockup](https://github.com/sablier-labs/v2-core/blob/main/SECURITY.md) and +[here for Flow](https://github.com/sablier-labs/flow/blob/main/SECURITY.md). We are offering a bounty of up to $100,000 +for reporting critical vulnerabilities. diff --git a/docs/concepts/06-glossary.md b/docs/concepts/11-glossary.md similarity index 73% rename from docs/concepts/06-glossary.md rename to docs/concepts/11-glossary.md index 906081ac..6653d706 100644 --- a/docs/concepts/06-glossary.md +++ b/docs/concepts/11-glossary.md @@ -1,27 +1,18 @@ --- id: "glossary" -sidebar_position: 6 +sidebar_position: 11 title: "Glossary" --- ## Allow List -A list of smart contract recipients that are authorized to be run by the Sablier protocol upon withdraw and cancel. - -## Airstream - -A portmanteau of "airdrop" and "stream", it's a token distribution model where the tokens are vested over time, as -opposed to airdropped at once. - -## Asset - -Digital assets can exist in various forms, but the Sablier Protocol exclusively supports the streaming of ERC-20 assets. +A list of smart contract recipients that are authorized to be run by the Lockup protocol upon withdraw and cancel. The stream itself is represented as an NFT (ERC-721). ## Broker -A third-party entity that interacts with the Sablier Protocol on behalf of its users, who may charge service fees for +A third-party entity that interacts with the Sablier Protocols on behalf of its users, who may charge service fees for facilitating these interactions. ## Broker fees @@ -30,15 +21,9 @@ The fees collected by the broker upon creating a stream for their users. ## Cliff -The cut-off point for releasing assets. Prior to the cliff, the recipient cannot withdraw, though assets continue to +The cut-off point for releasing tokens. Prior to the cliff, the recipient cannot withdraw, though tokens continue to accrue in the stream. -## Core - -Sablier contracts that are considered foundational, and are essential for Sablier to exist. Upgrading to a new version -of core would require deploying an entirely new set of smart contracts, and would be considered a new version of the -Sablier Protocol. - ## DeFi Short for Decentralized Finance: an ecosystem of financial applications and services built on blockchain networks, @@ -69,7 +54,7 @@ The technical architecture of Ethereum, which many other blockchains have approp ## Foundry -[Foundry][foundry] is the application development toolkit that has been used to develop the Sablier Protocol. +[Foundry][foundry] is the application development toolkit that has been used to develop the Sablier Protocols. ## Gas Fee @@ -80,7 +65,18 @@ Gas is paid only when streams are created, canceled, transferred, or withdrawn f ## Lockup -A term that refers to the requirement of locking up assets in order to create a stream. +A term coined by us to refer to the requirement of locking up tokens in order to create a stream. + +## Lockup Core + +Smart contracts that are considered foundational, and are essential for Lockup to exist. Upgrading to a new version of +lockup would require deploying an entirely new set of smart contracts, and would be considered a new version of the +Lockup protocol. + +## Lockup Periphery + +Sablier contracts that are useful, but not required for Lockup to exist. New periphery contracts can always be deployed +without migrating streams. ## Lockup Dynamic @@ -94,21 +90,11 @@ A Lockup stream with a constant payment rate per second. A Lockup stream with payments in discrete tranches. -## Timestamp - -A timestamp is the time component of a stream. In Lockup Linear, it represents start time, cliff time and end time -whereas in lockup dynamic and lockup tranched, it plays a crucial role in the calculation of streaming curves. - ## Monotonicity -A protocol invariant that states that the total amount of assets released by the stream can only increase over time and +A protocol invariant that states that the total amount of tokens released by the stream can only increase over time and never decrease. -## Periphery - -Sablier contracts that are useful, but not required for Sablier to exist. New periphery contracts can always be deployed -without migrating streams. - ## Protocol Admin An entity with exclusive access to specific functions of the protocol. @@ -124,7 +110,7 @@ exponents used in Lockup Dynamic. ## Real-time finance -A term coined by us in 2019 to emphasize the wide-ranging use cases for the Sablier Protocol. +A term coined by us in 2019 to emphasize the wide-ranging use cases for the Sablier Protocols. Since the withdrawable amounts in streams are updated every second, they embody the concept of real-time financial transactions. @@ -158,13 +144,23 @@ A stream can have one out of six possible statuses: A new financial primitive that permits by-the-second payments. -Currently, the Sablier Protocol offers a single type of stream called a lockup stream, in which the creator has to lock -up a specified amount of assets. +Currently, Sablier offers two streaming protocols called Lockup and Flow. In Lockup, the creator has to lock up a +specified amount of tokens whereas in Flow protocol, creator is not required to lock up any amount of tokens. ## Streaming By-the-second payments. +## Timestamp + +A timestamp is the time component of a stream. In Lockup Linear, it represents start time, cliff time and end time +whereas in Lockup Dynamic and Lockup Tranched, it plays a crucial role in the calculation of streaming curves. + +## Token + +Digital tokens can exist in various forms, but the Sablier Protocols exclusively supports the streaming of ERC-20 +tokens. + ## Tranche A data object that encapsulates these two properties: diff --git a/docs/concepts/flow/01-overview.md b/docs/concepts/flow/01-overview.md new file mode 100644 index 00000000..b3a371a8 --- /dev/null +++ b/docs/concepts/flow/01-overview.md @@ -0,0 +1,90 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +Flow is a debt tracking protocol that tracks tokens owed between two parties, enabling indefinite token streaming. A +Flow stream is characterized by its rate per second (rps). The relationship between the amount owed and time elapsed is +linear and can be defined as: + +```math +\text{amount owed} = rps \cdot \text{elapsed time} +``` + +Flow protocol can be used in several areas of everyday finance, such as payroll, distributing grants, insurance +premiums, loans interest, token ESOPs etc. If you are looking for vesting and airdrops, please refer to our +[Lockup](../lockup/overview) protocol. + +## Features + +1. **Flexible deposit:** A stream can be funded with any amount, at any time, by anyone, in full or in parts. +2. **Flexible duration:** A stream can be created with no specific start or end time. It can run indefinitely. +3. **Pause:** A stream can be paused by the sender and can later be restarted without losing track of previously accrued + debt. +4. **Refund:** Unstreamed amount can be refunded back to the sender at any time. +5. **Void:** Voiding a stream implies it cannot be restarted anymore. Voiding an insolvent stream forfeits the uncovered + debt. Either party can void a stream at any time. +6. **Withdraw:** it is publicly callable as long as `to` is set to the recipient. However, a stream’s recipient is + allowed to withdraw funds to any address. + +## Key Definitions + +The definitions below will help you understand some terms used in Sablier Flow: + +### Stream balance + +Stream balance is the token balance of a stream. It increases when funds are deposited into a stream, and decreases when +the sender refunds from it or when a withdrawal happens. + +### Total debt + +Total debt is the amount of tokens owed to the recipient. This value is further divided into two sub-categories: + +- **Covered debt:** The part of the total debt that covered by the stream balance. This is the same as the + **withdrawable amount**, which is an alias. +- **Uncovered debt:** The part of the total debt that is not covered by the stream balance. This is what the sender owes + to the stream. + +```math +\text{total debt} = \text{covered debt} + \text{uncovered debt} +``` + +### Snapshot debt and Snapshot time + +A snapshot is an event during which snapshot debt and snapshot time of a Flow stream are updated. **Snapshot debt** is +the debt accumulated until the previous snapshot. The UNIX timestamp at which snapshot debt is updated is called +**Snapshot time**. + +At snapshot, the following operations are taking place: + +```math +\text{snapshot debt} = \text{previous snapshot debt} + \underbrace{ +rps \cdot (\text{block.timestamp} - \text{snapshot time})}_\text{ongoing debt} +``` + +```math +\text{snapshot time} = \text{block.timestamp} +``` + +### Ongoing debt + +Ongoing debt is the debt accumulated since the previous snapshot. It is calculated as the following: + +```math +\text{ongoing debt} = rps \cdot (\text{block.timestamp} - \text{snapshot time}) +``` + +Therefore, at any point in time, total debt can also be defined as: + +```math +\text{total debt} = \text{snapshot debt} + \text{ongoing debt} +``` + +## Lifecycle + +1. A Flow stream is created with an `rps`, a `sender` and a `recipient` address. +2. During the lifecycle of the stream, all the functions enclosed inside the dotted rectangle (diagram below) can be + called any number of times. There are some limitations though, such as `restart` can only be called if the stream is + `paused`. +3. Any party can call `void` to terminate it. Only withdraw and refund are allowed on a voided stream. diff --git a/docs/concepts/flow/02-statuses.md b/docs/concepts/flow/02-statuses.md new file mode 100644 index 00000000..b70cfce8 --- /dev/null +++ b/docs/concepts/flow/02-statuses.md @@ -0,0 +1,130 @@ +--- +id: "statuses" +sidebar_position: 2 +title: "Statuses" +--- + +# Stream Statuses + +A Flow stream can have one of five distinct statuses: + +| Status | Description | +| --------------------- | ----------------------------------------------------------------------------------- | +| `STREAMING_SOLVENT` | Active stream with total debt not exceeding stream balance. | +| `STREAMING_INSOLVENT` | Active stream with total debt exceeding stream balance. | +| `PAUSED_SOLVENT` | Paused stream with total debt not exceeding stream balance. | +| `PAUSED_INSOLVENT` | Paused stream with total debt exceeding stream balance. | +| `VOIDED` | Paused stream that can no longer be restarted and has forfeited its uncovered debt. | + +## Stream characteristics + +A stream can have the following characteristics: + +| Characteristic | Statuses | Description | +| :------------- | :---------------------------------------------- | :------------------------------------------------------ | +| Streaming | `STREAMING_SOLVENT`, `STREAMING_INSOLVENT` | Non-zero rps. | +| Paused | `PAUSED_SOLVENT`, `PAUSED_INSOLVENT`, `VOIDED` | Zero rps. | +| Solvent | `STREAMING_SOLVENT`, `PAUSED_SOLVENT`, `VOIDED` | Total debt not exceeding the stream balance. | +| Insolvent | `STREAMING_INSOLVENT`, `PAUSED_INSOLVENT` | Total debt exceeding the stream balance. | + +## State transitions + +The following diagram illustrates the statuses and the allowed transitions between them: + +```mermaid +flowchart LR + N(NULL) + V(VOIDED) + + subgraph PAUSED + direction RL + PS(SOLVENT) + PI(INSOLVENT) + PI -- "deposit" --> PS + end + + subgraph STREAMING + direction LR + SS(SOLVENT) + SI(INSOLVENT) + SI -- "deposit" --> SS + SS -- "time" --> SI + end + + STREAMING -- pause --> PAUSED + STREAMING -- void --> V + PAUSED -- restart --> STREAMING + PAUSED -- void --> V + + N -- create (rps > 0) --> STREAMING + N -- create (rps = 0) --> PAUSED +``` + +## Functions Statuses Interaction + +### NULL stream + +```mermaid +flowchart LR + CR[CREATE] --> NULL((NULL)) +``` + +### STREAMING stream + +```mermaid +flowchart TD + STR((STREAMING)) + + ADJRPS[ADJUST_RPS] --> STR + DP[DEPOSIT] --> STR + RFD[REFUND] --> STR + PS[PAUSE] --> STR + VD[VOID] --> STR + WTD[WITHDRAW] --> STR +``` + +### PAUSED stream + +```mermaid +flowchart TD + PSED((PAUSED)) + + DP([DEPOSIT]) --> PSED + RFD([REFUND]) --> PSED + RST([RESTART]) --> PSED + VD([VOID]) --> PSED + WTD([WITHDRAW]) --> PSED +``` + +### VOIDED stream + +```mermaid +flowchart LR + VOID((VOIDED)) + + RFD([REFUND]) --> VOID + WTD([WITHDRAW]) --> VOID +``` + +## Q&A + +### Q: What is a null stream? + +A: An ID that does not reference a created stream. Trying to interact with a null stream will result in a revert. + +### Q: What to do with a stream status? + +A: Knowing the status of a stream can inform your decision making. For example, if a stream is `STREAMING_INSOLVENT`, +that means the stream is active but has insufficient balance. As a sender, you should deposit into the stream so that +your recipient can withdraw the streamed amount without any hiccups. And if you don't want to continue the stream, you +can pause it. + +### Q: Who can make a stream `VOIDED`? + +A: Both sender and recipient can void the stream. This is especially useful when either party wants to stop the stream +immediately. Once a stream is voided, it cannot be restarted. If there is uncovered debt, it will be reset to 0. So to +ensure that your recipient does not lose on any streamed amount, you can deposit into the stream before voiding it. + +``` + +``` diff --git a/docs/concepts/flow/_category_.json b/docs/concepts/flow/_category_.json new file mode 100644 index 00000000..000c818d --- /dev/null +++ b/docs/concepts/flow/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": false, + "label": "Flow", + "position": 5 +} diff --git a/docs/concepts/lockup/01-overview.md b/docs/concepts/lockup/01-overview.md new file mode 100644 index 00000000..0b1cfdba --- /dev/null +++ b/docs/concepts/lockup/01-overview.md @@ -0,0 +1,22 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +Lockup is a token streaming protocol that refers to the requirement that the creator of a stream must lock up a certain +amount of tokens in a smart contract. A Lockup stream, therefore, is characterized by the start time, end time, amount +of tokens to be streamed and a [stream shape](./02-stream-shapes.mdx). + +Let's discuss an example. Imagine Alice wants to stream 3,000 DAI to Bob during the whole month of January. + +1. Alice deposits the 3,000 DAI in Lockup before Apr 1, setting the end time to May 1. +2. Bob's allocation of the DAI deposit increases every second beginning Apr 1. +3. On Apr 10, Bob will have earned approximately 1,000 DAI. He can send a transaction to Lockup to withdraw the tokens. +4. If at any point during January Alice wishes to get back her tokens, she can cancel the stream and recover what has + not been streamed yet. + +This streaming model is especially useful for use cases like vesting and airdrops. If you are looking to create an +indefinite stream of tokens, please refer to our [Flow](../flow/overview) protocol. + +Lockup enables multiple shapes of streams which is discussed in the next section. diff --git a/docs/concepts/protocol/02-stream-types.mdx b/docs/concepts/lockup/02-stream-shapes.mdx similarity index 87% rename from docs/concepts/protocol/02-stream-types.mdx rename to docs/concepts/lockup/02-stream-shapes.mdx index ba8de743..7404615d 100644 --- a/docs/concepts/protocol/02-stream-types.mdx +++ b/docs/concepts/lockup/02-stream-shapes.mdx @@ -1,31 +1,26 @@ --- -id: "stream-types" +id: "stream-shapes" sidebar_position: 2 -title: "Types of Streams" +title: "Stream Shapes" --- import FunctionPlot from "@site/src/components/FunctionPlot"; -## Lockup - -"Lockup" is a higher-level category that refers to the requirement that the creator of a stream must lock up a certain -amount of assets in a smart contract. All streams currently supported by Sablier are Lockup streams. - :::note -The code used to generate the gas benchmarks for the different stream types can be found +The code used to generate the gas benchmarks for the different stream curves can be found [here](https://github.com/sablier-labs/examples/tree/shapes-benchmark). ::: ## Lockup Linear -Lockup Linear streams are the simplest type of stream in Sablier. The streamed amount over time follows a straight line -that goes up and to the right on a graph, which corresponds to the identity function $f(x) = x$: +Lockup Linear streams are the simplest token distribution curve in Sablier. The streamed amount over time follows a +straight line that goes up and to the right on a graph, which corresponds to the identity function $f(x) = x$: -With this type of stream, the payment rate remains constant, meaning that the same fraction of the deposit amount is +With this shape of stream, the payment rate remains constant, meaning that the same fraction of the deposit amount is streamed to the recipient every second. This provides greater predictability and is easy to understand because of how intuitive it is. Imagine a diagonal line going up and to the right – that's how simple it is. @@ -37,8 +32,8 @@ The gas cost to create this shape is approximately _150,000_ on Mainnet. This ma ### Cliffs -It is possible to attach a "cliff" to a Lockup Linear stream, which sets a cut-off point for releasing assets. Prior to -the cliff, the recipient cannot withdraw any assets, but the stream continues to accrue them. After the cliff, the +It is possible to attach a "cliff" to a Lockup Linear stream, which sets a cut-off point for releasing tokens. Prior to +the cliff, the recipient cannot withdraw any tokens, but the stream continues to accrue them. After the cliff, the constant payment rate per second kicks in. -This feature is especially useful for vesting ERC-20 assets as it allows you to have, for example, a 1-year cliff, and +This feature is especially useful for vesting ERC-20 tokens as it allows you to have, for example, a 1-year cliff, and then 3 additional years of linear streaming. If the stream is for an employee, you can make it cancellable so that if -the employee leaves your company during the stream, you can cancel it and recover the assets that have not yet been +the employee leaves your company during the stream, you can cancel it and recover the tokens that have not yet been streamed. :::info @@ -72,21 +67,21 @@ The gas cost to create this shape is approximately _150,000_ on Mainnet. This ma ## Lockup Dynamic -Lockup Dynamic streams are what makes Sablier so unique, since they enable the creation of any type of streaming curve, -including non-linear ones. +Lockup Dynamic streams are what makes Sablier so unique, since they enable the creation of an arbitrary streaming curve, +including non-linear curves. On the Sablier Interface, we support only some distribution shapes (the ones enumerated below), but the potential for innovation is limitless when you interact programmatically with the contracts. For example, one could design a logarithmic stream that emulates the $f(x) = log(x)$ function. -These streams are powered by a number of user-provided [segments](/concepts/protocol/segments), which we will cover in -the next article. What is important to note here is that with Lockup Dynamic, Sablier has evolved into a universal -streaming engine, capable of supporting any custom streaming curve. +These streams are powered by a number of user-provided [segments](/concepts/lockup/segments), which we will cover in the +next article. What is important to note here is that with Lockup Dynamic, Sablier has evolved into a universal streaming +engine, capable of supporting any custom streaming curve. :::note If you are interested in learning how to programmatically create the curves shown below in Solidity, check out the -[examples](https://github.com/sablier-labs/examples/blob/main/v2/core/LockupDynamicCurvesCreator.sol) repository. +[examples](https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupDynamicCurvesCreator.sol) repository. ::: @@ -251,7 +246,7 @@ Lockup Dynamic to create a traditional vesting structure with periodic unlocks, for that use case. As a result, a stream with tranches created using Lockup Tranched is more gas efficient than the same stream created using Lockup Dynamic. -These streams are powered by a number of user-provided [tranches](/concepts/protocol/tranches), which is covered in the +These streams are powered by a number of user-provided [tranches](/concepts/lockup/tranches), which is covered in the tranches article. ### Unlock in Steps @@ -298,7 +293,7 @@ multiple factors to consider. ### Unlock Monthly -Unlock Monthly is a special case of Unlock in Steps where assets are unlocked on the same day every month, e.g. the 1st +Unlock Monthly is a special case of Unlock in Steps where tokens are unlocked on the same day every month, e.g. the 1st of every month. This is suited for use cases like traditional monthly salaries or ESOPs plans. can change the status. | | Cold | Settled, Canceled, Depleted | The passage of time alone cannot change the status. Only a user action can do this. | -## Diagram +## State transitions The following diagram illustrates the statuses and the allowed transitions between them: @@ -62,10 +62,10 @@ A: An id that does not reference a created stream. Trying to interact with a nul ### Q: What to do with a stream status? A: Knowing the status of a stream can inform your decision making. For example, if a stream is canceled, you know that -you can't cancel it again. Or, if a stream is depleted, you know that you can't withdraw any more assets from it. +you can't cancel it again. Or, if a stream is depleted, you know that you can't withdraw any more tokens from it. ### Q: How can a stream enter the `SETTLED` status directly? -A: This is a peculiarity of the [Lockup Dynamic](/concepts/protocol/stream-types#lockup-dynamic) type of stream. Segment -amounts can be zero, and the segment milestones can be set in such a way that all non-zero segments are in the past. -This will cause the stream to enter the `SETTLED` status directly. +A: This is a peculiarity of the [Lockup Dynamic](/concepts/lockup/stream-shapes#lockup-dynamic) streams. Segment amounts +can be zero, and the segment milestones can be set in such a way that all non-zero segments are in the past. This will +cause the stream to enter the `SETTLED` status directly. diff --git a/docs/concepts/lockup/07-hooks.md b/docs/concepts/lockup/07-hooks.md new file mode 100644 index 00000000..c8045c8a --- /dev/null +++ b/docs/concepts/lockup/07-hooks.md @@ -0,0 +1,89 @@ +--- +id: "hooks" +sidebar_position: 7 +title: "Hooks" +--- + +Hooks are arbitrary third-party functions that get automatically executed by the Sablier Protocol in response to +`cancel` and `withdraw` events. They are similar to callback functions in web2. + +:::info Important + +Hooks have to be allowlisted before they can be run. Currently, only the [Protocol Admin](/concepts/governance) has +permission to do this. In the future, we may decentralize this process through governance. + +::: + +Hooks are a powerful feature that enable Sablier streams to interact with other DeFi protocols. Let's consider an +example: + +You own a Sablier stream that expires in two years. You are interested into taking a loan against it with the intention +to pay it all back after it expires. Hooks are what enable you to do that. With the help of Hooks, we can create an +ecosystem of varied use cases for Sablier streams. This can range from lending, staking, credit, and more. + +It is worth noting that once a hook has been allowlisted, it can never be removed. This is to ensure stronger +immutability and decentralization guarantees. Once a recipient contract is allowlisted, integrators do NOT have to trust +us to keep their contract on the allowlist. + +## Checklist + +The requirements a hook contract must meet: + +1. The contract is not upgradeable. +2. The contract was audited by a third-party security researcher. +3. The contract implements `supportsInterface` and returns `true` for `0xf8ee98d3`, i.e., + `type(ISablierLockupRecipient).interfaceId`. +4. If it implements `onSablierLockupCancel`: + 1. It returns `ISablierLockupRecipient.onSablierLockupCancel.selector`. + 1. It reverts if `msg.sender` is not the Lockup contract. + 1. It uses input parameters correctly: `streamId`, `sender`, `senderAmount`, `recipientAmount`. + 1. Be aware that if the call reverts, the entire `cancel` execution would revert too. +5. If it implements `onSablierLockupWithdraw`: + 1. It returns `ISablierLockupRecipient.onSablierLockupWithdraw.selector`. + 1. It reverts if `msg.sender` is not Lockup contract. + 1. It uses input parameters correctly: `streamId`, `caller`, `to`, `amount`. + 1. Be aware that if the call reverts, the entire `withdraw` execution would revert too. + +## Visual representation + +:::note + +If the recipient contract is not on the Sablier allowlist, the hooks will not be executed. + +::: + +### Cancel hook + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> SablierLockup: cancel() + SablierLockup -->> Recipient: onSablierLockupCancel() + Recipient -->> SablierLockup: return selector + SablierLockup -->> Sender: transfer unstreamed tokens + break if hook reverts + Recipient -->> SablierLockup: ❌ tx fail + end +``` + +### Withdraw hook + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> SablierLockup: withdraw() + SablierLockup -->> Recipient: onSablierLockupWithdraw() + Recipient -->> SablierLockup: return selector + SablierLockup -->> Recipient: transfer streamed tokens + break if hook reverts + Recipient -->> SablierLockup: ❌ tx fail + end +``` + +## Next steps + +If you are interested into using Sablier hooks into your protocol, please check the +[Hook guide](/guides/lockup/examples/hooks). if you looking to get on the allowlist, reach out to us on +[Discord](https://discord.sablier.com). diff --git a/docs/concepts/protocol/10-cancelability.md b/docs/concepts/lockup/08-cancelability.md similarity index 99% rename from docs/concepts/protocol/10-cancelability.md rename to docs/concepts/lockup/08-cancelability.md index 10b65c8a..92432432 100644 --- a/docs/concepts/protocol/10-cancelability.md +++ b/docs/concepts/lockup/08-cancelability.md @@ -1,6 +1,6 @@ --- id: "cancelability" -sidebar_position: 10 +sidebar_position: 8 title: "Cancelability" --- diff --git a/docs/contracts/v2/guides/_category_.json b/docs/concepts/lockup/_category_.json similarity index 66% rename from docs/contracts/v2/guides/_category_.json rename to docs/concepts/lockup/_category_.json index eb546556..0d6f614e 100644 --- a/docs/contracts/v2/guides/_category_.json +++ b/docs/concepts/lockup/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Guides", + "label": "Lockup", "position": 4 } diff --git a/docs/concepts/protocol/08-fees.mdx b/docs/concepts/protocol/08-fees.mdx deleted file mode 100644 index e1d968d3..00000000 --- a/docs/concepts/protocol/08-fees.mdx +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: "fees" -sidebar_position: 8 -title: "Fees" ---- - -import Link from "@docusaurus/Link"; -import { links } from "@site/src/constants"; - -The Sablier Protocol is entirely free to use. There is no protocol fee. However, external integrators who manage their -own UI may charge broker fee in exchange for providing their services. Broker fees can only be charged when a stream is -created, and is capped at 10%. - -## Broker fees - -In the Sablier ecosystem, a "broker" is any third-party entity that interacts with the Sablier Protocol on behalf of -other users. These brokers have the ability to charge service fees for facilitating such interactions. - -Broker fees are particularly useful for front-end applications that integrate the Sablier Protocol. They enable -front-end operators to levy a fee on each Sablier stream created through their platform. - -The broker fee is a percentage of the streamed amount, and it cannot be higher than 10%. In the event of cancellation, -broker fee is non-refundable. - -:::info - -The official [Sablier Interface](https://app.sablier.com) does NOT currently charge any broker fees. - -::: - -:::note - -Interested in becoming a broker? Please fill out this form and we will respond as -soon as possible. - -::: - -## Gas Fees - -### Q: What are gas fees? - -A: [Gas fees](https://www.investopedia.com/terms/g/gas-ethereum.asp) are transaction fees paid to the blockchain -validators in native tokens such as ETH. Sablier Labs does not take any cut from this. - -### Q: When are gas fees paid? - -A: Gas is paid only when streams are created, canceled, transferred, or withdrawn from. It does not accrue in real-time. - -### Q: Does Sablier receive any portion of the gas fee? - -A: No. 100% of the gas fee goes to the blockchain validators, which are not affiliated with Sablier Labs. - -:::tip - -To find how much each function costs, check out these [gas benchmark reports](/contracts/v2/gas-benchmarks). - -::: diff --git a/docs/concepts/protocol/09-hooks.md b/docs/concepts/protocol/09-hooks.md deleted file mode 100644 index 4efdbe84..00000000 --- a/docs/concepts/protocol/09-hooks.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -id: "hooks" -sidebar_position: 9 -title: "Hooks" ---- - -Hooks are arbitrary functions that get automatically executed by Sablier in response to `cancel` and `withdraw` events. -They are similar to callback functions in web2. - -:::info Important - -Hooks have to be allowlisted before they can be run. Currently, only the [Protocol Admin](/concepts/governance) has -permission to do this. In the future, we aim to decentralize this process through governance. - -::: - -Hooks are powerful feature that enable Sablier streams to interact with other DeFi protocols. Let's consider an example. - -You own a Sablier stream that expires in two years. You are interested into taking a loan against it with the intention -to pay it all back after it expires. Hooks are what enable you to do that. With the help of Hooks, we can create an -ecosystem of varied use cases for Sablier streams. This can range from lending, staking, credit, and more. - -It is worth noting that once a hook has been allowlisted, it can never be removed. This is to ensure stronger -immutability and decentralization guarantees. Once a recipient contract is allowlisted, integrators do NOT have to trust -us to keep their contract on the allowlist. - -## Visual representation - -:::note - -If the recipient contract is not on the allowlist, the hooks will not be executed. - -::: - -```mermaid -flowchart LR - S((Sender)) - A((Anyone)) - subgraph Core - L[SablierLockup] - end - R((Recipient)) - S -- "cancel" --> L - L -- "onSablierLockupCancel" --> R - A -- "withdraw" --> L - L -- "onSablierLockupWithdraw" --> R -``` - -## Next steps - -Looking to get on the allowlist? Reach out to us on [Discord](https://discord.sablier.com). diff --git a/docs/contracts/v1/_category_.json b/docs/contracts/v1/_category_.json deleted file mode 100644 index 7ea28707..00000000 --- a/docs/contracts/v1/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "collapsed": true, - "label": "V1 Protocol", - "position": 2 -} diff --git a/docs/contracts/v1/guides/codebase.mdx b/docs/contracts/v1/guides/codebase.mdx deleted file mode 100644 index e3ff04c9..00000000 --- a/docs/contracts/v1/guides/codebase.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: codebase -title: Codebase -sidebar_position: 2 ---- - -import LinkPreview from "../../../../src/components/LinkPreview"; - -## Repository - -The Sablier Protocol is hosted on GitHub and the source code for each contract is verified on Etherscan. - - - -## ABIs - -Depending on the web3 library you're working with, you may need to get hold of the Sablier ABIs (application binary -interfaces). The ABI acts as an interface between two program modules, one of which is the smart contract and the other -the Ethereum virtual machine code. - -There are two ways to obtain it:‌ - -1. Copy `Sablier.json` from [sablier-labs/v1-abis](https://github.com/sablier-labs/v1-abis). -2. Clone [sablier-labs/v1-protocol](https://github.com/sablier-labs/v1-protocol) and compile the contract yourself. - -Here's an example for how to do step 2 with yarn and truffle: - -```bash -$ git clone git@github.com/sablier-labs/v1-protocol.git sablier-v1 -$ cd ./sablier-v1 -$ yarn bootstrap -$ cd ./packages/protocol -$ truffle compile - -The `Sablier.json` artifact should be generated in the relative `build/contracts` folder. -``` diff --git a/docs/contracts/v2/01-overview.md b/docs/contracts/v2/01-overview.md deleted file mode 100644 index 0847672c..00000000 --- a/docs/contracts/v2/01-overview.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: "overview" -sidebar_position: 1 -title: "Overview" ---- - -# Sablier V2 Protocol - -Welcome to the Sablier V2 Protocol documentation. - -This section contains detailed guides and technical references for the Sablier V2 Protocol, a suite of smart contracts -running autonomously in the Ethereum ecosystem. These documents offer insight into the operational nuances of the -contracts, providing a valuable resource for building onchain integrations. - -# Guides - -If you are new to Sablier, we recommend you start with the [Concepts](/concepts/what-is-sablier) section first. - -You can then setup your [local environment](./guides/01-local-environment.md) and create your -[first stream](./guides/create-stream/01-lockup-linear.mdx). - -# Reference - -For a deeper dive, read through the [technical reference](./reference/overview). - -# Resources - -- [V2 Core](https://github.com/sablier-labs/v2-core/tree/release) -- [V2 Periphery](https://github.com/sablier-labs/v2-periphery/tree/release) -- [Integration Template](https://github.com/sablier-labs/sablier-integration-template) -- [Example Integrations](https://github.com/sablier-labs/examples) -- [Foundry Book](https://book.getfoundry.sh/) diff --git a/docs/contracts/v2/03-security.md b/docs/contracts/v2/03-security.md deleted file mode 100644 index e53242be..00000000 --- a/docs/contracts/v2/03-security.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -id: "security" -sidebar_position: 3 -title: "Security" ---- - -Ensuring the security of the Sablier Protocol is our utmost priority. We have dedicated significant efforts towards the -design and testing of the protocol to guarantee its safety and reliability. - -## Audits - -The codebase has undergone rigorous audits by leading security experts from [Cantina](https://cantina.xyz/), -[CodeHawks](https://codehawks.cyfrin.io/), and many independent auditors. For a comprehensive list of all audits -conducted, check out [this link](https://github.com/sablier-labs/audits). - -## Bug Bounty - -The Sablier Protocol is subject to a bug bounty program per the terms outlined -[here](https://github.com/sablier-labs/v2-core/blob/main/SECURITY.md). We are offering a bounty of up to $100,000 for -reporting critical vulnerabilities. diff --git a/docs/contracts/v2/deployments/_category_.json b/docs/contracts/v2/deployments/_category_.json deleted file mode 100644 index 4e559949..00000000 --- a/docs/contracts/v2/deployments/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "collapsed": true, - "label": "Previous Versions", - "position": 7 -} diff --git a/docs/contracts/v2/reference/01-overview.md b/docs/contracts/v2/reference/01-overview.md deleted file mode 100644 index d0aa4073..00000000 --- a/docs/contracts/v2/reference/01-overview.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -id: "overview" -sidebar_position: 1 -title: "Overview" ---- - -Sablier V2 is a binary smart contract system comprised of many contracts, libraries, and types, which together make Core -and Periphery. - -- **Core** provides the fundamental token distribution logic of the Sablier V2 Protocol. It contains LockupLinear, - LockupDynamic, and LockupTranched, the primary contracts that users will interact with. -- **Periphery** contracts interact with one or more Core contracts but are not part of the Core. They are an abstraction - layer that enhance the security and the extensibility of the protocol without introducing upgradeability. Periphery - plays a key role in creating Airstream campaigns. - -Given the permissionless nature of the Sablier Protocol, the Periphery has no special privileges and is only a fraction -of possible periphery-like contracts. Users maintain the liberty to establish streams via the Core directly. - -The design of the Sablier smart contracts draws inspiration from the architectural principles of -[Uniswap](https://docs.uniswap.org/). - -## Core - -> [**Core Source Code**](https://github.com/sablier-labs/v2-core/tree/v1.2.0) - -Core consists of the distribution contracts (LockupLinear, LockupDynamic and LockupTranched), and an NFT descriptor. - -### LockupLinear - -> [**LockupLinear Reference**](./core/contract.SablierV2LockupLinear) - -Creates and manages Lockup streams with a linear streaming function. - -### LockupDynamic - -> [**LockupDynamic Reference**](./core/contract.SablierV2LockupDynamic) - -Creates and manages Lockup streams with dynamic streaming functions. - -### LockupTranched - -> [**LockupTranched Reference**](./core/contract.SablierV2LockupTranched) - -Creates and manages Lockup streams with tranches. - -### NFTDescriptor - -> [**NFTDescriptor Reference**](./core/contract.SablierV2NFTDescriptor) - -Generates the URI describing the Sablier V2 stream NFTs. - -## Periphery - -> [**Periphery Source Code**](https://github.com/sablier-labs/v2-periphery/tree/v1.2.0) - -The Periphery is a collection of contracts meant to make the Sablier Protocol more modular while introducing -functionalities such as [Airstreams](/concepts/protocol/airstreams). It consists of BatchLockup and Airstream related -contracts (such as MerkleLockupFactory, MerkleLL and MerkleLT). - -### BatchLockup - -> [**BatchLockup Reference**](./periphery/contract.SablierV2BatchLockup) - -### MerkleLockupFactory - -> [**MerkleLockupFactory Reference**](./periphery/contract.SablierV2MerkleLockupFactory) - -### MerkleLockupLL - -> [**MerkleLockupLL Reference**](./periphery/contract.SablierV2MerkleLL) - -### MerkleLockupLT - -> [**MerkleLockupLT Reference**](./periphery/contract.SablierV2MerkleLT) diff --git a/docs/contracts/v2/reference/05-access-control.md b/docs/contracts/v2/reference/05-access-control.md deleted file mode 100644 index 78af3ea3..00000000 --- a/docs/contracts/v2/reference/05-access-control.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -id: "access-control" -sidebar_position: 5 -title: "Access Control" ---- - -With the exception of the [admin functions](/docs/concepts/05-governance.md), all functionalities in Sablier can only be -triggered by users. The Protocol Admin has no control over any stream or any part of the protocol. - -This article will provide a comprehensive overview of the actions that can be performed on streams once they are -created, as well as the corresponding user permissions for each action. - -:::note - -Every stream has a sender and a recipient. Recipients can approve third parties to take actions on their behalf. An -'unknown' caller is any address outside of sender and recipient. - -::: - -## Overview - -The table below offers a quick overview of the access control for each action that can be performed on a stream. - -| Action | Sender | Recipient / Approved third party | Unknown Caller | -| ----------------------- | :----: | :------------------------------: | :------------: | -| Burn NFT | ❌ | ✅ | ❌ | -| Cancel | ✅ | ❌ | ❌ | -| Cancel Multiple | ✅ | ❌ | ❌ | -| Renounce | ✅ | ❌ | ❌ | -| Transfer NFT | ❌ | ✅ | ❌ | -| Withdraw to recipient | ✅ | ✅ | ✅ | -| Withdraw to any address | ❌ | ✅ | ❌ | -| Withdraw Multiple | ✅ | ✅ | ✅ | - -## Burn NFT - -Either the recipient or an approved operator can burn the NFT associated with a stream. - -```mermaid -flowchart LR; - recipient((Recipient)); - operator((Operator)); - nft[(NFT)]; - - recipient -- burn -->nft; - recipient -- approve -->operator; - operator -- burn -->nft; -``` - -## Cancel - -Only the sender can cancel a stream. - -```mermaid -flowchart LR; - sender((Sender)); - stream[(Stream)]; - sender -- cancel -->stream; -``` - -## Cancel Multiple - -Only the sender can cancel multiple streams. - -```mermaid -flowchart LR; - sender((Sender)); - streams[(Multiple Streams)]; - - sender -- cancelMultiple -->streams; -``` - -## Renounce - -Only the sender can renounce a stream. - -```mermaid -flowchart LR; - sender((Sender)); - stream[(Stream)]; - sender -- renounce -->stream; -``` - -## Transfer NFT - -Either the recipient or an approved operator can transfer the NFT associated with a stream. - -- Only if the stream is transferable. - -```mermaid -flowchart LR; - recipient((Recipient)); - operator((Operator)); - nft[(NFT)]; - - recipient -- transfer -->nft; - recipient -- approve -->operator; - operator -- transfer -->nft; -``` - -## Withdraw Multiple - -Anybody can withdraw assets from multiple streams to the recipients of each stream. - -```mermaid -flowchart LR; - unknown((Unknown caller)); - recipient((Recipient)); - operator((Operator)); - sender((Sender)); - streams[(Stream)]; - toAddress[Recipient address]; - - unknown -- withdrawMultiple --> streams; - sender -- withdrawMultiple --->streams; - recipient -- withdrawMultiple --->streams - recipient -- approve -->operator; - operator -- withdrawMultiple -->streams; - streams -- tokens --> toAddress; -``` - -## Withdraw to Any Address - -The assets in a stream can be withdrawn to any address only by the recipient or an approved third party. - -```mermaid -flowchart LR; - recipient((Recipient)); - operator((Operator)); - stream[(Stream)]; - toAddress[Any address]; - - recipient -- withdraw -->stream; - recipient -- approve -->operator; - operator -- withdraw -->stream; - stream -- tokens --> toAddress; -``` - -## Withdraw to Recipient - -The assets in a stream can be withdrawn to the recipient by anyone including the sender, recipient, or an approved third -party. - -```mermaid -flowchart LR; - unknown((Unknown caller)); - recipient((Recipient)); - operator((Operator)); - sender((Sender)); - stream[(Stream)]; - toAddress[Recipient address]; - - unknown -- withdraw ----> stream; - sender -- withdraw --->stream; - recipient -- withdraw -->stream; - recipient -- approve -->operator; - operator -- withdraw -->stream; - stream -- tokens --> toAddress; -``` diff --git a/docs/contracts/v2/guides/10-custom-deployments.mdx b/docs/guides/03-custom-deployments.mdx similarity index 59% rename from docs/contracts/v2/guides/10-custom-deployments.mdx rename to docs/guides/03-custom-deployments.mdx index eb17b119..2321f14c 100644 --- a/docs/contracts/v2/guides/10-custom-deployments.mdx +++ b/docs/guides/03-custom-deployments.mdx @@ -1,6 +1,6 @@ --- id: "custom-deployments" -sidebar_position: 11 +sidebar_position: 3 title: "Custom Deployments" --- @@ -22,14 +22,14 @@ you fill out this form and meet the requi - GraphQL solution, e.g., a deployment of [The Graph](https://thegraph.com/) - Functional JSON-RPC endpoint, ideally listed on [ChainList](https://chainlist.org/) -## Deployment Guide +## Lockup Deployment Guide The following guidelines apply to you only if you have you been granted a -[BUSL license](https://app.ens.domains/lockup-license-grants.sablier.eth?tab=records) to deploy the Sablier Protocol. +[BUSL license](https://app.ens.domains/lockup-license-grants.sablier.eth?tab=records) to deploy the Lockup Protocol. -### Pre Requisities +### Prerequisites -- Check if the deployment is not already made on [your chain](/contracts/v2/deployments) +- Check if the deployment is not already made on [your chain](/guides/lockup/deployments) - Follow the [contributing guide](https://github.com/sablier-labs/v2-core/blob/main/CONTRIBUTING.md) - RPC endpoint, e.g., a paid Infura account - Enough ETH in your deployer account @@ -37,7 +37,7 @@ The following guidelines apply to you only if you have you been granted a ### Steps for deploying Core contracts -#### Step 1: Clone the [v2-core repo](https://github.com/sablier-labs/v2-core) and checkout to the latest release tag +#### Step 1: Clone the [Lockup core repo](https://github.com/sablier-labs/v2-core) and checkout to the latest release tag At the time of writing, the latest release tag is `v1.2.0`: @@ -71,7 +71,7 @@ source .env :::warning[Important] -You must set the protocol admin to the Sablier-controlled address 0xD427d37B5F6d33f7D42C4125979361E011FFbfD9. Failure to +You must set the protocol admin to the Sablier controlled address 0xD427d37B5F6d33f7D42C4125979361E011FFbfD9. Failure to do so will result in your deployment not being acknowledged as official. ::: @@ -111,7 +111,7 @@ If you are using a mnemonic or a hardware device for your deployer address, refe ### Steps for deploying Periphery contracts -#### Step 1: Clone the [v2-periphery](https://github.com/sablier-labs/v2-periphery) and checkout to the latest release tag +#### Step 1: Clone the [Lockup periphery repo](https://github.com/sablier-labs/v2-periphery) and checkout to the latest release tag At the time of writing, the latest release tag is `v1.2.0`: @@ -178,11 +178,97 @@ If you are using a mnemonic or a hardware device for your deployer address, refe ### Steps for listing the deployments -Once the contracts are deployed, the final step is to list the deployment addresses and artifacts in the Sablier docs: +Once the contracts are deployed, the final step is to list the deployment addresses and artifacts in the Lockup docs: 1. List the deployment addresses by opening a PR in the [docs repo](https://github.com/sablier-labs/docs/blob/main/docs/contracts/v2/02-deployments.md) -2. List the deployment artifacts by opening a PR in the - [deployments repo](https://github.com/sablier-labs/v2-deployments) +2. List the deployment artifacts by opening a PR in the [deployments repo](https://github.com/sablier-labs/deployments) - Copy the generated artifact files (ABIs) from the `artifacts` directory. - Copy the latest broadcast file from the `broadcast` directory. + +## Flow Deployment Guide + +The following guidelines apply to you only if you have you been granted a +[BUSL license](https://app.ens.domains/flow-license-grants.sablier.eth?tab=records) to deploy the Flow protocol. + +### Prerequisites + +- Check if the deployment is not already made on [your chain](/guides/flow/deployments) +- Follow the [contributing guide](https://github.com/sablier-labs/flow/blob/main/CONTRIBUTING.md) +- RPC endpoint, e.g., a paid Infura account +- Enough ETH in your deployer account +- Etherscan API key (for source code verification) + +### Steps for deploying Flow contracts + +#### Step 1: Clone the [Flow repo](https://github.com/sablier-labs/flow) and checkout to the latest release tag + +At the time of writing, the latest release tag is `v1.0.0`: + +```bash +git checkout v1.0.0 +``` + +#### Step 2: Create an `.env` file + +```bash +touch .env +``` + +Add the following variables to `.env` file: + +``` +EOA="DEPLOYER ADDRESS" +ETHERSCAN_API_KEY="EXPLORER API KEY" +PRIVATE_KEY="PRIVATE KEY OF DEPLOYER ADDRESS" +RPC_URL="RPC ENDPOINT URL" +VERIFIER_URL="EXPLORER VERIFICATION URL" +``` + +Load the environment variables into your shell: + +```bash +source .env +``` + +#### Step 3: Run the following deployment command + +:::warning[Important] + +You must set the protocol admin to the Sablier controlled address 0xD427d37B5F6d33f7D42C4125979361E011FFbfD9. Failure to +do so will result in your deployment not being acknowledged as official. + +::: + +For **deterministic** deployment: + +```bash +FOUNDRY_PROFILE=optimized \ +forge script script/DeployDeterministicFlow.s.sol \ +--broadcast \ +--etherscan-api-key $ETHERSCAN_API_KEY \ +--rpc-url $RPC_URL \ +--private-key $PRIVATE_KEY \ +--sig "run(address)" 0xD427d37B5F6d33f7D42C4125979361E011FFbfD9 \ +--verifier-url $VERIFIER_URL \ +--verify \ +-vvv +``` + +For **non-deterministic** deployment: + +```bash +FOUNDRY_PROFILE=optimized \ +forge script script/DeployFlow.s.sol \ +--broadcast \ +--etherscan-api-key $ETHERSCAN_API_KEY \ +--private-key $PRIVATE_KEY \ +--rpc-url $RPC_URL \ +--sig "run(address)" 0xD427d37B5F6d33f7D42C4125979361E011FFbfD9 \ +--verifier-url $VERIFIER_URL \ +--verify \ +-vvv +``` + +If you are using a mnemonic or a hardware device for your deployer address, refer to `forge-script` page from +[foundry book](https://book.getfoundry.sh/reference/forge/forge-script#forge-script) for different wallet options. diff --git a/docs/contracts/v2/guides/08-snapshot-voting.md b/docs/guides/04-snapshot-voting.md similarity index 86% rename from docs/contracts/v2/guides/08-snapshot-voting.md rename to docs/guides/04-snapshot-voting.md index 3dc5d76f..81ae6e9b 100644 --- a/docs/contracts/v2/guides/08-snapshot-voting.md +++ b/docs/guides/04-snapshot-voting.md @@ -1,21 +1,21 @@ --- id: "snapshot-voting" -sidebar_position: 9 -title: "Snapshot Strategies" +sidebar_position: 4 +title: "Snapshot Voting" --- # Snapshot Voting Strategies To enable off-chain governance, we designed a collection of Snapshot Strategies that compute the voting power of assets -stored in Sablier streams. +stored in Lockup streams. -## Sablier V2 +## Lockup - [Snapshot playground](https://snapshot.org/#/playground/sablier-v2) - test the strategies - [Snapshot code repository](https://github.com/snapshot-labs/snapshot-strategies/tree/master/src/strategies/sablier-v2) - see the implementation -The following strategies will read the various amounts that can be found in Sablier V2 streams. The voting power will be +The following strategies will read the various amounts that can be found in Lockup streams. The voting power will be calculated based on some sub-strategies called `policies`. | Snapshot Playground | @@ -63,7 +63,7 @@ These policies are designed to address specific edge cases. We strongly recommen ### Example ```text -Sablier V2 Stream #000001 +Lockup Stream #000001 --- Deposited: TKN 1000 for 30 days Withdrawn: TKN 450 before snapshot @@ -105,7 +105,7 @@ For the best results, we recommend using the primary policies. The withdrawable amount counts tokens that have been streamed but not withdrawn yet by the recipient. This is provided using the -[`withdrawableAmountOf`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) contract +[`withdrawableAmountOf`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) contract method. Voting power: realized (present). @@ -138,8 +138,8 @@ Aggregates historical deposits up to the snapshot time, counting only the stream :::caution Caveats - Streaming, canceling and streaming again will cause tokens to be counted multiple times. -- Takes into account streams created through [PRBProxy](/contracts/v2/reference/overview#periphery) instances configured - through the official [Sablier Interface](https://app.sablier.com/). +- Takes into account streams created through [PRBProxy](/reference/lockup/periphery/contract.SablierV2BatchLockup) + instances configured through the official [Sablier Interface](https://app.sablier.com/). ::: @@ -149,7 +149,7 @@ Aggregates historical amounts that have already been streamed to the recipient. included. It relies on the `streamedAmountOf` method in the -[SablierV2Lockup](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#streamedamountof) contract. +[SablierV2Lockup](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#streamedamountof) contract. :::caution Caveats @@ -165,18 +165,18 @@ The opposite of `streamed-recipient`, counting amounts that have not been stream available in the future). Subtracts the `streamed` amount from the initial `deposit`. For canceled streams, the unstreamed amount will be `0`. -## Sablier V1 +## Legacy - [Snapshot playground](https://snapshot.org/#/playground/sablier-v1-deposit) - test the strategies - [Snapshot code repository](https://github.com/snapshot-labs/snapshot-strategies/tree/master/src/strategies/sablier-v1-deposit) - dive into the implementation -The Sablier V1 strategy regards the stream recipient as the voter. It returns the voting power for any voter as the -**sum of all deposits** made by a sender towards the recipient (the **voter**) for a specific ERC-20 token. +The Legacy strategy regards the stream recipient as the voter. It returns the voting power for any voter as the **sum of +all deposits** made by a sender towards the recipient (the **voter**) for a specific ERC-20 token. :::caution Caveats -- Similar to the Sablier V2 [`streamed-recipient`](#streamed-recipient) strategy, the voting power can be increased +- Similar to the Sablier Lockup [`streamed-recipient`](#streamed-recipient) strategy, the voting power can be increased artificially. ::: diff --git a/docs/contracts/v2/guides/07-frontend.md b/docs/guides/05-frontend.md similarity index 71% rename from docs/contracts/v2/guides/07-frontend.md rename to docs/guides/05-frontend.md index 1c93e9c4..1f9da64b 100644 --- a/docs/contracts/v2/guides/07-frontend.md +++ b/docs/guides/05-frontend.md @@ -1,12 +1,12 @@ --- draft: true -sidebar_position: 8 +sidebar_position: 5 id: "frontend" title: "Frontend Integrations" --- -Throughout this series, we've been focusing on creating an onchain integration with Sablier. But maybe you're interested -in developing a front-end app. No worries! In this guide, we'll provide some pointers on how to go about it. +Throughout this series, we've been focusing on creating an onchain integration with Sablier protocols. But maybe you're +interested in developing a front-end app. No worries! In this guide, we'll provide some pointers on how to go about it. ## Toolset diff --git a/docs/guides/flow/01-overview.md b/docs/guides/flow/01-overview.md new file mode 100644 index 00000000..45da0318 --- /dev/null +++ b/docs/guides/flow/01-overview.md @@ -0,0 +1,29 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +# Sablier Flow V1.0 + +Welcome to the Sablier Flow protocol documentation. + +This section contains detailed guides and technical references for the Flow protocol. These documents offer insight into +the operational nuances of the contracts, providing a valuable resource for building onchain integrations. + +# Guides + +If you are new to Sablier, we recommend you start with the [Concepts](/concepts/what-is-sablier) section first. + +If you want to setup your local environment, head over to [the guide](/guides/flow/examples/local-environment). + +# Reference + +For a deeper dive into the protocol specifications, read through the [technical reference](/reference/flow/diagrams). + +# Resources + +- [Flow Contracts](https://github.com/sablier-labs/flow/tree/release) +- [Flow Integration Templates](https://github.com/sablier-labs/flow-integration-template) +- [Flow Integration Examples](https://github.com/sablier-labs/examples) +- [Foundry Book](https://book.getfoundry.sh/) diff --git a/docs/guides/flow/02-deployments.md b/docs/guides/flow/02-deployments.md new file mode 100644 index 00000000..4615a2ec --- /dev/null +++ b/docs/guides/flow/02-deployments.md @@ -0,0 +1,258 @@ +--- +id: "deployments" +sidebar_position: 2 +title: "Deployment Addresses" +--- + +# Flow Deployments + +This document contains the deployment addresses for the v1.0 release of +[@sablier/flow](https://npmjs.com/package/@sablier/flow/v/1.0.0). + +A few noteworthy details about the deployments: + +- The addresses are final +- All contracts are non-upgradeable +- The source code is verified on Etherscan across all chains + +:::info + +Stay up to date with any new releases by [subscribing](https://x.com/Sablier/status/1821220784661995627) to the official +Sablier repositories on Github. + +::: + +## Mainnets + +### Ethereum Mainnet + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x2d9221a63e12aa796619cb381ec4a71b201281f5](https://etherscan.io/address/0x2d9221a63e12aa796619cb381ec4a71b201281f5) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xb69b27073fa0366cddf432f5976c34c9baf7eae6](https://etherscan.io/address/0xb69b27073fa0366cddf432f5976c34c9baf7eae6) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Arbitrum One + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x18a12a7035aa56240bcd236bc019aa245dcc015a](https://arbiscan.io/address/0x18a12a7035aa56240bcd236bc019aa245dcc015a) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x900ebdb9ecfb19f9463d68d1fd6e5fa7ab9c6897](https://arbiscan.io/address/0x900ebdb9ecfb19f9463d68d1fd6e5fa7ab9c6897) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Avalanche + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x8c172e42c06302e3cfe555dc4d6b71a756ee186b](https://snowtrace.io/address/0x8c172e42c06302e3cfe555dc4d6b71a756ee186b) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x82ea83ab59b106c125168492cd468c322bd0d195](https://snowtrace.io/address/0x82ea83ab59b106c125168492cd468c322bd0d195) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Base + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x1a9adc0e2114c8407cc31669baafeee031d15dd2](https://basescan.org/address/0x1a9adc0e2114c8407cc31669baafeee031d15dd2) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x8e64f389a4697e004647162ec6ea0a7779d5d899](https://basescan.org/address/0x8e64f389a4697e004647162ec6ea0a7779d5d899) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Blast + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xfdac2799644141856e20e021ac06f231cafc731f](https://blastscan.io/address/0xfdac2799644141856e20e021ac06f231cafc731f) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xb40624ce2af67227529f713bac46e2b7064b7b92](https://blastscan.io/address/0xb40624ce2af67227529f713bac46e2b7064b7b92) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### BNB Smart Chain + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xfce01f79247cf450062545e7155d7bd568551d0e](https://bscscan.com/address/0xfce01f79247cf450062545e7155d7bd568551d0e) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xbc6fdd3f59900b9fcd445f8df159e2e794f098ec](https://bscscan.com/address/0xbc6fdd3f59900b9fcd445f8df159e2e794f098ec) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Core Dao + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- | +| SablierFlow | [0x447c6ea25540611541ff98fc677ca865f4e92450](https://scan.coredao.org/address/0x447c6ea25540611541ff98fc677ca865f4e92450) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xbfaa055ecfe503e1323dc9fc26b7d3aa3bf54364](https://scan.coredao.org/address/0xbfaa055ecfe503e1323dc9fc26b7d3aa3bf54364) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Gnosis + +| Contract | Address | Deployment | +| :---------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x5515f774a4db42820802333ba575f68a6e85bd13](https://gnosisscan.io/address/0x5515f774a4db42820802333ba575f68a6e85bd13) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xc07c1128c19c2bf303b68ae061eff5293927630e](https://gnosisscan.io/address/0xc07c1128c19c2bf303b68ae061eff5293927630e) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### IoTex + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x1DdC1c21CD39c2Fa16366E6036c95342A31831Ba](https://iotexscan.io/address/0x1DdC1c21CD39c2Fa16366E6036c95342A31831Ba) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x83Dd52FCA44E069020b58155b761A590F12B59d3](https://iotexscan.io/address/0x83Dd52FCA44E069020b58155b761A590F12B59d3) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Lightlink + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x46fa0164c5af9382d330e5a245a2ca8a18398950](https://phoenix.lightlink.io/address/0x46fa0164c5af9382d330e5a245a2ca8a18398950) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xa2a48b83b6c96e1536336df9ead024d557a97a23](https://phoenix.lightlink.io/address/0xa2a48b83b6c96e1536336df9ead024d557a97a23) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Linea + +| Contract | Address | Deployment | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x949bFa08f1632432A2656a9dB17CA34d54Da8296](https://lineascan.build/address/0x949bFa08f1632432A2656a9dB17CA34d54Da8296) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xF430f0d2f798c42fDFAc35b5e32BD4f63Bf51130](https://lineascan.build/address/0xF430f0d2f798c42fDFAc35b5e32BD4f63Bf51130) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Meld + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x9efc8663cab0e2d97ad17c9fbfc8392445517e94](https://meldscan.io/address/0x9efc8663cab0e2d97ad17c9fbfc8392445517e94) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x3d664b2da905ddd0db931982fd9a759ea950d6e1](https://meldscan.io/address/0x3d664b2da905ddd0db931982fd9a759ea950d6e1) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Mode + +| Contract | Address | Deployment | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x75970dde488431fc4961494569def3269f20d6b3](https://explorer.mode.network/address/0x75970dde488431fc4961494569def3269f20d6b3) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x46fa0164c5af9382d330e5a245a2ca8a18398950](https://explorer.mode.network/address/0x46fa0164c5af9382d330e5a245a2ca8a18398950) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Morph + +| Contract | Address | Deployment | +| :---------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xfe6972d0ae797fae343e5a58d0c7d8513937f092](https://explorer.morphl2.io/address/0xfe6972d0ae797fae343e5a58d0c7d8513937f092) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xab281bbc2bc34a1f202ddff17ffd1c00edf73f3a](https://explorer.morphl2.io/address/0xab281bbc2bc34a1f202ddff17ffd1c00edf73f3a) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Optimism + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x906356e4e6410ea0a97dbc5b071cf394ab0dcd69](https://optimistic.etherscan.io/address/0x906356e4e6410ea0a97dbc5b071cf394ab0dcd69) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xe674fb603d6f72b88bf297c1ba69f57b588a8f6d](https://optimistic.etherscan.io/address/0xe674fb603d6f72b88bf297c1ba69f57b588a8f6d) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Polygon + +| Contract | Address | Deployment | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xcf2d812d5aad4e6fec3b05850ff056b21159d496](https://polygonscan.com/address/0xcf2d812d5aad4e6fec3b05850ff056b21159d496) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x011277c87158e52cfbd8a1dd4a29118d602dda3a](https://polygonscan.com/address/0x011277c87158e52cfbd8a1dd4a29118d602dda3a) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Scroll + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x66826f53bffeaab71adc7fe1a77e86f8268848d8](https://scrollscan.com/address/0x66826f53bffeaab71adc7fe1a77e86f8268848d8) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x57fd892b3dc20eadb83cd8fb0240a87960046daa](https://scrollscan.com/address/0x57fd892b3dc20eadb83cd8fb0240a87960046daa) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Superseed + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- | +| SablierFlow | [0x4f5f9b3fb57bba43aaf90e3f71d8f8f384e88e20](https://explorer.superseed.xyz/address/0x4f5f9b3fb57bba43aaf90e3f71d8f8f384e88e20) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xac2c36347869d8d779f7872c6202de3efd6ef2bb](https://explorer.superseed.xyz/address/0xac2c36347869d8d779f7872c6202de3efd6ef2bb) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Taiko Mainnet + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x3d303e4c61285f87da9f61aaadc8c89b7d55dfa2](https://taikoscan.io/address/0x3d303e4c61285f87da9f61aaadc8c89b7d55dfa2) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xe790b6178612eeba6faeec16a2e1354c872f8bde](https://taikoscan.io/address/0xe790b6178612eeba6faeec16a2e1354c872f8bde) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Tangle + +| Contract | Address | Deployment | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://explorer.tangle.tools/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](http://explorer.tangle.tools/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### zkSync Era + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x015899a075B7C181e357Cd0ed000683DBB4F1FcE](https://era.zksync.network/address/0x015899a075B7C181e357Cd0ed000683DBB4F1FcE) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x01C40608f2822816cF25a0a911c1df330487ba62](https://era.zksync.network/address/0x01C40608f2822816cF25a0a911c1df330487ba62) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +## Testnets + +### Sepolia + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x5ae8c13f6ae094887322012425b34b0919097d8a](https://sepolia.etherscan.io/address/0x5ae8c13f6ae094887322012425b34b0919097d8a) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xbc4da2fbdfe5c5eaa11bd0e282201e2abf40b1ee](https://sepolia.etherscan.io/address/0xbc4da2fbdfe5c5eaa11bd0e282201e2abf40b1ee) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Arbitrum Sepolia + +| Contract | Address | Deployment | +| :---------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x781b3b2527f2a0a1e6b429161f2717a8a28b9f46](https://sepolia.arbiscan.io/address/0x781b3b2527f2a0a1e6b429161f2717a8a28b9f46) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x9a08e6ae67c28002ee2c7cff9badecd33ae2151c](https://sepolia.arbiscan.io/address/0x9a08e6ae67c28002ee2c7cff9badecd33ae2151c) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Base Sepolia + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xd5f78708d83ac2bc8734a8cdf2d112c1bb3b62a2](https://sepolia.basescan.org/address/0xd5f78708d83ac2bc8734a8cdf2d112c1bb3b62a2) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x168ad0b246f604bc70bef87ecde585c3f1d49617](https://sepolia.basescan.org/address/0x168ad0b246f604bc70bef87ecde585c3f1d49617) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Berachain Bartio + +| Contract | Address | Deployment | +| :---------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xee4ee0b5c260e5cf559266d4a18a6f05ecd52d61](https://bartio.beratrail.io/address/0xee4ee0b5c260e5cf559266d4a18a6f05ecd52d61) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x6f41ffb18d451a4744ee713d0b5a68579877be5f](https://bartio.beratrail.io/address/0x6f41ffb18d451a4744ee713d0b5a68579877be5f) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Blast Sepolia + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xa8c864c53e72301c2ab484d013627a5a7084174b](https://sepolia.blastscan.io/address/0xa8c864c53e72301c2ab484d013627a5a7084174b) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x567a95aa72a23b924f79dfa437d28c38740e144c](https://sepolia.blastscan.io/address/0x567a95aa72a23b924f79dfa437d28c38740e144c) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Linea Sepolia + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xb0255ed1ee5c01dfe865c1b21bbf56a80f9ae739](https://sepolia.lineascan.build/address/0xb0255ed1ee5c01dfe865c1b21bbf56a80f9ae739) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xcd8871a22640c57ba36984fb57e9c794f5df7f40](https://sepolia.lineascan.build/address/0xcd8871a22640c57ba36984fb57e9c794f5df7f40) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Mode Sepolia + +| Contract | Address | Deployment | +| :---------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0xf5ac60870e1ccc4bfce23cfbb7a796a0d8dbaf47](https://sepolia.explorer.mode.network/address/0xf5ac60870e1ccc4bfce23cfbb7a796a0d8dbaf47) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x1cae76b71913598d7664d16641ccb6037d8ed61a](https://sepolia.explorer.mode.network/address/0x1cae76b71913598d7664d16641ccb6037d8ed61a) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Morph Holesky + +| Contract | Address | Deployment | +| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x9efc8663cab0e2d97ad17c9fbfc8392445517e94](https://explorer-holesky.morphl2.io/address/0x9efc8663cab0e2d97ad17c9fbfc8392445517e94) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x3d664b2da905ddd0db931982fd9a759ea950d6e1](https://explorer-holesky.morphl2.io/address/0x3d664b2da905ddd0db931982fd9a759ea950d6e1) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Optimism Sepolia + +| Contract | Address | Deployment | +| :---------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x417db0f2bd020fc4d6bccea6b2bb6be0c541862e](https://sepolia-optimistic.etherscan.io/address/0x417db0f2bd020fc4d6bccea6b2bb6be0c541862e) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x28401987a23ed9b8926b07f3b6855222a70c2128](https://sepolia-optimistic.etherscan.io/address/0x28401987a23ed9b8926b07f3b6855222a70c2128) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Superseed Sepolia + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x905756b52efeaf75f6b1bb1bb0fc35eea15ae260](https://sepolia-explorer.superseed.xyz/address/0x905756b52efeaf75f6b1bb1bb0fc35eea15ae260) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xc43fb9fe4477d8e8bf68b9fd3a0163a4cffcbb31](https://sepolia-explorer.superseed.xyz/address/0xc43fb9fe4477d8e8bf68b9fd3a0163a4cffcbb31) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### Taiko Hekla + +| Contract | Address | Deployment | +| :---------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x29b7bafce0a04638dc91ca0b87a562cab8c3dbde](https://hekla.taikoscan.io/address/0x29b7bafce0a04638dc91ca0b87a562cab8c3dbde) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0xd45f45dd34045a368854f7987a84d9485b4b45e9](https://hekla.taikoscan.io/address/0xd45f45dd34045a368854f7987a84d9485b4b45e9) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | + +### zkSync Sepolia + +| Contract | Address | Deployment | +| :---------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| SablierFlow | [0x8e70296f8972ebe94d885b1caf94da4836976140](https://sepolia-era.zksync.network/address/0x8e70296f8972ebe94d885b1caf94da4836976140) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | +| FlowNFTDescriptor | [0x900277DBB45a04eB79028b3A44c650Ac81Ca86c4](https://sepolia-era.zksync.network/address/0x900277DBB45a04eB79028b3A44c650Ac81Ca86c4) | [v1.0.0](https://github.com/sablier-labs/deployments/blob/main/flow/v1.0.0) | diff --git a/docs/guides/flow/04-gas-benchmarks.md b/docs/guides/flow/04-gas-benchmarks.md new file mode 100644 index 00000000..f2ad4fb4 --- /dev/null +++ b/docs/guides/flow/04-gas-benchmarks.md @@ -0,0 +1,33 @@ +--- +label: "Gas benchmarks" +sidebar_position: 4 +title: "Gas Benchmarks" +--- + +The gas usage of the Flow protocol is not deterministic and varies by user. Calls to third-party contracts, such as +ERC-20 tokens, may use an arbitrary amount of gas. The values in the table below are rough estimations on Ethereum +mainnet - you shouldn't take them for granted. The gas usage may vary depending on the network. + +:::note + +Please refer to the [GitHub repository](https://github.com/sablier-labs/flow/blob/main/benchmark) to view the code that +generates these benchmarks. + +::: + +The following gas benchmarks are generated using a 6-decimal token. + +| Function | Gas Usage | +| ----------------------------- | --------- | +| `adjustRatePerSecond` | 44,171 | +| `create` | 113,681 | +| `deposit` | 32,975 | +| `depositViaBroker` | 22,732 | +| `pause` | 7,522 | +| `refund` | 11,939 | +| `restart` | 7,036 | +| `void (solvent stream)` | 10,060 | +| `void (insolvent stream)` | 37,460 | +| `withdraw (insolvent stream)` | 57,688 | +| `withdraw (solvent stream)` | 38,156 | +| `withdrawMax` | 51,988 | diff --git a/docs/api/subgraphs/protocol/_category_.json b/docs/guides/flow/_category_.json similarity index 56% rename from docs/api/subgraphs/protocol/_category_.json rename to docs/guides/flow/_category_.json index 4156418e..aad6c9d3 100644 --- a/docs/api/subgraphs/protocol/_category_.json +++ b/docs/guides/flow/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Subgraph: Protocol", + "label": "Flow V1.0", "position": 2 } diff --git a/docs/guides/flow/examples/01-local-environment.md b/docs/guides/flow/examples/01-local-environment.md new file mode 100644 index 00000000..12bf65b3 --- /dev/null +++ b/docs/guides/flow/examples/01-local-environment.md @@ -0,0 +1,140 @@ +--- +id: "local-environment" +sidebar_position: 1 +title: "Configure Your Local Environment" +--- + +In this guide, we will go through the steps to set up a local development environment for building onchain integrations +with Flow. We will use Foundry to install Flow as a dependency, and run a few simple tests. + +At the end, you’ll have a development environment set up that you can use to build the rest of the examples under +"Guides", or start your own integration project. + +## Pre-requisites + +You will need the following software on your machine: + +- [Git](https://git-scm.com/downloads) +- [Foundry](https://github.com/foundry-rs/foundry) +- [Node.js](https://nodejs.org/en/download) +- [Bun](https://bun.sh) + +In addition, familiarity with [Ethereum](https://ethereum.org/) and [Solidity](https://soliditylang.org/) is requisite. + +## Set up using Flow integration template + +We put together a template repository that you can use to get started quickly. This repository features a basic project +structure, pre-configured Flow imports, and a selection of sample contracts and tests. + +:::tip + +Make sure you are using the latest version of Foundry by running `foundryup`. + +::: + +To install the template, simply execute the following commands: + +```shell +$ mkdir flow-integration-template +$ cd flow-integration-template +$ forge init --template sablier-labs/flow-integration-template +$ bun install +``` + +## Set up using Foundry template + +Foundry is a popular development toolkit for Ethereum projects, which we have used to build the Sablier Protocols. For +the purposes of this guide, Foundry will provide us with the tooling needed to compile and test our contracts. + +Let's use this command to spin up a new Foundry project: + +```shell +$ forge init my-project +$ cd my-project +``` + +:::note + +You might notice that the CLI is `forge` rather than `foundry`. This is because Foundry is a toolkit, and `forge` is +just one of the tools that comes with it. + +::: + +Once the initialization completes, take a look around at what got set up: + +```tree +├── foundry.toml +├── script +├── src +└── test +``` + +The folder structure should be intuitive: + +- `src` is where you'll write Solidity contracts +- `test` is where you'll write tests (also in Solidity) +- `script` is where you'll write scripts to perform actions like deploying contracts (you guessed it, in Solidity) +- `foundry.toml` is where you can configure your Foundry settings, which we will leave as is in this guide + +## Install Flow npm package + +Let's install the Flow Node.js packages using Bun: + +```shell +$ bun add @sablier/flow +``` + +Bun will download the Flow contracts, along with their dependencies, and put them in the `node_modules` directory. + +Let's remap the package names to point to the installed contracts. This step is required so that the Solidity compiler +can find the Flow contracts when you import them: + +```shell +$ echo "@sablier/flow=node_modules/@sablier/flow/" >> remappings.txt +$ echo "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/" >> remappings.txt +$ echo "@prb/math/=node_modules/@prb/math/" >> remappings.txt +``` + +That's it! You should now have a functional development environment to start building onchain Flow integrations. Let's +run a quick test to confirm everything is set up properly. + +## Write your first contract + +Delete the `src/Counter.sol` and `test/Counter.t.sol` files generated by Forge, and create a new file: +`src/FlowStreamCreator.sol`. + +Paste the following code into `src/FlowStreamCreator.sol`. + +```solidity reference title="Flow Stream Creator" +https://github.com/sablier-labs/examples/blob/main/flow/FlowStreamCreator.sol +``` + +Let's use Forge to compile this contract: + +```shell +$ forge build +``` + +If the contract was compiled correctly, you should see this message: + +```text +[⠢] Compiling... +[⠰] Compiling { number } files with { compiler } +[⠒] Solc { compiler } finished in { time } +Compiler run successful +``` + +:::info + +The minimum Solidity version supported by the Flow contracts is v0.8.22. + +::: + +## Next steps + +Congratulations! Your environment is now configured, and you are prepared to start building. Explore the guides section +to discover various Flow features available for integration. + +As far as Foundry is concerned, there is much more to uncover. If you want to learn more about it, check out the +[Foundry Book](https://book.getfoundry.sh/), which contains numerous examples and tutorials. A deep understanding of +Foundry will enable you to create more sophisticated integrations with Flow. diff --git a/docs/contracts/v1/guides/_category_.json b/docs/guides/flow/examples/_category_.json similarity index 64% rename from docs/contracts/v1/guides/_category_.json rename to docs/guides/flow/examples/_category_.json index bfddf204..b42547fb 100644 --- a/docs/contracts/v1/guides/_category_.json +++ b/docs/guides/flow/examples/_category_.json @@ -1,5 +1,5 @@ { "collapsed": true, - "label": "Guides", + "label": "Examples", "position": 3 } diff --git a/docs/contracts/v1/guides/getting-started.md b/docs/guides/legacy/01-overview.md similarity index 57% rename from docs/contracts/v1/guides/getting-started.md rename to docs/guides/legacy/01-overview.md index 7dbd9ffd..6db4a06a 100644 --- a/docs/contracts/v1/guides/getting-started.md +++ b/docs/guides/legacy/01-overview.md @@ -1,10 +1,18 @@ --- -id: getting-started -title: Getting Started +id: "overview" sidebar_position: 1 +title: "Overview" --- -This is a technical account on how to integrate Sablier into your own application. If you have any questions along the +# Legacy + +:::warning + +Legacy has been superseded by [Sablier Lockup](/guides/lockup/overview). + +::: + +This is a technical account on how to integrate Legacy into your own application. If you have any questions along the way, please join the #dev channel in the [Sablier Discord server](https://discord.sablier.com); our team, and members of the community, look forward to helping you. diff --git a/docs/contracts/v1/01-deployments.md b/docs/guides/legacy/02-deployments.md similarity index 86% rename from docs/contracts/v1/01-deployments.md rename to docs/guides/legacy/02-deployments.md index 2b79bd17..60252b3d 100644 --- a/docs/contracts/v1/01-deployments.md +++ b/docs/guides/legacy/02-deployments.md @@ -1,20 +1,17 @@ --- id: "deployments" -title: Overview -sidebar_position: 1 +sidebar_position: 2 +title: "Deployment Addresses" --- -# V1 Overview +# Legacy Deployment Addresses -Depending on what [EVM](https://ethereum.org/en/developers/docs/evm/) chain you want to use Sablier on, you will need to -use a different contract address. Sablier V1 runs on top of a singleton contract that manages all streams. +This section contains deployment addresses for Sablier Legacy, a release that has been superseded by +[Sablier Lockup](/guides/lockup/overview). -## Official deployments +Legacy is still accessible through the [legacy user interfaces](https://v1-pay.sablier.com). -Official deployments are deployments made by the Sablier team and supported in the -[official user interface](https://v1-pay.sablier.com). - -### Sablier V1.1 +## Legacy V1.1 | Contract | Chain | Address | | ----------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------ | @@ -27,7 +24,7 @@ Official deployments are deployments made by the Sablier team and supported in t | Sablier.sol | Ronin | [0xDe9dCc27aa1552d591Fc9B9c21881feE43BD8118](https://explorer.roninchain.com/address/ronin:de9dcc27aa1552d591fc9b9c21881fee43bd8118) | | Sablier.sol | Goerli | [0xFc7E3a3073F88B0f249151192812209117C2014b](https://goerli.etherscan.io/address/0xFc7E3a3073F88B0f249151192812209117C2014b) | -### Sablier V1.0 +## Legacy V1.0 _This is an outdated deployment_. @@ -38,8 +35,7 @@ _This is an outdated deployment_. ## Unofficial deployments -Unofficial deployments are deployments made by external teams and not supported in the -[official user interface](https://v1-pay.sablier.com). +Unofficial deployments are made by external teams, an they are not supported in the official user interface. | Chain | Address | Deployer | | ----- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | diff --git a/docs/guides/legacy/03-codebase.mdx b/docs/guides/legacy/03-codebase.mdx new file mode 100644 index 00000000..14564411 --- /dev/null +++ b/docs/guides/legacy/03-codebase.mdx @@ -0,0 +1,41 @@ +--- +id: codebase +title: Codebase +sidebar_position: 5 +--- + +import LinkPreview from "../../../src/components/LinkPreview"; + +## Repository + +The Sablier Legacy code is hosted on GitHub and the source code for each contract is verified on Etherscan. + + + +## ABIs + +Depending on the web3 library you're working with, you may need to get hold of the Lockup ABIs (application binary +interfaces). The ABI acts as an interface between two program modules, one of which is the smart contract and the other +the Ethereum virtual machine code. + +There are two ways to obtain it: + +1. Copy `Sablier.json` from [sablier-labs/legacy-abis](https://github.com/sablier-labs/legacy-abis). +2. Clone [sablier-labs/legacy](https://github.com/sablier-labs/legacy) and compile the contract yourself. + +Here's an example for how to do step 2 with yarn and truffle: + +```bash +$ git clone git@github.com/sablier-labs/legacy.git sablier-legacy +$ cd ./sablier-legacy +$ yarn bootstrap +$ cd ./packages/protocol +$ truffle compile + +The `Sablier.json` artifact should be generated in the relative `build/contracts` folder. +``` diff --git a/docs/contracts/v1/guides/streams.md b/docs/guides/legacy/04-streams.md similarity index 73% rename from docs/contracts/v1/guides/streams.md rename to docs/guides/legacy/04-streams.md index 76a7f17c..b34080eb 100644 --- a/docs/contracts/v1/guides/streams.md +++ b/docs/guides/legacy/04-streams.md @@ -1,11 +1,10 @@ --- id: streams title: Streams -sidebar_position: 4 +sidebar_position: 3 --- -Every interaction with the Sablier Protocol is in relation to a specific "token stream". This is how we refer to a -real-time payment. +Every interaction with Sablier is in relation to a specific "token stream". This is how we refer to a real-time payment. A token stream has six properties: diff --git a/docs/contracts/v1/guides/gas-costs.md b/docs/guides/legacy/05-gas-costs.md similarity index 76% rename from docs/contracts/v1/guides/gas-costs.md rename to docs/guides/legacy/05-gas-costs.md index 3a170cc1..f641a376 100644 --- a/docs/contracts/v1/guides/gas-costs.md +++ b/docs/guides/legacy/05-gas-costs.md @@ -1,10 +1,10 @@ --- id: gas-costs title: Gas Costs -sidebar_position: 5 +sidebar_position: 4 --- -The gas usage of the Sablier Protocol is not deterministic and varies by user. Calls to third-party contracts, such as +The gas usage of Sablier Legacy is not deterministic and varies by user. Calls to third-party contracts, such as [ERC-20](https://eips.ethereum.org/EIPS/eip-20) tokens, may use an arbitrary amount of gas. The values in the table below are rough estimations - you shouldn't take them for granted: diff --git a/docs/guides/legacy/_category_.json b/docs/guides/legacy/_category_.json new file mode 100644 index 00000000..63f12b47 --- /dev/null +++ b/docs/guides/legacy/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Legacy", + "position": 5 +} diff --git a/docs/guides/lockup/01-overview.md b/docs/guides/lockup/01-overview.md new file mode 100644 index 00000000..cf620f8b --- /dev/null +++ b/docs/guides/lockup/01-overview.md @@ -0,0 +1,39 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +# Sablier Lockup V1.2 + +Welcome to the Sablier Lockup protocol documentation. + +This section contains detailed guides and technical references for the Lockup protocol, a suite of smart contracts +running autonomously in the Ethereum ecosystem. These documents offer insight into the operational nuances of the +contracts, providing a valuable resource for building onchain integrations. + +# Guides + +If you are new to Sablier, we recommend you start with the [Concepts](/concepts/what-is-sablier) section first. + +You can then setup your [local environment](/guides/lockup/examples/local-environment) and create your +[first stream](/guides/lockup/examples/create-stream/lockup-linear). + +# Reference + +For a deeper dive into the protocol specifications, read through the [technical reference](/reference/lockup/diagrams). + +# Versioning + +The product now uses a unified versioning system across releases and npm packages. Prior to this change, product +releases followed a separate versioning scheme (e.g. V2.0, V2.1, V2.2), while the npm package used a semantic versioning +scheme (e.g. v1.0.2, v1.1.2, v1.2.0). From now onwards, the versioning has been standardized to a single system for +consistency across protocol releases and npm packages. + +# Resources + +- [Lockup Core](https://github.com/sablier-labs/v2-core/tree/release) +- [Lockup Periphery](https://github.com/sablier-labs/v2-periphery/tree/release) +- [Lockup Integration Templates](https://github.com/sablier-labs/lockup-integration-template) +- [Lockup Integration Examples](https://github.com/sablier-labs/examples) +- [Foundry Book](https://book.getfoundry.sh/) diff --git a/docs/contracts/v2/02-deployments.md b/docs/guides/lockup/02-deployments.md similarity index 81% rename from docs/contracts/v2/02-deployments.md rename to docs/guides/lockup/02-deployments.md index aa8cd208..29e9e449 100644 --- a/docs/contracts/v2/02-deployments.md +++ b/docs/guides/lockup/02-deployments.md @@ -2,35 +2,36 @@ id: "deployments" sidebar_position: 2 title: "Deployment Addresses" -toc_max_heading_level: 3 --- -This document contains the deployment addresses for the V2.2 release of [@sablier/v2-core][v2-core] and -[@sablier/v2-periphery][v2-periphery]. +# Lockup Deployments -[v2-core]: https://npmjs.com/package/@sablier/v2-core/v/1.2.0 -[v2-periphery]: https://npmjs.com/package/@sablier/v2-periphery/v/1.2.0 +This document contains the deployment addresses for the v1.2 release of [@sablier/v2-core][lockup-core] and +[@sablier/v2-periphery][lockup-periphery]. + +[lockup-core]: https://npmjs.com/package/@sablier/v2-core/v/1.2.0 +[lockup-periphery]: https://npmjs.com/package/@sablier/v2-periphery/v/1.2.0 A few noteworthy details about the deployments: - The addresses are final -- All LockupLinear, LockupDynamic, and LockupTranched contracts are non-upgradeable +- All contracts are non-upgradeable - The source code is verified on Etherscan across all chains ## Previous Versions Any updates or additional features will call for a new deployment of the protocol, due to its immutable nature. -Came here looking for the previous V2 deployments? Click below to see other versions as well as the in-app aliases -assigned under our [naming convention](/api/subgraphs/protocol/structure#identifying). +Came here looking for the previous Lockup deployments? Click below to see other versions as well as the in-app aliases +assigned under our [naming convention](/api/lockup/the-graph/structure#identifying). -| Version | UI Aliases | -| -------------------------------------- | ---------------------------------------------------------------- | -| v2.2 (current) | LD3 (Lockup Dynamic), LL3 (Lockup Linear), LT3 (Lockup Tranched) | -| [v2.1](/contracts/v2/deployments/v2.1) | LD2 (Lockup Dynamic), LL2 (Lockup Linear) | -| [v2.0](/contracts/v2/deployments/v2.0) | LD (Lockup Dynamic), LL (Lockup Linear) | +| Version | UI Aliases | +| ------------------------------------------------ | ---------------------------------------------------------------- | +| v1.2 (current) | LD3 (Lockup Dynamic), LL3 (Lockup Linear), LT3 (Lockup Tranched) | +| [v1.1](/guides/lockup/previous-deployments/v1.1) | LD2 (Lockup Dynamic), LL2 (Lockup Linear) | +| [v1.0](/guides/lockup/previous-deployments/v1.0) | LD (Lockup Dynamic), LL (Lockup Linear) | -Or maybe you're looking for V1? [Click here](/contracts/v1/deployments). +Or maybe you're looking for Legacy? [Click here](/guides/legacy/deployments). :::info @@ -45,361 +46,361 @@ Sablier repositories on Github. #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x9DeaBf7815b42Bf4E9a03EEc35a486fF74ee7459](https://etherscan.io/address/0x9DeaBf7815b42Bf4E9a03EEc35a486fF74ee7459) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x3962f6585946823440d274aD7C719B02b49DE51E](https://etherscan.io/address/0x3962f6585946823440d274aD7C719B02b49DE51E) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xf86B359035208e4529686A1825F2D5BeE38c28A8](https://etherscan.io/address/0xf86B359035208e4529686A1825F2D5BeE38c28A8) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xAE32Ca14d85311A506Bb852D49bbfB315466bA26](https://etherscan.io/address/0xAE32Ca14d85311A506Bb852D49bbfB315466bA26) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x9DeaBf7815b42Bf4E9a03EEc35a486fF74ee7459](https://etherscan.io/address/0x9DeaBf7815b42Bf4E9a03EEc35a486fF74ee7459) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x3962f6585946823440d274aD7C719B02b49DE51E](https://etherscan.io/address/0x3962f6585946823440d274aD7C719B02b49DE51E) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xf86B359035208e4529686A1825F2D5BeE38c28A8](https://etherscan.io/address/0xf86B359035208e4529686A1825F2D5BeE38c28A8) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xAE32Ca14d85311A506Bb852D49bbfB315466bA26](https://etherscan.io/address/0xAE32Ca14d85311A506Bb852D49bbfB315466bA26) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xB5Ec9706C3Be9d22326D208f491E5DEef7C8d9f0](https://etherscan.io/address/0xB5Ec9706C3Be9d22326D208f491E5DEef7C8d9f0) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xF35aB407CF28012Ba57CAF5ee2f6d6E4420253bc](https://etherscan.io/address/0xF35aB407CF28012Ba57CAF5ee2f6d6E4420253bc) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xB5Ec9706C3Be9d22326D208f491E5DEef7C8d9f0](https://etherscan.io/address/0xB5Ec9706C3Be9d22326D208f491E5DEef7C8d9f0) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xF35aB407CF28012Ba57CAF5ee2f6d6E4420253bc](https://etherscan.io/address/0xF35aB407CF28012Ba57CAF5ee2f6d6E4420253bc) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Arbitrum One #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x53F5eEB133B99C6e59108F35bCC7a116da50c5ce](https://arbiscan.io/address/0x53F5eEB133B99C6e59108F35bCC7a116da50c5ce) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x05a323a4C936fed6D02134c5f0877215CD186b51](https://arbiscan.io/address/0x05a323a4C936fed6D02134c5f0877215CD186b51) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x0dA2c7Aa93E7CD43e6b8D043Aab5b85CfDDf3818](https://arbiscan.io/address/0x0dA2c7Aa93E7CD43e6b8D043Aab5b85CfDDf3818) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xacA12cdC4DcD7063c82E69A358549ba082463608](https://arbiscan.io/address/0xacA12cdC4DcD7063c82E69A358549ba082463608) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x53F5eEB133B99C6e59108F35bCC7a116da50c5ce](https://arbiscan.io/address/0x53F5eEB133B99C6e59108F35bCC7a116da50c5ce) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x05a323a4C936fed6D02134c5f0877215CD186b51](https://arbiscan.io/address/0x05a323a4C936fed6D02134c5f0877215CD186b51) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x0dA2c7Aa93E7CD43e6b8D043Aab5b85CfDDf3818](https://arbiscan.io/address/0x0dA2c7Aa93E7CD43e6b8D043Aab5b85CfDDf3818) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xacA12cdC4DcD7063c82E69A358549ba082463608](https://arbiscan.io/address/0xacA12cdC4DcD7063c82E69A358549ba082463608) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x785Edf1e617824A78EFE76295E040B1AE06002bf](https://arbiscan.io/address/0x785Edf1e617824A78EFE76295E040B1AE06002bf) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xc9A5a0Bc2D8E217BDbdFE7486E9E72c5c3308F01](https://arbiscan.io/address/0xc9A5a0Bc2D8E217BDbdFE7486E9E72c5c3308F01) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x785Edf1e617824A78EFE76295E040B1AE06002bf](https://arbiscan.io/address/0x785Edf1e617824A78EFE76295E040B1AE06002bf) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xc9A5a0Bc2D8E217BDbdFE7486E9E72c5c3308F01](https://arbiscan.io/address/0xc9A5a0Bc2D8E217BDbdFE7486E9E72c5c3308F01) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Avalanche #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xE3826241E5EeBB3F5fEde33F9f677047674D3FBF](https://snowtrace.io/address/0xE3826241E5EeBB3F5fEde33F9f677047674D3FBF) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xc0bF14AfB95CA4C049BDc19E06a3531D8065F6Fd](https://snowtrace.io/address/0xc0bF14AfB95CA4C049BDc19E06a3531D8065F6Fd) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xfA536049652BFb5f57ba8DCFbec1B2b2Dd9803D3](https://snowtrace.io/address/0xfA536049652BFb5f57ba8DCFbec1B2b2Dd9803D3) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xcF24fb2a09227d955F8e9A12f36A26cf1ac079c6](https://snowtrace.io/address/0xcF24fb2a09227d955F8e9A12f36A26cf1ac079c6) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xE3826241E5EeBB3F5fEde33F9f677047674D3FBF](https://snowtrace.io/address/0xE3826241E5EeBB3F5fEde33F9f677047674D3FBF) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xc0bF14AfB95CA4C049BDc19E06a3531D8065F6Fd](https://snowtrace.io/address/0xc0bF14AfB95CA4C049BDc19E06a3531D8065F6Fd) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xfA536049652BFb5f57ba8DCFbec1B2b2Dd9803D3](https://snowtrace.io/address/0xfA536049652BFb5f57ba8DCFbec1B2b2Dd9803D3) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xcF24fb2a09227d955F8e9A12f36A26cf1ac079c6](https://snowtrace.io/address/0xcF24fb2a09227d955F8e9A12f36A26cf1ac079c6) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xaBCdF4dcDBa57a04889784A670b862540758f9E7](https://snowtrace.io/address/0xaBCdF4dcDBa57a04889784A670b862540758f9E7) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x0430ed39EA2789AcdF27b89268117EBABc8176D1](https://snowtrace.io/address/0x0430ed39EA2789AcdF27b89268117EBABc8176D1) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xaBCdF4dcDBa57a04889784A670b862540758f9E7](https://snowtrace.io/address/0xaBCdF4dcDBa57a04889784A670b862540758f9E7) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x0430ed39EA2789AcdF27b89268117EBABc8176D1](https://snowtrace.io/address/0x0430ed39EA2789AcdF27b89268117EBABc8176D1) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Base #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xF9E9eD67DD2Fab3b3ca024A2d66Fcf0764d36742](https://basescan.org/address/0xF9E9eD67DD2Fab3b3ca024A2d66Fcf0764d36742) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x4CB16D4153123A74Bc724d161050959754f378D8](https://basescan.org/address/0x4CB16D4153123A74Bc724d161050959754f378D8) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xf4937657Ed8B3f3cB379Eed47b8818eE947BEb1e](https://basescan.org/address/0xf4937657Ed8B3f3cB379Eed47b8818eE947BEb1e) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x0fF9d05E6331A43A906fE1440E0C9D0742F475A3](https://basescan.org/address/0x0fF9d05E6331A43A906fE1440E0C9D0742F475A3) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xF9E9eD67DD2Fab3b3ca024A2d66Fcf0764d36742](https://basescan.org/address/0xF9E9eD67DD2Fab3b3ca024A2d66Fcf0764d36742) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x4CB16D4153123A74Bc724d161050959754f378D8](https://basescan.org/address/0x4CB16D4153123A74Bc724d161050959754f378D8) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xf4937657Ed8B3f3cB379Eed47b8818eE947BEb1e](https://basescan.org/address/0xf4937657Ed8B3f3cB379Eed47b8818eE947BEb1e) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x0fF9d05E6331A43A906fE1440E0C9D0742F475A3](https://basescan.org/address/0x0fF9d05E6331A43A906fE1440E0C9D0742F475A3) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xc1c548F980669615772dadcBfEBC29937c29481A](https://basescan.org/address/0xc1c548F980669615772dadcBfEBC29937c29481A) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x58A51E5382318EeA6065BB7721eecdF4331c0B90](https://basescan.org/address/0x58A51E5382318EeA6065BB7721eecdF4331c0B90) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xc1c548F980669615772dadcBfEBC29937c29481A](https://basescan.org/address/0xc1c548F980669615772dadcBfEBC29937c29481A) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x58A51E5382318EeA6065BB7721eecdF4331c0B90](https://basescan.org/address/0x58A51E5382318EeA6065BB7721eecdF4331c0B90) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Blast #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x9b1468d29b4A5869f00c92517c57f8656E928B93](https://blastscan.io/address/0x9b1468d29b4A5869f00c92517c57f8656E928B93) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupDynamic | [0xA705DE617673e2Fe63a4Ea0E58c26897601D32A5](https://blastscan.io/address/0xA705DE617673e2Fe63a4Ea0E58c26897601D32A5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x91FB72e5297e2728c10FDe73BdE74A4888A68570](https://blastscan.io/address/0x91FB72e5297e2728c10FDe73BdE74A4888A68570) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x5f111b49f8f8bdb4A6001701E0D330fF52D6B370](https://blastscan.io/address/0x5f111b49f8f8bdb4A6001701E0D330fF52D6B370) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x9b1468d29b4A5869f00c92517c57f8656E928B93](https://blastscan.io/address/0x9b1468d29b4A5869f00c92517c57f8656E928B93) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupDynamic | [0xA705DE617673e2Fe63a4Ea0E58c26897601D32A5](https://blastscan.io/address/0xA705DE617673e2Fe63a4Ea0E58c26897601D32A5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x91FB72e5297e2728c10FDe73BdE74A4888A68570](https://blastscan.io/address/0x91FB72e5297e2728c10FDe73BdE74A4888A68570) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x5f111b49f8f8bdb4A6001701E0D330fF52D6B370](https://blastscan.io/address/0x5f111b49f8f8bdb4A6001701E0D330fF52D6B370) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xdc988d7AD6F186ea4a236f3E61A45a7851edF84E](https://blastscan.io/address/0xdc988d7AD6F186ea4a236f3E61A45a7851edF84E) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x3aBCDDa756d069Cf3c7a17410602343966EAFf27](https://blastscan.io/address/0x3aBCDDa756d069Cf3c7a17410602343966EAFf27) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xdc988d7AD6F186ea4a236f3E61A45a7851edF84E](https://blastscan.io/address/0xdc988d7AD6F186ea4a236f3E61A45a7851edF84E) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x3aBCDDa756d069Cf3c7a17410602343966EAFf27](https://blastscan.io/address/0x3aBCDDa756d069Cf3c7a17410602343966EAFf27) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### BNB Smart Chain #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xeB6d84c585bf8AEA34F05a096D6fAA3b8477D146](https://bscscan.com/address/0xeB6d84c585bf8AEA34F05a096D6fAA3b8477D146) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x88ad3B5c62A46Df953A5d428d33D70408F53C408](https://bscscan.com/address/0x88ad3B5c62A46Df953A5d428d33D70408F53C408) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xAb5f007b33EDDA56962A0fC428B15D544EA46591](https://bscscan.com/address/0xAb5f007b33EDDA56962A0fC428B15D544EA46591) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x27641f29b012d0d523EB5943011148c42c98e7F1](https://bscscan.com/address/0x27641f29b012d0d523EB5943011148c42c98e7F1) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xeB6d84c585bf8AEA34F05a096D6fAA3b8477D146](https://bscscan.com/address/0xeB6d84c585bf8AEA34F05a096D6fAA3b8477D146) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x88ad3B5c62A46Df953A5d428d33D70408F53C408](https://bscscan.com/address/0x88ad3B5c62A46Df953A5d428d33D70408F53C408) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xAb5f007b33EDDA56962A0fC428B15D544EA46591](https://bscscan.com/address/0xAb5f007b33EDDA56962A0fC428B15D544EA46591) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x27641f29b012d0d523EB5943011148c42c98e7F1](https://bscscan.com/address/0x27641f29b012d0d523EB5943011148c42c98e7F1) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x70998557980CB6E8E63c46810081262B6c343051](https://bscscan.com/address/0x70998557980CB6E8E63c46810081262B6c343051) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x96Aa12809CAC29Bba4944fEca1dFDC8e1704e6c1](https://bscscan.com/address/0x96Aa12809CAC29Bba4944fEca1dFDC8e1704e6c1) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x70998557980CB6E8E63c46810081262B6c343051](https://bscscan.com/address/0x70998557980CB6E8E63c46810081262B6c343051) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x96Aa12809CAC29Bba4944fEca1dFDC8e1704e6c1](https://bscscan.com/address/0x96Aa12809CAC29Bba4944fEca1dFDC8e1704e6c1) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Core Dao #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xf0a7F2cCE911c298B5CB8106Db19EF1D00230710](https://scan.coredao.org/address/0xf0a7F2cCE911c298B5CB8106Db19EF1D00230710) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x98Fe0d8b2c2c05d9C6a9e635f59474Aaa0000120](https://scan.coredao.org/address/0x98Fe0d8b2c2c05d9C6a9e635f59474Aaa0000120) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x9C99EF88399bC1c1188399B39E7Cc667D78210ea](https://scan.coredao.org/address/0x9C99EF88399bC1c1188399B39E7Cc667D78210ea) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x64C734B2F1704822D8E69CAF230aE8d2eC18AA3e](https://scan.coredao.org/address/0x64C734B2F1704822D8E69CAF230aE8d2eC18AA3e) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xf0a7F2cCE911c298B5CB8106Db19EF1D00230710](https://scan.coredao.org/address/0xf0a7F2cCE911c298B5CB8106Db19EF1D00230710) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x98Fe0d8b2c2c05d9C6a9e635f59474Aaa0000120](https://scan.coredao.org/address/0x98Fe0d8b2c2c05d9C6a9e635f59474Aaa0000120) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x9C99EF88399bC1c1188399B39E7Cc667D78210ea](https://scan.coredao.org/address/0x9C99EF88399bC1c1188399B39E7Cc667D78210ea) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x64C734B2F1704822D8E69CAF230aE8d2eC18AA3e](https://scan.coredao.org/address/0x64C734B2F1704822D8E69CAF230aE8d2eC18AA3e) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xdE21BBFf718723E9069d8528d6Bb26c2971D58a7](https://scan.coredao.org/address/0xdE21BBFf718723E9069d8528d6Bb26c2971D58a7) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x074CC814a8114126c505F5eecFC82A400B39cA03](https://scan.coredao.org/address/0x074CC814a8114126c505F5eecFC82A400B39cA03) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xdE21BBFf718723E9069d8528d6Bb26c2971D58a7](https://scan.coredao.org/address/0xdE21BBFf718723E9069d8528d6Bb26c2971D58a7) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x074CC814a8114126c505F5eecFC82A400B39cA03](https://scan.coredao.org/address/0x074CC814a8114126c505F5eecFC82A400B39cA03) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Gnosis #### Core -| Contract | Address | Deployment | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x555eb55cbc477Aebbe5652D25d0fEA04052d3971](https://gnosisscan.io/address/0x555eb55cbc477Aebbe5652D25d0fEA04052d3971) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xf1cAeB104AB29271463259335357D57772C90758](https://gnosisscan.io/address/0xf1cAeB104AB29271463259335357D57772C90758) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x59A4B7255A5D01247837600e7828A6F77f664b34](https://gnosisscan.io/address/0x59A4B7255A5D01247837600e7828A6F77f664b34) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xA0B5C851E3E9fED83f387f4D8847DA398Da4A8E2](https://gnosisscan.io/address/0xA0B5C851E3E9fED83f387f4D8847DA398Da4A8E2) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x555eb55cbc477Aebbe5652D25d0fEA04052d3971](https://gnosisscan.io/address/0x555eb55cbc477Aebbe5652D25d0fEA04052d3971) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xf1cAeB104AB29271463259335357D57772C90758](https://gnosisscan.io/address/0xf1cAeB104AB29271463259335357D57772C90758) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x59A4B7255A5D01247837600e7828A6F77f664b34](https://gnosisscan.io/address/0x59A4B7255A5D01247837600e7828A6F77f664b34) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xA0B5C851E3E9fED83f387f4D8847DA398Da4A8E2](https://gnosisscan.io/address/0xA0B5C851E3E9fED83f387f4D8847DA398Da4A8E2) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x0F324E5CB01ac98b2883c8ac4231aCA7EfD3e750](https://gnosisscan.io/address/0x0F324E5CB01ac98b2883c8ac4231aCA7EfD3e750) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x5f12318fc6cCa518A950e2Ee16063a6317C2a9Ef](https://gnosisscan.io/address/0x5f12318fc6cCa518A950e2Ee16063a6317C2a9Ef) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x0F324E5CB01ac98b2883c8ac4231aCA7EfD3e750](https://gnosisscan.io/address/0x0F324E5CB01ac98b2883c8ac4231aCA7EfD3e750) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x5f12318fc6cCa518A950e2Ee16063a6317C2a9Ef](https://gnosisscan.io/address/0x5f12318fc6cCa518A950e2Ee16063a6317C2a9Ef) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### IoTeX #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x6FcAB41e3b62d05aB4fC729586CB06Af2a2662D0](https://iotexscan.io/address/0x6FcAB41e3b62d05aB4fC729586CB06Af2a2662D0) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x84f092cf4d7d36c2d4987f672df81a39200a7146](https://iotexscan.io/address/0x84f092cf4d7d36c2d4987f672df81a39200a7146) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x179536f3289fb50076968b339C7EF0Dc0B38E3AF](https://iotexscan.io/address/0x179536f3289fb50076968b339C7EF0Dc0B38E3AF) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x28eAB88ee8a951F78e1028557D0C3fD97af61A33](https://iotexscan.io/address/0x28eAB88ee8a951F78e1028557D0C3fD97af61A33) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x6FcAB41e3b62d05aB4fC729586CB06Af2a2662D0](https://iotexscan.io/address/0x6FcAB41e3b62d05aB4fC729586CB06Af2a2662D0) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x84f092cf4d7d36c2d4987f672df81a39200a7146](https://iotexscan.io/address/0x84f092cf4d7d36c2d4987f672df81a39200a7146) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x179536f3289fb50076968b339C7EF0Dc0B38E3AF](https://iotexscan.io/address/0x179536f3289fb50076968b339C7EF0Dc0B38E3AF) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x28eAB88ee8a951F78e1028557D0C3fD97af61A33](https://iotexscan.io/address/0x28eAB88ee8a951F78e1028557D0C3fD97af61A33) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x711900e5f55d427cd88e5E3FCAe54Ccf02De71F4](https://iotexscan.io/address/0x711900e5f55d427cd88e5E3FCAe54Ccf02De71F4) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xf978034bb3CAB5fe88d23DB5Cb38D510485DaB90](https://iotexscan.io/address/0xf978034bb3CAB5fe88d23DB5Cb38D510485DaB90) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x711900e5f55d427cd88e5E3FCAe54Ccf02De71F4](https://iotexscan.io/address/0x711900e5f55d427cd88e5E3FCAe54Ccf02De71F4) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xf978034bb3CAB5fe88d23DB5Cb38D510485DaB90](https://iotexscan.io/address/0xf978034bb3CAB5fe88d23DB5Cb38D510485DaB90) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### LightLink #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xAa05E418Fb7851C211351C65435F1b17cbFa88Bf](https://phoenix.lightlink.io/address/0xAa05E418Fb7851C211351C65435F1b17cbFa88Bf) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x6329591464FA6721c8E1c1271e4c6C41531Aea6b](https://phoenix.lightlink.io/address/0x6329591464FA6721c8E1c1271e4c6C41531Aea6b) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x83403c6426E6D044bF3B84EC1C007Db211AaA140](https://phoenix.lightlink.io/address/0x83403c6426E6D044bF3B84EC1C007Db211AaA140) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x5881ef3c0D3eB21b1b40E13b4a69c50754bc77C7](https://phoenix.lightlink.io/address/0x5881ef3c0D3eB21b1b40E13b4a69c50754bc77C7) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xAa05E418Fb7851C211351C65435F1b17cbFa88Bf](https://phoenix.lightlink.io/address/0xAa05E418Fb7851C211351C65435F1b17cbFa88Bf) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x6329591464FA6721c8E1c1271e4c6C41531Aea6b](https://phoenix.lightlink.io/address/0x6329591464FA6721c8E1c1271e4c6C41531Aea6b) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x83403c6426E6D044bF3B84EC1C007Db211AaA140](https://phoenix.lightlink.io/address/0x83403c6426E6D044bF3B84EC1C007Db211AaA140) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x5881ef3c0D3eB21b1b40E13b4a69c50754bc77C7](https://phoenix.lightlink.io/address/0x5881ef3c0D3eB21b1b40E13b4a69c50754bc77C7) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x5C847244649BD74aB41f09C893aF792AD87D32aA](https://phoenix.lightlink.io/address/0x5C847244649BD74aB41f09C893aF792AD87D32aA) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x278AC15622846806BD46FBDbdB8dB8d09614173A](https://phoenix.lightlink.io/address/0x278AC15622846806BD46FBDbdB8dB8d09614173A) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x5C847244649BD74aB41f09C893aF792AD87D32aA](https://phoenix.lightlink.io/address/0x5C847244649BD74aB41f09C893aF792AD87D32aA) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x278AC15622846806BD46FBDbdB8dB8d09614173A](https://phoenix.lightlink.io/address/0x278AC15622846806BD46FBDbdB8dB8d09614173A) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Linea #### Core -| Contract | Address | Deployment | -| :---------------------- | :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xF2E46B249cFe09c2b3A2022dc81E0bB4bE3336F1](https://lineascan.build/address/0xF2E46B249cFe09c2b3A2022dc81E0bB4bE3336F1) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xB5d39049510F47EE7f74c528105D225E42747d63](https://lineascan.build/address/0xB5d39049510F47EE7f74c528105D225E42747d63) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xC46ce4B77cBc46D17A2EceB2Cc8e2EE23D96529F](https://lineascan.build/address/0xC46ce4B77cBc46D17A2EceB2Cc8e2EE23D96529F) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x2E72F7523cFeaed6B841aCe20060E0b203c312F5](https://lineascan.build/address/0x2E72F7523cFeaed6B841aCe20060E0b203c312F5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xF2E46B249cFe09c2b3A2022dc81E0bB4bE3336F1](https://lineascan.build/address/0xF2E46B249cFe09c2b3A2022dc81E0bB4bE3336F1) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xB5d39049510F47EE7f74c528105D225E42747d63](https://lineascan.build/address/0xB5d39049510F47EE7f74c528105D225E42747d63) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xC46ce4B77cBc46D17A2EceB2Cc8e2EE23D96529F](https://lineascan.build/address/0xC46ce4B77cBc46D17A2EceB2Cc8e2EE23D96529F) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x2E72F7523cFeaed6B841aCe20060E0b203c312F5](https://lineascan.build/address/0x2E72F7523cFeaed6B841aCe20060E0b203c312F5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x4259557F6665eCF5907c9019a30f3Cb009c20Ae7](https://lineascan.build/address/0x4259557F6665eCF5907c9019a30f3Cb009c20Ae7) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x35E9C3445A039B258Eb7112A5Eea259a825E8AC0](https://lineascan.build/address/0x35E9C3445A039B258Eb7112A5Eea259a825E8AC0) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x4259557F6665eCF5907c9019a30f3Cb009c20Ae7](https://lineascan.build/address/0x4259557F6665eCF5907c9019a30f3Cb009c20Ae7) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x35E9C3445A039B258Eb7112A5Eea259a825E8AC0](https://lineascan.build/address/0x35E9C3445A039B258Eb7112A5Eea259a825E8AC0) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Meld #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://meldscan.io/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xDf578C2c70A86945999c65961417057363530a1c](https://meldscan.io/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://meldscan.io/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://meldscan.io/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://meldscan.io/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xDf578C2c70A86945999c65961417057363530a1c](https://meldscan.io/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://meldscan.io/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://meldscan.io/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://meldscan.io/address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://meldscan.io/address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://meldscan.io/address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://meldscan.io/address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Mode #### Core -| Contract | Address | Deployment | -| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x704552099f5aD679294D337638B9a57Fd4726F52](https://explorer.mode.network/address/0x704552099f5aD679294D337638B9a57Fd4726F52) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xD8C65Bd7CB6924EF895b2eDcA03407c652f5a2C5](https://explorer.mode.network/address/0xD8C65Bd7CB6924EF895b2eDcA03407c652f5a2C5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xBbfA51A10bE68714fa33281646B986dae9f52021](https://explorer.mode.network/address/0xBbfA51A10bE68714fa33281646B986dae9f52021) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xA1976d4bd6572B68A677037B496D806ACC2cBdB3](https://explorer.mode.network/address/0xA1976d4bd6572B68A677037B496D806ACC2cBdB3) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x704552099f5aD679294D337638B9a57Fd4726F52](https://explorer.mode.network/address/0x704552099f5aD679294D337638B9a57Fd4726F52) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xD8C65Bd7CB6924EF895b2eDcA03407c652f5a2C5](https://explorer.mode.network/address/0xD8C65Bd7CB6924EF895b2eDcA03407c652f5a2C5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xBbfA51A10bE68714fa33281646B986dae9f52021](https://explorer.mode.network/address/0xBbfA51A10bE68714fa33281646B986dae9f52021) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xA1976d4bd6572B68A677037B496D806ACC2cBdB3](https://explorer.mode.network/address/0xA1976d4bd6572B68A677037B496D806ACC2cBdB3) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x641A10A2c9e0CeB94F406e1EF68b1E1da002662d](https://explorer.mode.network/address/0x641A10A2c9e0CeB94F406e1EF68b1E1da002662d) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x0Fd01Dd30F96A15dE6AfAd5627d45Ef94752460a](https://explorer.mode.network/address/0x0Fd01Dd30F96A15dE6AfAd5627d45Ef94752460a) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x641A10A2c9e0CeB94F406e1EF68b1E1da002662d](https://explorer.mode.network/address/0x641A10A2c9e0CeB94F406e1EF68b1E1da002662d) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x0Fd01Dd30F96A15dE6AfAd5627d45Ef94752460a](https://explorer.mode.network/address/0x0Fd01Dd30F96A15dE6AfAd5627d45Ef94752460a) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Morph #### Core -| Contract | Address | Deployment | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x946654AB30Dd6eD10236C89f2C8B2719df653691](https://explorer.morphl2.io/address/0x946654AB30Dd6eD10236C89f2C8B2719df653691) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4](https://explorer.morphl2.io/address/0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x63B92F7E2f69877184C955E63B9D8Dff55e52e14](https://explorer.morphl2.io/address/0x63B92F7E2f69877184C955E63B9D8Dff55e52e14) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259](https://explorer.morphl2.io/address/0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x946654AB30Dd6eD10236C89f2C8B2719df653691](https://explorer.morphl2.io/address/0x946654AB30Dd6eD10236C89f2C8B2719df653691) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4](https://explorer.morphl2.io/address/0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x63B92F7E2f69877184C955E63B9D8Dff55e52e14](https://explorer.morphl2.io/address/0x63B92F7E2f69877184C955E63B9D8Dff55e52e14) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259](https://explorer.morphl2.io/address/0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x28D116d7e917756310986C4207eA54183fcba06A](https://explorer.morphl2.io/address/0x28D116d7e917756310986C4207eA54183fcba06A) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x5e73bb96493C10919204045fCdb639D35ad859f8](https://explorer.morphl2.io/address/0x5e73bb96493C10919204045fCdb639D35ad859f8) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x28D116d7e917756310986C4207eA54183fcba06A](https://explorer.morphl2.io/address/0x28D116d7e917756310986C4207eA54183fcba06A) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x5e73bb96493C10919204045fCdb639D35ad859f8](https://explorer.morphl2.io/address/0x5e73bb96493C10919204045fCdb639D35ad859f8) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Optimism #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x4994325F8D4B4A36Bd643128BEb3EC3e582192C0](https://optimistic.etherscan.io/address/0x4994325F8D4B4A36Bd643128BEb3EC3e582192C0) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x5C22471A86E9558ed9d22235dD5E0429207ccf4B](https://optimistic.etherscan.io/address/0x5C22471A86E9558ed9d22235dD5E0429207ccf4B) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x90952912a50079bef00D5F49c975058d6573aCdC](https://optimistic.etherscan.io/address/0x90952912a50079bef00D5F49c975058d6573aCdC) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x1a4837b8c668b8F7BE22Ba156419b7b823Cfd05c](https://optimistic.etherscan.io/address/0x1a4837b8c668b8F7BE22Ba156419b7b823Cfd05c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x4994325F8D4B4A36Bd643128BEb3EC3e582192C0](https://optimistic.etherscan.io/address/0x4994325F8D4B4A36Bd643128BEb3EC3e582192C0) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x5C22471A86E9558ed9d22235dD5E0429207ccf4B](https://optimistic.etherscan.io/address/0x5C22471A86E9558ed9d22235dD5E0429207ccf4B) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x90952912a50079bef00D5F49c975058d6573aCdC](https://optimistic.etherscan.io/address/0x90952912a50079bef00D5F49c975058d6573aCdC) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x1a4837b8c668b8F7BE22Ba156419b7b823Cfd05c](https://optimistic.etherscan.io/address/0x1a4837b8c668b8F7BE22Ba156419b7b823Cfd05c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x6cd7bB0f63aFCc9F6CeDd1Bf1E3Bd4ED078CD019](https://optimistic.etherscan.io/address/0x6cd7bB0f63aFCc9F6CeDd1Bf1E3Bd4ED078CD019) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xe041629D99730b3EE4d6518097C45b4E3591992b](https://optimistic.etherscan.io/address/0xe041629D99730b3EE4d6518097C45b4E3591992b) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x6cd7bB0f63aFCc9F6CeDd1Bf1E3Bd4ED078CD019](https://optimistic.etherscan.io/address/0x6cd7bB0f63aFCc9F6CeDd1Bf1E3Bd4ED078CD019) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xe041629D99730b3EE4d6518097C45b4E3591992b](https://optimistic.etherscan.io/address/0xe041629D99730b3EE4d6518097C45b4E3591992b) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Polygon #### Core -| Contract | Address | Deployment | -| :---------------------- | :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x8D4dDc187a73017a5d7Cef733841f55115B13762](https://polygonscan.com/address/0x8D4dDc187a73017a5d7Cef733841f55115B13762) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x8D87c5eddb5644D1a714F85930Ca940166e465f0](https://polygonscan.com/address/0x8D87c5eddb5644D1a714F85930Ca940166e465f0) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xBF67f0A1E847564D0eFAD475782236D3Fa7e9Ec2](https://polygonscan.com/address/0xBF67f0A1E847564D0eFAD475782236D3Fa7e9Ec2) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xf28BF9390fb57BB68386430550818D312699ED15](https://polygonscan.com/address/0xf28BF9390fb57BB68386430550818D312699ED15) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x8D4dDc187a73017a5d7Cef733841f55115B13762](https://polygonscan.com/address/0x8D4dDc187a73017a5d7Cef733841f55115B13762) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x8D87c5eddb5644D1a714F85930Ca940166e465f0](https://polygonscan.com/address/0x8D87c5eddb5644D1a714F85930Ca940166e465f0) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xBF67f0A1E847564D0eFAD475782236D3Fa7e9Ec2](https://polygonscan.com/address/0xBF67f0A1E847564D0eFAD475782236D3Fa7e9Ec2) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xf28BF9390fb57BB68386430550818D312699ED15](https://polygonscan.com/address/0xf28BF9390fb57BB68386430550818D312699ED15) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xD29EC4B9203f2d1C9Cd4Ba8c68FCFE4ECd85f6f5](https://polygonscan.com/address/0xD29EC4B9203f2d1C9Cd4Ba8c68FCFE4ECd85f6f5) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xC28872e0c1f3633EeD467907123727ac0155029D](https://polygonscan.com/address/0xC28872e0c1f3633EeD467907123727ac0155029D) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xD29EC4B9203f2d1C9Cd4Ba8c68FCFE4ECd85f6f5](https://polygonscan.com/address/0xD29EC4B9203f2d1C9Cd4Ba8c68FCFE4ECd85f6f5) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xC28872e0c1f3633EeD467907123727ac0155029D](https://polygonscan.com/address/0xC28872e0c1f3633EeD467907123727ac0155029D) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Scroll #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xAc199bFea92aa4D4C3d8A49fd463EAD99C7a6A8f](https://scrollscan.com/address/0xAc199bFea92aa4D4C3d8A49fd463EAD99C7a6A8f) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xBc5DC6D77612E636DA32af0d85Ca3179a57330fd](https://scrollscan.com/address/0xBc5DC6D77612E636DA32af0d85Ca3179a57330fd) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xb0f78dDc01D829d8b567821Eb193De8082b57D9D](https://scrollscan.com/address/0xb0f78dDc01D829d8b567821Eb193De8082b57D9D) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xA1A281BbcaED8f0A9Dcd0fe67cbC53e0993C24cb](https://scrollscan.com/address/0xA1A281BbcaED8f0A9Dcd0fe67cbC53e0993C24cb) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xAc199bFea92aa4D4C3d8A49fd463EAD99C7a6A8f](https://scrollscan.com/address/0xAc199bFea92aa4D4C3d8A49fd463EAD99C7a6A8f) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xBc5DC6D77612E636DA32af0d85Ca3179a57330fd](https://scrollscan.com/address/0xBc5DC6D77612E636DA32af0d85Ca3179a57330fd) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xb0f78dDc01D829d8b567821Eb193De8082b57D9D](https://scrollscan.com/address/0xb0f78dDc01D829d8b567821Eb193De8082b57D9D) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xA1A281BbcaED8f0A9Dcd0fe67cbC53e0993C24cb](https://scrollscan.com/address/0xA1A281BbcaED8f0A9Dcd0fe67cbC53e0993C24cb) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x4B8BF9cD3274517609e7Fe905740fa151C9aa711](https://scrollscan.com/address/0x4B8BF9cD3274517609e7Fe905740fa151C9aa711) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x344afe8ad5dBA3d55870dc398e0F53B635B2ed0d](https://scrollscan.com/address/0x344afe8ad5dBA3d55870dc398e0F53B635B2ed0d) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x4B8BF9cD3274517609e7Fe905740fa151C9aa711](https://scrollscan.com/address/0x4B8BF9cD3274517609e7Fe905740fa151C9aa711) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x344afe8ad5dBA3d55870dc398e0F53B635B2ed0d](https://scrollscan.com/address/0x344afe8ad5dBA3d55870dc398e0F53B635B2ed0d) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Superseed #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x1fA500262b352d821B4e1c933A20f2242B45383d](https://explorer.superseed.xyz/address/0x1fA500262b352d821B4e1c933A20f2242B45383d) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x251FC799344151026d19b959B8f3667416d56B88](https://explorer.superseed.xyz/address/0x251FC799344151026d19b959B8f3667416d56B88) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x91211E1760280d3f7dF2182ce4D1Fd6A1735C202](https://explorer.superseed.xyz/address/0x91211E1760280d3f7dF2182ce4D1Fd6A1735C202) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x0a6C2E6B61cf05800F9aA91494480440843d6c3c](https://explorer.superseed.xyz/address/0x0a6C2E6B61cf05800F9aA91494480440843d6c3c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x1fA500262b352d821B4e1c933A20f2242B45383d](https://explorer.superseed.xyz/address/0x1fA500262b352d821B4e1c933A20f2242B45383d) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x251FC799344151026d19b959B8f3667416d56B88](https://explorer.superseed.xyz/address/0x251FC799344151026d19b959B8f3667416d56B88) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x91211E1760280d3f7dF2182ce4D1Fd6A1735C202](https://explorer.superseed.xyz/address/0x91211E1760280d3f7dF2182ce4D1Fd6A1735C202) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x0a6C2E6B61cf05800F9aA91494480440843d6c3c](https://explorer.superseed.xyz/address/0x0a6C2E6B61cf05800F9aA91494480440843d6c3c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xc4DE6f667435d5Ce0150e08BcEc9722C9017e90b](https://explorer.superseed.xyz/address/0xc4DE6f667435d5Ce0150e08BcEc9722C9017e90b) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xF60bEADEfbeb98C927E13C4165BCa7D85Ba32cB2](https://explorer.superseed.xyz/address/0xF60bEADEfbeb98C927E13C4165BCa7D85Ba32cB2) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xc4DE6f667435d5Ce0150e08BcEc9722C9017e90b](https://explorer.superseed.xyz/address/0xc4DE6f667435d5Ce0150e08BcEc9722C9017e90b) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xF60bEADEfbeb98C927E13C4165BCa7D85Ba32cB2](https://explorer.superseed.xyz/address/0xF60bEADEfbeb98C927E13C4165BCa7D85Ba32cB2) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Taiko Mainnet #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x238C830FA8E4ED0f0A4bc9C986BF338aEC9e38D1](https://taikoscan.io/address/0x238C830FA8E4ED0f0A4bc9C986BF338aEC9e38D1) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x5Ec0a2e88dAd09ad940Be2639c9aDb24D186989E](https://taikoscan.io/address/0x5Ec0a2e88dAd09ad940Be2639c9aDb24D186989E) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x6a619d35972578E8458E33B7d1e07b155A51585E](https://taikoscan.io/address/0x6a619d35972578E8458E33B7d1e07b155A51585E) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xBFD6048C80665792d949692CE77307e55dbb8986](https://taikoscan.io/address/0xBFD6048C80665792d949692CE77307e55dbb8986) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x238C830FA8E4ED0f0A4bc9C986BF338aEC9e38D1](https://taikoscan.io/address/0x238C830FA8E4ED0f0A4bc9C986BF338aEC9e38D1) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x5Ec0a2e88dAd09ad940Be2639c9aDb24D186989E](https://taikoscan.io/address/0x5Ec0a2e88dAd09ad940Be2639c9aDb24D186989E) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x6a619d35972578E8458E33B7d1e07b155A51585E](https://taikoscan.io/address/0x6a619d35972578E8458E33B7d1e07b155A51585E) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xBFD6048C80665792d949692CE77307e55dbb8986](https://taikoscan.io/address/0xBFD6048C80665792d949692CE77307e55dbb8986) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x65E2C9990d4CAc5E54E65c1BD625CdcC9FDd1292](https://taikoscan.io/address/0x65E2C9990d4CAc5E54E65c1BD625CdcC9FDd1292) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xd7df0b795756b60ab51a37e26f1edb7ef9e78828](https://taikoscan.io/address/0xd7df0b795756b60ab51a37e26f1edb7ef9e78828) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x65E2C9990d4CAc5E54E65c1BD625CdcC9FDd1292](https://taikoscan.io/address/0x65E2C9990d4CAc5E54E65c1BD625CdcC9FDd1292) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xd7df0b795756b60ab51a37e26f1edb7ef9e78828](https://taikoscan.io/address/0xd7df0b795756b60ab51a37e26f1edb7ef9e78828) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Tangle #### Core -| Contract | Address | Deployment | -| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x946654AB30Dd6eD10236C89f2C8B2719df653691](https://explorer.tangle.tools/address/0x946654AB30Dd6eD10236C89f2C8B2719df653691) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4](https://explorer.tangle.tools/address/0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x63B92F7E2f69877184C955E63B9D8Dff55e52e14](https://explorer.tangle.tools/address/0x63B92F7E2f69877184C955E63B9D8Dff55e52e14) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259](https://explorer.tangle.tools/address/0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x946654AB30Dd6eD10236C89f2C8B2719df653691](https://explorer.tangle.tools/address/0x946654AB30Dd6eD10236C89f2C8B2719df653691) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4](https://explorer.tangle.tools/address/0xAC19F4181E58efb7094e0cb4e1BB18c79F6AAdf4) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x63B92F7E2f69877184C955E63B9D8Dff55e52e14](https://explorer.tangle.tools/address/0x63B92F7E2f69877184C955E63B9D8Dff55e52e14) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259](https://explorer.tangle.tools/address/0xe785101Cb228693cc3EFdCd5d637fEf6A6Ff7259) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x28D116d7e917756310986C4207eA54183fcba06A](https://explorer.tangle.tools/address/0x28D116d7e917756310986C4207eA54183fcba06A) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x5e73bb96493C10919204045fCdb639D35ad859f8](https://explorer.tangle.tools/address/0x5e73bb96493C10919204045fCdb639D35ad859f8) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x28D116d7e917756310986C4207eA54183fcba06A](https://explorer.tangle.tools/address/0x28D116d7e917756310986C4207eA54183fcba06A) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x5e73bb96493C10919204045fCdb639D35ad859f8](https://explorer.tangle.tools/address/0x5e73bb96493C10919204045fCdb639D35ad859f8) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### zkSync Era @@ -412,21 +413,21 @@ Unlike other EVM chains, zkSync requires the libraries to be deployed, too. Plea #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xf03f4Bf48b108360bAf1597Fb8053Ebe0F5245dA](https://explorer.zksync.io/address/0xf03f4Bf48b108360bAf1597Fb8053Ebe0F5245dA) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x8cB69b514E97a904743922e1adf3D1627deeeE8D](https://explorer.zksync.io/address/0x8cB69b514E97a904743922e1adf3D1627deeeE8D) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x1fB145A47Eb9b8bf565273e137356376197b3559](https://explorer.zksync.io/address/0x1fB145A47Eb9b8bf565273e137356376197b3559) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x99BA0D464942e7166dEBb8BAaAF1192F8d4117eb](https://explorer.zksync.io/address/0x99BA0D464942e7166dEBb8BAaAF1192F8d4117eb) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| NFTSVG | [0xdCAaF1fC014BCdB5568Dc5CA8c22de4BE8829dCd](https://explorer.zksync.io/address/0xdCAaF1fC014BCdB5568Dc5CA8c22de4BE8829dCd) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SVGElements | [0x500b6f2624662b1e2E0a144ceF24117B39F09DA5](https://explorer.zksync.io/address/0x500b6f2624662b1e2E0a144ceF24117B39F09DA5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xf03f4Bf48b108360bAf1597Fb8053Ebe0F5245dA](https://explorer.zksync.io/address/0xf03f4Bf48b108360bAf1597Fb8053Ebe0F5245dA) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x8cB69b514E97a904743922e1adf3D1627deeeE8D](https://explorer.zksync.io/address/0x8cB69b514E97a904743922e1adf3D1627deeeE8D) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x1fB145A47Eb9b8bf565273e137356376197b3559](https://explorer.zksync.io/address/0x1fB145A47Eb9b8bf565273e137356376197b3559) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x99BA0D464942e7166dEBb8BAaAF1192F8d4117eb](https://explorer.zksync.io/address/0x99BA0D464942e7166dEBb8BAaAF1192F8d4117eb) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| NFTSVG | [0xdCAaF1fC014BCdB5568Dc5CA8c22de4BE8829dCd](https://explorer.zksync.io/address/0xdCAaF1fC014BCdB5568Dc5CA8c22de4BE8829dCd) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SVGElements | [0x500b6f2624662b1e2E0a144ceF24117B39F09DA5](https://explorer.zksync.io/address/0x500b6f2624662b1e2E0a144ceF24117B39F09DA5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xAE1A55205A0499d6BBb0Cf0f1210641957e9cb7e](https://explorer.zksync.io/address/0xAE1A55205A0499d6BBb0Cf0f1210641957e9cb7e) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x8a84fCF962163A7E98Bf0daFD918973c846fa5C8](https://explorer.zksync.io/address/0x8a84fCF962163A7E98Bf0daFD918973c846fa5C8) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xAE1A55205A0499d6BBb0Cf0f1210641957e9cb7e](https://explorer.zksync.io/address/0xAE1A55205A0499d6BBb0Cf0f1210641957e9cb7e) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x8a84fCF962163A7E98Bf0daFD918973c846fa5C8](https://explorer.zksync.io/address/0x8a84fCF962163A7E98Bf0daFD918973c846fa5C8) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ## Testnets @@ -434,199 +435,199 @@ Unlike other EVM chains, zkSync requires the libraries to be deployed, too. Plea #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x73BB6dD3f5828d60F8b3dBc8798EB10fbA2c5636](https://sepolia.etherscan.io/address/0x73BB6dD3f5828d60F8b3dBc8798EB10fbA2c5636) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x3E435560fd0a03ddF70694b35b673C25c65aBB6C](https://sepolia.etherscan.io/address/0x3E435560fd0a03ddF70694b35b673C25c65aBB6C) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x3a1beA13A8C24c0EA2b8fAE91E4b2762A59D7aF5](https://sepolia.etherscan.io/address/0x3a1beA13A8C24c0EA2b8fAE91E4b2762A59D7aF5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x56F2f7f4d15d1A9FF9d3782b6F6bB8f6fd690D33](https://sepolia.etherscan.io/address/0x56F2f7f4d15d1A9FF9d3782b6F6bB8f6fd690D33) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x73BB6dD3f5828d60F8b3dBc8798EB10fbA2c5636](https://sepolia.etherscan.io/address/0x73BB6dD3f5828d60F8b3dBc8798EB10fbA2c5636) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x3E435560fd0a03ddF70694b35b673C25c65aBB6C](https://sepolia.etherscan.io/address/0x3E435560fd0a03ddF70694b35b673C25c65aBB6C) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x3a1beA13A8C24c0EA2b8fAE91E4b2762A59D7aF5](https://sepolia.etherscan.io/address/0x3a1beA13A8C24c0EA2b8fAE91E4b2762A59D7aF5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x56F2f7f4d15d1A9FF9d3782b6F6bB8f6fd690D33](https://sepolia.etherscan.io/address/0x56F2f7f4d15d1A9FF9d3782b6F6bB8f6fd690D33) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x04A9c14b7a000640419aD5515Db4eF4172C00E31](https://sepolia.etherscan.io/address/0x04A9c14b7a000640419aD5515Db4eF4172C00E31) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x56E9180A8d2C35c99F2F8a1A5Ab8aBe79E876E8c](https://sepolia.etherscan.io/address/0x56E9180A8d2C35c99F2F8a1A5Ab8aBe79E876E8c) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x04A9c14b7a000640419aD5515Db4eF4172C00E31](https://sepolia.etherscan.io/address/0x04A9c14b7a000640419aD5515Db4eF4172C00E31) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x56E9180A8d2C35c99F2F8a1A5Ab8aBe79E876E8c](https://sepolia.etherscan.io/address/0x56E9180A8d2C35c99F2F8a1A5Ab8aBe79E876E8c) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Arbitrum Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x8127E8081C22807c8a786Af1e1b174939577144A](https://sepolia.arbiscan.io/address/0x8127E8081C22807c8a786Af1e1b174939577144A) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x9D1C257d9bc09E6E6B8E7e7c2496C12000f55457](https://sepolia.arbiscan.io/address/0x9D1C257d9bc09E6E6B8E7e7c2496C12000f55457) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xaff2efFCF38Ea4A92E0cC5D7c48456C53358fE1a](https://sepolia.arbiscan.io/address/0xaff2efFCF38Ea4A92E0cC5D7c48456C53358fE1a) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x46AEd4FE32aE1306d8073FE54A4E844e10a3ca16](https://sepolia.arbiscan.io/address/0x46AEd4FE32aE1306d8073FE54A4E844e10a3ca16) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x8127E8081C22807c8a786Af1e1b174939577144A](https://sepolia.arbiscan.io/address/0x8127E8081C22807c8a786Af1e1b174939577144A) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x9D1C257d9bc09E6E6B8E7e7c2496C12000f55457](https://sepolia.arbiscan.io/address/0x9D1C257d9bc09E6E6B8E7e7c2496C12000f55457) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xaff2efFCF38Ea4A92E0cC5D7c48456C53358fE1a](https://sepolia.arbiscan.io/address/0xaff2efFCF38Ea4A92E0cC5D7c48456C53358fE1a) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x46AEd4FE32aE1306d8073FE54A4E844e10a3ca16](https://sepolia.arbiscan.io/address/0x46AEd4FE32aE1306d8073FE54A4E844e10a3ca16) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4](https://sepolia.arbiscan.io/address/0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xa11561F9e418f2C431B411E1CA22FD3F85D4c831](https://sepolia.arbiscan.io/address/0xa11561F9e418f2C431B411E1CA22FD3F85D4c831) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4](https://sepolia.arbiscan.io/address/0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xa11561F9e418f2C431B411E1CA22FD3F85D4c831](https://sepolia.arbiscan.io/address/0xa11561F9e418f2C431B411E1CA22FD3F85D4c831) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Base Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x6DCB73E5F7e8e70bE20b3B9CF50E3be4625A91C3](https://sepolia.basescan.org/address/0x6DCB73E5F7e8e70bE20b3B9CF50E3be4625A91C3) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xFE7fc0Bbde84C239C0aB89111D617dC7cc58049f](https://sepolia.basescan.org/address/0xFE7fc0Bbde84C239C0aB89111D617dC7cc58049f) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xb8c724df3eC8f2Bf8fA808dF2cB5dbab22f3E68c](https://sepolia.basescan.org/address/0xb8c724df3eC8f2Bf8fA808dF2cB5dbab22f3E68c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x474dFf3Cdd6489523947bf08D538F56d07Ca699e](https://sepolia.basescan.org/address/0x474dFf3Cdd6489523947bf08D538F56d07Ca699e) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x6DCB73E5F7e8e70bE20b3B9CF50E3be4625A91C3](https://sepolia.basescan.org/address/0x6DCB73E5F7e8e70bE20b3B9CF50E3be4625A91C3) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xFE7fc0Bbde84C239C0aB89111D617dC7cc58049f](https://sepolia.basescan.org/address/0xFE7fc0Bbde84C239C0aB89111D617dC7cc58049f) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xb8c724df3eC8f2Bf8fA808dF2cB5dbab22f3E68c](https://sepolia.basescan.org/address/0xb8c724df3eC8f2Bf8fA808dF2cB5dbab22f3E68c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x474dFf3Cdd6489523947bf08D538F56d07Ca699e](https://sepolia.basescan.org/address/0x474dFf3Cdd6489523947bf08D538F56d07Ca699e) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x23d0B7691F4Ca0E5477132a7C7F54fdCEd1814B9](https://sepolia.basescan.org/address/0x23d0B7691F4Ca0E5477132a7C7F54fdCEd1814B9) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x899a05feb160fe912f621733A1d0b39C1446B3eB](https://sepolia.basescan.org/address/0x899a05feb160fe912f621733A1d0b39C1446B3eB) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x23d0B7691F4Ca0E5477132a7C7F54fdCEd1814B9](https://sepolia.basescan.org/address/0x23d0B7691F4Ca0E5477132a7C7F54fdCEd1814B9) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x899a05feb160fe912f621733A1d0b39C1446B3eB](https://sepolia.basescan.org/address/0x899a05feb160fe912f621733A1d0b39C1446B3eB) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Berachain Bartio #### Core -| Contract | Address | Deployment | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x1EA807A7CeAd9547d1dB14B4249b215C01c0B4D4](https://bartio.beratrail.io/address/0x1EA807A7CeAd9547d1dB14B4249b215C01c0B4D4) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xfB603381EdfaF3A67e8332c14f9453E073A1BeF6](https://bartio.beratrail.io/address/0xfB603381EdfaF3A67e8332c14f9453E073A1BeF6) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xE92893Ee49b6Ae9e468B332cc5A3FdEA8cb7FEBf](https://bartio.beratrail.io/address/0xE92893Ee49b6Ae9e468B332cc5A3FdEA8cb7FEBf) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x5A67965B0f8d8202121b965a4ad977706329e607](https://bartio.beratrail.io/address/0x5A67965B0f8d8202121b965a4ad977706329e607) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x1EA807A7CeAd9547d1dB14B4249b215C01c0B4D4](https://bartio.beratrail.io/address/0x1EA807A7CeAd9547d1dB14B4249b215C01c0B4D4) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xfB603381EdfaF3A67e8332c14f9453E073A1BeF6](https://bartio.beratrail.io/address/0xfB603381EdfaF3A67e8332c14f9453E073A1BeF6) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xE92893Ee49b6Ae9e468B332cc5A3FdEA8cb7FEBf](https://bartio.beratrail.io/address/0xE92893Ee49b6Ae9e468B332cc5A3FdEA8cb7FEBf) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x5A67965B0f8d8202121b965a4ad977706329e607](https://bartio.beratrail.io/address/0x5A67965B0f8d8202121b965a4ad977706329e607) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xf43Df76b7533245da6F194a58Cb82533479b2100](https://bartio.beratrail.io/address/0xf43Df76b7533245da6F194a58Cb82533479b2100) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x5ED2465370adBC11D6e651002d70C476fd9106Cb](https://bartio.beratrail.io/address/0x5ED2465370adBC11D6e651002d70C476fd9106Cb) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xf43Df76b7533245da6F194a58Cb82533479b2100](https://bartio.beratrail.io/address/0xf43Df76b7533245da6F194a58Cb82533479b2100) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x5ED2465370adBC11D6e651002d70C476fd9106Cb](https://bartio.beratrail.io/address/0x5ED2465370adBC11D6e651002d70C476fd9106Cb) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Blast Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x9dA09f4887FD3a78Ea237F74a456a82e4301F3D4](https://sepolia.blastscan.io/address/0x9dA09f4887FD3a78Ea237F74a456a82e4301F3D4) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x07f1386803ab6e1D8b6AABD50A9772E45bEA08f1](https://sepolia.blastscan.io/address/0x07f1386803ab6e1D8b6AABD50A9772E45bEA08f1) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x7eB79ab3652713bBE989e7A0dCA61ba484CAED85](https://sepolia.blastscan.io/address/0x7eB79ab3652713bBE989e7A0dCA61ba484CAED85) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x93c0c4a57573C7056D7d63B536e33E28FB3ec2EE](https://sepolia.blastscan.io/address/0x93c0c4a57573C7056D7d63B536e33E28FB3ec2EE) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x9dA09f4887FD3a78Ea237F74a456a82e4301F3D4](https://sepolia.blastscan.io/address/0x9dA09f4887FD3a78Ea237F74a456a82e4301F3D4) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x07f1386803ab6e1D8b6AABD50A9772E45bEA08f1](https://sepolia.blastscan.io/address/0x07f1386803ab6e1D8b6AABD50A9772E45bEA08f1) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x7eB79ab3652713bBE989e7A0dCA61ba484CAED85](https://sepolia.blastscan.io/address/0x7eB79ab3652713bBE989e7A0dCA61ba484CAED85) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x93c0c4a57573C7056D7d63B536e33E28FB3ec2EE](https://sepolia.blastscan.io/address/0x93c0c4a57573C7056D7d63B536e33E28FB3ec2EE) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xAC83E6aDA41a9251516601d8D5D0188466044Cc1](https://sepolia.blastscan.io/address/0xAC83E6aDA41a9251516601d8D5D0188466044Cc1) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xb9fCF1f73DD941Dd1C589fCf8545E60133EE5eC2](https://sepolia.blastscan.io/address/0xb9fCF1f73DD941Dd1C589fCf8545E60133EE5eC2) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xAC83E6aDA41a9251516601d8D5D0188466044Cc1](https://sepolia.blastscan.io/address/0xAC83E6aDA41a9251516601d8D5D0188466044Cc1) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xb9fCF1f73DD941Dd1C589fCf8545E60133EE5eC2](https://sepolia.blastscan.io/address/0xb9fCF1f73DD941Dd1C589fCf8545E60133EE5eC2) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Linea Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x95D29708be647BDD8dA0bdF82B84eB5f42d45918](https://sepolia.lineascan.build/address/0x95D29708be647BDD8dA0bdF82B84eB5f42d45918) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x435F33C21B9Ea8BF207785616Bb28C46eDeD7366](https://sepolia.lineascan.build/address/0x435F33C21B9Ea8BF207785616Bb28C46eDeD7366) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x5A52E9F4dFcdBcd68E50386D484378718167aB60](https://sepolia.lineascan.build/address/0x5A52E9F4dFcdBcd68E50386D484378718167aB60) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x237f114a9cF62b87383684529d889DdfEd917f0c](https://sepolia.lineascan.build/address/0x237f114a9cF62b87383684529d889DdfEd917f0c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x95D29708be647BDD8dA0bdF82B84eB5f42d45918](https://sepolia.lineascan.build/address/0x95D29708be647BDD8dA0bdF82B84eB5f42d45918) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x435F33C21B9Ea8BF207785616Bb28C46eDeD7366](https://sepolia.lineascan.build/address/0x435F33C21B9Ea8BF207785616Bb28C46eDeD7366) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x5A52E9F4dFcdBcd68E50386D484378718167aB60](https://sepolia.lineascan.build/address/0x5A52E9F4dFcdBcd68E50386D484378718167aB60) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x237f114a9cF62b87383684529d889DdfEd917f0c](https://sepolia.lineascan.build/address/0x237f114a9cF62b87383684529d889DdfEd917f0c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x8224eb5D7d76B2D7Df43b868D875E79B11500eA8](https://sepolia.lineascan.build/address/0x8224eb5D7d76B2D7Df43b868D875E79B11500eA8) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x83Dd52FCA44E069020b58155b761A590F12B59d3](https://sepolia.lineascan.build/address/0x83Dd52FCA44E069020b58155b761A590F12B59d3) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x8224eb5D7d76B2D7Df43b868D875E79B11500eA8](https://sepolia.lineascan.build/address/0x8224eb5D7d76B2D7Df43b868D875E79B11500eA8) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x83Dd52FCA44E069020b58155b761A590F12B59d3](https://sepolia.lineascan.build/address/0x83Dd52FCA44E069020b58155b761A590F12B59d3) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Mode Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x5cD39Ec69F0Ed62733d0DA3E083E451334bA1f70](https://sepolia.explorer.mode.network/address/0x5cD39Ec69F0Ed62733d0DA3E083E451334bA1f70) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x61861e4C72EE2F6967C852FE79Eac0E7a9C4f466](https://sepolia.explorer.mode.network/address/0x61861e4C72EE2F6967C852FE79Eac0E7a9C4f466) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xc51346d1FD003E536530584eb4c8974BB279712D](https://sepolia.explorer.mode.network/address/0xc51346d1FD003E536530584eb4c8974BB279712D) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0xD3c856A7333c264475aD87F9E6f84Ef376AE250D](https://sepolia.explorer.mode.network/address/0xD3c856A7333c264475aD87F9E6f84Ef376AE250D) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x5cD39Ec69F0Ed62733d0DA3E083E451334bA1f70](https://sepolia.explorer.mode.network/address/0x5cD39Ec69F0Ed62733d0DA3E083E451334bA1f70) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x61861e4C72EE2F6967C852FE79Eac0E7a9C4f466](https://sepolia.explorer.mode.network/address/0x61861e4C72EE2F6967C852FE79Eac0E7a9C4f466) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xc51346d1FD003E536530584eb4c8974BB279712D](https://sepolia.explorer.mode.network/address/0xc51346d1FD003E536530584eb4c8974BB279712D) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0xD3c856A7333c264475aD87F9E6f84Ef376AE250D](https://sepolia.explorer.mode.network/address/0xD3c856A7333c264475aD87F9E6f84Ef376AE250D) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xece83740834694A6E204825e5bcD8774F26a2665](https://sepolia.explorer.mode.network/address/0xece83740834694A6E204825e5bcD8774F26a2665) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x900de6cC1021afa13f41e1067bEE681BbD661C69](https://sepolia.explorer.mode.network/address/0x900de6cC1021afa13f41e1067bEE681BbD661C69) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xece83740834694A6E204825e5bcD8774F26a2665](https://sepolia.explorer.mode.network/address/0xece83740834694A6E204825e5bcD8774F26a2665) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x900de6cC1021afa13f41e1067bEE681BbD661C69](https://sepolia.explorer.mode.network/address/0x900de6cC1021afa13f41e1067bEE681BbD661C69) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Morph Holesky #### Core -| Contract | Address | Deployment | -| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x36477f8FEf1fC3B0fe7F24b8F6d9561f0BeC30e7](https://explorer-holesky.morphl2.io/address/0x36477f8FEf1fC3B0fe7F24b8F6d9561f0BeC30e7) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x4b4126036726085636BC2A4788a448d5C26705E4](https://explorer-holesky.morphl2.io/address/0x4b4126036726085636BC2A4788a448d5C26705E4) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0x6AF155530D6360E789deD0CF88219f855CCb158F](https://explorer-holesky.morphl2.io/address/0x6AF155530D6360E789deD0CF88219f855CCb158F) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x33BE6a7810B464B913052EC0436A067de25C164c](https://explorer-holesky.morphl2.io/address/0x33BE6a7810B464B913052EC0436A067de25C164c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x36477f8FEf1fC3B0fe7F24b8F6d9561f0BeC30e7](https://explorer-holesky.morphl2.io/address/0x36477f8FEf1fC3B0fe7F24b8F6d9561f0BeC30e7) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x4b4126036726085636BC2A4788a448d5C26705E4](https://explorer-holesky.morphl2.io/address/0x4b4126036726085636BC2A4788a448d5C26705E4) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0x6AF155530D6360E789deD0CF88219f855CCb158F](https://explorer-holesky.morphl2.io/address/0x6AF155530D6360E789deD0CF88219f855CCb158F) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x33BE6a7810B464B913052EC0436A067de25C164c](https://explorer-holesky.morphl2.io/address/0x33BE6a7810B464B913052EC0436A067de25C164c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x728Ec8260Ea1115252D33c0D563d78CA18990dE4](https://explorer-holesky.morphl2.io/address/0x728Ec8260Ea1115252D33c0D563d78CA18990dE4) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x4B5F6B967dC61c2B39fa233092745B460eA1b433](https://explorer-holesky.morphl2.io/address/0x4B5F6B967dC61c2B39fa233092745B460eA1b433) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x728Ec8260Ea1115252D33c0D563d78CA18990dE4](https://explorer-holesky.morphl2.io/address/0x728Ec8260Ea1115252D33c0D563d78CA18990dE4) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x4B5F6B967dC61c2B39fa233092745B460eA1b433](https://explorer-holesky.morphl2.io/address/0x4B5F6B967dC61c2B39fa233092745B460eA1b433) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Optimism Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x89EC3830040dec63E9dF0C904d649fda4d49DF16](https://sepolia-optimistic.etherscan.io/address/0x89EC3830040dec63E9dF0C904d649fda4d49DF16) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x0a881bbd71a21710D56Ff1931EC8189d94019D60](https://sepolia-optimistic.etherscan.io/address/0x0a881bbd71a21710D56Ff1931EC8189d94019D60) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xb971A93608413C54F407eE86C7c15b295E0004bB](https://sepolia-optimistic.etherscan.io/address/0xb971A93608413C54F407eE86C7c15b295E0004bB) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x48F8C05C721E27FA82aD6c8ddB1a88eF43864A9A](https://sepolia-optimistic.etherscan.io/address/0x48F8C05C721E27FA82aD6c8ddB1a88eF43864A9A) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x89EC3830040dec63E9dF0C904d649fda4d49DF16](https://sepolia-optimistic.etherscan.io/address/0x89EC3830040dec63E9dF0C904d649fda4d49DF16) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x0a881bbd71a21710D56Ff1931EC8189d94019D60](https://sepolia-optimistic.etherscan.io/address/0x0a881bbd71a21710D56Ff1931EC8189d94019D60) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xb971A93608413C54F407eE86C7c15b295E0004bB](https://sepolia-optimistic.etherscan.io/address/0xb971A93608413C54F407eE86C7c15b295E0004bB) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x48F8C05C721E27FA82aD6c8ddB1a88eF43864A9A](https://sepolia-optimistic.etherscan.io/address/0x48F8C05C721E27FA82aD6c8ddB1a88eF43864A9A) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4](https://sepolia-optimistic.etherscan.io/address/0xd9dD971D4800100aED0BfF3535aB116D4Be5c420) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0xa11561F9e418f2C431B411E1CA22FD3F85D4c831](https://sepolia-optimistic.etherscan.io/address/0x6CBe6e298A9354306e6ee65f63FF85CFA7062a39) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0xC1FD380b3B0fF989C259D0b45B97F9663B638aA4](https://sepolia-optimistic.etherscan.io/address/0xd9dD971D4800100aED0BfF3535aB116D4Be5c420) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0xa11561F9e418f2C431B411E1CA22FD3F85D4c831](https://sepolia-optimistic.etherscan.io/address/0x6CBe6e298A9354306e6ee65f63FF85CFA7062a39) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Superseed Sepolia #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://sepolia-explorer.superseed.xyz/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0xDf578C2c70A86945999c65961417057363530a1c](https://sepolia-explorer.superseed.xyz/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://sepolia-explorer.superseed.xyz/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://sepolia-explorer.superseed.xyz/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://sepolia-explorer.superseed.xyz/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0xDf578C2c70A86945999c65961417057363530a1c](https://sepolia-explorer.superseed.xyz/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://sepolia-explorer.superseed.xyz/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://sepolia-explorer.superseed.xyz/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://sepolia-explorer.superseed.xyz/address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://sepolia-explorer.superseed.xyz/address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://sepolia-explorer.superseed.xyz/address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://sepolia-explorer.superseed.xyz/address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### Taiko Hekla #### Core -| Contract | Address | Deployment | -| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0x01565a1298d631302c114E13C431c9345ae5532e](https://explorer.hekla.taiko.xyz/address/0x01565a1298d631302c114E13C431c9345ae5532e) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x640376B26E5f57dCD385b394a24c91F4C60E4fAc](https://explorer.hekla.taiko.xyz/address/0x640376B26E5f57dCD385b394a24c91F4C60E4fAc) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xd040fa437021F771C307178F06183bffC36cb4A5](https://explorer.hekla.taiko.xyz/address/0xd040fa437021F771C307178F06183bffC36cb4A5) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x49Fd46F7d897778205c00D5c1D943fCDc26Ed9E8](https://explorer.hekla.taiko.xyz/address/0x49Fd46F7d897778205c00D5c1D943fCDc26Ed9E8) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0x01565a1298d631302c114E13C431c9345ae5532e](https://explorer.hekla.taiko.xyz/address/0x01565a1298d631302c114E13C431c9345ae5532e) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x640376B26E5f57dCD385b394a24c91F4C60E4fAc](https://explorer.hekla.taiko.xyz/address/0x640376B26E5f57dCD385b394a24c91F4C60E4fAc) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xd040fa437021F771C307178F06183bffC36cb4A5](https://explorer.hekla.taiko.xyz/address/0xd040fa437021F771C307178F06183bffC36cb4A5) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x49Fd46F7d897778205c00D5c1D943fCDc26Ed9E8](https://explorer.hekla.taiko.xyz/address/0x49Fd46F7d897778205c00D5c1D943fCDc26Ed9E8) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x6C6a4Ef6C0C1318C9FD60b5084B68E04FB5e9Db9](https://explorer.hekla.taiko.xyz/address/0x6C6a4Ef6C0C1318C9FD60b5084B68E04FB5e9Db9) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x4F0d64365EfA9D6D1B88FfC387Ce02e4A71d9f9f](https://explorer.hekla.taiko.xyz/address/0x4F0d64365EfA9D6D1B88FfC387Ce02e4A71d9f9f) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x6C6a4Ef6C0C1318C9FD60b5084B68E04FB5e9Db9](https://explorer.hekla.taiko.xyz/address/0x6C6a4Ef6C0C1318C9FD60b5084B68E04FB5e9Db9) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x4F0d64365EfA9D6D1B88FfC387Ce02e4A71d9f9f](https://explorer.hekla.taiko.xyz/address/0x4F0d64365EfA9D6D1B88FfC387Ce02e4A71d9f9f) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | ### zkSync Sepolia @@ -639,18 +640,18 @@ Unlike other EVM chains, zkSync requires the libraries to be deployed, too. Plea #### Core -| Contract | Address | Deployment | -| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupDynamic | [0xc4311a5913953162111bF75530f7BB14ec24e014](https://sepolia.explorer.zksync.io/address/0xc4311a5913953162111bF75530f7BB14ec24e014) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupLinear | [0x43864C567b89FA5fEE8010f92d4473Bf19169BBA](https://sepolia.explorer.zksync.io/address/0x43864C567b89FA5fEE8010f92d4473Bf19169BBA) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2LockupTranched | [0xF6e869b73E20b812dcf0E850AA8822F74f67f670](https://sepolia.explorer.zksync.io/address/0xF6e869b73E20b812dcf0E850AA8822F74f67f670) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SablierV2NFTDescriptor | [0x477DDC91a7e13CBaC01c06737abF96d50ECa7961](https://sepolia.explorer.zksync.io/address/0x477DDC91a7e13CBaC01c06737abF96d50ECa7961) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| NFTSVG | [0x622e3bfA60486Fc7319cA370BfB81E713fd10c0f](https://sepolia.explorer.zksync.io/address/0x622e3bfA60486Fc7319cA370BfB81E713fd10c0f) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | -| SVGElements | [0x41602e7D355A15b76D43F84183831836eC498678](https://sepolia.explorer.zksync.io/address/0x41602e7D355A15b76D43F84183831836eC498678) | [core-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.2.0) | +| Contract | Address | Deployment | +| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupDynamic | [0xc4311a5913953162111bF75530f7BB14ec24e014](https://sepolia.explorer.zksync.io/address/0xc4311a5913953162111bF75530f7BB14ec24e014) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupLinear | [0x43864C567b89FA5fEE8010f92d4473Bf19169BBA](https://sepolia.explorer.zksync.io/address/0x43864C567b89FA5fEE8010f92d4473Bf19169BBA) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2LockupTranched | [0xF6e869b73E20b812dcf0E850AA8822F74f67f670](https://sepolia.explorer.zksync.io/address/0xF6e869b73E20b812dcf0E850AA8822F74f67f670) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SablierV2NFTDescriptor | [0x477DDC91a7e13CBaC01c06737abF96d50ECa7961](https://sepolia.explorer.zksync.io/address/0x477DDC91a7e13CBaC01c06737abF96d50ECa7961) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| NFTSVG | [0x622e3bfA60486Fc7319cA370BfB81E713fd10c0f](https://sepolia.explorer.zksync.io/address/0x622e3bfA60486Fc7319cA370BfB81E713fd10c0f) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | +| SVGElements | [0x41602e7D355A15b76D43F84183831836eC498678](https://sepolia.explorer.zksync.io/address/0x41602e7D355A15b76D43F84183831836eC498678) | [core-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/core) | #### Periphery -| Contract | Address | Deployment | -| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2BatchLockup | [0x1D68417ff71855Eb0237Ff03a8FfF02Ef67e4AFb](https://sepolia.explorer.zksync.io/address/0x1D68417ff71855Eb0237Ff03a8FfF02Ef67e4AFb) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | -| SablierV2MerkleLockupFactory | [0x2CEf8C06dDF7a1440Ad2561c53821e43adDbfA31](https://sepolia.explorer.zksync.io/address/0x2CEf8C06dDF7a1440Ad2561c53821e43adDbfA31) | [periphery-v1.2.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.2.0) | +| Contract | Address | Deployment | +| :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2BatchLockup | [0x1D68417ff71855Eb0237Ff03a8FfF02Ef67e4AFb](https://sepolia.explorer.zksync.io/address/0x1D68417ff71855Eb0237Ff03a8FfF02Ef67e4AFb) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | +| SablierV2MerkleLockupFactory | [0x2CEf8C06dDF7a1440Ad2561c53821e43adDbfA31](https://sepolia.explorer.zksync.io/address/0x2CEf8C06dDF7a1440Ad2561c53821e43adDbfA31) | [periphery-v1.2.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.2.0/periphery) | diff --git a/docs/contracts/v2/05-gas-benchmarks.md b/docs/guides/lockup/04-gas-benchmarks.md similarity index 96% rename from docs/contracts/v2/05-gas-benchmarks.md rename to docs/guides/lockup/04-gas-benchmarks.md index 843af970..f2f6bfa1 100644 --- a/docs/contracts/v2/05-gas-benchmarks.md +++ b/docs/guides/lockup/04-gas-benchmarks.md @@ -1,14 +1,14 @@ --- label: "Gas benchmarks" -sidebar_position: 5 +sidebar_position: 4 title: "Gas Benchmarks" --- -The gas usage of the Sablier Protocol is not deterministic and varies by user. Calls to third-party contracts, such as -ERC-20 tokens, may use an arbitrary amount of gas. The values in the table below are rough estimations - you shouldn't -take them for granted. +The gas usage of the Lockup protocol is not deterministic and varies by user. Calls to third-party contracts, such as +ERC-20 tokens, may use an arbitrary amount of gas. The values in the table below are rough estimations on Ethereum +mainnet - you shouldn't take them for granted. The gas usage may vary depending on the network. -## V2 Core +## Lockup Core :::note @@ -102,7 +102,7 @@ view the code that generates these benchmarks. | `withdraw` (100 tranches) (After End Time) (by Anyone) | 46,644 | | `withdraw` (100 tranches) (Before End Time) (by Anyone) | 73,887 | -## V2 Periphery +## Lockup Periphery :::note diff --git a/docs/contracts/v2/guides/09-etherscan.md b/docs/guides/lockup/05-etherscan.md similarity index 86% rename from docs/contracts/v2/guides/09-etherscan.md rename to docs/guides/lockup/05-etherscan.md index 2ed7df19..f1a28eac 100644 --- a/docs/contracts/v2/guides/09-etherscan.md +++ b/docs/guides/lockup/05-etherscan.md @@ -1,18 +1,17 @@ --- id: "etherscan" -sidebar_position: 10 -title: "Etherscan" +sidebar_position: 5 +title: "Etherscan Operations" --- # Etherscan: Manual Operations ## Introduction -Just like any other open protocol, Sablier V2 can be interacted with directly through a blockchain explorer like -Etherscan. +Just like any other open protocol, Lockup can be interacted with directly through a blockchain explorer like Etherscan. In this guide, we will show you how to create a stream and withdraw from a stream by manually interacting with the -Sablier V2 Core contracts on Etherscan. +Lockup Core contracts on Etherscan. If you're interested in interacting with V1, please refer to this [article](https://blog.sablier.com/operating-the-sablier-v1-protocol-manually/). @@ -21,12 +20,12 @@ If you're interested in interacting with V1, please refer to this ### Prerequisites -Before being able to create a stream using the Sablier V2 Core contracts you need to have granted a sufficient token +Before being able to create a stream using the Lockup Core contracts you need to have granted a sufficient token allowance. See the [Allowances](#prerequisite-erc20-allowances) section below for a guide on how to do that. ### Step 1: Go to contract page -Head over to our [deployments](/contracts/v2/deployments) list to pick the contract address you want to interact with. +Head over to our [deployments](/guides/lockup/deployments) list to pick the contract address you want to interact with. For each chain, that will be either `SablierV2LockupLinear`, `SablierV2LockupDynamic`, or `SablierV2LockupTranched`. In this tutorial, we will create a **LockupLinear** stream on Sepolia. @@ -54,10 +53,10 @@ We will now proceed to create our first stream. Let's go with the following para - and transferrable As the start and end date are fixed, we'll be using the -[`createWithTimestamps`](/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear#createwithtimestamps) +[`createWithTimestamps`](/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear#createwithtimestamps) method. Please note that using -[`createWithDurations`](/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear#createwithdurations) is -also possible if you specify durations instead of the timestamps. +[`createWithDurations`](/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear#createwithdurations) is also +possible if you specify durations instead of the timestamps. Open the **"createWithTimestamps"** method, and start filling in the stream details: @@ -106,8 +105,7 @@ from Etherscan to learn how to correctly format input data for Write Contract ta ::: As an example, in the screenshot below, we are providing input parameters for -[`createWithTimestampsLL`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithtimestampsll) -function in +[`createWithTimestampsLL`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithtimestampsll) function in [`SablierV2BatchLockup`](https://sepolia.etherscan.io/address/0x04A9c14b7a000640419aD5515Db4eF4172C00E31#writeContract) contract. As you can see, since `batch` requires a tuple and does not break it down into separate fields, we had to use the above method. @@ -134,8 +132,8 @@ example, you will need to fill in `20000000000000000000000`. :::note -The total amount will also include any [broker fee](/concepts/protocol/fees). While fees are kept at zero in Sablier UI, -the total amount should be equal to the streamed amount plus the broker fee amount. +The total amount will also include any [broker fee](/concepts/fees). While fees are kept at zero in Sablier UI, the +total amount should be equal to the streamed amount plus the broker fee amount. ::: @@ -179,8 +177,7 @@ to have a cliff, fill in the timestamp for the the cliff there. An optional parameter that can be set in order to charge a fee as a percentage of `totalAmount`. -You can set the `broker` field to address zero and `zero` fees. Read more about fees -[here](/concepts/protocol/fees#broker-fees). +You can set the `broker` field to address zero and `zero` fees. Read more about fees [here](/concepts/fees#broker-fee). :::caution @@ -228,7 +225,7 @@ Once found, you will see the stream ID between the two brackets. Note that strea Anyone can withdraw on your behalf if they pay the gas fee. When a third party withdraws, the recipient is the only allowed withdrawal address. However, if you withdraw yourself, you can choose to withdraw to any other address. You can -read more about this advanced feature [here](/contracts/v2/reference/access-control#overview). +read more about this advanced feature [here](/reference/lockup/access-control#overview). ::: @@ -236,7 +233,7 @@ read more about this advanced feature [here](/contracts/v2/reference/access-cont ### Step 1: Go to contract page -Head over to our [deployments](/contracts/v2/deployments) list and select the contract address you want to interact +Head over to our [deployments](/guides/lockup/deployments) list and select the contract address you want to interact with. Once you find the right contract, click on the address to access its explorer's page. Click on the "Contract" tab, and @@ -289,7 +286,7 @@ Apart from the main flows, you may be required to do some other actions, usually ## Prerequisite: ERC20 Allowances -Before interacting directly with the Sablier V2 [contracts](/contracts/v2/deployments) to +Before interacting directly with the Lockup [contracts](/guides/lockup/deployments) to [create a stream](#creating-a-stream) you will need to manually grant proper ERC20 allowances. ### Step 1: Go to token page @@ -300,8 +297,8 @@ page on Etherscan (in this example, we're using Sepolia): `https://sepolia.ether :::info -To get the address of an asset in the [Sablier Interface](/apps/overview), you can click on its name in the token list -dialog or find an existing stream with that token and click on the icon inside the stream circle. +To get the address of an asset in the [Sablier Interface](/apps/features/overview), you can click on its name in the +token list dialog or find an existing stream with that token and click on the icon inside the stream circle. ![Etherscan 09](/img/etherscan-tutorial/09.webp) ![Etherscan 10](/img/etherscan-tutorial/10.webp) @@ -328,8 +325,8 @@ use a proxy pattern. For these, you have to use the "Write as Proxy" tab. ### Step 3: Send transaction -For the purpose of creating a **LockupLinear** stream with Sablier V2, the spender will be the -[SablierV2LockupLinear](/contracts/v2/deployments) contract. +For the purpose of creating a **LockupLinear** stream with Lockup, the spender will be the +[SablierV2LockupLinear](/guides/lockup/deployments) contract. As for the amount, you'll have to pad it with the right number of decimals. For DAI, that's 18 decimals, so a value of `100` will turn into `100 * 1e18` (100 followed by 18 zeroes). For USDC,that's 6 decimals, so a value of `100` will turn diff --git a/docs/contracts/v2/_category_.json b/docs/guides/lockup/_category_.json similarity index 61% rename from docs/contracts/v2/_category_.json rename to docs/guides/lockup/_category_.json index d640b759..e3b6184a 100644 --- a/docs/contracts/v2/_category_.json +++ b/docs/guides/lockup/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "V2 Protocol", + "label": "Lockup V1.2", "position": 1 } diff --git a/docs/contracts/v2/guides/01-local-environment.md b/docs/guides/lockup/examples/01-local-environment.md similarity index 75% rename from docs/contracts/v2/guides/01-local-environment.md rename to docs/guides/lockup/examples/01-local-environment.md index 6154f1ce..a301799a 100644 --- a/docs/contracts/v2/guides/01-local-environment.md +++ b/docs/guides/lockup/examples/01-local-environment.md @@ -5,7 +5,7 @@ title: "Configure Your Local Environment" --- In this guide, we will go through the steps to set up a local development environment for building onchain integrations -with Sablier. We will use Foundry to install Sablier as a dependency, and run a few simple tests. +with Lockup. We will use Foundry to install Lockup as a dependency, and run a few simple tests. At the end, you’ll have a development environment set up that you can use to build the rest of the examples under "Guides", or start your own integration project. @@ -21,10 +21,10 @@ You will need the following software on your machine: In addition, familiarity with [Ethereum](https://ethereum.org/) and [Solidity](https://soliditylang.org/) is requisite. -## Quick start +## Set up using Lockup integration template We put together a template repository that you can use to get started quickly. This repository features a basic project -structure, pre-configured Sablier imports, and a selection of sample contracts and tests. +structure, pre-configured Lockup imports, and a selection of sample contracts and tests. :::tip @@ -35,17 +35,18 @@ Make sure you are using the latest version of Foundry by running `foundryup`. To install the template, simply execute the following commands: ```shell -$ mkdir sablier-integration-template -$ cd sablier-integration-template -$ forge init --template sablier-labs/sablier-integration-template +$ mkdir lockup-integration-template +$ cd lockup-integration-template +$ forge init --template sablier-labs/lockup-integration-template $ bun install ``` -Then, hop to the `Run a Fork Test` section to complete your set up and start developing. +Then, hop to the [Run a Fork Test](/guides/lockup/examples/local-environment#run-a-fork-test) section to complete your +set up and start developing. -## Start from scratch +## Set up using Foundry template -Foundry is a popular development toolkit for Ethereum projects, which we have used to build the Sablier Protocol. For +Foundry is a popular development toolkit for Ethereum projects, which we have used to build the Sablier Protocols. For the purposes of this guide, Foundry will provide us with the tooling needed to compile and test our contracts. Let's use this command to spin up a new Foundry project: @@ -78,16 +79,18 @@ The folder structure should be intuitive: - `script` is where you'll write scripts to perform actions like deploying contracts (you guessed it, in Solidity) - `foundry.toml` is where you can configure your Foundry settings, which we will leave as is in this guide -Let's install the Sablier Node.js packages using Bun: +## Install Lockup npm packages + +Let's install the Lockup Node.js packages using Bun: ```shell $ bun add @sablier/v2-core @sablier/v2-periphery ``` -Bun will download the Sablier contracts, along with their dependencies, and put them in the `node_modules` directory. +Bun will download the Lockup contracts, along with their dependencies, and put them in the `node_modules` directory. Let's remap the package names to point to the installed contracts. This step is required so that the Solidity compiler -can find the Sablier contracts when you import them: +can find the Lockup contracts when you import them: ```shell $ echo "@sablier/v2-core=node_modules/@sablier/v2-core/" >> remappings.txt @@ -96,19 +99,19 @@ $ echo "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/" >> remap $ echo "@prb/math/=node_modules/@prb/math/" >> remappings.txt ``` -That's it! You should now have a functional development environment to start building onchain Sablier integrations. -Let's run a quick test to confirm everything is set up properly. +That's it! You should now have a functional development environment to start building onchain Lockup integrations. Let's +run a quick test to confirm everything is set up properly. -## Sample contract +## Write your first contract Delete the `src/Counter.sol` and `test/Counter.t.sol` files generated by Forge, and create two new files: `src/StreamCreator.sol` and `test/StreamCreator.t.sol`. Paste the following code into `src/StreamCreator.sol` (a detailed explanation of this contract can be found -[here](/contracts/v2/guides/create-stream/lockup-linear)): +[here](/guides/lockup/examples/create-stream/lockup-linear)): ```solidity reference title="Lockup Linear Stream Creator" -https://github.com/sablier-labs/examples/blob/main/v2/core/LockupLinearStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupLinearStreamCreator.sol ``` Let's use Forge to compile this contract: @@ -128,7 +131,7 @@ Compiler run successful :::info -The minimum Solidity version supported by the Sablier contracts is v0.8.13. +The minimum Solidity version supported by the Lockup contracts is v0.8.13. ::: @@ -144,7 +147,7 @@ As a prerequisite, you will need an RPC that supports forking. A good solution f Once you have obtained your RPC, you can proceed to run the following test: ```solidity reference title="Stream Creator Test" -https://github.com/sablier-labs/examples/blob/main/v2/core/LockupStreamCreator.t.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupStreamCreator.t.sol ``` You can run the test using Forge: @@ -156,7 +159,7 @@ $ forge test If the test passed, you should see a message like this: ```text -Ran 2 tests for v2/core/LockupStreamCreator.t.sol:LockupStreamCreatorTest +Ran 2 tests for lockup/core/LockupStreamCreator.t.sol:LockupStreamCreatorTest [PASS] test_LockupDynamicStreamCreator() (gas: 273719) [PASS] test_LockupLinearStreamCreator() (gas: 186388) Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.34s (5.80s CPU time) @@ -165,9 +168,9 @@ Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.34s (5.80s CPU ti ## Next steps Congratulations! Your environment is now configured, and you are prepared to start building. Explore the guides section -to discover various Sablier features available for integration. Remember to include all contracts (`.sol` files) in the +to discover various Lockup features available for integration. Remember to include all contracts (`.sol` files) in the `src` folder and their corresponding tests in the `test` folder. As far as Foundry is concerned, there is much more to uncover. If you want to learn more about it, check out the [Foundry Book](https://book.getfoundry.sh/), which contains numerous examples and tutorials. A deep understanding of -Foundry will enable you to create more sophisticated integrations with Sablier. +Foundry will enable you to create more sophisticated integrations with Lockup. diff --git a/docs/contracts/v2/guides/04-create-airstream.mdx b/docs/guides/lockup/examples/04-create-airstream.mdx similarity index 83% rename from docs/contracts/v2/guides/04-create-airstream.mdx rename to docs/guides/lockup/examples/04-create-airstream.mdx index 87bd2c3f..cbd69a1c 100644 --- a/docs/contracts/v2/guides/04-create-airstream.mdx +++ b/docs/guides/lockup/examples/04-create-airstream.mdx @@ -10,9 +10,9 @@ import ConstantsComment from "@site/docs/snippets/ConstantsComment.mdx"; # Create an Airstream In this guide, we will show you how to programmatically create an airstream via the -[Merkle Factory](/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory). +[Merkle Factory](/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory). -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/airstreams) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/lockup/airstreams) section. :::note @@ -60,10 +60,10 @@ contract AirstreamCreator { There are two Airstream create functions available through factory: -- [`createMerkleLL`](/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory#createmerklell): uses - Lockup Linear streams. -- [`createMerkleLT`](/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory#createmerklelt): uses - Lockup Tranched streams. +- [`createMerkleLL`](/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory#createmerklell): uses Lockup + Linear streams. +- [`createMerkleLT`](/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory#createmerklelt): uses Lockup + Tranched streams. Which one you choose depends upon your use case. In this guide, we will use `createMerkleLL`. @@ -80,8 +80,8 @@ function createLLAirstream() public returns (ISablierV2MerkleLL merkleLL) { ## Parameters MerkleLockupFactory uses -[MerkleLockup.ConstructorParams](/contracts/v2/reference/periphery/types/library.MerkleLockup#constructorparams) as the -shared struct between `createMerkleLL` and `createMerkleLT` functions. +[MerkleLockup.ConstructorParams](/reference/lockup/periphery/types/library.MerkleLockup#constructorparams) as the shared +struct between `createMerkleLL` and `createMerkleLT` functions. ```solidity MerkleLockup.ConstructorParams memory baseParams; @@ -91,7 +91,7 @@ Let's review each parameter of the shared struct in detail. ### Asset -The contract address of the ERC-20 asset that you want to airdrop to your recipients. In this example, we will use DAI. +The contract address of the ERC-20 token that you want to airdrop to your recipients. In this example, we will use DAI. ```solidity baseParams.asset = DAI; @@ -109,8 +109,8 @@ baseParams.cancelable = true; The unix timestamp indicating the expiration of the campaign. Once this time has been passed, users will no longer be able to claim their airdrop. And you will be able to -[clawback](/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup#clawback) any unclaimed assets -from the campaign. +[clawback](/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup#clawback) any unclaimed assets from the +campaign. ```solidity baseParams.expiration = uint40(block.timestamp + 12 weeks); @@ -118,7 +118,7 @@ baseParams.expiration = uint40(block.timestamp + 12 weeks); ### Initial Admin -This is the initial admin of the Airstream campaign. When a recipient claims his airdrop, a Sablier stream is created +This is the initial admin of the Airstream campaign. When a recipient claims his airdrop, a Lockup stream is created with this admin as the sender of the stream. Another role of admin is to clawback unclaimed assets from the campaign post expiry and during grace period. @@ -141,7 +141,8 @@ Airstreams use a Merkle tree data structure to store the airdrop data onchain. A create the contract and store the Merkle root onchain. Airdrop recipients can then call the contract on their own to claim their airdrop. -If you want to create the Merkle root programatically, you can follow [our guide on Merkle API](/api/merkle-api/intro). +If you want to create the Merkle root programmatically, you can follow +[our guide on Merkle API](/api/airdrops/merkle-api/overview). ```solidity baseParams.merkleRoot = 0x4e07408562bedb8b60ce05c1decfe3ad16b722309875f562c03d02d7aaacb123; @@ -213,8 +214,8 @@ merkleLL = FACTORY.createMerkleLL(baseParams, LOCKUP_LINEAR, streamDurations, ag Below you can see the complete functioning code: a contract that creates an airstream campaign with Lockup Linear streams. You can access the code on GitHub through -[this link](https://github.com/sablier-labs/examples/blob/main/v2/periphery/AirstreamCreator.sol). +[this link](https://github.com/sablier-labs/examples/blob/main/lockup/periphery/AirstreamCreator.sol). ```solidity reference title="Airstream Creator" -https://github.com/sablier-labs/examples/blob/main/v2/periphery/AirstreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/periphery/AirstreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/06-hooks.md b/docs/guides/lockup/examples/06-hooks.md similarity index 66% rename from docs/contracts/v2/guides/06-hooks.md rename to docs/guides/lockup/examples/06-hooks.md index c2ab0157..1358e2f8 100644 --- a/docs/contracts/v2/guides/06-hooks.md +++ b/docs/guides/lockup/examples/06-hooks.md @@ -5,20 +5,20 @@ title: "Implement Hooks" --- Hooks provide an interface for recipient contracts to react upon cancellations and withdrawals. In order to allow your -contract to be able to hook into Sablier, you must implement this interface and it must have been allowlisted by the +contract to be able to hook into Lockup, you must implement this interface and it must have been allowlisted by the Lockup contract's admin. :::info -[`allowToHook`](/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup#allowtohook) is an irreversible -operation, i.e., once a contract has been added to the allowlist, it can never be removed. This is to ensure stronger -immutability and decentralization guarantees. Once a recipient contract is allowlisted, integrators should NOT have to -trust us to keep their contract on the allowlist. +[`allowToHook`](/reference/lockup/core/interfaces/interface.ISablierV2Lockup#allowtohook) is an irreversible operation, +i.e., once a contract has been added to the allowlist, it can never be removed. This is to ensure stronger immutability +and decentralization guarantees. Once a recipient contract is allowlisted, integrators should NOT have to trust us to +keep their contract on the allowlist. ::: -In this guide, we will explain how to implement [hooks](/concepts/protocol/hooks) in your smart contract to allow -interacting with Sablier streams. +In this guide, we will explain how to implement [hooks](/concepts/lockup/hooks) in your smart contract to allow +interacting with Lockup streams. ### Overview @@ -47,7 +47,7 @@ These are the hooks that can be implemented by a recipient contract: | `onSablierLockupWithdraw` | `(streamId, caller, to, amount)` | function selector | Called when an amount is withdrawn from the stream. | The complete interface for `ISablierLockupRecipient` can be found -[here](/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient). +[here](/reference/lockup/core/interfaces/interface.ISablierLockupRecipient). :::tip @@ -59,6 +59,6 @@ Looking to get on the allowlist? Reach out to us on [Discord](https://discord.sa #### Recipient -```solidity reference title="Sablier Recipient Hooks" -https://github.com/sablier-labs/examples/blob/main/v2/core/RecipientHooks.sol +```solidity reference title="Sablier Lockup Recipient Hooks" +https://github.com/sablier-labs/examples/blob/main/lockup/core/RecipientHooks.sol ``` diff --git a/docs/guides/lockup/examples/08-pull-vesting-data.md b/docs/guides/lockup/examples/08-pull-vesting-data.md new file mode 100644 index 00000000..3d7ac943 --- /dev/null +++ b/docs/guides/lockup/examples/08-pull-vesting-data.md @@ -0,0 +1,181 @@ +--- +id: "vesting-data" +sidebar_position: 8 +title: "Pull Vesting Data" +--- + +This guide explains how you can pull vesting data from Sablier Lockup streams. This data can be useful for a variety of +use cases, including but not limited to staking contracts, blockchain explorers, and data dashboards: + +1. **Staking**: Staking of Sablier streams require access to the amount of tokens that are held by the stream. You do + not want to distribute rewards for tokens that have been withdrawn by users. +2. **Explorers (e.g., Etherscan, CoinGecko)**: One major feature of blockchain explorers is to show accurate circulating + supplies. When tokens are vested through Sablier, you may want to exclude the amount of unvested tokens from the + circulating supply. This is helpful to accurately calculate the market cap, which depends upon the amount of liquid + tokens. +3. **Data Dashboards (e.g., Tokenomist, Nansen, Dune)**: Investors and traders use data dashboards to make informed + trading decisions. When Sablier is used, you may want to show the amount of liquid (or vested) tokens and the amount + of illiquid (or unvested) tokens. This is helpful to understand the token distribution and the team's commitment to + the long-term success of the project. + +:::note + +Note that 'streamed amount' is synonymous with 'vested amount'. + +::: + +## Frontend Sandbox + +The examples in this guide are written in Solidity, but you may want to interact with the Sablier Lockup contract from +your frontend application. A good starting point for this is the +[Sablier Sandbox](https://github.com/sablier-labs/sandbox). + +For a comprehensive list of all the functions available in Sablier Lockup, visit the [References](/reference/overview) +section of this website. + +## Actions + +### Cancel on first withdraw + +To automatically cancel streams as soon as the user withdraws their tokens, you can use one of two methods: onchain or +offchain. + +The onchain method is to track the withdrawn amount and check if its value is greater than 0: + +```solidity +if (lockup.getWithdrawnAmount(streamId) > 0) { + lockup.cancel(streamId); +} +``` + +Offchain, you can monitor the [`WithdrawFromLockupStream`](/reference/lockup/core/interfaces/interface.ISablierV2Lockup) +events. As soon as a withdrawal event is detected, you can send a transaction to cancel the stream. + +## Calculating Amounts + +### Amount in stream + +This is the amount of tokens held by the stream. It is the sum of locked tokens and vested tokens that have not been +withdrawn. This value is particularly useful for applications like staking. The following formula can be used for both +cancelable and non-cancelable streams: + +```solidity +uint256 amountInStream = sablierLockup.getDepositedAmount(streamId) + - sablierLockup.getWithdrawnAmount(streamId) + - sablierLockup.getRefundedAmount(streamId); +``` + +For non-cancelable stream, a more efficient way to calculate the amount in stream is: + +```solidity +uint256 amountInStream = sablierLockup.getDepositedAmount(streamId) + - sablierLockup.getWithdrawnAmount(streamId); +``` + +:::info + +If you want to build a Staking contract for Sablier streams, check out the [staking guide](./staking/setup). + +::: + +### Locked amount + +This is the amount of tokens that are locked in the stream and are effectively illiquid. This is particularly relevant +when calculating the circulating supply of a token. + +```solidity +uint256 lockedAmount = lockup.getDepositedAmount(streamId) + - lockup.streamedAmountOf(streamId) + - sablierLockup.getRefundedAmount(streamId); +``` + +For non-cancelable stream, a more efficient way to calculate locked amount is: + +```solidity +uint256 lockedAmount = lockup.getDepositedAmount(streamId) - lockup.streamedAmountOf(streamId); +``` + +While calculating the circulating supply, you may want to subtract the locked amount from your calculations. + +### Unlocked amount + +As opposed to the locked amount, the unlocked amount refers to tokens that are no longer locked and are effectively +liquid. + +```solidity +uint256 unlockedAmount = lockup.streamedAmountOf(streamId) + + sablierLockup.getRefundedAmount(streamId); +``` + +For non-cancelable stream, a more efficient way to calculate unlocked amount is: + +```solidity +uint256 unlockedAmount = lockup.streamedAmountOf(streamId); +``` + +## Vested amount not withdrawn + +If you are building an application that requires access to amount of tokens that have been vested but not yet withdrawn, +you can use the following formula: + +```solidity +uint256 vestedAmount = lockup.streamedAmountOf(streamId) - lockup.getWithdrawnAmount(streamId); +``` + +This may be useful for use cases in which you want to reward 'diamond hands', i.e., users who have not withdrawn their +share of airdrops. + +## Unlock Dates + +This section is useful if you are building a data dashboard and want to index the dates when tokens will be unlocked in +Sablier. + +To obtain the time at which a stream will be fully unlocked, you can use the following function: + +```solidity +uint256 unlockTime = lockup.getEndTime(streamId); +``` + +Obtaining the earlier unlock times depends on the type of stream. Let's go through each stream type: + +### Linear streams + +For Lockup Linear streams, make a request to `lockup.getTimestamps(streamId)` and then calculate cliff time and end time +as `timestamps.cliff` and `timestamps.end` respectively. + +### Dynamic streams + +For Lockup Dynamic streams, you may be particularly interested in the unlock amount and time of the current segment. + +```solidity +LockupDynamic.Segment[] memory segments = lockup.getSegments(streamId); + +// Loop over the segments to find the next unlock time. +for (uint i; i < segments.length; ++i) { + if (segments[i].timestamp > block.timestamp) { + nextUnlockAmount = segments[i].amount; + nextUnlockTime = segments[i].timestamp; + break; + } +} +``` + +### Tranched streams + +For Lockup Tranched streams, you may be particularly interested in the unlock amount and time of the current tranche. + +```solidity +LockupTranched.Tranche[] memory tranches = lockup.getTranches(streamId); + +// Loop over the tranches to find the next unlock time. +for (uint i; i < tranches.length; ++i) { + if (tranches[i].timestamp > block.timestamp) { + nextUnlockAmount = tranches[i].amount; + nextUnlockTime = tranches[i].timestamp; + break; + } +} +``` + +We hope you have found this guide helpful. If you have a use case that is not covered here, please reach out to us on +[Discord](https://discord.sablier.com), and we will assist you. diff --git a/docs/guides/lockup/examples/_category_.json b/docs/guides/lockup/examples/_category_.json new file mode 100644 index 00000000..b42547fb --- /dev/null +++ b/docs/guides/lockup/examples/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Examples", + "position": 3 +} diff --git a/docs/contracts/v2/guides/batch-create-streams/01-batch-lockup-linear.mdx b/docs/guides/lockup/examples/batch-create-streams/01-batch-lockup-linear.mdx similarity index 86% rename from docs/contracts/v2/guides/batch-create-streams/01-batch-lockup-linear.mdx rename to docs/guides/lockup/examples/batch-create-streams/01-batch-lockup-linear.mdx index dc826416..90665c59 100644 --- a/docs/contracts/v2/guides/batch-create-streams/01-batch-lockup-linear.mdx +++ b/docs/guides/lockup/examples/batch-create-streams/01-batch-lockup-linear.mdx @@ -10,10 +10,10 @@ import ConstantsComment from "@site/docs/snippets/ConstantsComment.mdx"; # Create a Batch of Lockup Linear Streams -In this guide, we will show you how to programmatically batch create linear streams via the Sablier's -[Batch Lockup](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup) contract. +In this guide, we will show you how to programmatically batch create linear streams via the Lockup's +[Batch Lockup](/reference/lockup/periphery/contract.SablierV2BatchLockup) contract. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -61,8 +61,8 @@ contract BatchLLStreamCreator { There are two batch create functions for the Lockup Linear contract: -- [`createWithDurationsLL`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithdurationsll) -- [`createWithTimestampsLL`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithtimestampsll) +- [`createWithDurationsLL`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithdurationsll) +- [`createWithTimestampsLL`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithtimestampsll) Which one you choose depends upon your use case. In this guide, we will use `createWithDurationsLL`. @@ -71,7 +71,7 @@ Which one you choose depends upon your use case. In this guide, we will use `cre ## Stream Parameters Given that we declared a `batchSize` of two, we need to define two -[BatchLockup.CreateWithDurationsLL](/contracts/v2/reference/periphery/types/library.BatchLockup#createwithdurationsll) +[BatchLockup.CreateWithDurationsLL](/reference/lockup/periphery/types/library.BatchLockup#createwithdurationsll) structs: ```solidity @@ -126,10 +126,10 @@ streamIds = BATCH_LOCKUP.createWithDurationsLL(LOCKUP_LINEAR, DAI, batch); ## The complete Batch Lockup Linear stream creator contract -Below you can see the complete functioning code: a contract that batch creates Lockup Linear streams using Sablier's +Below you can see the complete functioning code: a contract that batch creates Lockup Linear streams using Lockup's `Batch` that start at `block.timestamp`. You can access the code on GitHub through this -[link](https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLLStreamCreator.sol). +[link](https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLLStreamCreator.sol). ```solidity reference title="Batch Lockup Linear stream creator" -https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLLStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLLStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/batch-create-streams/02-batch-lockup-dynamic.mdx b/docs/guides/lockup/examples/batch-create-streams/02-batch-lockup-dynamic.mdx similarity index 87% rename from docs/contracts/v2/guides/batch-create-streams/02-batch-lockup-dynamic.mdx rename to docs/guides/lockup/examples/batch-create-streams/02-batch-lockup-dynamic.mdx index 39e43164..cb82658c 100644 --- a/docs/contracts/v2/guides/batch-create-streams/02-batch-lockup-dynamic.mdx +++ b/docs/guides/lockup/examples/batch-create-streams/02-batch-lockup-dynamic.mdx @@ -10,10 +10,10 @@ import ConstantsComment from "@site/docs/snippets/ConstantsComment.mdx"; # Create a Batch of Lockup Dynamic Streams -In this guide, we will show you how to programmatically batch create dynamic streams via the Sablier's -[Batch](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup) contract. +In this guide, we will show you how to programmatically batch create dynamic streams via the Lockup's +[Batch](/reference/lockup/periphery/contract.SablierV2BatchLockup) contract. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -62,8 +62,8 @@ contract BatchLDStreamCreator { There are two batch create functions for the Lockup Dynamic contract: -- [`createWithDurationsLD`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithdurationsld) -- [`createWithTimestampsLD`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithtimestampsld) +- [`createWithDurationsLD`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithdurationsld) +- [`createWithTimestampsLD`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithtimestampsld) Which one you choose depends upon your use case. In this guide, we will use `createWithTimestampsLD`. @@ -72,7 +72,7 @@ Which one you choose depends upon your use case. In this guide, we will use `cre ## Stream Parameters Given that we declared a `batchSize` of two, we need to define two -[BatchLockup.CreateWithTimestampsLD](/contracts/v2/reference/periphery/types/library.BatchLockup#createwithtimestampsld) +[BatchLockup.CreateWithTimestampsLD](/reference/lockup/periphery/types/library.BatchLockup#createwithtimestampsld) structs: ```solidity @@ -148,10 +148,10 @@ streamIds = BATCH_LOCKUP.createWithTimestampsLD(LOCKUP_DYNAMIC, DAI, batch); ## The complete Batch Lockup Dynamic stream creator contract -Below you can see the complete functioning code: a contract that batch creates Lockup Dynamic streams using Sablier's +Below you can see the complete functioning code: a contract that batch creates Lockup Dynamic streams using Lockup's `Batch` that start at `block.timestamp`. You can access the code on GitHub through this -[link](https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLDStreamCreator.sol). +[link](https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLDStreamCreator.sol). ```solidity reference title="Batch Lockup Dynamic stream creator" -https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLDStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLDStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/batch-create-streams/03-batch-lockup-tranched.mdx b/docs/guides/lockup/examples/batch-create-streams/03-batch-lockup-tranched.mdx similarity index 87% rename from docs/contracts/v2/guides/batch-create-streams/03-batch-lockup-tranched.mdx rename to docs/guides/lockup/examples/batch-create-streams/03-batch-lockup-tranched.mdx index c245759e..4e417216 100644 --- a/docs/contracts/v2/guides/batch-create-streams/03-batch-lockup-tranched.mdx +++ b/docs/guides/lockup/examples/batch-create-streams/03-batch-lockup-tranched.mdx @@ -10,10 +10,10 @@ import ConstantsComment from "@site/docs/snippets/ConstantsComment.mdx"; # Create a Batch of Lockup Tranched Streams -In this guide, we will show you how to programmatically batch create tranched streams via the Sablier's -[Batch](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup) contract. +In this guide, we will show you how to programmatically batch create tranched streams via the Lockup's +[Batch](/reference/lockup/periphery/contract.SablierV2BatchLockup) contract. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -61,8 +61,8 @@ contract BatchLTStreamCreator { There are two batch create functions for the Lockup Tranched contract: -- [`createWithDurationsLT`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithdurationslt) -- [`createWithTimestampsLT`](/contracts/v2/reference/periphery/contract.SablierV2BatchLockup#createwithtimestampslt) +- [`createWithDurationsLT`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithdurationslt) +- [`createWithTimestampsLT`](/reference/lockup/periphery/contract.SablierV2BatchLockup#createwithtimestampslt) Which one you choose depends upon your use case. In this guide, we will use `createWithTimestampsLT`. @@ -71,7 +71,7 @@ Which one you choose depends upon your use case. In this guide, we will use `cre ## Stream Parameters Given that we declared a `batchSize` of two, we need to define two -[BatchLockup.CreateWithTimestampsLT](/contracts/v2/reference/periphery/types/library.BatchLockup#createwithtimestampslt) +[BatchLockup.CreateWithTimestampsLT](/reference/lockup/periphery/types/library.BatchLockup#createwithtimestampslt) structs: ```solidity @@ -139,10 +139,10 @@ streamIds = BATCH_LOCKUP.createWithTimestampsLT(LOCKUP_TRANCHED, DAI, batch); ## The complete Batch Lockup Tranched stream creator contract -Below you can see the complete functioning code: a contract that batch creates Lockup Tranched streams using Sablier's +Below you can see the complete functioning code: a contract that batch creates Lockup Tranched streams using Lockup's `Batch` that start at `block.timestamp`. You can access the code on GitHub through this -[link](https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLTStreamCreator.sol). +[link](https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLTStreamCreator.sol). ```solidity reference title="Batch Lockup Tranched stream creator" -https://github.com/sablier-labs/examples/blob/main/v2/periphery/BatchLTStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/periphery/BatchLTStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/batch-create-streams/_category_.json b/docs/guides/lockup/examples/batch-create-streams/_category_.json similarity index 100% rename from docs/contracts/v2/guides/batch-create-streams/_category_.json rename to docs/guides/lockup/examples/batch-create-streams/_category_.json diff --git a/docs/contracts/v2/guides/create-stream/01-lockup-linear.mdx b/docs/guides/lockup/examples/create-stream/01-lockup-linear.mdx similarity index 82% rename from docs/contracts/v2/guides/create-stream/01-lockup-linear.mdx rename to docs/guides/lockup/examples/create-stream/01-lockup-linear.mdx index c8dc71c6..a4c977b4 100644 --- a/docs/contracts/v2/guides/create-stream/01-lockup-linear.mdx +++ b/docs/guides/lockup/examples/create-stream/01-lockup-linear.mdx @@ -20,7 +20,7 @@ import ParamTransferable from "@site/docs/snippets/ParamTransferable.mdx"; Lockup Linear are streams with a strictly linear streaming function. In this guide, we will show you how to programmatically create a Lockup Linear stream. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -79,25 +79,26 @@ function createStream(uint128 totalAmount) public returns (uint256 streamId) { ## ERC-20 steps To create a stream, the caller must approve the creator contract to pull the tokens from the calling address's account. -Then, we have to also approve the Sablier contract to pull the assets that the creator contract will be in possession of -after they are transferred from the calling address (you): +Then, we have to also approve the Lockup linear contract to pull the assets that the creator contract will be in +possession of after they are transferred from the calling address (you): ```solidity // Transfer the provided amount of DAI tokens to this contract DAI.transferFrom(msg.sender, address(this), totalAmount); -// Approve the Sablier contract to spend DAI +// Approve the Lockup linear contract to spend DAI DAI.approve(address(LOCKUP_LINEAR), totalAmount); ``` -For more guidance on how to approve and transfer ERC-20 assets, see +For more guidance on how to approve and transfer ERC-20 tokens, see [this article](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) on the Ethereum website. ## Parameters -Sablier uses structs to encode the parameters of its create functions. The struct associated with `createWithDurations` -is [`LockupLinear.CreateWithDurations`](/contracts/v2/reference/core/types/library.LockupLinear#createwithdurations), -and it can be initialized like this: +Lockup linear uses structs to encode the parameters of its create functions. The struct associated with +`createWithDurations` is +[`LockupLinear.CreateWithDurations`](/reference/lockup/core/types/library.LockupLinear#createwithdurations), and it can +be initialized like this: ```solidity LockupLinear.CreateWithDurations memory params; @@ -143,8 +144,8 @@ streamId = LOCKUP_LINEAR.createWithDurations(params); Below you can see the complete functioning code: a contract that creates Lockup Linear streams that start at `block.timestamp`. You can access the code on GitHub through -[this link](https://github.com/sablier-labs/examples/blob/main/v2/core/LockupLinearStreamCreator.sol). +[this link](https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupLinearStreamCreator.sol). ```solidity reference title="Lockup Linear Stream Creator" -https://github.com/sablier-labs/examples/blob/main/v2/core/LockupLinearStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupLinearStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/create-stream/02-lockup-dynamic.mdx b/docs/guides/lockup/examples/create-stream/02-lockup-dynamic.mdx similarity index 84% rename from docs/contracts/v2/guides/create-stream/02-lockup-dynamic.mdx rename to docs/guides/lockup/examples/create-stream/02-lockup-dynamic.mdx index 2a7b57d8..8afc1587 100644 --- a/docs/contracts/v2/guides/create-stream/02-lockup-dynamic.mdx +++ b/docs/guides/lockup/examples/create-stream/02-lockup-dynamic.mdx @@ -20,7 +20,7 @@ import ParamTransferable from "@site/docs/snippets/ParamTransferable.mdx"; Lockup Dynamic are streams with custom streaming curves. In this guide, we will show you how to programmatically create a Lockup Dynamic stream. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -87,26 +87,26 @@ uint256 totalAmount = amount0 + amount1; ## ERC-20 steps To create a stream, the caller must approve the creator contract to pull the tokens from the calling address's account. -Then, we have to also approve the Sablier contract to pull the assets that the creator contract will be in possession of -after they are transferred from the calling address (you): +Then, we have to also approve the Lockup dynamic contract to pull the assets that the creator contract will be in +possession of after they are transferred from the calling address (you): ```solidity // Transfer the provided amount of DAI tokens to this contract DAI.transferFrom(msg.sender, address(this), totalAmount); -// Approve the Sablier contract to spend DAI +// Approve the Lockup dynamic contract to spend DAI DAI.approve(address(LOCKUP_DYNAMIC), totalAmount); ``` -For more guidance on how to approve and transfer ERC-20 assets, see +For more guidance on how to approve and transfer ERC-20 tokens, see [this article](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) on the Ethereum website. ## Parameters -Sablier uses structs to encode the parameters of its create functions. The struct associated with `createWithTimestamps` -is -[`LockupDynamic.CreateWithTimestamps`](/contracts/v2/reference/core/types/library.LockupDynamic#createwithtimestamps), -and it can be initialized like this: +Lockup dynamic uses structs to encode the parameters of its create functions. The struct associated with +`createWithTimestamps` is +[`LockupDynamic.CreateWithTimestamps`](/reference/lockup/core/types/library.LockupDynamic#createwithtimestamps), and it +can be initialized like this: ```solidity LockupDynamic.CreateWithTimestamps memory params; @@ -139,11 +139,11 @@ params.startTime = uint40(block.timestamp + 100 seconds); ### Segments Segments are what the protocol uses to compose the custom distribution curve of a Lockup Dynamic stream. For a full -exposition of segments, see the [Segments](/concepts/protocol/segments) guide. +exposition of segments, see the [Segments](/concepts/lockup/segments) guide. The term "segment" refers to the splitting of the stream into separate partitions, with each segment characterized by a specific amount, exponent, and timestamp. These segments are supplied to the function in the form of an array containing -[`LockupDynamic.Segment`](/contracts/v2/reference/core/types/library.LockupDynamic#segment) structs. +[`LockupDynamic.Segment`](/reference/lockup/core/types/library.LockupDynamic#segment) structs. Let's define two dummy segments: @@ -194,8 +194,8 @@ streamId = LOCKUP_DYNAMIC.createWithTimestamps(params); Below you can see the complete functioning code: a contract that creates a Lockup Dynamic stream. You can access the code on GitHub through -[this link](https://github.com/sablier-labs/examples/blob/main/v2/core/LockupDynamicStreamCreator.sol). +[this link](https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupDynamicStreamCreator.sol). ```solidity reference title="Lockup Dynamic Stream Creator" -https://github.com/sablier-labs/examples/blob/main/v2/core/LockupDynamicStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupDynamicStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/create-stream/03-lockup-tranched.mdx b/docs/guides/lockup/examples/create-stream/03-lockup-tranched.mdx similarity index 83% rename from docs/contracts/v2/guides/create-stream/03-lockup-tranched.mdx rename to docs/guides/lockup/examples/create-stream/03-lockup-tranched.mdx index a8d6fcb6..1b45af3d 100644 --- a/docs/contracts/v2/guides/create-stream/03-lockup-tranched.mdx +++ b/docs/guides/lockup/examples/create-stream/03-lockup-tranched.mdx @@ -20,7 +20,7 @@ import ParamTransferable from "@site/docs/snippets/ParamTransferable.mdx"; Lockup Tranched are streams with discrete unlocks. In this guide, we will show you how to programmatically create a Lockup Tranched stream. -This guide assumes that you have already gone through the [Protocol Concepts](/concepts/protocol/streaming) section. +This guide assumes that you have already gone through the [Protocol Concepts](/concepts/streaming) section. :::note @@ -87,26 +87,26 @@ uint256 totalAmount = amount0 + amount1; ## ERC-20 steps To create a stream, the caller must approve the creator contract to pull the tokens from the calling address's account. -Then, we have to also approve the Sablier contract to pull the assets that the creator contract will be in possession of -after they are transferred from the calling address (you): +Then, we have to also approve the Lockup tranched contract to pull the assets that the creator contract will be in +possession of after they are transferred from the calling address (you): ```solidity // Transfer the provided amount of DAI tokens to this contract DAI.transferFrom(msg.sender, address(this), totalAmount); -// Approve the Sablier contract to spend DAI +// Approve the Lockup tranched contract to spend DAI DAI.approve(address(LOCKUP_TRANCHED), totalAmount); ``` -For more guidance on how to approve and transfer ERC-20 assets, see +For more guidance on how to approve and transfer ERC-20 tokens, see [this article](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) on the Ethereum website. ## Parameters -Sablier uses structs to encode the parameters of its create functions. The struct associated with `createWithDurations` -is -[`LockupTranched.CreateWithDurations`](/contracts/v2/reference/core/types/library.LockupTranched#createwithdurations), -and it can be initialized like this: +Lockup tranched uses structs to encode the parameters of its create functions. The struct associated with +`createWithDurations` is +[`LockupTranched.CreateWithDurations`](/reference/lockup/core/types/library.LockupTranched#createwithdurations), and it +can be initialized like this: ```solidity LockupTranched.CreateWithDurations memory params; @@ -129,12 +129,11 @@ Let's review each parameter in detail. ### Tranches With Duration Tranches are what the protocol uses to compose the Lockup Tranched stream. For a full exposition of tranches, see the -[Tranches](/concepts/protocol/tranches) guide. +[Tranches](/concepts/lockup/tranches) guide. Each tranche is characterized by a specific amount and timestamp. Because we are using `createWithDurations` in this example, these tranches are supplied to the function in the form of an array containing -[`LockupTranched.TrancheWithDuration`](/contracts/v2/reference/core/types/library.LockupTranched#tranchewithduration) -structs. +[`LockupTranched.TrancheWithDuration`](/reference/lockup/core/types/library.LockupTranched#tranchewithduration) structs. Let's define two dummy tranches: @@ -170,8 +169,8 @@ streamId = LOCKUP_TRANCHED.createWithDurations(params); Below you can see the complete functioning code: a contract that creates a Lockup Tranched stream. You can access the code on GitHub through -[this link](https://github.com/sablier-labs/examples/blob/main/v2/core/LockupTranchedStreamCreator.sol). +[this link](https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupTranchedStreamCreator.sol). ```solidity reference title="Lockup Tranched Stream Creator" -https://github.com/sablier-labs/examples/blob/main/v2/core/LockupTranchedStreamCreator.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/LockupTranchedStreamCreator.sol ``` diff --git a/docs/contracts/v2/guides/create-stream/_category_.json b/docs/guides/lockup/examples/create-stream/_category_.json similarity index 100% rename from docs/contracts/v2/guides/create-stream/_category_.json rename to docs/guides/lockup/examples/create-stream/_category_.json diff --git a/docs/contracts/v2/guides/staking/01-setup.md b/docs/guides/lockup/examples/staking/01-setup.md similarity index 95% rename from docs/contracts/v2/guides/staking/01-setup.md rename to docs/guides/lockup/examples/staking/01-setup.md index a0160a2c..26d00031 100644 --- a/docs/contracts/v2/guides/staking/01-setup.md +++ b/docs/guides/lockup/examples/staking/01-setup.md @@ -7,8 +7,8 @@ title: "Introduction" # Staking in Sablier Staking is a popular concept in DeFi. A major advantage of using Sablier is that you can set up staking of tokens being -vested through Sablier streams. This is enabled by [hooks](/concepts/protocol/hooks), about which you can read more in -the [hooks guide](/contracts/v2/guides/hooks). +vested through Sablier streams. This is enabled by [hooks](/concepts/lockup/hooks), about which you can read more in the +[hooks guide](/guides/lockup/examples/hooks). This series will guide you through an example of a staking contract with the following features: @@ -68,4 +68,4 @@ in the constructor. The rewards will also be distributed in the same token. To focus on specific functionalities that enable staking support for streams, obvious functions such as `startStakingPeriod` have been omitted from this guide. However, for completeness, the full code can be found on the next page as well as in the -[examples repo](https://github.com/sablier-labs/examples/blob/main/v2/core/StakeSablierNFT.sol). +[examples repo](https://github.com/sablier-labs/examples/blob/main/lockup/core/StakeSablierNFT.sol). diff --git a/docs/contracts/v2/guides/staking/02-full-code.md b/docs/guides/lockup/examples/staking/02-full-code.md similarity index 65% rename from docs/contracts/v2/guides/staking/02-full-code.md rename to docs/guides/lockup/examples/staking/02-full-code.md index 4ed1ccb9..d44a6736 100644 --- a/docs/contracts/v2/guides/staking/02-full-code.md +++ b/docs/guides/lockup/examples/staking/02-full-code.md @@ -6,8 +6,8 @@ title: "Full code" The guide in the following pages will cover each of the essential functionalities of the `StakeSablierNFT` contract. For those who want to start hacking right away, here is the full code, which can also be found on -[GitHub](https://github.com/sablier-labs/examples/blob/main/v2/core/StakeSablierNFT.sol): +[GitHub](https://github.com/sablier-labs/examples/blob/main/lockup/core/StakeSablierNFT.sol): ```solidity reference title="StakeSablierNFT contract" -https://github.com/sablier-labs/examples/blob/main/v2/core/StakeSablierNFT.sol +https://github.com/sablier-labs/examples/blob/main/lockup/core/StakeSablierNFT.sol ``` diff --git a/docs/contracts/v2/guides/staking/03-hooks.md b/docs/guides/lockup/examples/staking/03-hooks.md similarity index 82% rename from docs/contracts/v2/guides/staking/03-hooks.md rename to docs/guides/lockup/examples/staking/03-hooks.md index 1fa3b2be..05066942 100644 --- a/docs/contracts/v2/guides/staking/03-hooks.md +++ b/docs/guides/lockup/examples/staking/03-hooks.md @@ -4,10 +4,10 @@ sidebar_position: 3 title: "Hooks" --- -As explained in the [access control](/contracts/v2/reference/access-control#overview) section, the Sablier Protocol -allows anyone to trigger withdrawals from a stream. For the staking contract, we want to make sure that any call to -`withdraw` also updates the states of the staking contract. So in this section, we will discuss how we can create such -control flows with Sablier hooks. +As explained in the [access control](/reference/lockup/access-control) section, the Sablier Protocol allows anyone to +trigger withdrawals from a stream. For the staking contract, we want to make sure that any call to `withdraw` also +updates the states of the staking contract. So in this section, we will discuss how we can create such control flows +with Sablier hooks. Hooks enable callbacks to the staking contract in the following scenario: @@ -26,14 +26,14 @@ For this example, we will implement the following logic: :::note -A dedicated guide for hooks is available [here](/contracts/v2/guides/hooks). +A dedicated guide for hooks is available [here](/guides/lockup/examples/hooks). ::: ### Cancel hook ```solidity -/// @notice Implements the hook to handle cancelation events. This will be called by Sablier contract when a stream +/// @notice Implements the hook to handle cancellation events. This will be called by Sablier contract when a stream /// is canceled by the sender. /// @dev This function subtracts the amount refunded to the sender from `totalERC20StakedSupply`. /// - This function also updates the rewards for the staker. diff --git a/docs/contracts/v2/guides/staking/04-stake.md b/docs/guides/lockup/examples/staking/04-stake.md similarity index 100% rename from docs/contracts/v2/guides/staking/04-stake.md rename to docs/guides/lockup/examples/staking/04-stake.md diff --git a/docs/contracts/v2/guides/staking/05-rewards.md b/docs/guides/lockup/examples/staking/05-rewards.md similarity index 100% rename from docs/contracts/v2/guides/staking/05-rewards.md rename to docs/guides/lockup/examples/staking/05-rewards.md diff --git a/docs/contracts/v2/guides/staking/06-claim.md b/docs/guides/lockup/examples/staking/06-claim.md similarity index 100% rename from docs/contracts/v2/guides/staking/06-claim.md rename to docs/guides/lockup/examples/staking/06-claim.md diff --git a/docs/contracts/v2/guides/staking/07-unstake.md b/docs/guides/lockup/examples/staking/07-unstake.md similarity index 100% rename from docs/contracts/v2/guides/staking/07-unstake.md rename to docs/guides/lockup/examples/staking/07-unstake.md diff --git a/docs/contracts/v2/guides/staking/_category_.json b/docs/guides/lockup/examples/staking/_category_.json similarity index 100% rename from docs/contracts/v2/guides/staking/_category_.json rename to docs/guides/lockup/examples/staking/_category_.json diff --git a/docs/contracts/v2/guides/stream-management/01-setup.md b/docs/guides/lockup/examples/stream-management/01-setup.md similarity index 79% rename from docs/contracts/v2/guides/stream-management/01-setup.md rename to docs/guides/lockup/examples/stream-management/01-setup.md index 894ce33e..a9c2c8c2 100644 --- a/docs/contracts/v2/guides/stream-management/01-setup.md +++ b/docs/guides/lockup/examples/stream-management/01-setup.md @@ -4,14 +4,14 @@ sidebar_position: 1 title: "Set Up Your Contract" --- -The "Stream Management" series will guide you through interacting with Sablier V2 Core, showing how to withdraw, cancel, +The "Stream Management" series will guide you through interacting with Lockup Core, showing how to withdraw, cancel, renounce, and transfer ownership of streams. Before diving in, please note the following: -1. We assume you are already familiar with [creating streams](/contracts/v2/guides/create-stream/lockup-linear). +1. We assume you are already familiar with [creating streams](/guides/lockup/examples/create-stream/lockup-linear). 2. We also assume that the stream management contract is authorized to invoke each respective function. To learn more - about access control in Sablier, see the [Access Control](/contracts/v2/reference/access-control) guide. + about access control in Lockup, see the [Access Control](/reference/lockup/access-control) guide. With that said, let's begin. First, declare the Solidity version used to compile the contract: @@ -42,7 +42,7 @@ contract StreamManagement { ``` Just like in the create stream guides, the next step requires you to head over to the -[Deployment Addresses](/contracts/v2/deployments) page and copy the address of the Sablier contract you intend to use +[Deployment Addresses](/guides/lockup/deployments) page and copy the address of the Lockup contract you intend to use (either Lockup Linear, Lockup Dynamic, or Lockup Tranched). Then, you can deploy the stream management contract: ```solidity diff --git a/docs/contracts/v2/guides/stream-management/02-withdraw.md b/docs/guides/lockup/examples/stream-management/02-withdraw.md similarity index 51% rename from docs/contracts/v2/guides/stream-management/02-withdraw.md rename to docs/guides/lockup/examples/stream-management/02-withdraw.md index ed920a26..c36b4560 100644 --- a/docs/contracts/v2/guides/stream-management/02-withdraw.md +++ b/docs/guides/lockup/examples/stream-management/02-withdraw.md @@ -6,14 +6,15 @@ title: "Withdraw from Streams" :::note -This section assumes that you have already gone through the [setup](/contracts/v2/guides/stream-management/setup) part. +This section assumes that you have already gone through the [setup](/guides/lockup/examples/stream-management/setup) +part. ::: :::tip -See the [Access Control](/contracts/v2/reference/access-control) guide for an overview of who is allowed to withdraw -from streams. +See the [Access Control](/reference/lockup/access-control) guide for an overview of who is allowed to withdraw from +streams. ::: @@ -22,38 +23,38 @@ the withdrawal to an alternative address of their choice. There are four withdrawal functions: -1. [`withdraw`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdraw): withdraws a specific amount - of assets. -2. [`withdrawMax`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawmax): withdraws the maximum +1. [`withdraw`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdraw): withdraws a specific amount of + assets. +2. [`withdrawMax`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawmax): withdraws the maximum withdrawable amount of assets. -3. [`withdrawMaxAndTransfer`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawmaxandtransfer): +3. [`withdrawMaxAndTransfer`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawmaxandtransfer): withdraws the maximum withdrawable amount and transfers the NFT. -4. [`withdrawMultiple`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawmultiple): withdraws - specific amounts of assets from multiple streams at once. +4. [`withdrawMultiple`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawmultiple): withdraws specific + amounts of assets from multiple streams at once. To call any of these functions, you need to have created a stream. If you don't have one yet, go back to the -[previous guide](/contracts/v2/guides/create-stream/lockup-linear) and create a stream with a brief duration, assigning -the `StreamManagement` contract as the recipient. Then, you can use the `withdraw` function like this: +[previous guide](/guides/lockup/examples/create-stream/lockup-linear) and create a stream with a brief duration, +assigning the `StreamManagement` contract as the recipient. Then, you can use the `withdraw` function like this: ```solidity reference title="Stream Management: Withdraw" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L20-L22 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L20-L22 ``` In this example, the withdrawal address and withdrawal amount are hard-coded for demonstration purposes. However, in a production environment, these values would likely be adjustable parameters determined by the user. Alternatively, you -can use [`withdrawableAmountOf`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) +can use [`withdrawableAmountOf`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) function to determine how much amount of assets is available to withdraw. In addition to the `withdraw` function, there is the `withdrawMax` function, which you can use to withdraw the maximum withdrawable amount of assets at the time of invocation: ```solidity reference title="Stream Management: Withdraw Max" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L25-L27 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L25-L27 ``` What `withdrawMax` does is call the -[`withdrawableAmountOf`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) function -and pass its value to `withdraw`. +[`withdrawableAmountOf`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawableamountof) function and +pass its value to `withdraw`. Similar to `withdrawMax`, you can use `withdrawMaxAndTransfer` to withdraw the maximum withdrawable assets and at the same time, transfer the NFT to another address. @@ -61,5 +62,5 @@ same time, transfer the NFT to another address. Lastly, there is the `withdrawMultiple` function, with which you can use to withdraw from multiple streams at once: ```solidity reference title="Stream Management: Withdraw Multiple" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L30-L32 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L30-L32 ``` diff --git a/docs/contracts/v2/guides/stream-management/03-cancel.md b/docs/guides/lockup/examples/stream-management/03-cancel.md similarity index 55% rename from docs/contracts/v2/guides/stream-management/03-cancel.md rename to docs/guides/lockup/examples/stream-management/03-cancel.md index bccbf8f7..35a0daea 100644 --- a/docs/contracts/v2/guides/stream-management/03-cancel.md +++ b/docs/guides/lockup/examples/stream-management/03-cancel.md @@ -6,14 +6,14 @@ title: "Cancel Streams" :::note -This section assumes that you have already gone through the [setup](/contracts/v2/guides/stream-management/setup) part. +This section assumes that you have already gone through the [setup](/guides/lockup/examples/stream-management/setup) +part. ::: :::tip -See the [Access Control](/contracts/v2/reference/access-control) guide for an overview of who is allowed to cancel -streams. +See the [Access Control](/reference/lockup/access-control) guide for an overview of who is allowed to cancel streams. ::: @@ -23,21 +23,21 @@ recipient will need to withdraw it. There are two functions that can be used to cancel streams: -1. [`cancel`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#cancel): cancels a single stream -2. [`cancelMultiple`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#cancelmultiple): cancels multiple +1. [`cancel`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#cancel): cancels a single stream +2. [`cancelMultiple`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#cancelmultiple): cancels multiple streams at once To call any of these functions, you need to have created a cancelable stream. If you don't have one yet, go back to the -[previous guide](/contracts/v2/guides/create-stream/lockup-linear) and create a stream. Then, you can use the `cancel` -function like this: +[previous guide](/guides/lockup/examples/create-stream/lockup-linear) and create a stream. Then, you can use the +`cancel` function like this: ```solidity reference title="Stream Management: Cancel" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L39-L41 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L39-L41 ``` In addition to the `cancel` function, there is the `cancelMultiple` function, which allows you to cancel several streams at once: ```solidity reference title="Stream Management: Cancel Multiple" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L44-L46 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L44-L46 ``` diff --git a/docs/contracts/v2/guides/stream-management/04-renounce.md b/docs/guides/lockup/examples/stream-management/04-renounce.md similarity index 68% rename from docs/contracts/v2/guides/stream-management/04-renounce.md rename to docs/guides/lockup/examples/stream-management/04-renounce.md index 3152552e..59a617d7 100644 --- a/docs/contracts/v2/guides/stream-management/04-renounce.md +++ b/docs/guides/lockup/examples/stream-management/04-renounce.md @@ -6,19 +6,19 @@ title: "Renounce Streams" :::note -This section assumes that you have already gone through the [setup](/contracts/v2/guides/stream-management/setup) part. +This section assumes that you have already gone through the [setup](/guides/lockup/examples/stream-management/setup) +part. ::: Renouncing a stream means that the sender of the stream will no longer be able to cancel it. This is useful if the sender wants to give up control of the stream. -To renounce a stream, you can use -[`renounce`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#renounce). +To renounce a stream, you can use [`renounce`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#renounce). Before invoking this function, ensure that you have an active, cancelable stream with the sender set to the `StreamManagement` contract. Once the stream is created, you can use the the `renounce` function like this: ```solidity reference title="Stream Management: Renounce" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L53-L55 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L53-L55 ``` diff --git a/docs/contracts/v2/guides/stream-management/05-transfer.md b/docs/guides/lockup/examples/stream-management/05-transfer.md similarity index 65% rename from docs/contracts/v2/guides/stream-management/05-transfer.md rename to docs/guides/lockup/examples/stream-management/05-transfer.md index 6360c9e3..bd922895 100644 --- a/docs/contracts/v2/guides/stream-management/05-transfer.md +++ b/docs/guides/lockup/examples/stream-management/05-transfer.md @@ -6,29 +6,29 @@ title: "Transfer Ownership" :::note -This section assumes that you have already gone through the [setup](/contracts/v2/guides/stream-management/setup) part. +This section assumes that you have already gone through the [setup](/guides/lockup/examples/stream-management/setup) +part. ::: :::tip -See the [Access Control](/contracts/v2/reference/access-control) guide for an overview of who is allowed to transfer +See the [Access Control](/reference/lockup/access-control) guide for an overview of who is allowed to transfer ownership. ::: -You may remember from the [NFT](/concepts/protocol/nft) guide that every Sablier stream is wrapped in an +You may remember from the [NFT](/concepts/nft) guide that every Lockup stream is wrapped in an [ERC-721](https://eips.ethereum.org/EIPS/eip-721) non-fungible token (NFT). One of the key benefits of this design is that the recipient of the stream has the ability to transfer the NFT to a different address, effectively redirecting the streaming of assets to that new address. To transfer ownership of a stream, it is recommended to invoke the -[`withdrawMaxAndTransfer`](/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup#withdrawmaxandtransfer) -function, which withdraws all the unclaimed funds to the current recipient prior to transferring ownership to the new -recipient: +[`withdrawMaxAndTransfer`](/reference/lockup/core/abstracts/abstract.SablierV2Lockup#withdrawmaxandtransfer) function, +which withdraws all the unclaimed funds to the current recipient prior to transferring ownership to the new recipient: ```solidity reference title="Stream Management: Withdraw and Transfer Ownership" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L72-L74 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L72-L74 ``` The withdrawal will be skipped if there are no unclaimed funds. @@ -36,7 +36,7 @@ The withdrawal will be skipped if there are no unclaimed funds. If you want to transfer ownership without withdrawing the funds, you can use the `IERC721.transferFrom` function: ```solidity reference title="Stream Management: Transfer Ownership" -https://github.com/sablier-labs/examples/blob/main/v2/core/StreamManagement.sol#L67-L69 +https://github.com/sablier-labs/examples/blob/main/lockup/core/StreamManagement.sol#L67-L69 ``` :::caution diff --git a/docs/contracts/v2/guides/stream-management/_category_.json b/docs/guides/lockup/examples/stream-management/_category_.json similarity index 100% rename from docs/contracts/v2/guides/stream-management/_category_.json rename to docs/guides/lockup/examples/stream-management/_category_.json diff --git a/docs/contracts/v2/reference/_category_.json b/docs/guides/lockup/previous-deployments/_category_.json similarity index 53% rename from docs/contracts/v2/reference/_category_.json rename to docs/guides/lockup/previous-deployments/_category_.json index 1841e893..4213cb5b 100644 --- a/docs/contracts/v2/reference/_category_.json +++ b/docs/guides/lockup/previous-deployments/_category_.json @@ -1,5 +1,5 @@ { "collapsed": true, - "label": "Technical Reference", + "label": "Previous Deployments", "position": 6 } diff --git a/docs/contracts/v2/deployments/v2.0.md b/docs/guides/lockup/previous-deployments/v1.0.md similarity index 80% rename from docs/contracts/v2/deployments/v2.0.md rename to docs/guides/lockup/previous-deployments/v1.0.md index 0e90f04e..92681d25 100644 --- a/docs/contracts/v2/deployments/v2.0.md +++ b/docs/guides/lockup/previous-deployments/v1.0.md @@ -1,10 +1,10 @@ --- -id: "v2.0" +id: "v1.0" sidebar_position: 2 -title: "V2.0" +title: "v1.0" --- -This document contains the deployment addresses for the V2.0 release of [@sablier/v2-core@1.0.2][v2-core] and +This document contains the deployment addresses for the v1.0 release of [@sablier/v2-core@1.0.2][v2-core] and [@sablier/v2-periphery@1.0.3][v2-periphery]. [v2-core]: https://npmjs.com/package/@sablier/v2-core/v/1.0.2 @@ -13,12 +13,12 @@ This document contains the deployment addresses for the V2.0 release of [@sablie A few noteworthy details about the deployments: - The addresses are final -- All LockupLinear and LockupDynamic contracts are non-upgradeable +- All contracts are non-upgradeable - The source code is verified on Etherscan across all chains :::info -This is an outdated version of the Sablier protocol. See the latest version [here](/contracts/v2/deployments). +This is an outdated version of the Lockup protocol. See the latest version [here](/guides/lockup/deployments). ::: @@ -28,200 +28,200 @@ This is an outdated version of the Sablier protocol. See the latest version [her #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA](https://etherscan.io/address/0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x39EFdC3dbB57B2388CcC4bb40aC4CB1226Bc9E44](https://etherscan.io/address/0x39EFdC3dbB57B2388CcC4bb40aC4CB1226Bc9E44) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0xB10daee1FCF62243aE27776D7a92D39dC8740f95](https://etherscan.io/address/0xB10daee1FCF62243aE27776D7a92D39dC8740f95) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x98F2196fECc01C240d1429B624d007Ca268EEA29](https://etherscan.io/address/0x98F2196fECc01C240d1429B624d007Ca268EEA29) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA](https://etherscan.io/address/0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x39EFdC3dbB57B2388CcC4bb40aC4CB1226Bc9E44](https://etherscan.io/address/0x39EFdC3dbB57B2388CcC4bb40aC4CB1226Bc9E44) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0xB10daee1FCF62243aE27776D7a92D39dC8740f95](https://etherscan.io/address/0xB10daee1FCF62243aE27776D7a92D39dC8740f95) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x98F2196fECc01C240d1429B624d007Ca268EEA29](https://etherscan.io/address/0x98F2196fECc01C240d1429B624d007Ca268EEA29) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x0Be20a8242B0781B6fd4d453e90DCC1CcF7DBcc6](https://etherscan.io/address/0x0Be20a8242B0781B6fd4d453e90DCC1CcF7DBcc6) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x9bdebF4F9adEB99387f46e4020FBf3dDa885D2b8](https://etherscan.io/address/0x9bdebF4F9adEB99387f46e4020FBf3dDa885D2b8) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x638a7aC8315767cEAfc57a6f5e3559454347C3f6](https://etherscan.io/address/0x638a7aC8315767cEAfc57a6f5e3559454347C3f6) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x297b43aE44660cA7826ef92D8353324C018573Ef](https://etherscan.io/address/0x297b43aE44660cA7826ef92D8353324C018573Ef) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x0Be20a8242B0781B6fd4d453e90DCC1CcF7DBcc6](https://etherscan.io/address/0x0Be20a8242B0781B6fd4d453e90DCC1CcF7DBcc6) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x9bdebF4F9adEB99387f46e4020FBf3dDa885D2b8](https://etherscan.io/address/0x9bdebF4F9adEB99387f46e4020FBf3dDa885D2b8) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x638a7aC8315767cEAfc57a6f5e3559454347C3f6](https://etherscan.io/address/0x638a7aC8315767cEAfc57a6f5e3559454347C3f6) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x297b43aE44660cA7826ef92D8353324C018573Ef](https://etherscan.io/address/0x297b43aE44660cA7826ef92D8353324C018573Ef) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Arbitrum One #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762](https://arbiscan.io/address/0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xA9EfBEf1A35fF80041F567391bdc9813b2D50197](https://arbiscan.io/address/0xA9EfBEf1A35fF80041F567391bdc9813b2D50197) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x197D655F3be03903fD25e7828c3534504bfe525e](https://arbiscan.io/address/0x197D655F3be03903fD25e7828c3534504bfe525e) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xc245d6C9608769CeF91C3858e4d2a74802B9f1bB](https://arbiscan.io/address/0xc245d6C9608769CeF91C3858e4d2a74802B9f1bB) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762](https://arbiscan.io/address/0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xA9EfBEf1A35fF80041F567391bdc9813b2D50197](https://arbiscan.io/address/0xA9EfBEf1A35fF80041F567391bdc9813b2D50197) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x197D655F3be03903fD25e7828c3534504bfe525e](https://arbiscan.io/address/0x197D655F3be03903fD25e7828c3534504bfe525e) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xc245d6C9608769CeF91C3858e4d2a74802B9f1bB](https://arbiscan.io/address/0xc245d6C9608769CeF91C3858e4d2a74802B9f1bB) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0xDFa4512d07AbD4eb8Be570Cd79e2e6Fe21ff15C9](https://arbiscan.io/address/0xDFa4512d07AbD4eb8Be570Cd79e2e6Fe21ff15C9) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x9aB73CA73c89AF0bdc69642aCeb23CC6A55A514C](https://arbiscan.io/address/0x9aB73CA73c89AF0bdc69642aCeb23CC6A55A514C) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x90cc23dc3e12e80f27c05b8137b5f0d2b1edfa20](https://arbiscan.io/address/0x90cc23dc3e12e80f27c05b8137b5f0d2b1edfa20) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0xB7185AcAF42C4966fFA3c81486d9ED9633aa4c13](https://arbiscan.io/address/0xB7185AcAF42C4966fFA3c81486d9ED9633aa4c13) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0xDFa4512d07AbD4eb8Be570Cd79e2e6Fe21ff15C9](https://arbiscan.io/address/0xDFa4512d07AbD4eb8Be570Cd79e2e6Fe21ff15C9) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x9aB73CA73c89AF0bdc69642aCeb23CC6A55A514C](https://arbiscan.io/address/0x9aB73CA73c89AF0bdc69642aCeb23CC6A55A514C) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x90cc23dc3e12e80f27c05b8137b5f0d2b1edfa20](https://arbiscan.io/address/0x90cc23dc3e12e80f27c05b8137b5f0d2b1edfa20) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0xB7185AcAF42C4966fFA3c81486d9ED9633aa4c13](https://arbiscan.io/address/0xB7185AcAF42C4966fFA3c81486d9ED9633aa4c13) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Arbitrum Nova #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x203f1722d4adb9b67bf652c878d0dc3cc8099113](https://nova.arbiscan.io/address/0x203f1722d4adb9b67bf652c878d0dc3cc8099113) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xd6b66A8D797c1e83DdEcE8f483E7D1264B9DFDa6](https://nova.arbiscan.io/address/0xd6b66A8D797c1e83DdEcE8f483E7D1264B9DFDa6) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x18306C9550AbfE3F5900d1206FFdce9ce5763A89](https://nova.arbiscan.io/address/0x18306C9550AbfE3F5900d1206FFdce9ce5763A89) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xE88d26d1E8802be5cc023264b3FccF63Bc38C20c](https://nova.arbiscan.io/address/0xE88d26d1E8802be5cc023264b3FccF63Bc38C20c) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x203f1722d4adb9b67bf652c878d0dc3cc8099113](https://nova.arbiscan.io/address/0x203f1722d4adb9b67bf652c878d0dc3cc8099113) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xd6b66A8D797c1e83DdEcE8f483E7D1264B9DFDa6](https://nova.arbiscan.io/address/0xd6b66A8D797c1e83DdEcE8f483E7D1264B9DFDa6) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x18306C9550AbfE3F5900d1206FFdce9ce5763A89](https://nova.arbiscan.io/address/0x18306C9550AbfE3F5900d1206FFdce9ce5763A89) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xE88d26d1E8802be5cc023264b3FccF63Bc38C20c](https://nova.arbiscan.io/address/0xE88d26d1E8802be5cc023264b3FccF63Bc38C20c) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :------------------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x17DE7707D0b25F878Ae4FaC03cdE2481CD616EDd](https://nova.arbiscan.io/address/0x17DE7707D0b25F878Ae4FaC03cdE2481CD616EDd) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x1f09ce4be5ad6e76cda6242af91921440df2306e](https://nova.arbiscan.io/address/0x1f09ce4be5ad6e76cda6242af91921440df2306e) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetPermit2 | [0x4487F233bdf7d3C977F936891D5A0Ff1b275A2a8](https://nova.arbiscan.io/address/0x4487F233bdf7d3C977F936891D5A0Ff1b275A2a8) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x17DE7707D0b25F878Ae4FaC03cdE2481CD616EDd](https://nova.arbiscan.io/address/0x17DE7707D0b25F878Ae4FaC03cdE2481CD616EDd) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x1f09ce4be5ad6e76cda6242af91921440df2306e](https://nova.arbiscan.io/address/0x1f09ce4be5ad6e76cda6242af91921440df2306e) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetPermit2 | [0x4487F233bdf7d3C977F936891D5A0Ff1b275A2a8](https://nova.arbiscan.io/address/0x4487F233bdf7d3C977F936891D5A0Ff1b275A2a8) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Avalanche #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C](https://snowtrace.io/address/0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x665d1C8337F1035cfBe13DD94bB669110b975f5F](https://snowtrace.io/address/0x665d1C8337F1035cfBe13DD94bB669110b975f5F) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x610346E9088AFA70D6B03e96A800B3267E75cA19](https://snowtrace.io/address/0x610346E9088AFA70D6B03e96A800B3267E75cA19) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xFd050AFA2e04aA0596947DaD3Ec5690162aDc77F](https://snowtrace.io/address/0xFd050AFA2e04aA0596947DaD3Ec5690162aDc77F) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C](https://snowtrace.io/address/0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x665d1C8337F1035cfBe13DD94bB669110b975f5F](https://snowtrace.io/address/0x665d1C8337F1035cfBe13DD94bB669110b975f5F) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x610346E9088AFA70D6B03e96A800B3267E75cA19](https://snowtrace.io/address/0x610346E9088AFA70D6B03e96A800B3267E75cA19) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xFd050AFA2e04aA0596947DaD3Ec5690162aDc77F](https://snowtrace.io/address/0xFd050AFA2e04aA0596947DaD3Ec5690162aDc77F) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x7b1ef644ce9a625537e9e0c3d7fef3be667e6159](https://snowtrace.io/address/0x7b1ef644ce9a625537e9e0c3d7fef3be667e6159) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x17167A7e2763121e263B4331B700a1BF9113b387](https://snowtrace.io/address/0x17167A7e2763121e263B4331B700a1BF9113b387) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x817fE1364A9d57d1fB951945B53942234163Ef10](https://snowtrace.io/address/0x817fE1364A9d57d1fB951945B53942234163Ef10) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x48B4889cf5d6f8360050f9d7606505F1433120BC](https://snowtrace.io/address/0x48B4889cf5d6f8360050f9d7606505F1433120BC) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x7b1ef644ce9a625537e9e0c3d7fef3be667e6159](https://snowtrace.io/address/0x7b1ef644ce9a625537e9e0c3d7fef3be667e6159) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x17167A7e2763121e263B4331B700a1BF9113b387](https://snowtrace.io/address/0x17167A7e2763121e263B4331B700a1BF9113b387) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x817fE1364A9d57d1fB951945B53942234163Ef10](https://snowtrace.io/address/0x817fE1364A9d57d1fB951945B53942234163Ef10) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x48B4889cf5d6f8360050f9d7606505F1433120BC](https://snowtrace.io/address/0x48B4889cf5d6f8360050f9d7606505F1433120BC) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Base #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e](https://basescan.org/address/0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x645B00960Dc352e699F89a81Fc845C0C645231cf](https://basescan.org/address/0x645B00960Dc352e699F89a81Fc845C0C645231cf) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x6b9a46C8377f21517E65fa3899b3A9Fab19D17f5](https://basescan.org/address/0x6b9a46C8377f21517E65fa3899b3A9Fab19D17f5) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xEFc2896c29F70bc23e82892Df827d4e2259028Fd](https://basescan.org/address/0xEFc2896c29F70bc23e82892Df827d4e2259028Fd) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e](https://basescan.org/address/0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x645B00960Dc352e699F89a81Fc845C0C645231cf](https://basescan.org/address/0x645B00960Dc352e699F89a81Fc845C0C645231cf) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x6b9a46C8377f21517E65fa3899b3A9Fab19D17f5](https://basescan.org/address/0x6b9a46C8377f21517E65fa3899b3A9Fab19D17f5) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xEFc2896c29F70bc23e82892Df827d4e2259028Fd](https://basescan.org/address/0xEFc2896c29F70bc23e82892Df827d4e2259028Fd) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x1C5Ac71dd48c7ff291743e5E6e3689ba92F73cC6](https://basescan.org/address/0x1C5Ac71dd48c7ff291743e5E6e3689ba92F73cC6) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x50E8B9dC7F28e5cA9253759455C1077e497c4232](https://basescan.org/address/0x50E8B9dC7F28e5cA9253759455C1077e497c4232) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0xf19576Ab425753816eCbF98aca8132A0f693aEc5](https://basescan.org/address/0xf19576Ab425753816eCbF98aca8132A0f693aEc5) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x0648C80b969501c7778b6ff3ba47aBb78fEeDF39](https://basescan.org/address/0x0648C80b969501c7778b6ff3ba47aBb78fEeDF39) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x1C5Ac71dd48c7ff291743e5E6e3689ba92F73cC6](https://basescan.org/address/0x1C5Ac71dd48c7ff291743e5E6e3689ba92F73cC6) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x50E8B9dC7F28e5cA9253759455C1077e497c4232](https://basescan.org/address/0x50E8B9dC7F28e5cA9253759455C1077e497c4232) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0xf19576Ab425753816eCbF98aca8132A0f693aEc5](https://basescan.org/address/0xf19576Ab425753816eCbF98aca8132A0f693aEc5) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x0648C80b969501c7778b6ff3ba47aBb78fEeDF39](https://basescan.org/address/0x0648C80b969501c7778b6ff3ba47aBb78fEeDF39) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### BNB Smart Chain #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8](https://bscscan.com/address/0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xF2f3feF2454DcA59ECA929D2D8cD2a8669Cc6214](https://bscscan.com/address/0xF2f3feF2454DcA59ECA929D2D8cD2a8669Cc6214) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x3FE4333f62A75c2a85C8211c6AeFd1b9Bfde6e51](https://bscscan.com/address/0x3FE4333f62A75c2a85C8211c6AeFd1b9Bfde6e51) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x3daD1bF57edCFF979Fb68a802AC54c5AAfB78F4c](https://bscscan.com/address/0x3daD1bF57edCFF979Fb68a802AC54c5AAfB78F4c) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8](https://bscscan.com/address/0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xF2f3feF2454DcA59ECA929D2D8cD2a8669Cc6214](https://bscscan.com/address/0xF2f3feF2454DcA59ECA929D2D8cD2a8669Cc6214) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x3FE4333f62A75c2a85C8211c6AeFd1b9Bfde6e51](https://bscscan.com/address/0x3FE4333f62A75c2a85C8211c6AeFd1b9Bfde6e51) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x3daD1bF57edCFF979Fb68a802AC54c5AAfB78F4c](https://bscscan.com/address/0x3daD1bF57edCFF979Fb68a802AC54c5AAfB78F4c) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0xeDe48EB173A869c0b27Cb98CC56d00BC391e5887](https://bscscan.com/address/0xeDe48EB173A869c0b27Cb98CC56d00BC391e5887) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xC43b2d8CedB71df30F45dFd9a21eC1E50A813bD6](https://bscscan.com/address/0xC43b2d8CedB71df30F45dFd9a21eC1E50A813bD6) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0xc9bf2A6bD467A813908d836c1506efE61E465761](https://bscscan.com/address/0xc9bf2A6bD467A813908d836c1506efE61E465761) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x135e78B8E17B1d189Af75FcfCC018ab2E6c7b879](https://bscscan.com/address/0x135e78B8E17B1d189Af75FcfCC018ab2E6c7b879) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0xeDe48EB173A869c0b27Cb98CC56d00BC391e5887](https://bscscan.com/address/0xeDe48EB173A869c0b27Cb98CC56d00BC391e5887) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xC43b2d8CedB71df30F45dFd9a21eC1E50A813bD6](https://bscscan.com/address/0xC43b2d8CedB71df30F45dFd9a21eC1E50A813bD6) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0xc9bf2A6bD467A813908d836c1506efE61E465761](https://bscscan.com/address/0xc9bf2A6bD467A813908d836c1506efE61E465761) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x135e78B8E17B1d189Af75FcfCC018ab2E6c7b879](https://bscscan.com/address/0x135e78B8E17B1d189Af75FcfCC018ab2E6c7b879) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Gnosis #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2](https://gnosisscan.io/address/0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xeb148E4ec13aaA65328c0BA089a278138E9E53F9](https://gnosisscan.io/address/0xeb148E4ec13aaA65328c0BA089a278138E9E53F9) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x685E92c9cA2bB23f1B596d0a7D749c0603e88585](https://gnosisscan.io/address/0x685E92c9cA2bB23f1B596d0a7D749c0603e88585) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x8CE9Cd651e03325Cf6D4Ce9cfa74BE79CDf6d530](https://gnosisscan.io/address/0x8CE9Cd651e03325Cf6D4Ce9cfa74BE79CDf6d530) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2](https://gnosisscan.io/address/0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xeb148E4ec13aaA65328c0BA089a278138E9E53F9](https://gnosisscan.io/address/0xeb148E4ec13aaA65328c0BA089a278138E9E53F9) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x685E92c9cA2bB23f1B596d0a7D749c0603e88585](https://gnosisscan.io/address/0x685E92c9cA2bB23f1B596d0a7D749c0603e88585) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x8CE9Cd651e03325Cf6D4Ce9cfa74BE79CDf6d530](https://gnosisscan.io/address/0x8CE9Cd651e03325Cf6D4Ce9cfa74BE79CDf6d530) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0xF4A6F47Da7c6b26b6Dd774671aABA48fb4bFE309](https://gnosisscan.io/address/0xF4A6F47Da7c6b26b6Dd774671aABA48fb4bFE309) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xc84f0e95815A576171A19EB9E0fA55a217Ab1536](https://gnosisscan.io/address/0xc84f0e95815A576171A19EB9E0fA55a217Ab1536) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x89AfE038714e547C29Fa881029DD4B5CFB008454](https://gnosisscan.io/address/0x89AfE038714e547C29Fa881029DD4B5CFB008454) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x5B144C3B9C8cfd48297Aeb59B90a024Ef3fCcE92](https://gnosisscan.io/address/0x5B144C3B9C8cfd48297Aeb59B90a024Ef3fCcE92) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0xF4A6F47Da7c6b26b6Dd774671aABA48fb4bFE309](https://gnosisscan.io/address/0xF4A6F47Da7c6b26b6Dd774671aABA48fb4bFE309) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xc84f0e95815A576171A19EB9E0fA55a217Ab1536](https://gnosisscan.io/address/0xc84f0e95815A576171A19EB9E0fA55a217Ab1536) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x89AfE038714e547C29Fa881029DD4B5CFB008454](https://gnosisscan.io/address/0x89AfE038714e547C29Fa881029DD4B5CFB008454) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x5B144C3B9C8cfd48297Aeb59B90a024Ef3fCcE92](https://gnosisscan.io/address/0x5B144C3B9C8cfd48297Aeb59B90a024Ef3fCcE92) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Optimism #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10](https://optimistic.etherscan.io/address/0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x6f68516c21E248cdDfaf4898e66b2b0Adee0e0d6](https://optimistic.etherscan.io/address/0x6f68516c21E248cdDfaf4898e66b2b0Adee0e0d6) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0xB923aBdCA17Aed90EB5EC5E407bd37164f632bFD](https://optimistic.etherscan.io/address/0xB923aBdCA17Aed90EB5EC5E407bd37164f632bFD) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xe0138C596939CC0D2382046795bC163ad5755e0E](https://optimistic.etherscan.io/address/0xe0138C596939CC0D2382046795bC163ad5755e0E) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10](https://optimistic.etherscan.io/address/0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x6f68516c21E248cdDfaf4898e66b2b0Adee0e0d6](https://optimistic.etherscan.io/address/0x6f68516c21E248cdDfaf4898e66b2b0Adee0e0d6) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0xB923aBdCA17Aed90EB5EC5E407bd37164f632bFD](https://optimistic.etherscan.io/address/0xB923aBdCA17Aed90EB5EC5E407bd37164f632bFD) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xe0138C596939CC0D2382046795bC163ad5755e0E](https://optimistic.etherscan.io/address/0xe0138C596939CC0D2382046795bC163ad5755e0E) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x9A09eC6f991386718854aDDCEe68647776Befd5b](https://optimistic.etherscan.io/address/0x9A09eC6f991386718854aDDCEe68647776Befd5b) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x77C8516B1F327890C956bb38F93Ac2d6B24795Ea](https://optimistic.etherscan.io/address/0x77C8516B1F327890C956bb38F93Ac2d6B24795Ea) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x8a6974c162fdc7Cb67996F7dB8bAAFb9a99566e0](https://optimistic.etherscan.io/address/0x8a6974c162fdc7Cb67996F7dB8bAAFb9a99566e0) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x194ed7D6005C8ba4084A948406545DF299ad37cD](https://optimistic.etherscan.io/address/0x194ed7D6005C8ba4084A948406545DF299ad37cD) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x9A09eC6f991386718854aDDCEe68647776Befd5b](https://optimistic.etherscan.io/address/0x9A09eC6f991386718854aDDCEe68647776Befd5b) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x77C8516B1F327890C956bb38F93Ac2d6B24795Ea](https://optimistic.etherscan.io/address/0x77C8516B1F327890C956bb38F93Ac2d6B24795Ea) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x8a6974c162fdc7Cb67996F7dB8bAAFb9a99566e0](https://optimistic.etherscan.io/address/0x8a6974c162fdc7Cb67996F7dB8bAAFb9a99566e0) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x194ed7D6005C8ba4084A948406545DF299ad37cD](https://optimistic.etherscan.io/address/0x194ed7D6005C8ba4084A948406545DF299ad37cD) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Polygon #### Core -| Contract | Address | Deployment | -| :--------------------- | :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E](https://polygonscan.com/address/0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x7313AdDb53f96a4f710D3b91645c62B434190725](https://polygonscan.com/address/0x7313AdDb53f96a4f710D3b91645c62B434190725) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x67422C3E36A908D5C3237e9cFfEB40bDE7060f6E](https://polygonscan.com/address/0x67422C3E36A908D5C3237e9cFfEB40bDE7060f6E) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xA820946EaAceB2a85aF123f706f23192c28bC6B9](https://polygonscan.com/address/0xA820946EaAceB2a85aF123f706f23192c28bC6B9) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E](https://polygonscan.com/address/0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x7313AdDb53f96a4f710D3b91645c62B434190725](https://polygonscan.com/address/0x7313AdDb53f96a4f710D3b91645c62B434190725) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x67422C3E36A908D5C3237e9cFfEB40bDE7060f6E](https://polygonscan.com/address/0x67422C3E36A908D5C3237e9cFfEB40bDE7060f6E) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xA820946EaAceB2a85aF123f706f23192c28bC6B9](https://polygonscan.com/address/0xA820946EaAceB2a85aF123f706f23192c28bC6B9) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0xA2f5B2e798e7ADd59d85d9b76645E6AC13fC4e1f](https://polygonscan.com/address/0xA2f5B2e798e7ADd59d85d9b76645E6AC13fC4e1f) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xBe4cad0e99865CC62787Ecf029aD9DD4815d3d2e](https://polygonscan.com/address/0xBe4cad0e99865CC62787Ecf029aD9DD4815d3d2e) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0xccA6dd77bA2cfcccEdA01A82CB309e2A17901682](https://polygonscan.com/address/0xccA6dd77bA2cfcccEdA01A82CB309e2A17901682) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x576743075fc5F771bbC1376c3267A6185Af9D62B](https://polygonscan.com/address/0x576743075fc5F771bbC1376c3267A6185Af9D62B) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0xA2f5B2e798e7ADd59d85d9b76645E6AC13fC4e1f](https://polygonscan.com/address/0xA2f5B2e798e7ADd59d85d9b76645E6AC13fC4e1f) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xBe4cad0e99865CC62787Ecf029aD9DD4815d3d2e](https://polygonscan.com/address/0xBe4cad0e99865CC62787Ecf029aD9DD4815d3d2e) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0xccA6dd77bA2cfcccEdA01A82CB309e2A17901682](https://polygonscan.com/address/0xccA6dd77bA2cfcccEdA01A82CB309e2A17901682) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x576743075fc5F771bbC1376c3267A6185Af9D62B](https://polygonscan.com/address/0x576743075fc5F771bbC1376c3267A6185Af9D62B) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Scroll #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b](https://scrollscan.com/address/0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xde6a30D851eFD0Fc2a9C922F294801Cfd5FCB3A1](https://scrollscan.com/address/0xde6a30D851eFD0Fc2a9C922F294801Cfd5FCB3A1) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x80640ca758615ee83801EC43452feEA09a202D33](https://scrollscan.com/address/0x80640ca758615ee83801EC43452feEA09a202D33) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xC1fa624733203F2B7185c3724039C4D5E5234fE4](https://scrollscan.com/address/0xC1fa624733203F2B7185c3724039C4D5E5234fE4) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b](https://scrollscan.com/address/0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xde6a30D851eFD0Fc2a9C922F294801Cfd5FCB3A1](https://scrollscan.com/address/0xde6a30D851eFD0Fc2a9C922F294801Cfd5FCB3A1) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x80640ca758615ee83801EC43452feEA09a202D33](https://scrollscan.com/address/0x80640ca758615ee83801EC43452feEA09a202D33) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xC1fa624733203F2B7185c3724039C4D5E5234fE4](https://scrollscan.com/address/0xC1fa624733203F2B7185c3724039C4D5E5234fE4) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x94A18AC6e4B7d97E31f1587f6a666Dc5503086c3](https://scrollscan.com/address/0x94A18AC6e4B7d97E31f1587f6a666Dc5503086c3) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xED1591BD6038032a74D786A452A23536b3201490](https://scrollscan.com/address/0xED1591BD6038032a74D786A452A23536b3201490) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x71CeA9c4d15fed2E58785cE0C05165CE34313A74](https://scrollscan.com/address/0x71CeA9c4d15fed2E58785cE0C05165CE34313A74) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x91154fc80933D25793E6B4D7CE19fb51dE6794B7](https://scrollscan.com/address/0x91154fc80933D25793E6B4D7CE19fb51dE6794B7) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x94A18AC6e4B7d97E31f1587f6a666Dc5503086c3](https://scrollscan.com/address/0x94A18AC6e4B7d97E31f1587f6a666Dc5503086c3) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xED1591BD6038032a74D786A452A23536b3201490](https://scrollscan.com/address/0xED1591BD6038032a74D786A452A23536b3201490) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x71CeA9c4d15fed2E58785cE0C05165CE34313A74](https://scrollscan.com/address/0x71CeA9c4d15fed2E58785cE0C05165CE34313A74) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x91154fc80933D25793E6B4D7CE19fb51dE6794B7](https://scrollscan.com/address/0x91154fc80933D25793E6B4D7CE19fb51dE6794B7) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ## Testnets @@ -229,76 +229,76 @@ This is an outdated version of the Sablier protocol. See the latest version [her #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0xECF737BDb9BB094489beCa39f0b9Ae66E0C14ba8](https://goerli.arbiscan.io/address/0xECF737BDb9BB094489beCa39f0b9Ae66E0C14ba8) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0xdc0a619fF975de6a08c7615ea383533fd265f2e3](https://goerli.arbiscan.io/address/0xdc0a619fF975de6a08c7615ea383533fd265f2e3) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x323B629635b6cFfe2453Aa2869c5957AfF55F445](https://goerli.arbiscan.io/address/0x323B629635b6cFfe2453Aa2869c5957AfF55F445) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x740509d893BC15a31EAE8542683Ed32085c559cB](https://goerli.arbiscan.io/address/0x740509d893BC15a31EAE8542683Ed32085c559cB) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0xECF737BDb9BB094489beCa39f0b9Ae66E0C14ba8](https://goerli.arbiscan.io/address/0xECF737BDb9BB094489beCa39f0b9Ae66E0C14ba8) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0xdc0a619fF975de6a08c7615ea383533fd265f2e3](https://goerli.arbiscan.io/address/0xdc0a619fF975de6a08c7615ea383533fd265f2e3) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x323B629635b6cFfe2453Aa2869c5957AfF55F445](https://goerli.arbiscan.io/address/0x323B629635b6cFfe2453Aa2869c5957AfF55F445) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x740509d893BC15a31EAE8542683Ed32085c559cB](https://goerli.arbiscan.io/address/0x740509d893BC15a31EAE8542683Ed32085c559cB) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x4371d767Cd7991248D20eD61d425e1e70c6CEEab](https://goerli.arbiscan.io/address/0x4371d767Cd7991248D20eD61d425e1e70c6CEEab) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xD37832B8993bEe6F41A8183967a7488C6e2a3551](https://goerli.arbiscan.io/address/0xD37832B8993bEe6F41A8183967a7488C6e2a3551) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetPermit2 | [0x2Ebd987e12432Ee3a74Fe0A55Afe5D866096e354](https://goerli.arbiscan.io/address/0x2Ebd987e12432Ee3a74Fe0A55Afe5D866096e354) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x4371d767Cd7991248D20eD61d425e1e70c6CEEab](https://goerli.arbiscan.io/address/0x4371d767Cd7991248D20eD61d425e1e70c6CEEab) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xD37832B8993bEe6F41A8183967a7488C6e2a3551](https://goerli.arbiscan.io/address/0xD37832B8993bEe6F41A8183967a7488C6e2a3551) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetPermit2 | [0x2Ebd987e12432Ee3a74Fe0A55Afe5D866096e354](https://goerli.arbiscan.io/address/0x2Ebd987e12432Ee3a74Fe0A55Afe5D866096e354) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Arbitrum Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9](https://sepolia.arbiscan.io/address/0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x7938c18a59FaD2bA11426AcfBe8d74F0F598a4D2](https://sepolia.arbiscan.io/address/0x7938c18a59FaD2bA11426AcfBe8d74F0F598a4D2) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0xa3e36b51B7A456812c92253780f4B15bad56e34c](https://sepolia.arbiscan.io/address/0xa3e36b51B7A456812c92253780f4B15bad56e34c) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0xEe93BFf599C17C6fF8e31F2De6c3e40bd5e51312](https://sepolia.arbiscan.io/address/0xEe93BFf599C17C6fF8e31F2De6c3e40bd5e51312) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9](https://sepolia.arbiscan.io/address/0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x7938c18a59FaD2bA11426AcfBe8d74F0F598a4D2](https://sepolia.arbiscan.io/address/0x7938c18a59FaD2bA11426AcfBe8d74F0F598a4D2) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0xa3e36b51B7A456812c92253780f4B15bad56e34c](https://sepolia.arbiscan.io/address/0xa3e36b51B7A456812c92253780f4B15bad56e34c) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0xEe93BFf599C17C6fF8e31F2De6c3e40bd5e51312](https://sepolia.arbiscan.io/address/0xEe93BFf599C17C6fF8e31F2De6c3e40bd5e51312) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x2C8fA48361C7D48Dc21b27a3D549402Cf8AE16B0](https://sepolia.arbiscan.io/address/0x2C8fA48361C7D48Dc21b27a3D549402Cf8AE16B0) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x7D310803c3824636bAff74e4f80e81ece167c440](https://sepolia.arbiscan.io/address/0x7D310803c3824636bAff74e4f80e81ece167c440) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetPermit2 | [0x396A3a169918A4C0B339ECf86C583f46D696254E](https://sepolia.arbiscan.io/address/0x396A3a169918A4C0B339ECf86C583f46D696254E) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0x2C8fA48361C7D48Dc21b27a3D549402Cf8AE16B0](https://sepolia.arbiscan.io/address/0x2C8fA48361C7D48Dc21b27a3D549402Cf8AE16B0) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x7D310803c3824636bAff74e4f80e81ece167c440](https://sepolia.arbiscan.io/address/0x7D310803c3824636bAff74e4f80e81ece167c440) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetPermit2 | [0x396A3a169918A4C0B339ECf86C583f46D696254E](https://sepolia.arbiscan.io/address/0x396A3a169918A4C0B339ECf86C583f46D696254E) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Goerli #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x9B75F65bCCd05545C400145Cca29dA52DA57AC2b](https://goerli.etherscan.io/address/0x9B75F65bCCd05545C400145Cca29dA52DA57AC2b) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x4BE70EDe968e9dBA12DB42b9869Bec66bEDC17d7](https://goerli.etherscan.io/address/0x4BE70EDe968e9dBA12DB42b9869Bec66bEDC17d7) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0x6E3678c005815Ab34986D8d66A353Cd3699103DE](https://goerli.etherscan.io/address/0x6E3678c005815Ab34986D8d66A353Cd3699103DE) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x1D83CDd66BCf0ea8c99E745cC868478d6C3633f0](https://goerli.etherscan.io/address/0x1D83CDd66BCf0ea8c99E745cC868478d6C3633f0) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x9B75F65bCCd05545C400145Cca29dA52DA57AC2b](https://goerli.etherscan.io/address/0x9B75F65bCCd05545C400145Cca29dA52DA57AC2b) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x4BE70EDe968e9dBA12DB42b9869Bec66bEDC17d7](https://goerli.etherscan.io/address/0x4BE70EDe968e9dBA12DB42b9869Bec66bEDC17d7) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0x6E3678c005815Ab34986D8d66A353Cd3699103DE](https://goerli.etherscan.io/address/0x6E3678c005815Ab34986D8d66A353Cd3699103DE) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x1D83CDd66BCf0ea8c99E745cC868478d6C3633f0](https://goerli.etherscan.io/address/0x1D83CDd66BCf0ea8c99E745cC868478d6C3633f0) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0xFd14E62e6fe4d96F033cf972556ae56D09Bd49cA](https://goerli.etherscan.io/address/0xFd14E62e6fe4d96F033cf972556ae56D09Bd49cA) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0x9CA1dFFC744318198bE9Cf92283A803CE16b698a](https://goerli.etherscan.io/address/0x9CA1dFFC744318198bE9Cf92283A803CE16b698a) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x0e563B883dfe11469915194F8651a65212fdB96F](https://goerli.etherscan.io/address/0x0e563B883dfe11469915194F8651a65212fdB96F) | [periphery-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x0eE01680645c361B740ab4dCDdF238988eB20411](https://goerli.etherscan.io/address/0x0eE01680645c361B740ab4dCDdF238988eB20411) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Archive | [0xFd14E62e6fe4d96F033cf972556ae56D09Bd49cA](https://goerli.etherscan.io/address/0xFd14E62e6fe4d96F033cf972556ae56D09Bd49cA) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0x9CA1dFFC744318198bE9Cf92283A803CE16b698a](https://goerli.etherscan.io/address/0x9CA1dFFC744318198bE9Cf92283A803CE16b698a) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x0e563B883dfe11469915194F8651a65212fdB96F](https://goerli.etherscan.io/address/0x0e563B883dfe11469915194F8651a65212fdB96F) | [periphery-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x0eE01680645c361B740ab4dCDdF238988eB20411](https://goerli.etherscan.io/address/0x0eE01680645c361B740ab4dCDdF238988eB20411) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | ### Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2Comptroller | [0x2006d43E65e66C5FF20254836E63947FA8bAaD68](https://sepolia.etherscan.io/address/0x2006d43E65e66C5FF20254836E63947FA8bAaD68) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupDynamic | [0x421e1E7a53FF360f70A2D02037Ee394FA474e035](https://sepolia.etherscan.io/address/0x421e1E7a53FF360f70A2D02037Ee394FA474e035) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2LockupLinear | [0xd4300c5bc0b9e27c73ebabdc747ba990b1b570db](https://sepolia.etherscan.io/address/0xd4300c5bc0b9e27c73ebabdc747ba990b1b570db) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | -| SablierV2NFTDescriptor | [0x3cb51943ebcea05b23c35c50491b3d296ff675db](https://sepolia.etherscan.io/address/0x3cb51943ebcea05b23c35c50491b3d296ff675db) | [core-v1.0.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.1) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2Comptroller | [0x2006d43E65e66C5FF20254836E63947FA8bAaD68](https://sepolia.etherscan.io/address/0x2006d43E65e66C5FF20254836E63947FA8bAaD68) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupDynamic | [0x421e1E7a53FF360f70A2D02037Ee394FA474e035](https://sepolia.etherscan.io/address/0x421e1E7a53FF360f70A2D02037Ee394FA474e035) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2LockupLinear | [0xd4300c5bc0b9e27c73ebabdc747ba990b1b570db](https://sepolia.etherscan.io/address/0xd4300c5bc0b9e27c73ebabdc747ba990b1b570db) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | +| SablierV2NFTDescriptor | [0x3cb51943ebcea05b23c35c50491b3d296ff675db](https://sepolia.etherscan.io/address/0x3cb51943ebcea05b23c35c50491b3d296ff675db) | [core-v1.0.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/core) | #### Periphery -| Contract | Address | Deployment | -| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | -| SablierV2Archive | [0x83495d8DF6221f566232e1353a6e7231A86C61fF](https://sepolia.etherscan.io/address/0x83495d8DF6221f566232e1353a6e7231A86C61fF) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyPlugin | [0xa333c8233CfD04740E64AB4fd5447995E357561B](https://sepolia.etherscan.io/address/0xa333c8233CfD04740E64AB4fd5447995E357561B) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | -| SablierV2ProxyTargetApprove | [0x105E7728C5706Ad41d194EbDc7873B047352F3d2](https://sepolia.etherscan.io/address/0x105E7728C5706Ad41d194EbDc7873B047352F3d2) | [periphery-v1.0.1 ](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.1) | -| SablierV2ProxyTargetPermit2 | [0x5091900B7cF803a7407FCE6333A6bAE4aA779Fd4](https://sepolia.etherscan.io/address/0x5091900B7cF803a7407FCE6333A6bAE4aA779Fd4) | [periphery-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.0.0) | +| Contract | Address | Deployment | +| :-------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- | +| SablierV2Archive | [0x83495d8DF6221f566232e1353a6e7231A86C61fF](https://sepolia.etherscan.io/address/0x83495d8DF6221f566232e1353a6e7231A86C61fF) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyPlugin | [0xa333c8233CfD04740E64AB4fd5447995E357561B](https://sepolia.etherscan.io/address/0xa333c8233CfD04740E64AB4fd5447995E357561B) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | +| SablierV2ProxyTargetApprove | [0x105E7728C5706Ad41d194EbDc7873B047352F3d2](https://sepolia.etherscan.io/address/0x105E7728C5706Ad41d194EbDc7873B047352F3d2) | [periphery-v1.0.1 ](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.1/periphery) | +| SablierV2ProxyTargetPermit2 | [0x5091900B7cF803a7407FCE6333A6bAE4aA779Fd4](https://sepolia.etherscan.io/address/0x5091900B7cF803a7407FCE6333A6bAE4aA779Fd4) | [periphery-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/periphery) | diff --git a/docs/contracts/v2/deployments/v2.1.md b/docs/guides/lockup/previous-deployments/v1.1.md similarity index 81% rename from docs/contracts/v2/deployments/v2.1.md rename to docs/guides/lockup/previous-deployments/v1.1.md index d6f4fa40..c0063be0 100644 --- a/docs/contracts/v2/deployments/v2.1.md +++ b/docs/guides/lockup/previous-deployments/v1.1.md @@ -1,10 +1,10 @@ --- -id: "v2.1" +id: "v1.1" sidebar_position: 1 -title: "V2.1" +title: "v1.1" --- -This document contains the deployment addresses for the V2.1 release of [@sablier/v2-core@1.1.2][v2-core] and +This document contains the deployment addresses for the v1.1 release of [@sablier/v2-core@1.1.2][v2-core] and [@sablier/v2-periphery@1.1.1][v2-periphery]. [v2-core]: https://npmjs.com/package/@sablier/v2-core/v/1.1.2 @@ -13,12 +13,12 @@ This document contains the deployment addresses for the V2.1 release of [@sablie A few noteworthy details about the deployments: - The addresses are final -- All LockupLinear and LockupDynamic contracts are non-upgradeable +- All contracts are non-upgradeable - The source code is verified on Etherscan across all chains :::info -This is an outdated version of the Sablier protocol. See the latest version [here](/contracts/v2/deployments). +This is an outdated version of the Lockup protocol. See the latest version [here](/guides/lockup/deployments). ::: @@ -28,217 +28,217 @@ This is an outdated version of the Sablier protocol. See the latest version [her #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xAFb979d9afAd1aD27C5eFf4E27226E3AB9e5dCC9](https://etherscan.io/address/0xAFb979d9afAd1aD27C5eFf4E27226E3AB9e5dCC9) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x7CC7e125d83A581ff438608490Cc0f7bDff79127](https://etherscan.io/address/0x7CC7e125d83A581ff438608490Cc0f7bDff79127) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x23eD5DA55AF4286c0dE55fAcb414dEE2e317F4CB](https://etherscan.io/address/0x23eD5DA55AF4286c0dE55fAcb414dEE2e317F4CB) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA](https://etherscan.io/address/0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xAFb979d9afAd1aD27C5eFf4E27226E3AB9e5dCC9](https://etherscan.io/address/0xAFb979d9afAd1aD27C5eFf4E27226E3AB9e5dCC9) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x7CC7e125d83A581ff438608490Cc0f7bDff79127](https://etherscan.io/address/0x7CC7e125d83A581ff438608490Cc0f7bDff79127) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x23eD5DA55AF4286c0dE55fAcb414dEE2e317F4CB](https://etherscan.io/address/0x23eD5DA55AF4286c0dE55fAcb414dEE2e317F4CB) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA](https://etherscan.io/address/0xC3Be6BffAeab7B297c03383B4254aa3Af2b9a5BA) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xEa07DdBBeA804E7fe66b958329F8Fa5cDA95Bd55](https://etherscan.io/address/0xEa07DdBBeA804E7fe66b958329F8Fa5cDA95Bd55) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x1A272b596b10f02931480BC7a3617db4a8d154E3](https://etherscan.io/address/0x1A272b596b10f02931480BC7a3617db4a8d154E3) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xEa07DdBBeA804E7fe66b958329F8Fa5cDA95Bd55](https://etherscan.io/address/0xEa07DdBBeA804E7fe66b958329F8Fa5cDA95Bd55) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x1A272b596b10f02931480BC7a3617db4a8d154E3](https://etherscan.io/address/0x1A272b596b10f02931480BC7a3617db4a8d154E3) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Arbitrum One #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xFDD9d122B451F549f48c4942c6fa6646D849e8C1](https://arbiscan.io/address/0xFDD9d122B451F549f48c4942c6fa6646D849e8C1) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xf390cE6f54e4dc7C5A5f7f8689062b7591F7111d](https://arbiscan.io/address/0xf390cE6f54e4dc7C5A5f7f8689062b7591F7111d) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x2fb103fC853b2F5022a840091ab1cDf5172E7cfa](https://arbiscan.io/address/0x2fb103fC853b2F5022a840091ab1cDf5172E7cfa) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762](https://arbiscan.io/address/0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xFDD9d122B451F549f48c4942c6fa6646D849e8C1](https://arbiscan.io/address/0xFDD9d122B451F549f48c4942c6fa6646D849e8C1) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xf390cE6f54e4dc7C5A5f7f8689062b7591F7111d](https://arbiscan.io/address/0xf390cE6f54e4dc7C5A5f7f8689062b7591F7111d) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x2fb103fC853b2F5022a840091ab1cDf5172E7cfa](https://arbiscan.io/address/0x2fb103fC853b2F5022a840091ab1cDf5172E7cfa) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762](https://arbiscan.io/address/0x17Ec73692F0aDf7E7C554822FBEAACB4BE781762) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xAFd1434296e29a0711E24014656158055F00784c](https://arbiscan.io/address/0xAFd1434296e29a0711E24014656158055F00784c) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x237400eF5a41886a75B0e036228221Df075b3B80](https://arbiscan.io/address/0x237400eF5a41886a75B0e036228221Df075b3B80) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xAFd1434296e29a0711E24014656158055F00784c](https://arbiscan.io/address/0xAFd1434296e29a0711E24014656158055F00784c) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x237400eF5a41886a75B0e036228221Df075b3B80](https://arbiscan.io/address/0x237400eF5a41886a75B0e036228221Df075b3B80) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Avalanche #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xB24B65E015620455bB41deAAd4e1902f1Be9805f](https://snowtrace.io/address/0xB24B65E015620455bB41deAAd4e1902f1Be9805f) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x0310Da0D8fF141166eD47548f00c96464880781F](https://snowtrace.io/address/0x0310Da0D8fF141166eD47548f00c96464880781F) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xaBEdCf46c5D1d8eD8B9a487144189887695835DC](https://snowtrace.io/address/0xaBEdCf46c5D1d8eD8B9a487144189887695835DC) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C](https://snowtrace.io/address/0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xB24B65E015620455bB41deAAd4e1902f1Be9805f](https://snowtrace.io/address/0xB24B65E015620455bB41deAAd4e1902f1Be9805f) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x0310Da0D8fF141166eD47548f00c96464880781F](https://snowtrace.io/address/0x0310Da0D8fF141166eD47548f00c96464880781F) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xaBEdCf46c5D1d8eD8B9a487144189887695835DC](https://snowtrace.io/address/0xaBEdCf46c5D1d8eD8B9a487144189887695835DC) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C](https://snowtrace.io/address/0x66F5431B0765D984f82A4fc4551b2c9ccF7eAC9C) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x68f156E5fa8C23D65B33aBEbbA50e0CA3626F741](https://snowtrace.io/address/0x68f156E5fa8C23D65B33aBEbbA50e0CA3626F741) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0x4849e797d7Aab20FCC8f807EfafDffF98A83412E](https://snowtrace.io/address/0x4849e797d7Aab20FCC8f807EfafDffF98A83412E) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x68f156E5fa8C23D65B33aBEbbA50e0CA3626F741](https://snowtrace.io/address/0x68f156E5fa8C23D65B33aBEbbA50e0CA3626F741) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0x4849e797d7Aab20FCC8f807EfafDffF98A83412E](https://snowtrace.io/address/0x4849e797d7Aab20FCC8f807EfafDffF98A83412E) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ### Base #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xFCF737582d167c7D20A336532eb8BCcA8CF8e350](https://basescan.org/address/0xFCF737582d167c7D20A336532eb8BCcA8CF8e350) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x461E13056a3a3265CEF4c593F01b2e960755dE91](https://basescan.org/address/0x461E13056a3a3265CEF4c593F01b2e960755dE91) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x67e0a126b695DBA35128860cd61926B90C420Ceb](https://basescan.org/address/0x67e0a126b695DBA35128860cd61926B90C420Ceb) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e](https://basescan.org/address/0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xFCF737582d167c7D20A336532eb8BCcA8CF8e350](https://basescan.org/address/0xFCF737582d167c7D20A336532eb8BCcA8CF8e350) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x461E13056a3a3265CEF4c593F01b2e960755dE91](https://basescan.org/address/0x461E13056a3a3265CEF4c593F01b2e960755dE91) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x67e0a126b695DBA35128860cd61926B90C420Ceb](https://basescan.org/address/0x67e0a126b695DBA35128860cd61926B90C420Ceb) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e](https://basescan.org/address/0x7Faaedd40B1385C118cA7432952D9DC6b5CbC49e) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x94E596EEd73b4e3171c067f05A87AB0268cA993c](https://basescan.org/address/0x94E596EEd73b4e3171c067f05A87AB0268cA993c) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x5545c8E7c3E1F74aDc98e518F2E8D23A002C4412](https://basescan.org/address/0x5545c8E7c3E1F74aDc98e518F2E8D23A002C4412) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x94E596EEd73b4e3171c067f05A87AB0268cA993c](https://basescan.org/address/0x94E596EEd73b4e3171c067f05A87AB0268cA993c) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x5545c8E7c3E1F74aDc98e518F2E8D23A002C4412](https://basescan.org/address/0x5545c8E7c3E1F74aDc98e518F2E8D23A002C4412) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Blast #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------ | -| SablierV2LockupLinear | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://blastscan.io/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | -| SablierV2LockupDynamic | [0xDf578C2c70A86945999c65961417057363530a1c](https://blastscan.io/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | -| SablierV2NFTDescriptor | [0x67e0a126b695DBA35128860cd61926B90C420Ceb](https://blastscan.io/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | -| SablierV2Comptroller | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://blastscan.io/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://blastscan.io/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xDf578C2c70A86945999c65961417057363530a1c](https://blastscan.io/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x67e0a126b695DBA35128860cd61926B90C420Ceb](https://blastscan.io/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://blastscan.io/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery | Contract | Address | Deployment | | :----------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://blastscan.io//address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | -| SablierV2MerkleStreamerFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://blastscan.io//address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/mainnet) | +| SablierV2Batch | [0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264](https://blastscan.io//address/0x0eDA15D606733f6CDe9DB67263E546bfcDDe9264) | [periphery-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a](https://blastscan.io//address/0x92FC05e49c27884d554D98a5C01Ff0894a9DC29a) | [periphery-blast](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ### BNB Smart Chain #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x14c35E126d75234a90c9fb185BF8ad3eDB6A90D2](https://bscscan.com/address/0x14c35E126d75234a90c9fb185BF8ad3eDB6A90D2) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xf900c5E3aA95B59Cc976e6bc9c0998618729a5fa](https://bscscan.com/address/0xf900c5E3aA95B59Cc976e6bc9c0998618729a5fa) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xEcAfcF09c23057210cB6470eB5D0FD8Bafd1755F](https://bscscan.com/address/0xEcAfcF09c23057210cB6470eB5D0FD8Bafd1755F) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8](https://bscscan.com/address/0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x14c35E126d75234a90c9fb185BF8ad3eDB6A90D2](https://bscscan.com/address/0x14c35E126d75234a90c9fb185BF8ad3eDB6A90D2) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xf900c5E3aA95B59Cc976e6bc9c0998618729a5fa](https://bscscan.com/address/0xf900c5E3aA95B59Cc976e6bc9c0998618729a5fa) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xEcAfcF09c23057210cB6470eB5D0FD8Bafd1755F](https://bscscan.com/address/0xEcAfcF09c23057210cB6470eB5D0FD8Bafd1755F) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8](https://bscscan.com/address/0x33511f69A784Fd958E6713aCaC7c9dCF1A5578E8) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x2E30a2ae6565Db78C06C28dE937F668597c80a1c](https://bscscan.com/address/0x2E30a2ae6565Db78C06C28dE937F668597c80a1c) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x434D73465aAc4125d204A6637eB6C579d8D69f48](https://bscscan.com/address/0x434D73465aAc4125d204A6637eB6C579d8D69f48) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x2E30a2ae6565Db78C06C28dE937F668597c80a1c](https://bscscan.com/address/0x2E30a2ae6565Db78C06C28dE937F668597c80a1c) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x434D73465aAc4125d204A6637eB6C579d8D69f48](https://bscscan.com/address/0x434D73465aAc4125d204A6637eB6C579d8D69f48) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Gnosis #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xce49854a647a1723e8Fb7CC3D190CAB29A44aB48](https://gnosisscan.io/address/0xce49854a647a1723e8Fb7CC3D190CAB29A44aB48) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x1DF83C7682080B0f0c26a20C6C9CB8623e0Df24E](https://gnosisscan.io/address/0x1DF83C7682080B0f0c26a20C6C9CB8623e0Df24E) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x01dbFE22205d8B109959e2Be02d0095379309eed](https://gnosisscan.io/address/0x01dbFE22205d8B109959e2Be02d0095379309eed) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2](https://gnosisscan.io/address/0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xce49854a647a1723e8Fb7CC3D190CAB29A44aB48](https://gnosisscan.io/address/0xce49854a647a1723e8Fb7CC3D190CAB29A44aB48) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x1DF83C7682080B0f0c26a20C6C9CB8623e0Df24E](https://gnosisscan.io/address/0x1DF83C7682080B0f0c26a20C6C9CB8623e0Df24E) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x01dbFE22205d8B109959e2Be02d0095379309eed](https://gnosisscan.io/address/0x01dbFE22205d8B109959e2Be02d0095379309eed) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2](https://gnosisscan.io/address/0x73962c44c0fB4cC5e4545FB91732a5c5e87F55C2) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xBd9DDbC55B85FF6Dc0b76E9EFdCd2547Ab482501](https://gnosisscan.io/address/0xBd9DDbC55B85FF6Dc0b76E9EFdCd2547Ab482501) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x777F66477FF83aBabADf39a3F22A8CC3AEE43765](https://gnosisscan.io/address/0x777F66477FF83aBabADf39a3F22A8CC3AEE43765) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xBd9DDbC55B85FF6Dc0b76E9EFdCd2547Ab482501](https://gnosisscan.io/address/0xBd9DDbC55B85FF6Dc0b76E9EFdCd2547Ab482501) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x777F66477FF83aBabADf39a3F22A8CC3AEE43765](https://gnosisscan.io/address/0x777F66477FF83aBabADf39a3F22A8CC3AEE43765) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### LightLink #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x17c4f98c40e69a6A0D5c42B11E3733f076A99E20](https://phoenix.lightlink.io/address/0x17c4f98c40e69a6A0D5c42B11E3733f076A99E20) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x49d753422ff05daa291A9efa383E4f57daEAd889](https://phoenix.lightlink.io/address/0x49d753422ff05daa291A9efa383E4f57daEAd889) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xda55fB3E53b7d205e37B6bdCe990b789255e4302](https://phoenix.lightlink.io/address/0xda55fB3E53b7d205e37B6bdCe990b789255e4302) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0xb568f9Bc0dcE39B9B64e843bC19DA102B5E3E939](https://phoenix.lightlink.io/address/0xb568f9Bc0dcE39B9B64e843bC19DA102B5E3E939) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x17c4f98c40e69a6A0D5c42B11E3733f076A99E20](https://phoenix.lightlink.io/address/0x17c4f98c40e69a6A0D5c42B11E3733f076A99E20) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x49d753422ff05daa291A9efa383E4f57daEAd889](https://phoenix.lightlink.io/address/0x49d753422ff05daa291A9efa383E4f57daEAd889) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xda55fB3E53b7d205e37B6bdCe990b789255e4302](https://phoenix.lightlink.io/address/0xda55fB3E53b7d205e37B6bdCe990b789255e4302) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0xb568f9Bc0dcE39B9B64e843bC19DA102B5E3E939](https://phoenix.lightlink.io/address/0xb568f9Bc0dcE39B9B64e843bC19DA102B5E3E939) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x3eb9F8f80354a157315Fce64990C554434690c2f](https://phoenix.lightlink.io/address/0x3eb9F8f80354a157315Fce64990C554434690c2f) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0xdB07a1749D5Ca49909C7C4159652Fbd527c735B8](https://phoenix.lightlink.io/address/0xdB07a1749D5Ca49909C7C4159652Fbd527c735B8) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x3eb9F8f80354a157315Fce64990C554434690c2f](https://phoenix.lightlink.io/address/0x3eb9F8f80354a157315Fce64990C554434690c2f) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0xdB07a1749D5Ca49909C7C4159652Fbd527c735B8](https://phoenix.lightlink.io/address/0xdB07a1749D5Ca49909C7C4159652Fbd527c735B8) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ### Optimism #### Core -| Contract | Address | Deployment | -| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x4b45090152a5731b5bc71b5baF71E60e05B33867](https://optimistic.etherscan.io/address/0x4b45090152a5731b5bc71b5baF71E60e05B33867) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xd6920c1094eABC4b71f3dC411A1566f64f4c206e](https://optimistic.etherscan.io/address/0xd6920c1094eABC4b71f3dC411A1566f64f4c206e) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xF5050c04425E639C647F5ED632218b16ce96694d](https://optimistic.etherscan.io/address/0xF5050c04425E639C647F5ED632218b16ce96694d) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10](https://optimistic.etherscan.io/address/0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x4b45090152a5731b5bc71b5baF71E60e05B33867](https://optimistic.etherscan.io/address/0x4b45090152a5731b5bc71b5baF71E60e05B33867) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xd6920c1094eABC4b71f3dC411A1566f64f4c206e](https://optimistic.etherscan.io/address/0xd6920c1094eABC4b71f3dC411A1566f64f4c206e) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xF5050c04425E639C647F5ED632218b16ce96694d](https://optimistic.etherscan.io/address/0xF5050c04425E639C647F5ED632218b16ce96694d) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10](https://optimistic.etherscan.io/address/0x1EECb6e6EaE6a1eD1CCB4323F3a146A7C5443A10) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x8145429538dDBdDc4099B2bAfd24DD8958fa03b8](https://optimistic.etherscan.io/address/0x8145429538dDBdDc4099B2bAfd24DD8958fa03b8) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x044EC80FbeC40f0eE7E7b3856828170971796C19](https://optimistic.etherscan.io/address/0x044EC80FbeC40f0eE7E7b3856828170971796C19) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x8145429538dDBdDc4099B2bAfd24DD8958fa03b8](https://optimistic.etherscan.io/address/0x8145429538dDBdDc4099B2bAfd24DD8958fa03b8) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x044EC80FbeC40f0eE7E7b3856828170971796C19](https://optimistic.etherscan.io/address/0x044EC80FbeC40f0eE7E7b3856828170971796C19) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Polygon #### Core -| Contract | Address | Deployment | -| :--------------------- | :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x5f0e1dea4A635976ef51eC2a2ED41490d1eBa003](https://polygonscan.com/address/0x5f0e1dea4A635976ef51eC2a2ED41490d1eBa003) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xB194c7278C627D52E440316b74C5F24FC70c1565](https://polygonscan.com/address/0xB194c7278C627D52E440316b74C5F24FC70c1565) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x8683da9DF8c5c3528e8251a5764EC7DAc7264795](https://polygonscan.com/address/0x8683da9DF8c5c3528e8251a5764EC7DAc7264795) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E](https://polygonscan.com/address/0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x5f0e1dea4A635976ef51eC2a2ED41490d1eBa003](https://polygonscan.com/address/0x5f0e1dea4A635976ef51eC2a2ED41490d1eBa003) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xB194c7278C627D52E440316b74C5F24FC70c1565](https://polygonscan.com/address/0xB194c7278C627D52E440316b74C5F24FC70c1565) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x8683da9DF8c5c3528e8251a5764EC7DAc7264795](https://polygonscan.com/address/0x8683da9DF8c5c3528e8251a5764EC7DAc7264795) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E](https://polygonscan.com/address/0x9761692EDf10F5F2A69f0150e2fd50dcecf05F2E) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x5865C73789C4496665eDE1CAF018dc52ac248598](https://polygonscan.com/address/0x5865C73789C4496665eDE1CAF018dc52ac248598) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0xF4906225e783fb8977410BDBFb960caBed6C2EF4](https://polygonscan.com/address/0xF4906225e783fb8977410BDBFb960caBed6C2EF4) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x5865C73789C4496665eDE1CAF018dc52ac248598](https://polygonscan.com/address/0x5865C73789C4496665eDE1CAF018dc52ac248598) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0xF4906225e783fb8977410BDBFb960caBed6C2EF4](https://polygonscan.com/address/0xF4906225e783fb8977410BDBFb960caBed6C2EF4) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Scroll #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x57e14AB4DAd920548899d86B54AD47Ea27F00987](https://scrollscan.com/address/0x57e14AB4DAd920548899d86B54AD47Ea27F00987) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xAaff2D11f9e7Cd2A9cDC674931fAC0358a165995](https://scrollscan.com/address/0xAaff2D11f9e7Cd2A9cDC674931fAC0358a165995) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xB71440B85172332E8B768e85EdBfdb34CB457c1c](https://scrollscan.com/address/0xB71440B85172332E8B768e85EdBfdb34CB457c1c) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b](https://scrollscan.com/address/0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x57e14AB4DAd920548899d86B54AD47Ea27F00987](https://scrollscan.com/address/0x57e14AB4DAd920548899d86B54AD47Ea27F00987) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xAaff2D11f9e7Cd2A9cDC674931fAC0358a165995](https://scrollscan.com/address/0xAaff2D11f9e7Cd2A9cDC674931fAC0358a165995) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xB71440B85172332E8B768e85EdBfdb34CB457c1c](https://scrollscan.com/address/0xB71440B85172332E8B768e85EdBfdb34CB457c1c) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b](https://scrollscan.com/address/0x859708495E3B3c61Bbe19e6E3E1F41dE3A5C5C5b) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xD18faa233E02d41EDFFdb64f20281dE0592FA3b5](https://scrollscan.com/address/0xD18faa233E02d41EDFFdb64f20281dE0592FA3b5) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0xb3ade5463000E6c0D376e7d7570f372eBf98BDAf](https://scrollscan.com/address/0xb3ade5463000E6c0D376e7d7570f372eBf98BDAf) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xD18faa233E02d41EDFFdb64f20281dE0592FA3b5](https://scrollscan.com/address/0xD18faa233E02d41EDFFdb64f20281dE0592FA3b5) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0xb3ade5463000E6c0D376e7d7570f372eBf98BDAf](https://scrollscan.com/address/0xb3ade5463000E6c0D376e7d7570f372eBf98BDAf) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### zkSync Era #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x2FcA69fa0a318EFDf4c15eE8F13A873347a8A8D4](https://era.zksync.network/address/0x2FcA69fa0a318EFDf4c15eE8F13A873347a8A8D4) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xE6c7324BEA8474209103e407779Eec600c07cF3F](https://era.zksync.network/address/0xE6c7324BEA8474209103e407779Eec600c07cF3F) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xf12d2B8ff4Fc0495Db9c6d16b6a03bff9a10657A](https://era.zksync.network/address/0xf12d2B8ff4Fc0495Db9c6d16b6a03bff9a10657A) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0xD05bdb4cF6Be7D647c5FEcC7952660bdD82cE44C](https://era.zksync.network/address/0xD05bdb4cF6Be7D647c5FEcC7952660bdD82cE44C) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x2FcA69fa0a318EFDf4c15eE8F13A873347a8A8D4](https://era.zksync.network/address/0x2FcA69fa0a318EFDf4c15eE8F13A873347a8A8D4) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xE6c7324BEA8474209103e407779Eec600c07cF3F](https://era.zksync.network/address/0xE6c7324BEA8474209103e407779Eec600c07cF3F) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xf12d2B8ff4Fc0495Db9c6d16b6a03bff9a10657A](https://era.zksync.network/address/0xf12d2B8ff4Fc0495Db9c6d16b6a03bff9a10657A) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0xD05bdb4cF6Be7D647c5FEcC7952660bdD82cE44C](https://era.zksync.network/address/0xD05bdb4cF6Be7D647c5FEcC7952660bdD82cE44C) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x37A20Fb12DD6e0ADA47B327C0466A231dDc4504A](https://era.zksync.network/address/0x37A20Fb12DD6e0ADA47B327C0466A231dDc4504A) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0x46DE683D20c3575A0381fFd66C10Ab6836390140](https://era.zksync.network/address/0x46DE683D20c3575A0381fFd66C10Ab6836390140) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x37A20Fb12DD6e0ADA47B327C0466A231dDc4504A](https://era.zksync.network/address/0x37A20Fb12DD6e0ADA47B327C0466A231dDc4504A) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0x46DE683D20c3575A0381fFd66C10Ab6836390140](https://era.zksync.network/address/0x46DE683D20c3575A0381fFd66C10Ab6836390140) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ## Testnets @@ -246,124 +246,124 @@ This is an outdated version of the Sablier protocol. See the latest version [her #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x483bdd560dE53DC20f72dC66ACdB622C5075de34](https://sepolia.arbiscan.io/address/0x483bdd560dE53DC20f72dC66ACdB622C5075de34) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0x8c8102b92B1f31cC304A085D490796f4DfdF7aF3](https://sepolia.arbiscan.io/address/0x8c8102b92B1f31cC304A085D490796f4DfdF7aF3) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x593050f0360518C3A4F11c32Eb936146e1096FD1](https://sepolia.arbiscan.io/address/0x593050f0360518C3A4F11c32Eb936146e1096FD1) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9](https://sepolia.arbiscan.io/address/0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x483bdd560dE53DC20f72dC66ACdB622C5075de34](https://sepolia.arbiscan.io/address/0x483bdd560dE53DC20f72dC66ACdB622C5075de34) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0x8c8102b92B1f31cC304A085D490796f4DfdF7aF3](https://sepolia.arbiscan.io/address/0x8c8102b92B1f31cC304A085D490796f4DfdF7aF3) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x593050f0360518C3A4F11c32Eb936146e1096FD1](https://sepolia.arbiscan.io/address/0x593050f0360518C3A4F11c32Eb936146e1096FD1) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9](https://sepolia.arbiscan.io/address/0xA6A0cfA3442053fbB516D55205A749Ef2D33aed9) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x72D921E579aB7FC5D19CD398B6be24d626Ccb6e7](https://sepolia.arbiscan.io/address/0x72D921E579aB7FC5D19CD398B6be24d626Ccb6e7) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0xcc87b1A4de285832f226BD585bd54a2184D32105](https://sepolia.arbiscan.io/address/0xcc87b1A4de285832f226BD585bd54a2184D32105) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x72D921E579aB7FC5D19CD398B6be24d626Ccb6e7](https://sepolia.arbiscan.io/address/0x72D921E579aB7FC5D19CD398B6be24d626Ccb6e7) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0xcc87b1A4de285832f226BD585bd54a2184D32105](https://sepolia.arbiscan.io/address/0xcc87b1A4de285832f226BD585bd54a2184D32105) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Base Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xbd7AAA2984c0a887E93c66baae222749883763d3](https://sepolia.basescan.org/address/0xbd7AAA2984c0a887E93c66baae222749883763d3) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xF46d5fA9bFC964E8d06846c8739AEc69BC06344d](https://sepolia.basescan.org/address/0xF46d5fA9bFC964E8d06846c8739AEc69BC06344d) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xb2b4b1E69B16411AEBD30c8EA5aB395E13069160](https://sepolia.basescan.org/address/0xb2b4b1E69B16411AEBD30c8EA5aB395E13069160) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0x90b1C663314cFb55c8FF6f9a50a8D57a2D83a664](https://sepolia.basescan.org/address/0x90b1c663314cfb55c8ff6f9a50a8d57a2d83a664) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xbd7AAA2984c0a887E93c66baae222749883763d3](https://sepolia.basescan.org/address/0xbd7AAA2984c0a887E93c66baae222749883763d3) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xF46d5fA9bFC964E8d06846c8739AEc69BC06344d](https://sepolia.basescan.org/address/0xF46d5fA9bFC964E8d06846c8739AEc69BC06344d) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xb2b4b1E69B16411AEBD30c8EA5aB395E13069160](https://sepolia.basescan.org/address/0xb2b4b1E69B16411AEBD30c8EA5aB395E13069160) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0x90b1C663314cFb55c8FF6f9a50a8D57a2D83a664](https://sepolia.basescan.org/address/0x90b1c663314cfb55c8ff6f9a50a8d57a2d83a664) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xbD636B8EF09760aC91f6Df3c6AC5531250420200](https://sepolia.basescan.org/address/0xbD636B8EF09760aC91f6Df3c6AC5531250420200) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0xf632521bbAb0dBC2bEf169865e6c8e285AFe0a42](https://sepolia.basescan.org/address/0xf632521bbAb0dBC2bEf169865e6c8e285AFe0a42) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xbD636B8EF09760aC91f6Df3c6AC5531250420200](https://sepolia.basescan.org/address/0xbD636B8EF09760aC91f6Df3c6AC5531250420200) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0xf632521bbAb0dBC2bEf169865e6c8e285AFe0a42](https://sepolia.basescan.org/address/0xf632521bbAb0dBC2bEf169865e6c8e285AFe0a42) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ### Blast Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------ | -| SablierV2LockupLinear | [0xe31Ac61c7762930625D4700D7ea9282B7E57b816](https://testnet.blastscan.io/address/0xe31Ac61c7762930625D4700D7ea9282B7E57b816) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | -| SablierV2LockupDynamic | [0x8aB55a8E046634D5AD87f64d65C1E96275e48712](https://testnet.blastscan.io/address/0x8aB55a8E046634D5AD87f64d65C1E96275e48712) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | -| SablierV2NFTDescriptor | [0x1e7217Aa198A17F79cc45aB5C90277Ff1d18b5DB](https://testnet.blastscan.io/address/0x1e7217Aa198A17F79cc45aB5C90277Ff1d18b5DB) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | -| SablierV2Comptroller | [0x9e216126115AFcdA9531232D3B735731905B4DC4](https://testnet.blastscan.io/address/0x9e216126115AFcdA9531232D3B735731905B4DC4) | [core-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xe31Ac61c7762930625D4700D7ea9282B7E57b816](https://testnet.blastscan.io/address/0xe31Ac61c7762930625D4700D7ea9282B7E57b816) | [core-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | +| SablierV2LockupDynamic | [0x8aB55a8E046634D5AD87f64d65C1E96275e48712](https://testnet.blastscan.io/address/0x8aB55a8E046634D5AD87f64d65C1E96275e48712) | [core-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | +| SablierV2NFTDescriptor | [0x1e7217Aa198A17F79cc45aB5C90277Ff1d18b5DB](https://testnet.blastscan.io/address/0x1e7217Aa198A17F79cc45aB5C90277Ff1d18b5DB) | [core-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | +| SablierV2Comptroller | [0x9e216126115AFcdA9531232D3B735731905B4DC4](https://testnet.blastscan.io/address/0x9e216126115AFcdA9531232D3B735731905B4DC4) | [core-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x72D91DB141fd38eD5DDc0D4b00BdDd2A17Cf6D55](https://testnet.blastscan.io/address/0x72D91DB141fd38eD5DDc0D4b00BdDd2A17Cf6D55) | [periphery-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | -| SablierV2MerkleStreamerFactory | [0x6F147f9A251A1F004A1d043b8E486aAb00A49cef](https://testnet.blastscan.io/address/0x6F147f9A251A1F004A1d043b8E486aAb00A49cef) | [periphery-blast](https://github.com/sablier-labs/v2-deployments/tree/chain/blast/blast/testnet) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | +| SablierV2Batch | [0x72D91DB141fd38eD5DDc0D4b00BdDd2A17Cf6D55](https://testnet.blastscan.io/address/0x72D91DB141fd38eD5DDc0D4b00BdDd2A17Cf6D55) | [periphery-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | +| SablierV2MerkleStreamerFactory | [0x6F147f9A251A1F004A1d043b8E486aAb00A49cef](https://testnet.blastscan.io/address/0x6F147f9A251A1F004A1d043b8E486aAb00A49cef) | [periphery-blast](https://github.com/sablier-labs/deployments/tree/chain/blast/blast/testnet) | ### Optimism Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xe59D28bEF2D37E99b93E734ed1dDcFc4B9C1bf73](https://sepolia-optimistic.etherscan.io/address/0xe59D28bEF2D37E99b93E734ed1dDcFc4B9C1bf73) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xf9e4095C1dfC058B34135C5c48cae66a8D2b3Aa5](https://sepolia-optimistic.etherscan.io/address/0xf9e4095C1dfC058B34135C5c48cae66a8D2b3Aa5) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0x3590f54c5d3d83BA68c17cF5C28DB89C5d1DfA10](https://sepolia-optimistic.etherscan.io/address/0x3590f54c5d3d83BA68c17cF5C28DB89C5d1DfA10) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0x6587166c4F4E0b6203549463EbAB4dBeFA63fd8f](https://sepolia-optimistic.etherscan.io/address/0x6587166c4F4E0b6203549463EbAB4dBeFA63fd8f) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xe59D28bEF2D37E99b93E734ed1dDcFc4B9C1bf73](https://sepolia-optimistic.etherscan.io/address/0xe59D28bEF2D37E99b93E734ed1dDcFc4B9C1bf73) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xf9e4095C1dfC058B34135C5c48cae66a8D2b3Aa5](https://sepolia-optimistic.etherscan.io/address/0xf9e4095C1dfC058B34135C5c48cae66a8D2b3Aa5) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0x3590f54c5d3d83BA68c17cF5C28DB89C5d1DfA10](https://sepolia-optimistic.etherscan.io/address/0x3590f54c5d3d83BA68c17cF5C28DB89C5d1DfA10) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0x6587166c4F4E0b6203549463EbAB4dBeFA63fd8f](https://sepolia-optimistic.etherscan.io/address/0x6587166c4F4E0b6203549463EbAB4dBeFA63fd8f) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x65D3A5b99372ef59E741EE768443dF884aB56E0b](https://sepolia-optimistic.etherscan.io/address/0x65D3A5b99372ef59E741EE768443dF884aB56E0b) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0x9b6cC73522f22Ad3f2F8187e892A51b95f1A0E8a](https://sepolia-optimistic.etherscan.io/address/0x9b6cC73522f22Ad3f2F8187e892A51b95f1A0E8a) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x65D3A5b99372ef59E741EE768443dF884aB56E0b](https://sepolia-optimistic.etherscan.io/address/0x65D3A5b99372ef59E741EE768443dF884aB56E0b) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0x9b6cC73522f22Ad3f2F8187e892A51b95f1A0E8a](https://sepolia-optimistic.etherscan.io/address/0x9b6cC73522f22Ad3f2F8187e892A51b95f1A0E8a) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | ### Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0x7a43F8a888fa15e68C103E18b0439Eb1e98E4301](https://sepolia.etherscan.io/address/0x7a43F8a888fa15e68C103E18b0439Eb1e98E4301) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xc9940AD8F43aAD8e8f33A4D5dbBf0a8F7FF4429A](https://sepolia.etherscan.io/address/0xc9940AD8F43aAD8e8f33A4D5dbBf0a8F7FF4429A) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xE8fFEbA8963CD9302ffD39c704dc2c027128D36F](https://sepolia.etherscan.io/address/0xE8fFEbA8963CD9302ffD39c704dc2c027128D36F) | [core-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.1) | -| SablierV2Comptroller | [0x2006d43E65e66C5FF20254836E63947FA8bAaD68](https://sepolia.etherscan.io/address/0x2006d43E65e66C5FF20254836E63947FA8bAaD68) | [core-v1.0.0](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.0.0) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0x7a43F8a888fa15e68C103E18b0439Eb1e98E4301](https://sepolia.etherscan.io/address/0x7a43F8a888fa15e68C103E18b0439Eb1e98E4301) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xc9940AD8F43aAD8e8f33A4D5dbBf0a8F7FF4429A](https://sepolia.etherscan.io/address/0xc9940AD8F43aAD8e8f33A4D5dbBf0a8F7FF4429A) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xE8fFEbA8963CD9302ffD39c704dc2c027128D36F](https://sepolia.etherscan.io/address/0xE8fFEbA8963CD9302ffD39c704dc2c027128D36F) | [core-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/core) | +| SablierV2Comptroller | [0x2006d43E65e66C5FF20254836E63947FA8bAaD68](https://sepolia.etherscan.io/address/0x2006d43E65e66C5FF20254836E63947FA8bAaD68) | [core-v1.0.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.0.0/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xd2569DC4A58dfE85d807Dffb976dbC0a3bf0B0Fb](https://sepolia.etherscan.io/address/0xd2569DC4A58dfE85d807Dffb976dbC0a3bf0B0Fb) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0xBacC1d151A78eeD71D504f701c25E8739DC0262D](https://sepolia.etherscan.io/address/0xBacC1d151A78eeD71D504f701c25E8739DC0262D) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xd2569DC4A58dfE85d807Dffb976dbC0a3bf0B0Fb](https://sepolia.etherscan.io/address/0xd2569DC4A58dfE85d807Dffb976dbC0a3bf0B0Fb) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0xBacC1d151A78eeD71D504f701c25E8739DC0262D](https://sepolia.etherscan.io/address/0xBacC1d151A78eeD71D504f701c25E8739DC0262D) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### Taiko Hekla #### Core -| Contract | Address | Deployment | -| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://explorer.hekla.taiko.xyz/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xDf578C2c70A86945999c65961417057363530a1c](https://explorer.hekla.taiko.xyz/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://explorer.hekla.taiko.xyz/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://explorer.hekla.taiko.xyz/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xcb099EfC90e88690e287259410B9AE63e1658CC6](https://explorer.hekla.taiko.xyz/address/0xcb099EfC90e88690e287259410B9AE63e1658CC6) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xDf578C2c70A86945999c65961417057363530a1c](https://explorer.hekla.taiko.xyz/address/0xDf578C2c70A86945999c65961417057363530a1c) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2](https://explorer.hekla.taiko.xyz/address/0xCff4a803b0Bf55dD1BE38Fb96088478F3D2eeCF2) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0x2De92156000269fa2fde7544F10f01E8cBC80fFa](https://explorer.hekla.taiko.xyz/address/0x2De92156000269fa2fde7544F10f01E8cBC80fFa) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0xd641a0E4509Cced67cC24E7BDcDe2a31b7F7cF77](https://explorer.hekla.taiko.xyz/address/0xd641a0E4509Cced67cC24E7BDcDe2a31b7F7cF77) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | -| SablierV2MerkleStreamerFactory | [0x29a8d9F67608d77D0B4544A70FC2ab80BA5525f5](https://explorer.hekla.taiko.xyz/address/0x29a8d9F67608d77D0B4544A70FC2ab80BA5525f5) | [periphery-v1.1.0](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.0) | +| Contract | Address | Deployment | +| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0xd641a0E4509Cced67cC24E7BDcDe2a31b7F7cF77](https://explorer.hekla.taiko.xyz/address/0xd641a0E4509Cced67cC24E7BDcDe2a31b7F7cF77) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | +| SablierV2MerkleStreamerFactory | [0x29a8d9F67608d77D0B4544A70FC2ab80BA5525f5](https://explorer.hekla.taiko.xyz/address/0x29a8d9F67608d77D0B4544A70FC2ab80BA5525f5) | [periphery-v1.1.0](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.0/periphery) | ### zkSync Sepolia #### Core -| Contract | Address | Deployment | -| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- | -| SablierV2LockupLinear | [0xdFC6F5D327dcF5DB579eC1b47fb260F93e042409](https://sepolia-era.zksync.network/address/0xdFC6F5D327dcF5DB579eC1b47fb260F93e042409) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2LockupDynamic | [0xe101C69A6f9c071Ab79aEE0be56928565962F56d](https://sepolia-era.zksync.network/address/0xe101C69A6f9c071Ab79aEE0be56928565962F56d) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2NFTDescriptor | [0xABF4a24519c9A3c68a354FD6d5D4429De0A0D36C](https://sepolia-era.zksync.network/address/0xABF4a24519c9A3c68a354FD6d5D4429De0A0D36C) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | -| SablierV2Comptroller | [0xEB4570723ae207a0473D73B3c2B255b0D5Ec9f01](https://sepolia-era.zksync.network/address/0xEB4570723ae207a0473D73B3c2B255b0D5Ec9f01) | [core-v1.1.2](https://github.com/sablier-labs/v2-deployments/tree/main/core/v1.1.2) | +| Contract | Address | Deployment | +| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------- | +| SablierV2LockupLinear | [0xdFC6F5D327dcF5DB579eC1b47fb260F93e042409](https://sepolia-era.zksync.network/address/0xdFC6F5D327dcF5DB579eC1b47fb260F93e042409) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2LockupDynamic | [0xe101C69A6f9c071Ab79aEE0be56928565962F56d](https://sepolia-era.zksync.network/address/0xe101C69A6f9c071Ab79aEE0be56928565962F56d) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2NFTDescriptor | [0xABF4a24519c9A3c68a354FD6d5D4429De0A0D36C](https://sepolia-era.zksync.network/address/0xABF4a24519c9A3c68a354FD6d5D4429De0A0D36C) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | +| SablierV2Comptroller | [0xEB4570723ae207a0473D73B3c2B255b0D5Ec9f01](https://sepolia-era.zksync.network/address/0xEB4570723ae207a0473D73B3c2B255b0D5Ec9f01) | [core-v1.1.2](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.2/core) | #### Periphery -| Contract | Address | Deployment | -| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | -| SablierV2Batch | [0x5F812F1332A2294149b9e1cBd216a5eED12cEbDD](https://sepolia-era.zksync.network/address/0x5F812F1332A2294149b9e1cBd216a5eED12cEbDD) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | -| SablierV2MerkleStreamerFactory | [0xd9a834135c816FFd133a411a36219aAFD190fF97](https://sepolia-era.zksync.network/address/0xd9a834135c816FFd133a411a36219aAFD190fF97) | [periphery-v1.1.1](https://github.com/sablier-labs/v2-deployments/tree/main/periphery/v1.1.1) | +| Contract | Address | Deployment | +| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| SablierV2Batch | [0x5F812F1332A2294149b9e1cBd216a5eED12cEbDD](https://sepolia-era.zksync.network/address/0x5F812F1332A2294149b9e1cBd216a5eED12cEbDD) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | +| SablierV2MerkleStreamerFactory | [0xd9a834135c816FFd133a411a36219aAFD190fF97](https://sepolia-era.zksync.network/address/0xd9a834135c816FFd133a411a36219aAFD190fF97) | [periphery-v1.1.1](https://github.com/sablier-labs/deployments/blob/main/lockup/v1.1.1/periphery) | diff --git a/docs/reference/01-overview.md b/docs/reference/01-overview.md new file mode 100644 index 00000000..dccc17e0 --- /dev/null +++ b/docs/reference/01-overview.md @@ -0,0 +1,81 @@ +--- +id: "overview" +sidebar_position: 1 +title: "Overview" +--- + +Both Lockup and Flow contracts are a binary smart contract system comprised of many contracts, libraries, and types. + +Although Flow is a separate protocol, it shares many similarities with Lockup. One key difference between the two is +that Flow consists of a single contract whereas Lockup consists of multiple contracts. The Lockup contracts are divided +into two categories: + +- **Lockup Core** provides the fundamental token distribution logic of the Lockup protocol. It contains LockupLinear, + LockupDynamic, and LockupTranched, the primary contracts that users will interact with. +- **Lockup Periphery** contracts interact with one or more Lockup Core contracts but are not part of the Lockup Core. + They are an abstraction layer that enhance the security and the extensibility of the protocol without introducing + upgradeability. Lockup Periphery plays a key role in creating Airstream campaigns. + +Given the permissionless nature of the Lockup protocol, the Periphery has no special privileges and is only a fraction +of possible periphery-like contracts. Users maintain the liberty to establish streams via the Core directly. + +The design of the Sablier smart contracts draws inspiration from the architectural principles of +[Uniswap](https://docs.uniswap.org/). + +## Lockup Core + +> [**Core Source Code**](https://github.com/sablier-labs/v2-core/tree/v1.2.0) + +Core consists of the distribution contracts (LockupLinear, LockupDynamic and LockupTranched), and an NFT descriptor. + +### LockupLinear + +> [**LockupLinear Reference**](./lockup/core/contract.SablierV2LockupLinear) + +Creates and manages Lockup streams with a linear streaming function. + +### LockupDynamic + +> [**LockupDynamic Reference**](./lockup/core/contract.SablierV2LockupDynamic) + +Creates and manages Lockup streams with dynamic streaming functions. + +### LockupTranched + +> [**LockupTranched Reference**](./lockup/core/contract.SablierV2LockupTranched) + +Creates and manages Lockup streams with tranches. + +### NFTDescriptor + +> [**NFTDescriptor Reference**](./lockup/core/contract.SablierV2NFTDescriptor) + +Generates the URI describing the Sablier Lockup stream NFTs. + +## Lockup Periphery + +> [**Periphery Source Code**](https://github.com/sablier-labs/v2-periphery/tree/v1.2.0) + +The Periphery is a collection of contracts meant to make the Lockup protocol more modular while introducing +functionalities such as [Airstreams](/concepts/lockup/airstreams). It consists of BatchLockup and Airstream related +contracts (such as MerkleLockupFactory, MerkleLL and MerkleLT). + +### BatchLockup + +> [**BatchLockup Reference**](./lockup/periphery/contract.SablierV2BatchLockup) + +### MerkleLockupFactory + +> [**MerkleLockupFactory Reference**](./lockup/periphery/contract.SablierV2MerkleLockupFactory) + +### MerkleLockupLL + +> [**MerkleLockupLL Reference**](./lockup/periphery/contract.SablierV2MerkleLL) + +### MerkleLockupLT + +> [**MerkleLockupLT Reference**](./lockup/periphery/contract.SablierV2MerkleLT) + +## Flow + +Coming soon. diff --git a/docs/contracts/v2/reference/06-errors.md b/docs/reference/05-errors.md similarity index 66% rename from docs/contracts/v2/reference/06-errors.md rename to docs/reference/05-errors.md index 6ea722f6..8709c978 100644 --- a/docs/contracts/v2/reference/06-errors.md +++ b/docs/reference/05-errors.md @@ -1,12 +1,12 @@ --- id: "errors" -sidebar_position: 6 +sidebar_position: 5 title: "Errors" --- ## Background -Sablier handles errors with the convenient and gas-efficient +Sablier protocols handle errors with the convenient and gas-efficient [custom error syntax](https://blog.soliditylang.org/2021/04/21/custom-errors) introduced in Solidity v0.8.4. The error data encoding is identical to the ABI encoding used for functions, e.g.: @@ -24,22 +24,26 @@ bytes4(keccak256(bytes("SablierV2Lockup_Unauthorized(address,uint256)"))) ## Naming Pattern -With the exception of a few generics, all errors in Sablier V2 adhere to the naming pattern -`SablierV2_`. +With the exception of a few generics, all errors in Sablier protocols adhere to the naming pattern +`_`. Incorporating the contract name as a prefix offers context, making it easier for end users to pinpoint the contract responsible for a reverted transaction. This approach is particularly helpful for complex transactions involving multiple contracts. -## Error List +## Lockup Error List ### Core -[Click here](core/libraries/library.Errors) to see the full error list in V2 Core. +[Click here](lockup/core/libraries/library.Errors) to see the full error list in Lockup Core. ### Periphery -[Click here](periphery/libraries/library.Errors) to see the full error list in V2 Periphery. +[Click here](lockup/periphery/libraries/library.Errors) to see the full error list in Lockup Periphery. + +## Flow Error List + +[Click here](flow/contracts/libraries/library.Errors) to see the full error list in Flow. ## Resources diff --git a/docs/reference/flow/01-diagrams.md b/docs/reference/flow/01-diagrams.md new file mode 100644 index 00000000..98902386 --- /dev/null +++ b/docs/reference/flow/01-diagrams.md @@ -0,0 +1,166 @@ +--- +id: "diagrams" +sidebar_position: 1 +title: "Diagrams" +--- + +## Abbreviations + +| Abbreviation | Full name | Description | +| ------------ | --------------- | ----------------------------------------------------------- | +| bal | Stream balance | Balance of the stream | +| cd | Covered debt | Portion of the total debt covered by the stream balance | +| elt | Elapsed time | Time elapsed in seconds since the last snapshot | +| od | Ongoing debt | Debt accumulated since the last snapshot | +| now | Current time | Same as `block.timestamps` | +| rps | Rate per second | Rate at which tokens are streamed per second | +| sd | Snapshot debt | Debt accumulated until the last snapshot | +| st | Snapshot time | Time of the last snapshot | +| td | Total debt | Sum of sd and od, also same as sum of cd and ud | +| ud | Uncovered debt | Portion of the total debt not covered by the stream balance | + +## Flow Storage Layout + +Each Flow contract is a singleton that stores all streams created by that contract's users. The following diagrams +provide insight into the storage layout. To see the list of all storage variables, +[click here](/reference/flow/contracts/types/library.Flow#structs). + +```mermaid +flowchart LR + storage[(Storage)] + bal([bal]) + rps([rps]) + sd([sd]) + st([st]) + + storage --> bal + storage --> rps + storage --> sd + storage --> st +``` + +## Token Flows + +The following three functions lead to tokens flow in and out of a stream: + +### Deposit + +Anyone can deposit into a stream. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> Flow: deposit() + Anyone -->> Flow: Transfer tokens +``` + +### Refund + +Only sender can refund from the stream that he created. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: refund() + Flow -->> Sender: Transfer unstreamed tokens +``` + +### Withdraw + +Anyone can call withdraw on a stream as long as `to` address matches the recipient. If recipient/operator is calling +withdraw on a stream, they can choose to withdraw to any address. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> Flow: withdraw() + activate Flow + Create actor Recipient + Flow -->> Recipient: Transfer streamed tokens + deactivate Flow + + Recipient ->> Flow: withdraw() + activate Flow + Create actor toAddress + Flow -->> toAddress: Transfer streamed tokens + deactivate Flow +``` + +## Debts + +### Covered debt + +```mermaid +flowchart TD + di0{ }:::blue0 + di1{ }:::blue0 + cd([cd]) + res_0([0 ]) + res_bal([bal]) + res_sum([td]) + + + cd --> di0 + di0 -- "bal = 0" --> res_0 + di0 -- "bal > 0" --> di1 + di1 -- "ud > 0" --> res_bal + di1 -- "ud = 0" --> res_sum +``` + +### Ongoing Debt + +```mermaid +flowchart TD +rca([od]) +di0{ } +di1{ } +res_00([0 ]) +res_01([0 ]) +res_rca(["rps ⋅ elt"]) + +rca --> di0 +di0 -- "rps > 0" --> di1 +di0 -- "rps == 0" --> res_00 +di1 -- "now <= st" --> res_01 +di1 -- "now > st" --> res_rca +``` + +### Uncovered Debt + +```mermaid +flowchart TD + di0{ }:::red1 + sd([ud]) + res_sd(["td - bal"]) + res_zero([0]) + + sd --> di0 + di0 -- "bal < td" --> res_sd + di0 -- "bal >= td" --> res_zero +``` + +### Total Debt + +```mermaid +flowchart TD +rca([td]) +di0{ } +res_00([sd ]) +res_01(["sd + od"]) + +rca --> di0 +di0 -- "rps == 0" --> res_00 +di0 -- "rps > 0" --> res_01 +``` + +## Refundable Amount + +```mermaid + flowchart TD + ra([Refundable Amount]) + res_ra([bal - cd]) + ra --> res_ra +``` diff --git a/docs/reference/flow/03-access-control.md b/docs/reference/flow/03-access-control.md new file mode 100644 index 00000000..5e0b6235 --- /dev/null +++ b/docs/reference/flow/03-access-control.md @@ -0,0 +1,154 @@ +--- +id: "access-control" +sidebar_position: 3 +title: "Access Control" +--- + +With the exception of the [admin functions](/concepts/governance#flow), all functionalities in Flow can only be +triggered by users. The Protocol Admin has no control over any stream or any part of the protocol. + +This article will provide a comprehensive overview of the actions that can be performed on streams once they are +created, as well as the corresponding user permissions for each action. + +:::note + +Every stream has a sender and a recipient. Recipients can approve third parties to take actions on their behalf. An +'public' caller is any address outside of sender and recipient. + +::: + +## Overview + +The table below offers a quick overview of the access control for each action that can be performed on a stream. + +| Action | Sender | Recipient / Approved third party | Public | +| ----------------------- | :----: | :------------------------------: | :----: | +| AdjustRatePerSecond | ✅ | ❌ | ❌ | +| Deposit | ✅ | ✅ | ✅ | +| Pause | ✅ | ❌ | ❌ | +| Refund | ✅ | ❌ | ❌ | +| Restart | ✅ | ❌ | ❌ | +| Transfer NFT | ❌ | ✅ | ❌ | +| Withdraw to any address | ❌ | ✅ | ❌ | +| Withdraw to recipient | ✅ | ✅ | ✅ | +| Void | ✅ | ✅ | ❌ | + +## Adjust rate per second + +Only the sender can adjust the rate per second of a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: adjustRatePerSecond() + Flow -->> Flow: update rps +``` + +## Create stream + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: create() + Create actor Recipient + Flow -->> Recipient: mint NFT +``` + +## Deposit into a stream + +Anyone can deposit into a stream. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> ERC20: approve() + Anyone ->> Flow: deposit() + Flow ->> ERC20: transferFrom() + Anyone -->> Flow: Transfer tokens +``` + +## Pause + +Only the sender can pause a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: pause() + Flow -->> Flow: set rps = 0 +``` + +## Refund from a stream + +Only the sender can refund from a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: refund() + Flow ->> ERC20: transfer() + Flow -->> Sender: Transfer unstreamed tokens +``` + +## Restarting a stream + +Only the sender can restart a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Flow: restart() + Flow -->> Flow: set rps > 0 +``` + +## Voiding a stream + +Both Sender and Recipient can void a stream. + +```mermaid + sequenceDiagram + actor Sender + + Sender ->> Flow: void() + activate Flow + Flow -->> Flow: set rps = 0, + Flow -->> Flow: set st = now & sd = cd + deactivate Flow + + actor Recipient + Recipient ->> Flow: void() + activate Flow + Flow -->> Flow: set rps = 0 + Flow -->> Flow: set st = now & sd = cd + deactivate Flow +``` + +## Withdraw from a stream + +Anyone can call withdraw on a stream as long as `to` address matches the recipient. If recipient/operator is calling +withdraw on a stream, they can choose to withdraw to any address. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> Flow: withdraw() + activate Flow + Flow ->> ERC20: transfer() + Create actor Recipient + Flow -->> Recipient: Transfer tokens + deactivate Flow + + Recipient ->> Flow: withdraw() + activate Flow + Flow ->> ERC20: transfer() + Create actor Any Address + Flow -->> Any Address : Transfer tokens + deactivate Flow +``` diff --git a/docs/api/indexers/protocol/_category_.json b/docs/reference/flow/_category_.json similarity index 52% rename from docs/api/indexers/protocol/_category_.json rename to docs/reference/flow/_category_.json index 7c6d02d7..63b6c805 100644 --- a/docs/api/indexers/protocol/_category_.json +++ b/docs/reference/flow/_category_.json @@ -1,5 +1,5 @@ { "collapsed": false, - "label": "Indexer: Protocol-Envio", + "label": "Flow", "position": 3 } diff --git a/docs/contracts/v1/contracts/_category_.json b/docs/reference/flow/contracts/_category_.json similarity index 100% rename from docs/contracts/v1/contracts/_category_.json rename to docs/reference/flow/contracts/_category_.json diff --git a/docs/contracts/v2/reference/core/abstracts/abstract.Adminable.md b/docs/reference/flow/contracts/abstracts/abstract.Adminable.md similarity index 72% rename from docs/contracts/v2/reference/core/abstracts/abstract.Adminable.md rename to docs/reference/flow/contracts/abstracts/abstract.Adminable.md index b89d9ac0..04b6731e 100644 --- a/docs/contracts/v2/reference/core/abstracts/abstract.Adminable.md +++ b/docs/reference/flow/contracts/abstracts/abstract.Adminable.md @@ -1,10 +1,10 @@ # Adminable -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/abstracts/Adminable.sol) +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/abstracts/Adminable.sol) -**Inherits:** [IAdminable](/docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md) +**Inherits:** [IAdminable](/docs/reference/flow/contracts/interfaces/interface.IAdminable.md) -See the documentation in [IAdminable](/docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md). +See the documentation in [IAdminable](/docs/reference/flow/contracts/interfaces/interface.IAdminable.md). ## State Variables diff --git a/docs/reference/flow/contracts/abstracts/abstract.Batch.md b/docs/reference/flow/contracts/abstracts/abstract.Batch.md new file mode 100644 index 00000000..c42969d1 --- /dev/null +++ b/docs/reference/flow/contracts/abstracts/abstract.Batch.md @@ -0,0 +1,25 @@ +# Batch + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/abstracts/Batch.sol) + +**Inherits:** [IBatch](/docs/reference/flow/contracts/interfaces/interface.IBatch.md) + +See the documentation in [IBatch](/docs/reference/flow/contracts/interfaces/interface.IBatch.md). + +_Forked from: https://github.com/boringcrypto/BoringSolidity/blob/master/contracts/BoringBatchable.sol_ + +## Functions + +### batch + +Allows batched call to self, `this` contract. + +```solidity +function batch(bytes[] calldata calls) external override; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | --------------------------------- | +| `calls` | `bytes[]` | An array of inputs for each call. | diff --git a/docs/reference/flow/contracts/abstracts/abstract.NoDelegateCall.md b/docs/reference/flow/contracts/abstracts/abstract.NoDelegateCall.md new file mode 100644 index 00000000..370c5870 --- /dev/null +++ b/docs/reference/flow/contracts/abstracts/abstract.NoDelegateCall.md @@ -0,0 +1,46 @@ +# NoDelegateCall + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/abstracts/NoDelegateCall.sol) + +This contract implements logic to prevent delegate calls. + +## State Variables + +### ORIGINAL + +_The address of the original contract that was deployed._ + +```solidity +address private immutable ORIGINAL; +``` + +## Functions + +### constructor + +_Sets the original contract address._ + +```solidity +constructor(); +``` + +### noDelegateCall + +Prevents delegate calls. + +```solidity +modifier noDelegateCall(); +``` + +### \_preventDelegateCall + +This function checks whether the current call is a delegate call, and reverts if it is. + +- A private function is used instead of inlining this logic in a modifier because Solidity copies modifiers into every + function that uses them. The `ORIGINAL` address would get copied in every place the modifier is used, which would + increase the contract size. By using a function instead, we can avoid this duplication of code and reduce the overall + size of the contract. + +```solidity +function _preventDelegateCall() private view; +``` diff --git a/docs/reference/flow/contracts/abstracts/abstract.SablierFlowBase.md b/docs/reference/flow/contracts/abstracts/abstract.SablierFlowBase.md new file mode 100644 index 00000000..5d9890e0 --- /dev/null +++ b/docs/reference/flow/contracts/abstracts/abstract.SablierFlowBase.md @@ -0,0 +1,486 @@ +# SablierFlowBase + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/abstracts/SablierFlowBase.sol) + +**Inherits:** [Adminable](/docs/reference/flow/contracts/abstracts/abstract.Adminable.md), +[ISablierFlowBase](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md), ERC721 + +See the documentation in [ISablierFlowBase](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md). + +## State Variables + +### MAX_FEE + +Retrieves the maximum fee that can be charged by the broker and the protocol, denoted as a fixed-point percentage where +1e18 is 100%. + +_This value is hard coded as a constant._ + +```solidity +UD60x18 public constant override MAX_FEE = UD60x18.wrap(0.1e18); +``` + +### aggregateBalance + +Retrieves the sum of balances of all streams. + +```solidity +mapping(IERC20 token => uint256 amount) public override aggregateBalance; +``` + +### nextStreamId + +Counter for stream ids. + +```solidity +uint256 public override nextStreamId; +``` + +### nftDescriptor + +Contract that generates the non-fungible token URI. + +```solidity +IFlowNFTDescriptor public override nftDescriptor; +``` + +### protocolFee + +Protocol fee for the provided ERC-20 token, denoted as a fixed-point percentage where 1e18 is 100%. + +```solidity +mapping(IERC20 token => UD60x18 fee) public override protocolFee; +``` + +### protocolRevenue + +Protocol revenue accrued for the provided ERC-20 token, denoted in token's decimals. + +```solidity +mapping(IERC20 token => uint128 revenue) public override protocolRevenue; +``` + +### \_streams + +_Sablier Flow streams mapped by unsigned integers._ + +```solidity +mapping(uint256 id => Flow.Stream stream) internal _streams; +``` + +## Functions + +### constructor + +_Emits {TransferAdmin} event._ + +```solidity +constructor(address initialAdmin, IFlowNFTDescriptor initialNFTDescriptor); +``` + +**Parameters** + +| Name | Type | Description | +| ---------------------- | -------------------- | ------------------------------------------ | +| `initialAdmin` | `address` | The address of the initial contract admin. | +| `initialNFTDescriptor` | `IFlowNFTDescriptor` | The address of the initial NFT descriptor. | + +### notNull + +_Checks that `streamId` does not reference a null stream._ + +```solidity +modifier notNull(uint256 streamId); +``` + +### notPaused + +_Checks that `streamId` does not reference a paused stream._ + +```solidity +modifier notPaused(uint256 streamId); +``` + +### notVoided + +_Checks that `streamId` does not reference a voided stream._ + +```solidity +modifier notVoided(uint256 streamId); +``` + +### onlySender + +_Checks the `msg.sender` is the stream's sender._ + +```solidity +modifier onlySender(uint256 streamId); +``` + +### updateMetadata + +_Emits an ERC-4906 event to trigger an update of the NFT metadata._ + +```solidity +modifier updateMetadata(uint256 streamId); +``` + +### getBalance + +Retrieves the balance of the stream, i.e. the total deposited amounts subtracted by the total withdrawn amounts, denoted +in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getBalance(uint256 streamId) external view override notNull(streamId) returns (uint128 balance); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getRatePerSecond + +Retrieves the rate per second of the stream, denoted as a fixed-point number where 1e18 is 1 token per second. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getRatePerSecond(uint256 streamId) external view override notNull(streamId) returns (UD21x18 ratePerSecond); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getRecipient + +Retrieves the stream's recipient. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getRecipient(uint256 streamId) external view override notNull(streamId) returns (address recipient); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSender + +Retrieves the stream's sender. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSender(uint256 streamId) external view override notNull(streamId) returns (address sender); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSnapshotDebtScaled + +Retrieves the snapshot debt of the stream, denoted as a fixed-point number where 1e18 is 1 token. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSnapshotDebtScaled(uint256 streamId) + external + view + override + notNull(streamId) + returns (uint256 snapshotDebtScaled); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSnapshotTime + +Retrieves the snapshot time of the stream, which is a Unix timestamp. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSnapshotTime(uint256 streamId) external view override notNull(streamId) returns (uint40 snapshotTime); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getStream + +Retrieves the stream entity. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getStream(uint256 streamId) external view override notNull(streamId) returns (Flow.Stream memory stream); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getToken + +Retrieves the token of the stream. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getToken(uint256 streamId) external view override notNull(streamId) returns (IERC20 token); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getTokenDecimals + +Retrieves the token decimals of the stream. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getTokenDecimals(uint256 streamId) external view override notNull(streamId) returns (uint8 tokenDecimals); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### isPaused + +Returns whether a stream is paused. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isPaused(uint256 streamId) external view override notNull(streamId) returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isStream + +Retrieves a flag indicating whether the stream exists. + +_Does not revert if `streamId` references a null stream._ + +```solidity +function isStream(uint256 streamId) external view override returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isTransferable + +Retrieves a flag indicating whether the stream NFT is transferable. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isTransferable(uint256 streamId) external view override notNull(streamId) returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isVoided + +Retrieves a flag indicating whether the stream is voided. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isVoided(uint256 streamId) external view override notNull(streamId) returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### tokenURI + +_See {IERC721Metadata-tokenURI}._ + +```solidity +function tokenURI(uint256 streamId) public view override(IERC721Metadata, ERC721) returns (string memory uri); +``` + +### collectProtocolRevenue + +Collect the protocol revenue accrued for the provided ERC-20 token. + +Emits {CollectProtocolRevenue} event. Requirements: + +- `msg.sender` must be the contract admin. +- The accrued protocol revenue must be greater than zero. + +```solidity +function collectProtocolRevenue(IERC20 token, address to) external override onlyAdmin; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | ----------------------------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token for which to claim protocol revenue. | +| `to` | `address` | The address to send the protocol revenue. | + +### recover + +Recover the surplus amount of tokens. + +Emits {Recover} event. Notes: + +- The surplus amount is defined as the difference between the total balance of the contract for the provided ERC-20 + token and the sum of balances of all streams created using the same ERC-20 token. Requirements: +- `msg.sender` must be the contract admin. +- The surplus amount must be greater than zero. + +```solidity +function recover(IERC20 token, address to) external override onlyAdmin; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | -------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token to recover for. | +| `to` | `address` | The address to send the surplus amount. | + +### setNFTDescriptor + +Sets a new NFT descriptor contract, which produces the URI describing the Sablier stream NFTs. + +Emits {SetNFTDescriptor} and {BatchMetadataUpdate} events. Notes: + +- Does not revert if the NFT descriptor is the same. Requirements: +- `msg.sender` must be the contract admin. + +```solidity +function setNFTDescriptor(IFlowNFTDescriptor newNFTDescriptor) external override onlyAdmin; +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | -------------------- | ----------------------------------------------- | +| `newNFTDescriptor` | `IFlowNFTDescriptor` | The address of the new NFT descriptor contract. | + +### setProtocolFee + +Sets a new protocol fee that will be charged on all the withdrawals from streams created with the provided ERC-20 token. + +Emits {SetProtocolFee} and {BatchMetadataUpdate} events. Notes: + +- Does not revert if the fee is the same. +- It can be zero. Requirements: +- `msg.sender` must be the contract admin. +- `newProtocolFee` must not be greater than `MAX_FEE`. + +```solidity +function setProtocolFee(IERC20 token, UD60x18 newProtocolFee) external override onlyAdmin; +``` + +**Parameters** + +| Name | Type | Description | +| ---------------- | --------- | ----------------------------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token to update the fee for. | +| `newProtocolFee` | `UD60x18` | The new protocol fee, denoted as a fixed-point percentage where 1e18 is 100%. | + +### supportsInterface + +_See {IERC165-supportsInterface}._ + +```solidity +function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC721) returns (bool); +``` + +### \_isCallerStreamRecipientOrApproved + +Checks whether `msg.sender` is the stream's recipient or an approved third party. + +```solidity +function _isCallerStreamRecipientOrApproved(uint256 streamId) internal view returns (bool); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### \_update + +Overrides the {ERC-721.\_update} function to check that the stream is transferable. + +_The transferable flag is ignored if the current owner is 0, as the update in this case is a mint and is allowed. +Transfers to the zero address are not allowed, preventing accidental burns._ + +```solidity +function _update( + address to, + uint256 streamId, + address auth +) + internal + override + updateMetadata(streamId) + returns (address); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `to` | `address` | The address of the new recipient of the stream. | +| `streamId` | `uint256` | ID of the stream to update. | +| `auth` | `address` | Optional parameter. If the value is not zero, the overridden implementation will check that `auth` is either the recipient of the stream, or an approved third party. | + +**Returns** + +| Name | Type | Description | +| -------- | --------- | ----------------------------------------------------------- | +| `` | `address` | The original recipient of the `streamId` before the update. | diff --git a/docs/reference/flow/contracts/contract.FlowNFTDescriptor.md b/docs/reference/flow/contracts/contract.FlowNFTDescriptor.md new file mode 100644 index 00000000..fcd05c56 --- /dev/null +++ b/docs/reference/flow/contracts/contract.FlowNFTDescriptor.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2 +--- + +# FlowNFTDescriptor + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/FlowNFTDescriptor.sol) + +**Inherits:** [IFlowNFTDescriptor](/docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md) + +See the documentation in +[IFlowNFTDescriptor](/docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md). + +## Functions + +### tokenURI + +Produces the URI describing a particular stream NFT. + +_Currently it returns the Sablier logo as an SVG. In the future, it will return an NFT SVG._ + +```solidity +function tokenURI(IERC721Metadata, uint256) external pure override returns (string memory uri); +``` + +**Parameters** + +| Name | Type | Description | +| -------- | ----------------- | ----------- | +| `` | `IERC721Metadata` | | +| `` | `uint256` | | + +**Returns** + +| Name | Type | Description | +| ----- | -------- | ----------------------------------------- | +| `uri` | `string` | The URI of the ERC721-compliant metadata. | diff --git a/docs/reference/flow/contracts/contract.SablierFlow.md b/docs/reference/flow/contracts/contract.SablierFlow.md new file mode 100644 index 00000000..5702e5a0 --- /dev/null +++ b/docs/reference/flow/contracts/contract.SablierFlow.md @@ -0,0 +1,845 @@ +--- +sidebar_position: 1 +--- + +# SablierFlow + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/SablierFlow.sol) + +**Inherits:** [Batch](/docs/reference/flow/contracts/abstracts/abstract.Batch.md), +[NoDelegateCall](/docs/reference/flow/contracts/abstracts/abstract.NoDelegateCall.md), +[ISablierFlow](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md), +[SablierFlowBase](/docs/reference/flow/contracts/abstracts/abstract.SablierFlowBase.md) + +See the documentation in [ISablierFlow](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md). + +## Functions + +### constructor + +_Emits {TransferAdmin} event._ + +```solidity +constructor( + address initialAdmin, + IFlowNFTDescriptor initialNFTDescriptor +) + ERC721("Sablier Flow NFT", "SAB-FLOW") + SablierFlowBase(initialAdmin, initialNFTDescriptor); +``` + +**Parameters** + +| Name | Type | Description | +| ---------------------- | -------------------- | ------------------------------------------ | +| `initialAdmin` | `address` | The address of the initial contract admin. | +| `initialNFTDescriptor` | `IFlowNFTDescriptor` | The address of the initial NFT descriptor. | + +### coveredDebtOf + +Returns the amount of debt covered by the stream balance, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function coveredDebtOf(uint256 streamId) external view override notNull(streamId) returns (uint128 coveredDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### depletionTimeOf + +Returns the time at which the total debt exceeds stream balance. If the total debt is less than or equal to stream +balance, it returns 0. + +Reverts on the following conditions: + +- If `streamId` references a paused or a null stream. +- If stream balance is zero. + +```solidity +function depletionTimeOf(uint256 streamId) + external + view + override + notNull(streamId) + notPaused(streamId) + returns (uint256 depletionTime); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### ongoingDebtScaledOf + +Returns the amount of debt accrued since the snapshot time until now, denoted as a fixed-point number where 1e18 is 1 +token. + +_Reverts if `streamId` references a null stream._ + +```solidity +function ongoingDebtScaledOf(uint256 streamId) + external + view + override + notNull(streamId) + returns (uint256 ongoingDebtScaled); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### refundableAmountOf + +Returns the amount that the sender can be refunded from the stream, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function refundableAmountOf(uint256 streamId) + external + view + override + notNull(streamId) + returns (uint128 refundableAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### statusOf + +Returns the stream's status. + +_Reverts if `streamId` references a null stream._ + +```solidity +function statusOf(uint256 streamId) external view override notNull(streamId) returns (Flow.Status status); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### totalDebtOf + +Returns the total amount owed by the sender to the recipient, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function totalDebtOf(uint256 streamId) external view override notNull(streamId) returns (uint256 totalDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### uncoveredDebtOf + +Returns the amount of debt not covered by the stream balance, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function uncoveredDebtOf(uint256 streamId) external view override notNull(streamId) returns (uint256 uncoveredDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### withdrawableAmountOf + +Calculates the amount that the recipient can withdraw from the stream, denoted in token decimals. This is an alias for +`coveredDebtOf`. + +_Reverts if `streamId` references a null stream._ + +```solidity +function withdrawableAmountOf(uint256 streamId) + external + view + override + notNull(streamId) + returns (uint128 withdrawableAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +**Returns** + +| Name | Type | Description | +| -------------------- | --------- | ------------------------------------------- | +| `withdrawableAmount` | `uint128` | The amount that the recipient can withdraw. | + +### adjustRatePerSecond + +Changes the stream's rate per second. + +Emits {AdjustFlowStream} and {MetadataUpdate} events. Notes: + +- It updates snapshot debt and snapshot time. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or a paused stream. +- `msg.sender` must be the stream's sender. +- `newRatePerSecond` must not equal to the current rate per second. + +```solidity +function adjustRatePerSecond( + uint256 streamId, + UD21x18 newRatePerSecond +) + external + override + noDelegateCall + notNull(streamId) + notPaused(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | --------- | ------------------------------------------------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to adjust. | +| `newRatePerSecond` | `UD21x18` | The new rate per second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### create + +Creates a new Flow stream by setting the snapshot time to `block.timestamp` and leaving the balance to zero. The stream +is wrapped in an ERC-721 NFT. + +Emits {CreateFlowStream} event. Requirements: + +- Must not be delegate called. +- `sender` must not be the zero address. +- `recipient` must not be the zero address. +- The `token`'s decimals must be less than or equal to 18. + +```solidity +function create( + address sender, + address recipient, + UD21x18 ratePerSecond, + IERC20 token, + bool transferable +) + external + override + noDelegateCall + returns (uint256 streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `sender` | `address` | The address streaming the tokens, which is able to adjust and pause the stream. It doesn't have to be the same as `msg.sender`. | +| `recipient` | `address` | The address receiving the tokens. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `token` | `IERC20` | The contract address of the ERC-20 token to be streamed. | +| `transferable` | `bool` | Boolean indicating if the stream NFT is transferable. | + +**Returns** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------------- | +| `streamId` | `uint256` | The ID of the newly created stream. | + +### createAndDeposit + +Creates a new Flow stream by setting the snapshot time to `block.timestamp` and the balance to `amount`. The stream is +wrapped in an ERC-721 NFT. + +Emits {Transfer}, {CreateFlowStream}, and {DepositFlowStream} events. Notes: + +- Refer to the notes in {deposit}. Requirements: +- Refer to the requirements in {create} and {deposit}. + +```solidity +function createAndDeposit( + address sender, + address recipient, + UD21x18 ratePerSecond, + IERC20 token, + bool transferable, + uint128 amount +) + external + override + noDelegateCall + returns (uint256 streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `sender` | `address` | The address streaming the tokens. It doesn't have to be the same as `msg.sender`. | +| `recipient` | `address` | The address receiving the tokens. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `token` | `IERC20` | The contract address of the ERC-20 token to be streamed. | +| `transferable` | `bool` | Boolean indicating if the stream NFT is transferable. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +**Returns** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------------- | +| `streamId` | `uint256` | The ID of the newly created stream. | + +### deposit + +Makes a deposit in a stream. + +Emits {Transfer} and {DepositFlowStream} events. Requirements: + +- Must not be delegate called. +- `streamId` must not reference a null or a voided stream. +- `amount` must be greater than zero. +- `sender` and `recipient` must match the stream's sender and recipient addresses. + +```solidity +function deposit( + uint256 streamId, + uint128 amount, + address sender, + address recipient +) + external + override + noDelegateCall + notNull(streamId) + notVoided(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ----------- | --------- | ------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to deposit to. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | + +### depositAndPause + +Deposits tokens in a stream and pauses it. + +Emits {Transfer}, {DepositFlowStream} and {PauseFlowStream} events. Notes: + +- Refer to the notes in {deposit} and {pause}. Requirements: +- Refer to the requirements in {deposit} and {pause}. + +```solidity +function depositAndPause( + uint256 streamId, + uint128 amount +) + external + override + noDelegateCall + notNull(streamId) + notPaused(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | --------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to deposit to, and then pause. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +### depositViaBroker + +Deposits tokens in a stream. + +Emits {Transfer} and {DepositFlowStream} events. Notes: + +- Refer to the notes in {deposit}. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `totalAmount` must be greater than zero. Otherwise it will revert inside {deposit}. +- `broker.account` must not be 0 address. +- `broker.fee` must not be greater than `MAX_FEE`. It can be zero. + +```solidity +function depositViaBroker( + uint256 streamId, + uint128 totalAmount, + address sender, + address recipient, + Broker calldata broker +) + external + override + noDelegateCall + notNull(streamId) + notVoided(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to deposit on. | +| `totalAmount` | `uint128` | The total amount, including the deposit and any broker fee, denoted in token's decimals. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | +| `broker` | `Broker` | Struct encapsulating (i) the address of the broker assisting in creating the stream, and (ii) the percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point percentage. | + +### pause + +Pauses the stream. + +Emits {PauseFlowStream} event. Notes: + +- It updates snapshot debt and snapshot time. +- It sets the rate per second to zero. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or an already paused stream. +- `msg.sender` must be the stream's sender. + +```solidity +function pause(uint256 streamId) + external + override + noDelegateCall + notNull(streamId) + notPaused(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------ | +| `streamId` | `uint256` | The ID of the stream to pause. | + +### refund + +Refunds the provided amount of tokens from the stream to the sender's address. + +Emits {Transfer} and {RefundFromFlowStream} events. Requirements: + +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `msg.sender` must be the sender. +- `amount` must be greater than zero and must not exceed the refundable amount. + +```solidity +function refund( + uint256 streamId, + uint128 amount +) + external + override + noDelegateCall + notNull(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | -------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to refund from. | +| `amount` | `uint128` | The amount to refund, denoted in token's decimals. | + +### refundAndPause + +Refunds the provided amount of tokens from the stream to the sender's address. + +Emits {Transfer}, {RefundFromFlowStream} and {PauseFlowStream} events. Notes: + +- Refer to the notes in {pause}. Requirements: +- Refer to the requirements in {refund} and {pause}. + +```solidity +function refundAndPause( + uint256 streamId, + uint128 amount +) + external + override + noDelegateCall + notNull(streamId) + notPaused(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | --------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to refund from and then pause. | +| `amount` | `uint128` | The amount to refund, denoted in token's decimals. | + +### refundMax + +Refunds the entire refundable amount of tokens from the stream to the sender's address. + +Emits {Transfer} and {RefundFromFlowStream} events. Requirements: + +- Refer to the requirements in {refund}. + +```solidity +function refundMax(uint256 streamId) + external + override + noDelegateCall + notNull(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to refund from. | + +### restart + +Restarts the stream with the provided rate per second. + +Emits {RestartFlowStream} event. Notes: + +- It updates snapshot debt and snapshot time. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null, or a voided stream. +- `msg.sender` must be the stream's sender. +- `ratePerSecond` must be greater than zero. + +```solidity +function restart( + uint256 streamId, + UD21x18 ratePerSecond +) + external + override + noDelegateCall + notNull(streamId) + notVoided(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to restart. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### restartAndDeposit + +Restarts the stream with the provided rate per second, and makes a deposit. + +Emits {RestartFlowStream}, {Transfer}, and {DepositFlowStream} events. Notes: + +- Refer to the notes in {restart} and {deposit}. Requirements: +- `amount` must be greater than zero. +- Refer to the requirements in {restart}. + +```solidity +function restartAndDeposit( + uint256 streamId, + UD21x18 ratePerSecond, + uint128 amount +) + external + override + noDelegateCall + notNull(streamId) + notVoided(streamId) + onlySender(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to restart. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +### void + +Voids a stream. + +Emits {VoidFlowStream} event. Notes: + +- It sets snapshot time to the `block.timestamp` +- Voiding an insolvent stream sets the snapshot debt to the stream's balance making the uncovered debt to become zero. +- Voiding a solvent stream updates the snapshot debt by adding up ongoing debt. +- It sets the rate per second to zero. +- A voided stream cannot be restarted. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or a voided stream. +- `msg.sender` must either be the stream's sender, recipient or an approved third party. + +```solidity +function void(uint256 streamId) + external + override + noDelegateCall + notNull(streamId) + notVoided(streamId) + updateMetadata(streamId); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------- | +| `streamId` | `uint256` | The ID of the stream to void. | + +### withdraw + +Withdraws the provided `amount` minus the protocol fee to the provided `to` address. + +Emits {Transfer} and {WithdrawFromFlowStream} events. Notes: + +- It sets the snapshot time to the `block.timestamp` if `amount` is greater than snapshot debt. +- A protocol fee may be charged on the withdrawn amount if the protocol fee is enabled for the streaming token. + Requirements: +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `to` must not be the zero address. +- `to` must be the recipient if `msg.sender` is not the stream's recipient. +- `amount` must be greater than zero and must not exceed the withdrawable amount. + +```solidity +function withdraw( + uint256 streamId, + address to, + uint128 amount +) + external + override + noDelegateCall + notNull(streamId) + updateMetadata(streamId) + returns (uint128 withdrawnAmount, uint128 protocolFeeAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to withdraw from. | +| `to` | `address` | The address receiving the withdrawn tokens. | +| `amount` | `uint128` | The amount to withdraw, denoted in token's decimals. | + +**Returns** + +| Name | Type | Description | +| ------------------- | --------- | ---------------------------------------------------------------------------------------------------------------- | +| `withdrawnAmount` | `uint128` | The amount withdrawn to the recipient, denoted in token's decimals. This is input amount minus the protocol fee. | +| `protocolFeeAmount` | `uint128` | The protocol fee amount, denoted in the token's decimals. | + +### withdrawMax + +Withdraws the entire withdrawable amount minus the protocol fee to the provided `to` address. + +Emits {Transfer} and {WithdrawFromFlowStream} events. Notes: + +- Refer to the notes in {withdraw}. Requirements: +- Refer to the requirements in {withdraw}. + +```solidity +function withdrawMax( + uint256 streamId, + address to +) + external + override + noDelegateCall + notNull(streamId) + updateMetadata(streamId) + returns (uint128 withdrawnAmount, uint128 protocolFeeAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to withdraw from. | +| `to` | `address` | The address receiving the withdrawn tokens. | + +**Returns** + +| Name | Type | Description | +| ------------------- | --------- | ------------------------------------------------------------------- | +| `withdrawnAmount` | `uint128` | The amount withdrawn to the recipient, denoted in token's decimals. | +| `protocolFeeAmount` | `uint128` | The protocol fee amount, denoted in the token's decimals. | + +### \_coveredDebtOf + +_Calculates the amount of covered debt by the stream balance._ + +```solidity +function _coveredDebtOf(uint256 streamId) internal view returns (uint128); +``` + +### \_ongoingDebtScaledOf + +_Calculates the ongoing debt, as a 18-decimals fixed point number, accrued since last snapshot. Return 0 if the stream +is paused or `block.timestamp` is less than or equal to snapshot time._ + +```solidity +function _ongoingDebtScaledOf(uint256 streamId) internal view returns (uint256); +``` + +### \_refundableAmountOf + +_Calculates the refundable amount._ + +```solidity +function _refundableAmountOf(uint256 streamId) internal view returns (uint128); +``` + +### \_totalDebtOf + +_The total debt is the sum of the snapshot debt and the ongoing debt descaled to token's decimal. This value is +independent of the stream's balance._ + +```solidity +function _totalDebtOf(uint256 streamId) internal view returns (uint256); +``` + +### \_uncoveredDebtOf + +_Calculates the uncovered debt._ + +```solidity +function _uncoveredDebtOf(uint256 streamId) internal view returns (uint256); +``` + +### \_verifyStreamSenderRecipient + +_Checks whether the provided addresses matches stream's sender and recipient._ + +```solidity +function _verifyStreamSenderRecipient(uint256 streamId, address sender, address recipient) internal view; +``` + +### \_adjustRatePerSecond + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _adjustRatePerSecond(uint256 streamId, UD21x18 newRatePerSecond) internal; +``` + +### \_create + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _create( + address sender, + address recipient, + UD21x18 ratePerSecond, + IERC20 token, + bool transferable +) + internal + returns (uint256 streamId); +``` + +### \_deposit + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _deposit(uint256 streamId, uint128 amount) internal; +``` + +### \_depositViaBroker + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _depositViaBroker(uint256 streamId, uint128 totalAmount, Broker memory broker) internal; +``` + +### \_pause + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _pause(uint256 streamId) internal; +``` + +### \_refund + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _refund(uint256 streamId, uint128 amount) internal; +``` + +### \_restart + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _restart(uint256 streamId, UD21x18 ratePerSecond) internal; +``` + +### \_void + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _void(uint256 streamId) internal; +``` + +### \_withdraw + +_See the documentation for the user-facing functions that call this internal function._ + +```solidity +function _withdraw( + uint256 streamId, + address to, + uint128 amount +) + internal + returns (uint128 withdrawnAmount, uint128 protocolFeeAmount); +``` diff --git a/docs/reference/flow/contracts/interfaces/interface.IAdminable.md b/docs/reference/flow/contracts/interfaces/interface.IAdminable.md new file mode 100644 index 00000000..54d568f8 --- /dev/null +++ b/docs/reference/flow/contracts/interfaces/interface.IAdminable.md @@ -0,0 +1,54 @@ +# IAdminable + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/interfaces/IAdminable.sol) + +Contract module that provides a basic access control mechanism, with an admin that can be granted exclusive access to +specific functions. The inheriting contract must set the initial admin in the constructor. + +## Functions + +### admin + +The address of the admin account or contract. + +```solidity +function admin() external view returns (address); +``` + +### transferAdmin + +Transfers the contract admin to a new address. + +Notes: + +- Does not revert if the admin is the same. +- This function can potentially leave the contract without an admin, thereby removing any functionality that is only + available to the admin. Requirements: +- `msg.sender` must be the contract admin. + +```solidity +function transferAdmin(address newAdmin) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------- | +| `newAdmin` | `address` | The address of the new admin. | + +## Events + +### TransferAdmin + +Emitted when the admin is transferred. + +```solidity +event TransferAdmin(address indexed oldAdmin, address indexed newAdmin); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------- | +| `oldAdmin` | `address` | The address of the old admin. | +| `newAdmin` | `address` | The address of the new admin. | diff --git a/docs/reference/flow/contracts/interfaces/interface.IBatch.md b/docs/reference/flow/contracts/interfaces/interface.IBatch.md new file mode 100644 index 00000000..82c06e15 --- /dev/null +++ b/docs/reference/flow/contracts/interfaces/interface.IBatch.md @@ -0,0 +1,21 @@ +# IBatch + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/interfaces/IBatch.sol) + +This contract implements logic to batch call any function. + +## Functions + +### batch + +Allows batched call to self, `this` contract. + +```solidity +function batch(bytes[] calldata calls) external; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | --------------------------------- | +| `calls` | `bytes[]` | An array of inputs for each call. | diff --git a/docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md b/docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md new file mode 100644 index 00000000..b5cd5e1e --- /dev/null +++ b/docs/reference/flow/contracts/interfaces/interface.IFlowNFTDescriptor.md @@ -0,0 +1,30 @@ +# IFlowNFTDescriptor + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/interfaces/IFlowNFTDescriptor.sol) + +This contract generates the URI describing the Sablier Flow stream NFTs. + +## Functions + +### tokenURI + +Produces the URI describing a particular stream NFT. + +_Currently it returns the Sablier logo as an SVG. In the future, it will return an NFT SVG._ + +```solidity +function tokenURI(IERC721Metadata sablierFlow, uint256 streamId) external view returns (string memory uri); +``` + +**Parameters** + +| Name | Type | Description | +| ------------- | ----------------- | ---------------------------------------------------------- | +| `sablierFlow` | `IERC721Metadata` | The address of the Sablier Flow the stream was created in. | +| `streamId` | `uint256` | The ID of the stream for which to produce a description. | + +**Returns** + +| Name | Type | Description | +| ----- | -------- | ----------------------------------------- | +| `uri` | `string` | The URI of the ERC721-compliant metadata. | diff --git a/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md b/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md new file mode 100644 index 00000000..04aaa17b --- /dev/null +++ b/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md @@ -0,0 +1,722 @@ +# ISablierFlow + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/interfaces/ISablierFlow.sol) + +**Inherits:** [IBatch](/docs/reference/flow/contracts/interfaces/interface.IBatch.md), +[ISablierFlowBase](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md) + +Creates and manages Flow streams with linear streaming functions. + +## Functions + +### coveredDebtOf + +Returns the amount of debt covered by the stream balance, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function coveredDebtOf(uint256 streamId) external view returns (uint128 coveredDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### depletionTimeOf + +Returns the time at which the total debt exceeds stream balance. If the total debt is less than or equal to stream +balance, it returns 0. + +Reverts on the following conditions: + +- If `streamId` references a paused or a null stream. +- If stream balance is zero. + +```solidity +function depletionTimeOf(uint256 streamId) external view returns (uint256 depletionTime); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### ongoingDebtScaledOf + +Returns the amount of debt accrued since the snapshot time until now, denoted as a fixed-point number where 1e18 is 1 +token. + +_Reverts if `streamId` references a null stream._ + +```solidity +function ongoingDebtScaledOf(uint256 streamId) external view returns (uint256 ongoingDebtScaled); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### refundableAmountOf + +Returns the amount that the sender can be refunded from the stream, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function refundableAmountOf(uint256 streamId) external view returns (uint128 refundableAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### statusOf + +Returns the stream's status. + +_Reverts if `streamId` references a null stream._ + +```solidity +function statusOf(uint256 streamId) external view returns (Flow.Status status); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### totalDebtOf + +Returns the total amount owed by the sender to the recipient, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function totalDebtOf(uint256 streamId) external view returns (uint256 totalDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### uncoveredDebtOf + +Returns the amount of debt not covered by the stream balance, denoted in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function uncoveredDebtOf(uint256 streamId) external view returns (uint256 uncoveredDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### withdrawableAmountOf + +Calculates the amount that the recipient can withdraw from the stream, denoted in token decimals. This is an alias for +`coveredDebtOf`. + +_Reverts if `streamId` references a null stream._ + +```solidity +function withdrawableAmountOf(uint256 streamId) external view returns (uint128 withdrawableAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +**Returns** + +| Name | Type | Description | +| -------------------- | --------- | ------------------------------------------- | +| `withdrawableAmount` | `uint128` | The amount that the recipient can withdraw. | + +### adjustRatePerSecond + +Changes the stream's rate per second. + +Emits [AdjustFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#adjustflowstream) and +{MetadataUpdate} events. Notes: + +- It updates snapshot debt and snapshot time. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or a paused stream. +- `msg.sender` must be the stream's sender. +- `newRatePerSecond` must not equal to the current rate per second. + +```solidity +function adjustRatePerSecond(uint256 streamId, UD21x18 newRatePerSecond) external; +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | --------- | ------------------------------------------------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to adjust. | +| `newRatePerSecond` | `UD21x18` | The new rate per second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### create + +Creates a new Flow stream by setting the snapshot time to `block.timestamp` and leaving the balance to zero. The stream +is wrapped in an ERC-721 NFT. + +Emits [CreateFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#createflowstream) event. +Requirements: + +- Must not be delegate called. +- `sender` must not be the zero address. +- `recipient` must not be the zero address. +- The `token`'s decimals must be less than or equal to 18. + +```solidity +function create( + address sender, + address recipient, + UD21x18 ratePerSecond, + IERC20 token, + bool transferable +) + external + returns (uint256 streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `sender` | `address` | The address streaming the tokens, which is able to adjust and pause the stream. It doesn't have to be the same as `msg.sender`. | +| `recipient` | `address` | The address receiving the tokens. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `token` | `IERC20` | The contract address of the ERC-20 token to be streamed. | +| `transferable` | `bool` | Boolean indicating if the stream NFT is transferable. | + +**Returns** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------------- | +| `streamId` | `uint256` | The ID of the newly created stream. | + +### createAndDeposit + +Creates a new Flow stream by setting the snapshot time to `block.timestamp` and the balance to `amount`. The stream is +wrapped in an ERC-721 NFT. + +Emits {Transfer}, {CreateFlowStream}, and {DepositFlowStream} events. Notes: + +- Refer to the notes in {deposit}. Requirements: +- Refer to the requirements in {create} and {deposit}. + +```solidity +function createAndDeposit( + address sender, + address recipient, + UD21x18 ratePerSecond, + IERC20 token, + bool transferable, + uint128 amount +) + external + returns (uint256 streamId); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `sender` | `address` | The address streaming the tokens. It doesn't have to be the same as `msg.sender`. | +| `recipient` | `address` | The address receiving the tokens. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `token` | `IERC20` | The contract address of the ERC-20 token to be streamed. | +| `transferable` | `bool` | Boolean indicating if the stream NFT is transferable. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +**Returns** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------------- | +| `streamId` | `uint256` | The ID of the newly created stream. | + +### deposit + +Makes a deposit in a stream. + +Emits {Transfer} and {DepositFlowStream} events. Requirements: + +- Must not be delegate called. +- `streamId` must not reference a null or a voided stream. +- `amount` must be greater than zero. +- `sender` and `recipient` must match the stream's sender and recipient addresses. + +```solidity +function deposit(uint256 streamId, uint128 amount, address sender, address recipient) external; +``` + +**Parameters** + +| Name | Type | Description | +| ----------- | --------- | ------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to deposit to. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | + +### depositAndPause + +Deposits tokens in a stream and pauses it. + +Emits {Transfer}, {DepositFlowStream} and {PauseFlowStream} events. Notes: + +- Refer to the notes in {deposit} and {pause}. Requirements: +- Refer to the requirements in {deposit} and {pause}. + +```solidity +function depositAndPause(uint256 streamId, uint128 amount) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | --------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to deposit to, and then pause. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +### depositViaBroker + +Deposits tokens in a stream. + +Emits {Transfer} and {DepositFlowStream} events. Notes: + +- Refer to the notes in {deposit}. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `totalAmount` must be greater than zero. Otherwise it will revert inside {deposit}. +- `broker.account` must not be 0 address. +- `broker.fee` must not be greater than `MAX_FEE`. It can be zero. + +```solidity +function depositViaBroker( + uint256 streamId, + uint128 totalAmount, + address sender, + address recipient, + Broker calldata broker +) + external; +``` + +**Parameters** + +| Name | Type | Description | +| ------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to deposit on. | +| `totalAmount` | `uint128` | The total amount, including the deposit and any broker fee, denoted in token's decimals. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | +| `broker` | `Broker` | Struct encapsulating (i) the address of the broker assisting in creating the stream, and (ii) the percentage fee paid to the broker from `totalAmount`, denoted as a fixed-point percentage. | + +### pause + +Pauses the stream. + +Emits [PauseFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#pauseflowstream) event. +Notes: + +- It updates snapshot debt and snapshot time. +- It sets the rate per second to zero. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or an already paused stream. +- `msg.sender` must be the stream's sender. + +```solidity +function pause(uint256 streamId) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------ | +| `streamId` | `uint256` | The ID of the stream to pause. | + +### refund + +Refunds the provided amount of tokens from the stream to the sender's address. + +Emits {Transfer} and {RefundFromFlowStream} events. Requirements: + +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `msg.sender` must be the sender. +- `amount` must be greater than zero and must not exceed the refundable amount. + +```solidity +function refund(uint256 streamId, uint128 amount) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | -------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to refund from. | +| `amount` | `uint128` | The amount to refund, denoted in token's decimals. | + +### refundAndPause + +Refunds the provided amount of tokens from the stream to the sender's address. + +Emits {Transfer}, {RefundFromFlowStream} and {PauseFlowStream} events. Notes: + +- Refer to the notes in {pause}. Requirements: +- Refer to the requirements in {refund} and {pause}. + +```solidity +function refundAndPause(uint256 streamId, uint128 amount) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | --------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to refund from and then pause. | +| `amount` | `uint128` | The amount to refund, denoted in token's decimals. | + +### refundMax + +Refunds the entire refundable amount of tokens from the stream to the sender's address. + +Emits {Transfer} and {RefundFromFlowStream} events. Requirements: + +- Refer to the requirements in {refund}. + +```solidity +function refundMax(uint256 streamId) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------ | +| `streamId` | `uint256` | The ID of the stream to refund from. | + +### restart + +Restarts the stream with the provided rate per second. + +Emits [RestartFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#restartflowstream) event. +Notes: + +- It updates snapshot debt and snapshot time. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null, or a voided stream. +- `msg.sender` must be the stream's sender. +- `ratePerSecond` must be greater than zero. + +```solidity +function restart(uint256 streamId, UD21x18 ratePerSecond) external; +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to restart. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### restartAndDeposit + +Restarts the stream with the provided rate per second, and makes a deposit. + +Emits [RestartFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#restartflowstream), +{Transfer}, and {DepositFlowStream} events. Notes: + +- Refer to the notes in {restart} and {deposit}. Requirements: +- `amount` must be greater than zero. +- Refer to the requirements in {restart}. + +```solidity +function restartAndDeposit(uint256 streamId, UD21x18 ratePerSecond, uint128 amount) external; +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to restart. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `amount` | `uint128` | The deposit amount, denoted in token's decimals. | + +### void + +Voids a stream. + +Emits [VoidFlowStream](/docs/reference/flow/contracts/interfaces/interface.ISablierFlow.md#voidflowstream) event. Notes: + +- It sets snapshot time to the `block.timestamp` +- Voiding an insolvent stream sets the snapshot debt to the stream's balance making the uncovered debt to become zero. +- Voiding a solvent stream updates the snapshot debt by adding up ongoing debt. +- It sets the rate per second to zero. +- A voided stream cannot be restarted. Requirements: +- Must not be delegate called. +- `streamId` must not reference a null or a voided stream. +- `msg.sender` must either be the stream's sender, recipient or an approved third party. + +```solidity +function void(uint256 streamId) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------- | +| `streamId` | `uint256` | The ID of the stream to void. | + +### withdraw + +Withdraws the provided `amount` minus the protocol fee to the provided `to` address. + +Emits {Transfer} and {WithdrawFromFlowStream} events. Notes: + +- It sets the snapshot time to the `block.timestamp` if `amount` is greater than snapshot debt. +- A protocol fee may be charged on the withdrawn amount if the protocol fee is enabled for the streaming token. + Requirements: +- Must not be delegate called. +- `streamId` must not reference a null stream. +- `to` must not be the zero address. +- `to` must be the recipient if `msg.sender` is not the stream's recipient. +- `amount` must be greater than zero and must not exceed the withdrawable amount. + +```solidity +function withdraw( + uint256 streamId, + address to, + uint128 amount +) + external + returns (uint128 withdrawnAmount, uint128 protocolFeeAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to withdraw from. | +| `to` | `address` | The address receiving the withdrawn tokens. | +| `amount` | `uint128` | The amount to withdraw, denoted in token's decimals. | + +**Returns** + +| Name | Type | Description | +| ------------------- | --------- | ---------------------------------------------------------------------------------------------------------------- | +| `withdrawnAmount` | `uint128` | The amount withdrawn to the recipient, denoted in token's decimals. This is input amount minus the protocol fee. | +| `protocolFeeAmount` | `uint128` | The protocol fee amount, denoted in the token's decimals. | + +### withdrawMax + +Withdraws the entire withdrawable amount minus the protocol fee to the provided `to` address. + +Emits {Transfer} and {WithdrawFromFlowStream} events. Notes: + +- Refer to the notes in {withdraw}. Requirements: +- Refer to the requirements in {withdraw}. + +```solidity +function withdrawMax( + uint256 streamId, + address to +) + external + returns (uint128 withdrawnAmount, uint128 protocolFeeAmount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to withdraw from. | +| `to` | `address` | The address receiving the withdrawn tokens. | + +**Returns** + +| Name | Type | Description | +| ------------------- | --------- | ------------------------------------------------------------------- | +| `withdrawnAmount` | `uint128` | The amount withdrawn to the recipient, denoted in token's decimals. | +| `protocolFeeAmount` | `uint128` | The protocol fee amount, denoted in the token's decimals. | + +## Events + +### AdjustFlowStream + +Emitted when the rate per second is updated by the sender. + +```solidity +event AdjustFlowStream(uint256 indexed streamId, uint256 totalDebt, UD21x18 oldRatePerSecond, UD21x18 newRatePerSecond); +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | --------- | ------------------------------------------------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream. | +| `totalDebt` | `uint256` | The total debt at the time of the update, denoted in token's decimals. | +| `oldRatePerSecond` | `UD21x18` | The old rate per second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `newRatePerSecond` | `UD21x18` | The new rate per second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### CreateFlowStream + +Emitted when a Flow stream is created. + +```solidity +event CreateFlowStream( + uint256 streamId, + address indexed sender, + address indexed recipient, + UD21x18 ratePerSecond, + IERC20 indexed token, + bool transferable +); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the newly created stream. | +| `sender` | `address` | The address streaming the tokens, which is able to adjust and pause the stream. | +| `recipient` | `address` | The address receiving the tokens, as well as the NFT owner. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | +| `token` | `IERC20` | The contract address of the ERC-20 token to be streamed. | +| `transferable` | `bool` | Boolean indicating whether the stream NFT is transferable or not. | + +### DepositFlowStream + +Emitted when a stream is funded. + +```solidity +event DepositFlowStream(uint256 indexed streamId, address indexed funder, uint128 amount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream. | +| `funder` | `address` | The address that made the deposit. | +| `amount` | `uint128` | The amount of tokens deposited into the stream, denoted in token's decimals. | + +### PauseFlowStream + +Emitted when a stream is paused by the sender. + +```solidity +event PauseFlowStream(uint256 indexed streamId, address indexed sender, address indexed recipient, uint256 totalDebt); +``` + +**Parameters** + +| Name | Type | Description | +| ----------- | --------- | -------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | +| `totalDebt` | `uint256` | The amount of tokens owed by the sender to the recipient, denoted in token's decimals. | + +### RefundFromFlowStream + +Emitted when a sender is refunded from a stream. + +```solidity +event RefundFromFlowStream(uint256 indexed streamId, address indexed sender, uint128 amount); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream. | +| `sender` | `address` | The stream's sender address. | +| `amount` | `uint128` | The amount of tokens refunded to the sender, denoted in token's decimals. | + +### RestartFlowStream + +Emitted when a stream is restarted by the sender. + +```solidity +event RestartFlowStream(uint256 indexed streamId, address indexed sender, UD21x18 ratePerSecond); +``` + +**Parameters** + +| Name | Type | Description | +| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream. | +| `sender` | `address` | The stream's sender address. | +| `ratePerSecond` | `UD21x18` | The amount by which the debt is increasing every second, denoted as a fixed-point number where 1e18 is 1 token per second. | + +### VoidFlowStream + +Emitted when a stream is voided by the sender, recipient or an approved operator. + +```solidity +event VoidFlowStream( + uint256 indexed streamId, + address indexed sender, + address indexed recipient, + address caller, + uint256 newTotalDebt, + uint256 writtenOffDebt +); +``` + +**Parameters** + +| Name | Type | Description | +| ---------------- | --------- | ------------------------------------------------------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream. | +| `sender` | `address` | The stream's sender address. | +| `recipient` | `address` | The stream's recipient address. | +| `caller` | `address` | The address that performed the void, which can be the sender, recipient or an approved operator. | +| `newTotalDebt` | `uint256` | The new total debt, denoted in token's decimals. | +| `writtenOffDebt` | `uint256` | The amount of debt written off by the caller, denoted in token's decimals. | + +### WithdrawFromFlowStream + +Emitted when tokens are withdrawn from a stream by a recipient or an approved operator. + +```solidity +event WithdrawFromFlowStream( + uint256 indexed streamId, + address indexed to, + IERC20 indexed token, + address caller, + uint128 withdrawAmount, + uint128 protocolFeeAmount +); +``` + +**Parameters** + +| Name | Type | Description | +| ------------------- | --------- | ------------------------------------------------------------------------------------------------------ | +| `streamId` | `uint256` | The ID of the stream. | +| `to` | `address` | The address that received the withdrawn tokens. | +| `token` | `IERC20` | The contract address of the ERC-20 token that was withdrawn. | +| `caller` | `address` | The address that performed the withdrawal, which can be the recipient or an approved operator. | +| `withdrawAmount` | `uint128` | The amount withdrawn to the recipient after subtracting the protocol fee, denoted in token's decimals. | +| `protocolFeeAmount` | `uint128` | The amount of protocol fee deducted from the withdrawn amount, denoted in token's decimals. | diff --git a/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md b/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md new file mode 100644 index 00000000..9affd9ad --- /dev/null +++ b/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md @@ -0,0 +1,441 @@ +# ISablierFlowBase + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/interfaces/ISablierFlowBase.sol) + +**Inherits:** IERC4906, IERC721Metadata, [IAdminable](/docs/reference/flow/contracts/interfaces/interface.IAdminable.md) + +Base contract that includes state variables (storage and constants) for the +[SablierFlow](/docs/reference/flow/contracts/contract.SablierFlow.md) contract, their respective getters, helpful +modifiers, and helper functions. + +_This contract also includes admin control functions._ + +## Functions + +### MAX_FEE + +Retrieves the maximum fee that can be charged by the broker and the protocol, denoted as a fixed-point percentage where +1e18 is 100%. + +_This value is hard coded as a constant._ + +```solidity +function MAX_FEE() external view returns (UD60x18 fee); +``` + +### aggregateBalance + +Retrieves the sum of balances of all streams. + +```solidity +function aggregateBalance(IERC20 token) external view returns (uint256); +``` + +**Parameters** + +| Name | Type | Description | +| ------- | -------- | ------------------------------- | +| `token` | `IERC20` | The ERC-20 token for the query. | + +### getBalance + +Retrieves the balance of the stream, i.e. the total deposited amounts subtracted by the total withdrawn amounts, denoted +in token's decimals. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getBalance(uint256 streamId) external view returns (uint128 balance); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getRatePerSecond + +Retrieves the rate per second of the stream, denoted as a fixed-point number where 1e18 is 1 token per second. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getRatePerSecond(uint256 streamId) external view returns (UD21x18 ratePerSecond); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getRecipient + +Retrieves the stream's recipient. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getRecipient(uint256 streamId) external view returns (address recipient); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSender + +Retrieves the stream's sender. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSender(uint256 streamId) external view returns (address sender); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSnapshotDebtScaled + +Retrieves the snapshot debt of the stream, denoted as a fixed-point number where 1e18 is 1 token. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSnapshotDebtScaled(uint256 streamId) external view returns (uint256 snapshotDebtScaled); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getSnapshotTime + +Retrieves the snapshot time of the stream, which is a Unix timestamp. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getSnapshotTime(uint256 streamId) external view returns (uint40 snapshotTime); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getStream + +Retrieves the stream entity. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getStream(uint256 streamId) external view returns (Flow.Stream memory stream); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### getToken + +Retrieves the token of the stream. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getToken(uint256 streamId) external view returns (IERC20 token); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### getTokenDecimals + +Retrieves the token decimals of the stream. + +_Reverts if `streamId` references a null stream._ + +```solidity +function getTokenDecimals(uint256 streamId) external view returns (uint8 tokenDecimals); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ------------------------------------------- | +| `streamId` | `uint256` | The ID of the stream to make the query for. | + +### isPaused + +Returns whether a stream is paused. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isPaused(uint256 streamId) external view returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isStream + +Retrieves a flag indicating whether the stream exists. + +_Does not revert if `streamId` references a null stream._ + +```solidity +function isStream(uint256 streamId) external view returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isTransferable + +Retrieves a flag indicating whether the stream NFT is transferable. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isTransferable(uint256 streamId) external view returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### isVoided + +Retrieves a flag indicating whether the stream is voided. + +_Reverts if `streamId` references a null stream._ + +```solidity +function isVoided(uint256 streamId) external view returns (bool result); +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ---------------------------- | +| `streamId` | `uint256` | The stream ID for the query. | + +### nextStreamId + +Counter for stream ids. + +```solidity +function nextStreamId() external view returns (uint256); +``` + +**Returns** + +| Name | Type | Description | +| -------- | --------- | ------------------- | +| `` | `uint256` | The next stream ID. | + +### nftDescriptor + +Contract that generates the non-fungible token URI. + +```solidity +function nftDescriptor() external view returns (IFlowNFTDescriptor); +``` + +### protocolFee + +Protocol fee for the provided ERC-20 token, denoted as a fixed-point percentage where 1e18 is 100%. + +```solidity +function protocolFee(IERC20 token) external view returns (UD60x18); +``` + +### protocolRevenue + +Protocol revenue accrued for the provided ERC-20 token, denoted in token's decimals. + +```solidity +function protocolRevenue(IERC20 token) external view returns (uint128); +``` + +### collectProtocolRevenue + +Collect the protocol revenue accrued for the provided ERC-20 token. + +Emits +[CollectProtocolRevenue](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md#collectprotocolrevenue) +event. Requirements: + +- `msg.sender` must be the contract admin. +- The accrued protocol revenue must be greater than zero. + +```solidity +function collectProtocolRevenue(IERC20 token, address to) external; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | ----------------------------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token for which to claim protocol revenue. | +| `to` | `address` | The address to send the protocol revenue. | + +### recover + +Recover the surplus amount of tokens. + +Emits [Recover](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md#recover) event. Notes: + +- The surplus amount is defined as the difference between the total balance of the contract for the provided ERC-20 + token and the sum of balances of all streams created using the same ERC-20 token. Requirements: +- `msg.sender` must be the contract admin. +- The surplus amount must be greater than zero. + +```solidity +function recover(IERC20 token, address to) external; +``` + +**Parameters** + +| Name | Type | Description | +| ------- | --------- | -------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token to recover for. | +| `to` | `address` | The address to send the surplus amount. | + +### setNFTDescriptor + +Sets a new NFT descriptor contract, which produces the URI describing the Sablier stream NFTs. + +Emits [SetNFTDescriptor](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md#setnftdescriptor) and +{BatchMetadataUpdate} events. Notes: + +- Does not revert if the NFT descriptor is the same. Requirements: +- `msg.sender` must be the contract admin. + +```solidity +function setNFTDescriptor(IFlowNFTDescriptor newNFTDescriptor) external; +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | -------------------- | ----------------------------------------------- | +| `newNFTDescriptor` | `IFlowNFTDescriptor` | The address of the new NFT descriptor contract. | + +### setProtocolFee + +Sets a new protocol fee that will be charged on all the withdrawals from streams created with the provided ERC-20 token. + +Emits [SetProtocolFee](/docs/reference/flow/contracts/interfaces/interface.ISablierFlowBase.md#setprotocolfee) and +{BatchMetadataUpdate} events. Notes: + +- Does not revert if the fee is the same. +- It can be zero. Requirements: +- `msg.sender` must be the contract admin. +- `newProtocolFee` must not be greater than `MAX_FEE`. + +```solidity +function setProtocolFee(IERC20 token, UD60x18 newProtocolFee) external; +``` + +**Parameters** + +| Name | Type | Description | +| ---------------- | --------- | ----------------------------------------------------------------------------- | +| `token` | `IERC20` | The contract address of the ERC-20 token to update the fee for. | +| `newProtocolFee` | `UD60x18` | The new protocol fee, denoted as a fixed-point percentage where 1e18 is 100%. | + +## Events + +### CollectProtocolRevenue + +Emitted when the contract admin collects protocol revenue accrued. + +```solidity +event CollectProtocolRevenue(address indexed admin, IERC20 indexed token, address to, uint128 revenue); +``` + +**Parameters** + +| Name | Type | Description | +| --------- | --------- | ---------------------------------------------------------------------------- | +| `admin` | `address` | The address of the contract admin. | +| `token` | `IERC20` | The address of the ERC-20 token the protocol revenue has been collected for. | +| `to` | `address` | The address the protocol revenue has been sent to. | +| `revenue` | `uint128` | The amount of protocol revenue collected. | + +### Recover + +Emitted when the contract admin recovers the surplus amount of token. + +```solidity +event Recover(address indexed admin, IERC20 indexed token, address to, uint256 surplus); +``` + +**Parameters** + +| Name | Type | Description | +| --------- | --------- | -------------------------------------------------------------------------- | +| `admin` | `address` | The address of the contract admin. | +| `token` | `IERC20` | The address of the ERC-20 token the surplus amount has been recovered for. | +| `to` | `address` | The address the surplus amount has been sent to. | +| `surplus` | `uint256` | The amount of surplus tokens recovered. | + +### SetNFTDescriptor + +Emitted when the contract admin sets a new NFT descriptor contract. + +```solidity +event SetNFTDescriptor(address indexed admin, IFlowNFTDescriptor oldNFTDescriptor, IFlowNFTDescriptor newNFTDescriptor); +``` + +**Parameters** + +| Name | Type | Description | +| ------------------ | -------------------- | ----------------------------------------------- | +| `admin` | `address` | The address of the contract admin. | +| `oldNFTDescriptor` | `IFlowNFTDescriptor` | The address of the old NFT descriptor contract. | +| `newNFTDescriptor` | `IFlowNFTDescriptor` | The address of the new NFT descriptor contract. | + +### SetProtocolFee + +Emitted when the contract admin sets a new protocol fee for the provided ERC-20 token. + +```solidity +event SetProtocolFee(address indexed admin, IERC20 indexed token, UD60x18 oldProtocolFee, UD60x18 newProtocolFee); +``` + +**Parameters** + +| Name | Type | Description | +| ---------------- | --------- | ---------------------------------------------------------------------- | +| `admin` | `address` | The address of the contract admin. | +| `token` | `IERC20` | The address of the ERC-20 token the new protocol fee has been set for. | +| `oldProtocolFee` | `UD60x18` | The old protocol fee, denoted as a fixed-point percentage. | +| `newProtocolFee` | `UD60x18` | The new protocol fee, denoted as a fixed-point percentage. | diff --git a/docs/reference/flow/contracts/libraries/library.Errors.md b/docs/reference/flow/contracts/libraries/library.Errors.md new file mode 100644 index 00000000..bad49fb6 --- /dev/null +++ b/docs/reference/flow/contracts/libraries/library.Errors.md @@ -0,0 +1,231 @@ +# Errors + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/libraries/Errors.sol) + +Library with custom errors used across the Flow contract. + +## Errors + +### BatchError + +Thrown when an unexpected error occurs during a batch call. + +```solidity +error BatchError(bytes errorData); +``` + +### CallerNotAdmin + +Thrown when `msg.sender` is not the admin. + +```solidity +error CallerNotAdmin(address admin, address caller); +``` + +### DelegateCall + +Thrown when trying to delegate call to a function that disallows delegate calls. + +```solidity +error DelegateCall(); +``` + +### SablierFlow_BrokerAddressZero + +Thrown when trying to create a stream with a broker recipient address as zero. + +```solidity +error SablierFlow_BrokerAddressZero(); +``` + +### SablierFlow_BrokerFeeTooHigh + +Thrown when trying to create a stream with a broker fee more than the allowed. + +```solidity +error SablierFlow_BrokerFeeTooHigh(UD60x18 brokerFee, UD60x18 maxFee); +``` + +### SablierFlow_DepositAmountZero + +Thrown when trying to create a stream with a zero deposit amount. + +```solidity +error SablierFlow_DepositAmountZero(uint256 streamId); +``` + +### SablierFlow_InvalidCalculation + +Thrown when an unexpected error occurs during the calculation of an amount. + +```solidity +error SablierFlow_InvalidCalculation(uint256 streamId, uint128 availableAmount, uint128 amount); +``` + +### SablierFlow_InvalidTokenDecimals + +Thrown when trying to create a stream with an token with no decimals. + +```solidity +error SablierFlow_InvalidTokenDecimals(address token); +``` + +### SablierFlow_NotStreamRecipient + +Thrown when the recipient address does not match the stream's recipient. + +```solidity +error SablierFlow_NotStreamRecipient(address recipient, address streamRecipient); +``` + +### SablierFlow_NotStreamSender + +Thrown when the sender address does not match the stream's sender. + +```solidity +error SablierFlow_NotStreamSender(address sender, address streamSender); +``` + +### SablierFlow_Null + +Thrown when the ID references a null stream. + +```solidity +error SablierFlow_Null(uint256 streamId); +``` + +### SablierFlow_Overdraw + +Thrown when trying to withdraw an amount greater than the withdrawable amount. + +```solidity +error SablierFlow_Overdraw(uint256 streamId, uint128 amount, uint128 withdrawableAmount); +``` + +### SablierFlow_RatePerSecondNotDifferent + +Thrown when trying to change the rate per second with the same rate per second. + +```solidity +error SablierFlow_RatePerSecondNotDifferent(uint256 streamId, UD21x18 ratePerSecond); +``` + +### SablierFlow_RefundAmountZero + +Thrown when trying to refund zero tokens from a stream. + +```solidity +error SablierFlow_RefundAmountZero(uint256 streamId); +``` + +### SablierFlow_RefundOverflow + +Thrown when trying to refund an amount greater than the refundable amount. + +```solidity +error SablierFlow_RefundOverflow(uint256 streamId, uint128 refundAmount, uint128 refundableAmount); +``` + +### SablierFlow_SenderZeroAddress + +Thrown when trying to create a stream with the sender as the zero address. + +```solidity +error SablierFlow_SenderZeroAddress(); +``` + +### SablierFlow_StreamBalanceZero + +Thrown when trying to get depletion time of a stream with zero balance. + +```solidity +error SablierFlow_StreamBalanceZero(uint256 streamId); +``` + +### SablierFlow_StreamPaused + +Thrown when trying to perform an action with a paused stream. + +```solidity +error SablierFlow_StreamPaused(uint256 streamId); +``` + +### SablierFlow_StreamNotPaused + +Thrown when trying to restart a stream that is not paused. + +```solidity +error SablierFlow_StreamNotPaused(uint256 streamId); +``` + +### SablierFlow_StreamVoided + +Thrown when trying to perform an action with a voided stream. + +```solidity +error SablierFlow_StreamVoided(uint256 streamId); +``` + +### SablierFlow_Unauthorized + +Thrown when `msg.sender` lacks authorization to perform an action. + +```solidity +error SablierFlow_Unauthorized(uint256 streamId, address caller); +``` + +### SablierFlow_WithdrawalAddressNotRecipient + +Thrown when trying to withdraw to an address other than the recipient's. + +```solidity +error SablierFlow_WithdrawalAddressNotRecipient(uint256 streamId, address caller, address to); +``` + +### SablierFlow_WithdrawAmountZero + +Thrown when trying to withdraw zero tokens from a stream. + +```solidity +error SablierFlow_WithdrawAmountZero(uint256 streamId); +``` + +### SablierFlow_WithdrawToZeroAddress + +Thrown when trying to withdraw to the zero address. + +```solidity +error SablierFlow_WithdrawToZeroAddress(uint256 streamId); +``` + +### SablierFlowBase_NoProtocolRevenue + +Thrown when trying to claim protocol revenue when the accrued amount is zero. + +```solidity +error SablierFlowBase_NoProtocolRevenue(address token); +``` + +### SablierFlowBase_NotTransferable + +Thrown when trying to transfer Stream NFT when transferability is disabled. + +```solidity +error SablierFlowBase_NotTransferable(uint256 streamId); +``` + +### SablierFlowBase_ProtocolFeeTooHigh + +Thrown when trying to set protocol fee more than the allowed. + +```solidity +error SablierFlowBase_ProtocolFeeTooHigh(UD60x18 newProtocolFee, UD60x18 maxFee); +``` + +### SablierFlowBase_SurplusZero + +Thrown when trying to recover for a token with zero surplus. + +```solidity +error SablierFlowBase_SurplusZero(address token); +``` diff --git a/docs/reference/flow/contracts/libraries/library.Helpers.md b/docs/reference/flow/contracts/libraries/library.Helpers.md new file mode 100644 index 00000000..277a10e2 --- /dev/null +++ b/docs/reference/flow/contracts/libraries/library.Helpers.md @@ -0,0 +1,52 @@ +# Helpers + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/libraries/Helpers.sol) + +Library with helper functions in [SablierFlow](/docs/reference/flow/contracts/contract.SablierFlow.md) contract. + +## Functions + +### calculateAmountsFromFee + +_Calculate the fee amount and the net amount after subtracting the fee, based on the `fee` percentage._ + +```solidity +function calculateAmountsFromFee( + uint128 totalAmount, + UD60x18 fee +) + internal + pure + returns (uint128 feeAmount, uint128 netAmount); +``` + +### checkAndCalculateBrokerFee + +_Checks the `Broker` parameter, and then calculates the broker fee amount and the deposit amount from the total amount._ + +```solidity +function checkAndCalculateBrokerFee( + uint128 totalAmount, + Broker memory broker, + UD60x18 maxFee +) + internal + pure + returns (uint128 brokerFeeAmount, uint128 depositAmount); +``` + +### descaleAmount + +_Descales the provided `amount` from 18 decimals fixed-point number to token's decimals number._ + +```solidity +function descaleAmount(uint256 amount, uint8 decimals) internal pure returns (uint256); +``` + +### scaleAmount + +_Scales the provided `amount` from token's decimals number to 18 decimals fixed-point number._ + +```solidity +function scaleAmount(uint256 amount, uint8 decimals) internal pure returns (uint256); +``` diff --git a/docs/reference/flow/contracts/types/library.Flow.md b/docs/reference/flow/contracts/types/library.Flow.md new file mode 100644 index 00000000..96759c64 --- /dev/null +++ b/docs/reference/flow/contracts/types/library.Flow.md @@ -0,0 +1,74 @@ +# Flow + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/types/DataTypes.sol) + +## Structs + +### Stream + +Struct representing Flow streams. + +_The fields are arranged like this to save gas via tight variable packing._ + +```solidity +struct Stream { + uint128 balance; + UD21x18 ratePerSecond; + address sender; + uint40 snapshotTime; + bool isStream; + bool isTransferable; + bool isVoided; + IERC20 token; + uint8 tokenDecimals; + uint256 snapshotDebtScaled; +} +``` + +**Properties** + +| Name | Type | Description | +| -------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `balance` | `uint128` | The amount of tokens that are currently available in the stream, denoted in token's decimals. This is the sum of deposited amounts minus the sum of withdrawn amounts. | +| `ratePerSecond` | `UD21x18` | The payment rate per second, denoted as a fixed-point number where 1e18 is 1 token per second. For example, to stream 1000 tokens per week, this parameter would have the value $(1000 * 10^18) / (7 days in seconds)$. | +| `sender` | `address` | The address streaming the tokens, with the ability to pause the stream. | +| `snapshotTime` | `uint40` | The Unix timestamp used for the ongoing debt calculation. | +| `isStream` | `bool` | Boolean indicating if the struct entity exists. | +| `isTransferable` | `bool` | Boolean indicating if the stream NFT is transferable. | +| `isVoided` | `bool` | Boolean indicating if the stream is voided. Voiding any stream is non-reversible and it cannot be restarted. Voiding an insolvent stream sets its uncovered debt to zero. | +| `token` | `IERC20` | The contract address of the ERC-20 token to stream. | +| `tokenDecimals` | `uint8` | The decimals of the ERC-20 token to stream. | +| `snapshotDebtScaled` | `uint256` | The amount of tokens that the sender owed to the recipient at snapshot time, denoted as a 18-decimals fixed-point number. This, along with the ongoing debt, can be used to calculate the total debt at any given point in time. | + +## Enums + +### Status + +Enum representing the different statuses of a stream. + +Explanations for the two types of streams: + +1. Streaming: when the total debt is increasing. +2. Paused: when the total debt is not increasing. + +**Notes:** + +- value0: STREAMING_SOLVENT Streaming stream when there is no uncovered debt. + +- value1: STREAMING_INSOLVENT Streaming stream when there is uncovered debt. + +- value2: PAUSED_SOLVENT Paused stream when there is no uncovered debt. + +- value3: PAUSED_INSOLVENT Paused stream when there is uncovered debt. + +- value4: VOIDED Paused stream with no uncovered debt and it cannot be restarted. + +```solidity +enum Status { + STREAMING_SOLVENT, + STREAMING_INSOLVENT, + PAUSED_SOLVENT, + PAUSED_INSOLVENT, + VOIDED +} +``` diff --git a/docs/reference/flow/contracts/types/struct.Broker.md b/docs/reference/flow/contracts/types/struct.Broker.md new file mode 100644 index 00000000..4356103b --- /dev/null +++ b/docs/reference/flow/contracts/types/struct.Broker.md @@ -0,0 +1,19 @@ +# Broker + +[Git Source](https://github.com/sablier-labs/flow/blob/ba8c67a35d9cfd4fe646c2ab7db2c40e93d7fd6f/src/types/DataTypes.sol) + +Struct encapsulating the broker parameters. + +```solidity +struct Broker { + address account; + UD60x18 fee; +} +``` + +**Properties** + +| Name | Type | Description | +| --------- | --------- | -------------------------------------------------------------------------------------------------------------------- | +| `account` | `address` | The address receiving the broker's fee. | +| `fee` | `UD60x18` | The broker's percentage fee charged from the deposit amount, denoted as a fixed-point percentage where 1e18 is 100%. | diff --git a/docs/reference/legacy/_category_.json b/docs/reference/legacy/_category_.json new file mode 100644 index 00000000..eda5e4e4 --- /dev/null +++ b/docs/reference/legacy/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Legacy", + "position": 4 +} diff --git a/docs/reference/legacy/contracts/_category_.json b/docs/reference/legacy/contracts/_category_.json new file mode 100644 index 00000000..c3ee869b --- /dev/null +++ b/docs/reference/legacy/contracts/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": true, + "label": "Contracts", + "position": 1 +} diff --git a/docs/contracts/v1/contracts/constant-functions.md b/docs/reference/legacy/contracts/constant-functions.md similarity index 98% rename from docs/contracts/v1/contracts/constant-functions.md rename to docs/reference/legacy/contracts/constant-functions.md index 377ebcd3..de9118f2 100644 --- a/docs/contracts/v1/contracts/constant-functions.md +++ b/docs/reference/legacy/contracts/constant-functions.md @@ -1,7 +1,7 @@ --- id: constant-functions title: Constant Functions -sidebar_position: 3 +sidebar_position: 2 --- ## Get Stream @@ -135,7 +135,7 @@ strings. :::info The contract call could revert with [no reason](https://vmexceptionwhileprocessingtransactionrevert.com/) provided. In -this case, you probably did not approve the Sablier contract to spend your token balance, although this is not +this case, you probably did not approve the Lockup contract to spend your token balance, although this is not necessarily the case. Ping us on [Discord](https://discord.sablier.com) if you get stuck. ::: diff --git a/docs/contracts/v1/contracts/non-constant-functions.md b/docs/reference/legacy/contracts/non-constant-functions.md similarity index 99% rename from docs/contracts/v1/contracts/non-constant-functions.md rename to docs/reference/legacy/contracts/non-constant-functions.md index 71971455..e78cf55f 100644 --- a/docs/contracts/v1/contracts/non-constant-functions.md +++ b/docs/reference/legacy/contracts/non-constant-functions.md @@ -1,7 +1,7 @@ --- id: non-constant-functions title: Non-Constant Functions -sidebar_position: 2 +sidebar_position: 1 --- ## Create stream diff --git a/docs/contracts/v2/reference/02-diagrams.md b/docs/reference/lockup/01-diagrams.md similarity index 63% rename from docs/contracts/v2/reference/02-diagrams.md rename to docs/reference/lockup/01-diagrams.md index 6a4a8447..fff540c7 100644 --- a/docs/contracts/v2/reference/02-diagrams.md +++ b/docs/reference/lockup/01-diagrams.md @@ -1,6 +1,6 @@ --- id: "diagrams" -sidebar_position: 2 +sidebar_position: 1 title: "Diagrams" --- @@ -11,8 +11,8 @@ provide insight into the storage layout. ### Shared Lockup -To see the list of all common storage variables, [click here](/contracts/v2/reference/core/types/library.Lockup#stream). -This struct is shared across LockupLinear, LockupDynamic, and LockupTranched. +To see the list of all common storage variables, [click here](/reference/lockup/core/types/library.Lockup#stream). This +struct is shared across LockupLinear, LockupDynamic, and LockupTranched. ```mermaid classDiagram @@ -24,7 +24,7 @@ classDiagram 5. wasCanceled } class slot1 { - 1. asset + 1. token 2. isDepleted 3. isStream 4. isTransferable @@ -47,9 +47,9 @@ classDiagram ### Lockup Linear -Apart from the shared lockup storage, Lockup Linear requires a -[separate storage](/contracts/v2/reference/core/contract.SablierV2LockupLinear#_cliffs) to store cliff details for each -stream ID. +Apart from the shared Lockup storage, Lockup Linear requires a +[separate storage](/reference/lockup/core/contract.SablierV2LockupLinear#_cliffs) to store cliff details for each stream +ID. ```mermaid flowchart LR; @@ -73,8 +73,8 @@ flowchart LR; ### Lockup Dynamic Similarly, Lockup Dynamic requires a -[separate storage](/contracts/v2/reference/core/contract.SablierV2LockupDynamic#_segments) to store an array of -[segments](/contracts/v2/reference/core/types/library.LockupDynamic#segment) for each stream ID. +[separate storage](/reference/lockup/core/contract.SablierV2LockupDynamic#_segments) to store an array of +[segments](/reference/lockup/core/types/library.LockupDynamic#segment) for each stream ID. ```mermaid flowchart LR; @@ -107,8 +107,8 @@ flowchart LR; ### Lockup Tranched -Lockup Tranched requires a [separate storage](/contracts/v2/reference/core/contract.SablierV2LockupTranched#_tranches) -to store an array of [tranches](/contracts/v2/reference/core/types/library.LockupTranched#tranche) for each stream ID. +Lockup Tranched requires a [separate storage](/reference/lockup/core/contract.SablierV2LockupTranched#_tranches) to +store an array of [tranches](/reference/lockup/core/types/library.LockupTranched#tranche) for each stream ID. ```mermaid flowchart LR; @@ -139,28 +139,27 @@ flowchart LR; C --> S1; ``` -## Airstream Flow +## Airstream Campaign -A typical campaign creation flow looks like the following: +A typical Airstream campaign creation flow looks like the following: ```mermaid -flowchart LR - MSF[(MerkleLockupFactory Contract)] - MS[(MerkleLockup Contract)] - S[Campaign creator] -- "createMerkleLL" --> MSF - MSF -- "create2" --> MS +sequenceDiagram + actor Campaign creator + + Campaign creator ->> MerkleLockupFactory: createMerkleLL() + MerkleLockupFactory -->> MerkleLockup: Deploy a new contract ``` And this is how the claim flow looks like for recipients: ```mermaid -flowchart LR - R1[Recipient] - MS[(MerkleLockup Contract)] - LL[(LockupLinear Contract)] - R1 -- "claim" --> MS - MS -- "createWithDurations" --> LL - LL -- "Transfer NFT" --> R1 +sequenceDiagram + actor Airdrop recipient + + Airdrop recipient ->> MerkleLockup: claim() + MerkleLockup -->> LockupLinear: Create vesting stream + LockupLinear -->> Airdrop recipient: Mint Stream NFT ``` For campaign admins, we offer `clawback` functionality which can be used to retrieve unclaimed funds after expiration. @@ -169,9 +168,9 @@ There is also a grace period that ends 7 days after the first claim is made. Dur transfer of funds. ```mermaid -flowchart LR - A[Campaign Admin] - MS[(MerkleLockup Contract)] - A -- "clawback" --> MS - MS -- "unclaimed funds" --> A +sequenceDiagram + actor Campaign creator + + Campaign creator ->> MerkleLockup: clawback() + MerkleLockup -->> Campaign creator: Transfer unclaimed tokens ``` diff --git a/docs/reference/lockup/04-access-control.md b/docs/reference/lockup/04-access-control.md new file mode 100644 index 00000000..024e0cbb --- /dev/null +++ b/docs/reference/lockup/04-access-control.md @@ -0,0 +1,177 @@ +--- +id: "access-control" +sidebar_position: 4 +title: "Access Control" +--- + +With the exception of the [admin functions](/concepts/governance#lockup), all functionalities in Lockup can only be +triggered by users. The Protocol Admin has no control over any stream or any part of the protocol. + +This article will provide a comprehensive overview of the actions that can be performed on streams once they are +created, as well as the corresponding user permissions for each action. + +:::note + +Every stream has a sender and a recipient. Recipients can approve third parties to take actions on their behalf. An +'public' caller is any address outside of sender and recipient. + +::: + +## Overview + +The table below offers a quick overview of the access control for each action that can be performed on a stream. + +| Action | Sender | Recipient / Approved third party | Public | +| ----------------------- | :----: | :------------------------------: | :----: | +| Burn NFT | ❌ | ✅ | ❌ | +| Cancel | ✅ | ❌ | ❌ | +| Cancel Multiple | ✅ | ❌ | ❌ | +| Renounce | ✅ | ❌ | ❌ | +| Transfer NFT | ❌ | ✅ | ❌ | +| Withdraw to any address | ❌ | ✅ | ❌ | +| Withdraw to recipient | ✅ | ✅ | ✅ | +| Withdraw Multiple | ✅ | ✅ | ✅ | + +## Burn NFT + +Either the recipient or an approved operator can burn the NFT associated with a stream. + +```mermaid +sequenceDiagram + actor Recipient + + Recipient ->> Lockup: burn() + Recipient -->> address(0): Transfer stream NFT +``` + +#### With Operator: + +```mermaid +sequenceDiagram + actor Recipient + actor Operator + + Recipient ->> Lockup: approve(operator) + Operator ->> Lockup: burn() + Recipient -->> address(0): Transfer stream NFT +``` + +## Cancel + +Only the sender can cancel a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Lockup: cancel() + Lockup -->> Sender: Transfer unvested tokens +``` + +## Cancel Multiple + +Only the sender can cancel multiple streams. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Lockup: cancelMultiple() + Lockup -->> Sender: Transfer unvested tokens from multiple streams +``` + +## Renounce + +Only the sender can renounce a stream. + +```mermaid +sequenceDiagram + actor Sender + + Sender ->> Lockup: renounce() +``` + +## Transfer NFT + +Either the recipient or an approved operator can transfer the NFT associated with a stream. + +- Only if the stream is transferable. + +```mermaid +sequenceDiagram + actor Recipient + + Recipient ->> Lockup: transfer(toAddress) + Create actor toAddress + Recipient -->> toAddress: Transfer NFT +``` + +#### With Operator: + +```mermaid +sequenceDiagram + actor Recipient + actor Operator + + Recipient ->> Lockup: approve(operator) + Operator ->> Lockup: transfer(toAddress) + Create actor toAddress + Recipient -->> toAddress: Transfer NFT +``` + +## Withdraw Multiple + +Anybody can withdraw tokens from multiple streams to the recipients of each stream. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> Lockup: withdrawMultiple() + Create actor getRecipient(1) + Lockup -->> getRecipient(1): Transfer vested tokens from stream 1 + Create actor getRecipient(2) + Lockup -->> getRecipient(2): Transfer vested tokens from stream 2 + Create actor getRecipient(3) + Lockup -->> getRecipient(3): Transfer vested tokens from stream 3 +``` + +## Withdraw to Any Address + +The tokens in a stream can be withdrawn to any address only by the recipient or an approved third party. + +```mermaid +sequenceDiagram + actor Recipient + + Recipient ->> Lockup: withdraw(toAddress) + Create actor toAddress + Lockup -->> toAddress: Transfer vested tokens +``` + +#### With Operator: + +```mermaid +sequenceDiagram + actor Recipient + actor Operator + + Recipient ->> Lockup: approve(operator) + Operator ->> Lockup: withdraw(toAddress) + Create actor toAddress + Lockup -->> toAddress: Transfer vested tokens +``` + +## Withdraw to Recipient + +The tokens in a stream can be withdrawn to the recipient by anyone including the sender, recipient, or an approved third +party. + +```mermaid +sequenceDiagram + actor Anyone + + Anyone ->> Lockup: withdraw(recipient) + Create actor Recipient + Lockup -->> Recipient: Transfer vested tokens +``` diff --git a/docs/reference/lockup/_category_.json b/docs/reference/lockup/_category_.json new file mode 100644 index 00000000..5196dae4 --- /dev/null +++ b/docs/reference/lockup/_category_.json @@ -0,0 +1,5 @@ +{ + "collapsed": false, + "label": "Lockup", + "position": 2 +} diff --git a/docs/contracts/v2/reference/core/_category_.json b/docs/reference/lockup/core/_category_.json similarity index 73% rename from docs/contracts/v2/reference/core/_category_.json rename to docs/reference/lockup/core/_category_.json index a9e441a9..7b9ce196 100644 --- a/docs/contracts/v2/reference/core/_category_.json +++ b/docs/reference/lockup/core/_category_.json @@ -1,5 +1,5 @@ { "collapsed": true, "label": "Core", - "position": 3 + "position": 2 } diff --git a/docs/contracts/v2/reference/core/abstracts/_category_.json b/docs/reference/lockup/core/abstracts/_category_.json similarity index 100% rename from docs/contracts/v2/reference/core/abstracts/_category_.json rename to docs/reference/lockup/core/abstracts/_category_.json diff --git a/docs/reference/lockup/core/abstracts/abstract.Adminable.md b/docs/reference/lockup/core/abstracts/abstract.Adminable.md new file mode 100644 index 00000000..60beca23 --- /dev/null +++ b/docs/reference/lockup/core/abstracts/abstract.Adminable.md @@ -0,0 +1,48 @@ +# Adminable + +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/abstracts/Adminable.sol) + +**Inherits:** [IAdminable](/docs/reference/lockup/core/interfaces/interface.IAdminable.md) + +See the documentation in [IAdminable](/docs/reference/lockup/core/interfaces/interface.IAdminable.md). + +## State Variables + +### admin + +The address of the admin account or contract. + +```solidity +address public override admin; +``` + +## Functions + +### onlyAdmin + +Reverts if called by any account other than the admin. + +```solidity +modifier onlyAdmin(); +``` + +### transferAdmin + +Transfers the contract admin to a new address. + +Notes: + +- Does not revert if the admin is the same. +- This function can potentially leave the contract without an admin, thereby removing any functionality that is only + available to the admin. Requirements: +- `msg.sender` must be the contract admin. + +```solidity +function transferAdmin(address newAdmin) public virtual override onlyAdmin; +``` + +**Parameters** + +| Name | Type | Description | +| ---------- | --------- | ----------------------------- | +| `newAdmin` | `address` | The address of the new admin. | diff --git a/docs/contracts/v2/reference/core/abstracts/abstract.NoDelegateCall.md b/docs/reference/lockup/core/abstracts/abstract.NoDelegateCall.md similarity index 88% rename from docs/contracts/v2/reference/core/abstracts/abstract.NoDelegateCall.md rename to docs/reference/lockup/core/abstracts/abstract.NoDelegateCall.md index 458154e5..5b9af3fb 100644 --- a/docs/contracts/v2/reference/core/abstracts/abstract.NoDelegateCall.md +++ b/docs/reference/lockup/core/abstracts/abstract.NoDelegateCall.md @@ -1,6 +1,6 @@ # NoDelegateCall -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/abstracts/NoDelegateCall.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/abstracts/NoDelegateCall.sol) This contract implements logic to prevent delegate calls. diff --git a/docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md b/docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md similarity index 96% rename from docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md rename to docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md index 700debf0..b48560ca 100644 --- a/docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md +++ b/docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md @@ -1,12 +1,12 @@ # SablierV2Lockup -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/abstracts/SablierV2Lockup.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/abstracts/SablierV2Lockup.sol) -**Inherits:** [NoDelegateCall](/docs/contracts/v2/reference/core/abstracts/abstract.NoDelegateCall.md), -[Adminable](/docs/contracts/v2/reference/core/abstracts/abstract.Adminable.md), -[ISablierV2Lockup](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md), ERC721 +**Inherits:** [NoDelegateCall](/docs/reference/lockup/core/abstracts/abstract.NoDelegateCall.md), +[Adminable](/docs/reference/lockup/core/abstracts/abstract.Adminable.md), +[ISablierV2Lockup](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md), ERC721 -See the documentation in [ISablierV2Lockup](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md). +See the documentation in [ISablierV2Lockup](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md). ## State Variables @@ -226,8 +226,8 @@ function getWithdrawnAmount(uint256 streamId) Retrieves a flag indicating whether the provided address is a contract allowed to hook to Sablier when a stream is canceled or when assets are withdrawn. -_See [ISablierLockupRecipient](/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md) for -more information._ +_See [ISablierLockupRecipient](/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md) for more +information._ ```solidity function isAllowedToHook(address recipient) external view returns (bool result); @@ -452,7 +452,7 @@ Emits an {AllowToHook} event. Notes: - `msg.sender` must be the contract admin. - `recipient` must have a non-zero code size. - `recipient` must implement - [ISablierLockupRecipient](/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md). + [ISablierLockupRecipient](/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md). ```solidity function allowToHook(address recipient) external override onlyAdmin; diff --git a/docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md b/docs/reference/lockup/core/contract.SablierV2LockupDynamic.md similarity index 93% rename from docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md rename to docs/reference/lockup/core/contract.SablierV2LockupDynamic.md index b8637dc4..97daf456 100644 --- a/docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md +++ b/docs/reference/lockup/core/contract.SablierV2LockupDynamic.md @@ -4,14 +4,13 @@ sidebar_position: 2 # SablierV2LockupDynamic -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/SablierV2LockupDynamic.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/SablierV2LockupDynamic.sol) -**Inherits:** -[ISablierV2LockupDynamic](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupDynamic.md), -[SablierV2Lockup](/docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md) +**Inherits:** [ISablierV2LockupDynamic](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupDynamic.md), +[SablierV2Lockup](/docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md) See the documentation in -[ISablierV2LockupDynamic](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupDynamic.md). +[ISablierV2LockupDynamic](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupDynamic.md). ## State Variables @@ -28,7 +27,7 @@ uint256 public immutable override MAX_SEGMENT_COUNT; ### \_segments _Stream segments mapped by stream IDs. This complements the `_streams` mapping in -[SablierV2Lockup](docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md)._ +[SablierV2Lockup](docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md)._ ```solidity mapping(uint256 id => LockupDynamic.Segment[] segments) internal _segments; diff --git a/docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md b/docs/reference/lockup/core/contract.SablierV2LockupLinear.md similarity index 92% rename from docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md rename to docs/reference/lockup/core/contract.SablierV2LockupLinear.md index 41fbf9f6..f46732d8 100644 --- a/docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md +++ b/docs/reference/lockup/core/contract.SablierV2LockupLinear.md @@ -4,21 +4,20 @@ sidebar_position: 1 # SablierV2LockupLinear -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/SablierV2LockupLinear.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/SablierV2LockupLinear.sol) -**Inherits:** -[ISablierV2LockupLinear](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear.md), -[SablierV2Lockup](/docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md) +**Inherits:** [ISablierV2LockupLinear](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear.md), +[SablierV2Lockup](/docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md) See the documentation in -[ISablierV2LockupLinear](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear.md). +[ISablierV2LockupLinear](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear.md). ## State Variables ### \_cliffs _Cliff times mapped by stream IDs. This complements the `_streams` mapping in -[SablierV2Lockup](docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md)._ +[SablierV2Lockup](docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md)._ ```solidity mapping(uint256 id => uint40 cliff) internal _cliffs; diff --git a/docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md b/docs/reference/lockup/core/contract.SablierV2LockupTranched.md similarity index 92% rename from docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md rename to docs/reference/lockup/core/contract.SablierV2LockupTranched.md index c32d9c5d..78f87c6d 100644 --- a/docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md +++ b/docs/reference/lockup/core/contract.SablierV2LockupTranched.md @@ -4,14 +4,13 @@ sidebar_position: 2 # SablierV2LockupTranched -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/SablierV2LockupTranched.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/SablierV2LockupTranched.sol) -**Inherits:** -[ISablierV2LockupTranched](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupTranched.md), -[SablierV2Lockup](/docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md) +**Inherits:** [ISablierV2LockupTranched](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupTranched.md), +[SablierV2Lockup](/docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md) See the documentation in -[ISablierV2LockupTranched](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupTranched.md). +[ISablierV2LockupTranched](/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupTranched.md). ## State Variables @@ -28,7 +27,7 @@ uint256 public immutable override MAX_TRANCHE_COUNT; ### \_tranches _Stream tranches mapped by stream IDs. This complements the `_streams` mapping in -[SablierV2Lockup](docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md)._ +[SablierV2Lockup](docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md)._ ```solidity mapping(uint256 id => LockupTranched.Tranche[] tranches) internal _tranches; diff --git a/docs/contracts/v2/reference/core/contract.SablierV2NFTDescriptor.md b/docs/reference/lockup/core/contract.SablierV2NFTDescriptor.md similarity index 94% rename from docs/contracts/v2/reference/core/contract.SablierV2NFTDescriptor.md rename to docs/reference/lockup/core/contract.SablierV2NFTDescriptor.md index f8ed06ef..a4985c3f 100644 --- a/docs/contracts/v2/reference/core/contract.SablierV2NFTDescriptor.md +++ b/docs/reference/lockup/core/contract.SablierV2NFTDescriptor.md @@ -4,13 +4,12 @@ sidebar_position: 3 # SablierV2NFTDescriptor -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/SablierV2NFTDescriptor.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/SablierV2NFTDescriptor.sol) -**Inherits:** -[ISablierV2NFTDescriptor](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2NFTDescriptor.md) +**Inherits:** [ISablierV2NFTDescriptor](/docs/reference/lockup/core/interfaces/interface.ISablierV2NFTDescriptor.md) See the documentation in -[ISablierV2NFTDescriptor](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2NFTDescriptor.md). +[ISablierV2NFTDescriptor](/docs/reference/lockup/core/interfaces/interface.ISablierV2NFTDescriptor.md). ## Functions diff --git a/docs/contracts/v2/reference/core/interfaces/_category_.json b/docs/reference/lockup/core/interfaces/_category_.json similarity index 100% rename from docs/contracts/v2/reference/core/interfaces/_category_.json rename to docs/reference/lockup/core/interfaces/_category_.json diff --git a/docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md b/docs/reference/lockup/core/interfaces/interface.IAdminable.md similarity index 91% rename from docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md rename to docs/reference/lockup/core/interfaces/interface.IAdminable.md index 7077caec..895d2695 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md +++ b/docs/reference/lockup/core/interfaces/interface.IAdminable.md @@ -1,6 +1,6 @@ # IAdminable -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/IAdminable.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/IAdminable.sol) Contract module that provides a basic access control mechanism, with an admin that can be granted exclusive access to specific functions. The inheriting contract must set the initial admin in the constructor. diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md b/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md similarity index 96% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md rename to docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md index 9559bfd8..8dd7f706 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md @@ -1,6 +1,6 @@ # ISablierLockupRecipient -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierLockupRecipient.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierLockupRecipient.sol) **Inherits:** IERC165 diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md b/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md similarity index 95% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md rename to docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md index af71ede1..389a01f8 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md @@ -1,9 +1,8 @@ # ISablierV2Lockup -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierV2Lockup.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierV2Lockup.sol) -**Inherits:** [IAdminable](/docs/contracts/v2/reference/core/interfaces/interface.IAdminable.md), IERC4906, -IERC721Metadata +**Inherits:** [IAdminable](/docs/reference/lockup/core/interfaces/interface.IAdminable.md), IERC4906, IERC721Metadata Common logic between all Sablier V2 Lockup contracts. @@ -143,8 +142,8 @@ function getWithdrawnAmount(uint256 streamId) external view returns (uint128 wit Retrieves a flag indicating whether the provided address is a contract allowed to hook to Sablier when a stream is canceled or when assets are withdrawn. -_See [ISablierLockupRecipient](/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md) for -more information._ +_See [ISablierLockupRecipient](/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md) for more +information._ ```solidity function isAllowedToHook(address recipient) external view returns (bool result); @@ -362,15 +361,14 @@ function withdrawableAmountOf(uint256 streamId) external view returns (uint128 w Allows a recipient contract to hook to Sablier when a stream is canceled or when assets are withdrawn. Useful for implementing contracts that hold streams on behalf of users, such as vaults or staking contracts. -Emits an [AllowToHook](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md#allowtohook) event. -Notes: +Emits an [AllowToHook](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md#allowtohook) event. Notes: - Does not revert if the contract is already on the allowlist. - This is an irreversible operation. The contract cannot be removed from the allowlist. Requirements: - `msg.sender` must be the contract admin. - `recipient` must have a non-zero code size. - `recipient` must implement - [ISablierLockupRecipient](/docs/contracts/v2/reference/core/interfaces/interface.ISablierLockupRecipient.md). + [ISablierLockupRecipient](/docs/reference/lockup/core/interfaces/interface.ISablierLockupRecipient.md). ```solidity function allowToHook(address recipient) external; @@ -450,8 +448,8 @@ function cancelMultiple(uint256[] calldata streamIds) external; Removes the right of the stream's sender to cancel the stream. Emits a -[RenounceLockupStream](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md#renouncelockupstream) -and {MetadataUpdate} event. Notes: +[RenounceLockupStream](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md#renouncelockupstream) and +{MetadataUpdate} event. Notes: - This is an irreversible operation. Requirements: - Must not be delegate called. @@ -473,8 +471,8 @@ function renounce(uint256 streamId) external; Sets a new NFT descriptor contract, which produces the URI describing the Sablier stream NFTs. -Emits a [SetNFTDescriptor](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md#setnftdescriptor) -and {BatchMetadataUpdate} event. Notes: +Emits a [SetNFTDescriptor](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md#setnftdescriptor) and +{BatchMetadataUpdate} event. Notes: - Does not revert if the NFT descriptor is the same. Requirements: - `msg.sender` must be the contract admin. @@ -547,7 +545,7 @@ Withdraws the maximum withdrawable amount from the stream to the current recipie `newRecipient`. Emits a -[WithdrawFromLockupStream](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md#withdrawfromlockupstream) +[WithdrawFromLockupStream](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md#withdrawfromlockupstream) and a {Transfer} event. Notes: - If the withdrawable amount is zero, the withdrawal is skipped. diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupDynamic.md b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupDynamic.md similarity index 97% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupDynamic.md rename to docs/reference/lockup/core/interfaces/interface.ISablierV2LockupDynamic.md index 6bcc349b..81432370 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupDynamic.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupDynamic.md @@ -1,8 +1,8 @@ # ISablierV2LockupDynamic -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierV2LockupDynamic.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierV2LockupDynamic.sol) -**Inherits:** [ISablierV2Lockup](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md) +**Inherits:** [ISablierV2Lockup](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md) Creates and manages Lockup streams with a dynamic distribution function. diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear.md b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear.md similarity index 96% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear.md rename to docs/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear.md index 6f0d3b4e..c2bdbb51 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupLinear.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupLinear.md @@ -1,8 +1,8 @@ # ISablierV2LockupLinear -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierV2LockupLinear.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierV2LockupLinear.sol) -**Inherits:** [ISablierV2Lockup](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md) +**Inherits:** [ISablierV2Lockup](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md) Creates and manages Lockup streams with a linear distribution function. diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupTranched.md b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupTranched.md similarity index 97% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupTranched.md rename to docs/reference/lockup/core/interfaces/interface.ISablierV2LockupTranched.md index 3a296277..3d23fa44 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2LockupTranched.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierV2LockupTranched.md @@ -1,8 +1,8 @@ # ISablierV2LockupTranched -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierV2LockupTranched.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierV2LockupTranched.sol) -**Inherits:** [ISablierV2Lockup](/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2Lockup.md) +**Inherits:** [ISablierV2Lockup](/docs/reference/lockup/core/interfaces/interface.ISablierV2Lockup.md) Creates and manages Lockup streams with a tranched distribution function. diff --git a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2NFTDescriptor.md b/docs/reference/lockup/core/interfaces/interface.ISablierV2NFTDescriptor.md similarity index 89% rename from docs/contracts/v2/reference/core/interfaces/interface.ISablierV2NFTDescriptor.md rename to docs/reference/lockup/core/interfaces/interface.ISablierV2NFTDescriptor.md index 5806a9c8..55fc5098 100644 --- a/docs/contracts/v2/reference/core/interfaces/interface.ISablierV2NFTDescriptor.md +++ b/docs/reference/lockup/core/interfaces/interface.ISablierV2NFTDescriptor.md @@ -1,6 +1,6 @@ # ISablierV2NFTDescriptor -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/interfaces/ISablierV2NFTDescriptor.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/interfaces/ISablierV2NFTDescriptor.sol) This contract generates the URI describing the Sablier V2 stream NFTs. diff --git a/docs/contracts/v2/reference/core/libraries/_category_.json b/docs/reference/lockup/core/libraries/_category_.json similarity index 100% rename from docs/contracts/v2/reference/core/libraries/_category_.json rename to docs/reference/lockup/core/libraries/_category_.json diff --git a/docs/contracts/v2/reference/core/libraries/library.Errors.md b/docs/reference/lockup/core/libraries/library.Errors.md similarity index 98% rename from docs/contracts/v2/reference/core/libraries/library.Errors.md rename to docs/reference/lockup/core/libraries/library.Errors.md index b2f15ccd..b72e2b50 100644 --- a/docs/contracts/v2/reference/core/libraries/library.Errors.md +++ b/docs/reference/lockup/core/libraries/library.Errors.md @@ -1,6 +1,6 @@ # Errors -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/libraries/Errors.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/libraries/Errors.sol) Library containing all custom errors the protocol may revert with. diff --git a/docs/contracts/v2/reference/core/libraries/library.Helpers.md b/docs/reference/lockup/core/libraries/library.Helpers.md similarity index 83% rename from docs/contracts/v2/reference/core/libraries/library.Helpers.md rename to docs/reference/lockup/core/libraries/library.Helpers.md index f57bd777..547eedd5 100644 --- a/docs/contracts/v2/reference/core/libraries/library.Helpers.md +++ b/docs/reference/lockup/core/libraries/library.Helpers.md @@ -1,6 +1,6 @@ # Helpers -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/libraries/Helpers.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/libraries/Helpers.sol) Library with helper functions needed across the Sablier V2 contracts. @@ -47,8 +47,7 @@ function checkAndCalculateBrokerFee( ### checkCreateLockupDynamic _Checks the parameters of the -[SablierV2LockupDynamic-\_create](/docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md#_create) -function._ +[SablierV2LockupDynamic-\_create](/docs/reference/lockup/core/contract.SablierV2LockupLinear.md#_create) function._ ```solidity function checkCreateLockupDynamic( @@ -64,7 +63,7 @@ function checkCreateLockupDynamic( ### checkCreateLockupLinear _Checks the parameters of the -[SablierV2LockupLinear-\_create](/docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md#_create) function._ +[SablierV2LockupLinear-\_create](/docs/reference/lockup/core/contract.SablierV2LockupLinear.md#_create) function._ ```solidity function checkCreateLockupLinear(uint128 depositAmount, LockupLinear.Timestamps memory timestamps) internal view; @@ -73,8 +72,7 @@ function checkCreateLockupLinear(uint128 depositAmount, LockupLinear.Timestamps ### checkCreateLockupTranched _Checks the parameters of the -[SablierV2LockupTranched-\_create](/docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md#_create) -function._ +[SablierV2LockupTranched-\_create](/docs/reference/lockup/core/contract.SablierV2LockupLinear.md#_create) function._ ```solidity function checkCreateLockupTranched( diff --git a/docs/contracts/v2/reference/core/libraries/library.NFTSVG.md b/docs/reference/lockup/core/libraries/library.NFTSVG.md similarity index 92% rename from docs/contracts/v2/reference/core/libraries/library.NFTSVG.md rename to docs/reference/lockup/core/libraries/library.NFTSVG.md index 91569b26..41e21a23 100644 --- a/docs/contracts/v2/reference/core/libraries/library.NFTSVG.md +++ b/docs/reference/lockup/core/libraries/library.NFTSVG.md @@ -1,6 +1,6 @@ # NFTSVG -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/libraries/NFTSVG.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/libraries/NFTSVG.sol) ## State Variables diff --git a/docs/contracts/v2/reference/core/libraries/library.SVGElements.md b/docs/reference/lockup/core/libraries/library.SVGElements.md similarity index 98% rename from docs/contracts/v2/reference/core/libraries/library.SVGElements.md rename to docs/reference/lockup/core/libraries/library.SVGElements.md index 45b1b7e6..0d788c58 100644 --- a/docs/contracts/v2/reference/core/libraries/library.SVGElements.md +++ b/docs/reference/lockup/core/libraries/library.SVGElements.md @@ -1,6 +1,6 @@ # SVGElements -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/libraries/SVGElements.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/libraries/SVGElements.sol) ## State Variables diff --git a/docs/contracts/v2/reference/core/types/_category_.json b/docs/reference/lockup/core/types/_category_.json similarity index 100% rename from docs/contracts/v2/reference/core/types/_category_.json rename to docs/reference/lockup/core/types/_category_.json diff --git a/docs/contracts/v2/reference/core/types/library.Lockup.md b/docs/reference/lockup/core/types/library.Lockup.md similarity index 83% rename from docs/contracts/v2/reference/core/types/library.Lockup.md rename to docs/reference/lockup/core/types/library.Lockup.md index 4c258915..fcf7799d 100644 --- a/docs/contracts/v2/reference/core/types/library.Lockup.md +++ b/docs/reference/lockup/core/types/library.Lockup.md @@ -1,10 +1,10 @@ # Lockup -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/types/DataTypes.sol) Namespace for the structs used in both -[SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) and -[SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md). +[SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) and +[SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md). ## Structs @@ -51,7 +51,7 @@ struct CreateAmounts { ### Stream A common data structure to be stored in all -[SablierV2Lockup](docs/contracts/v2/reference/core/abstracts/abstract.SablierV2Lockup.md) models. +[SablierV2Lockup](docs/reference/lockup/core/abstracts/abstract.SablierV2Lockup.md) models. _The fields are arranged like this to save gas via tight variable packing._ @@ -91,6 +91,18 @@ struct Stream { Enum representing the different statuses of a stream. +**Notes:** + +- PENDING Stream created but not started; assets are in a pending state. + +- STREAMING Active stream where assets are currently being streamed. + +- SETTLED All assets have been streamed; recipient is due to withdraw them. + +- CANCELED Canceled stream; remaining assets await recipient's withdrawal. + +- DEPLETED Depleted stream; all assets have been withdrawn and/or refunded. + ```solidity enum Status { PENDING, diff --git a/docs/contracts/v2/reference/core/types/library.LockupDynamic.md b/docs/reference/lockup/core/types/library.LockupDynamic.md similarity index 97% rename from docs/contracts/v2/reference/core/types/library.LockupDynamic.md rename to docs/reference/lockup/core/types/library.LockupDynamic.md index 5f3a0e40..c9b4f74d 100644 --- a/docs/contracts/v2/reference/core/types/library.LockupDynamic.md +++ b/docs/reference/lockup/core/types/library.LockupDynamic.md @@ -1,9 +1,9 @@ # LockupDynamic -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/types/DataTypes.sol) Namespace for the structs used in -[SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md). +[SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md). ## Structs diff --git a/docs/contracts/v2/reference/core/types/library.LockupLinear.md b/docs/reference/lockup/core/types/library.LockupLinear.md similarity index 96% rename from docs/contracts/v2/reference/core/types/library.LockupLinear.md rename to docs/reference/lockup/core/types/library.LockupLinear.md index 56781422..5275b6c4 100644 --- a/docs/contracts/v2/reference/core/types/library.LockupLinear.md +++ b/docs/reference/lockup/core/types/library.LockupLinear.md @@ -1,9 +1,8 @@ # LockupLinear -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/types/DataTypes.sol) -Namespace for the structs used in -[SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md). +Namespace for the structs used in [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md). ## Structs diff --git a/docs/contracts/v2/reference/core/types/library.LockupTranched.md b/docs/reference/lockup/core/types/library.LockupTranched.md similarity index 97% rename from docs/contracts/v2/reference/core/types/library.LockupTranched.md rename to docs/reference/lockup/core/types/library.LockupTranched.md index e71b5d57..1c16913a 100644 --- a/docs/contracts/v2/reference/core/types/library.LockupTranched.md +++ b/docs/reference/lockup/core/types/library.LockupTranched.md @@ -1,9 +1,9 @@ # LockupTranched -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/types/DataTypes.sol) Namespace for the structs used in -[SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md). +[SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md). ## Structs diff --git a/docs/contracts/v2/reference/core/types/struct.Broker.md b/docs/reference/lockup/core/types/struct.Broker.md similarity index 85% rename from docs/contracts/v2/reference/core/types/struct.Broker.md rename to docs/reference/lockup/core/types/struct.Broker.md index a2ef9c70..d8287e2b 100644 --- a/docs/contracts/v2/reference/core/types/struct.Broker.md +++ b/docs/reference/lockup/core/types/struct.Broker.md @@ -1,6 +1,6 @@ # Broker -[Git Source](https://github.com/sablier-labs/v2-core/blob/36b49d3bf2a396d19083d28247e8e03d7a3a2ee1/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-core/blob/73356945b53e8dd4112f34f3e2c63c278c4a5239/src/types/DataTypes.sol) Struct encapsulating the broker parameters passed to the create functions. Both can be set to zero. diff --git a/docs/contracts/v2/reference/periphery/_category_.json b/docs/reference/lockup/periphery/_category_.json similarity index 75% rename from docs/contracts/v2/reference/periphery/_category_.json rename to docs/reference/lockup/periphery/_category_.json index feaf9004..4f38796a 100644 --- a/docs/contracts/v2/reference/periphery/_category_.json +++ b/docs/reference/lockup/periphery/_category_.json @@ -1,5 +1,5 @@ { "collapsed": true, "label": "Periphery", - "position": 4 + "position": 3 } diff --git a/docs/contracts/v2/reference/periphery/abstracts/_category_.json b/docs/reference/lockup/periphery/abstracts/_category_.json similarity index 100% rename from docs/contracts/v2/reference/periphery/abstracts/_category_.json rename to docs/reference/lockup/periphery/abstracts/_category_.json diff --git a/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md b/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md similarity index 90% rename from docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md rename to docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md index 1c266fd5..e444ee37 100644 --- a/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md +++ b/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md @@ -1,13 +1,12 @@ # SablierV2MerkleLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/abstracts/SablierV2MerkleLockup.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/abstracts/SablierV2MerkleLockup.sol) -**Inherits:** -[ISablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md), +**Inherits:** [ISablierV2MerkleLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md), Adminable See the documentation in -[ISablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md). +[ISablierV2MerkleLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md). ## State Variables diff --git a/docs/contracts/v2/reference/periphery/contract.SablierV2BatchLockup.md b/docs/reference/lockup/periphery/contract.SablierV2BatchLockup.md similarity index 80% rename from docs/contracts/v2/reference/periphery/contract.SablierV2BatchLockup.md rename to docs/reference/lockup/periphery/contract.SablierV2BatchLockup.md index e29201c3..71f006f2 100644 --- a/docs/contracts/v2/reference/periphery/contract.SablierV2BatchLockup.md +++ b/docs/reference/lockup/periphery/contract.SablierV2BatchLockup.md @@ -4,13 +4,12 @@ sidebar_position: 1 # SablierV2BatchLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/SablierV2BatchLockup.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/SablierV2BatchLockup.sol) -**Inherits:** -[ISablierV2BatchLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2BatchLockup.md) +**Inherits:** [ISablierV2BatchLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2BatchLockup.md) See the documentation in -[ISablierV2BatchLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2BatchLockup.md). +[ISablierV2BatchLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2BatchLockup.md). ## Functions @@ -36,11 +35,11 @@ function createWithDurationsLD( **Parameters** -| Name | Type | Description | -| --------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithDurations}. | +| Name | Type | Description | +| --------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithDurations}. | **Returns** @@ -70,11 +69,11 @@ function createWithTimestampsLD( **Parameters** -| Name | Type | Description | -| --------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithTimestamps}. | +| Name | Type | Description | +| --------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithTimestamps}. | **Returns** @@ -104,11 +103,11 @@ function createWithDurationsLL( **Parameters** -| Name | Type | Description | -| -------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithDurations}. | +| Name | Type | Description | +| -------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithDurations}. | **Returns** @@ -138,11 +137,11 @@ function createWithTimestampsLL( **Parameters** -| Name | Type | Description | -| -------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithTimestamps}. | +| Name | Type | Description | +| -------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithTimestamps}. | **Returns** @@ -172,11 +171,11 @@ function createWithDurationsLT( **Parameters** -| Name | Type | Description | -| ---------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithDurations}. | +| Name | Type | Description | +| ---------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithDurations}. | **Returns** @@ -206,11 +205,11 @@ function createWithTimestampsLT( **Parameters** -| Name | Type | Description | -| ---------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithTimestamps}. | +| Name | Type | Description | +| ---------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithTimestamps}. | **Returns** diff --git a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLL.md b/docs/reference/lockup/periphery/contract.SablierV2MerkleLL.md similarity index 77% rename from docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLL.md rename to docs/reference/lockup/periphery/contract.SablierV2MerkleLL.md index e6c05711..bbd4b3ec 100644 --- a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLL.md +++ b/docs/reference/lockup/periphery/contract.SablierV2MerkleLL.md @@ -4,19 +4,19 @@ sidebar_position: 3 # SablierV2MerkleLL -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/SablierV2MerkleLL.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/SablierV2MerkleLL.sol) -**Inherits:** [ISablierV2MerkleLL](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL.md), -[SablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md) +**Inherits:** [ISablierV2MerkleLL](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL.md), +[SablierV2MerkleLockup](/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md) See the documentation in -[ISablierV2MerkleLL](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL.md). +[ISablierV2MerkleLL](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL.md). ## State Variables ### LOCKUP_LINEAR -The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. +The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. ```solidity ISablierV2LockupLinear public immutable override LOCKUP_LINEAR; diff --git a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLT.md b/docs/reference/lockup/periphery/contract.SablierV2MerkleLT.md similarity index 82% rename from docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLT.md rename to docs/reference/lockup/periphery/contract.SablierV2MerkleLT.md index d10c22c5..f018581c 100644 --- a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLT.md +++ b/docs/reference/lockup/periphery/contract.SablierV2MerkleLT.md @@ -4,20 +4,19 @@ sidebar_position: 3 # SablierV2MerkleLT -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/SablierV2MerkleLT.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/SablierV2MerkleLT.sol) -**Inherits:** [ISablierV2MerkleLT](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLT.md), -[SablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md) +**Inherits:** [ISablierV2MerkleLT](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLT.md), +[SablierV2MerkleLockup](/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md) See the documentation in -[ISablierV2MerkleLT](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLT.md). +[ISablierV2MerkleLT](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLT.md). ## State Variables ### LOCKUP_TRANCHED -The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) -contract. +The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. ```solidity ISablierV2LockupTranched public immutable override LOCKUP_TRANCHED; diff --git a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory.md b/docs/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory.md similarity index 82% rename from docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory.md rename to docs/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory.md index 6003669d..6f169582 100644 --- a/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLockupFactory.md +++ b/docs/reference/lockup/periphery/contract.SablierV2MerkleLockupFactory.md @@ -4,13 +4,13 @@ sidebar_position: 2 # SablierV2MerkleLockupFactory -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/SablierV2MerkleLockupFactory.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/SablierV2MerkleLockupFactory.sol) **Inherits:** -[ISablierV2MerkleLockupFactory](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md) +[ISablierV2MerkleLockupFactory](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md) See the documentation in -[ISablierV2MerkleLockupFactory](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md). +[ISablierV2MerkleLockupFactory](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md). ## Functions diff --git a/docs/contracts/v2/reference/periphery/interfaces/_category_.json b/docs/reference/lockup/periphery/interfaces/_category_.json similarity index 100% rename from docs/contracts/v2/reference/periphery/interfaces/_category_.json rename to docs/reference/lockup/periphery/interfaces/_category_.json diff --git a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2BatchLockup.md b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2BatchLockup.md similarity index 81% rename from docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2BatchLockup.md rename to docs/reference/lockup/periphery/interfaces/interface.ISablierV2BatchLockup.md index def41ec2..592ad67a 100644 --- a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2BatchLockup.md +++ b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2BatchLockup.md @@ -1,6 +1,6 @@ # ISablierV2BatchLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/interfaces/ISablierV2BatchLockup.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/interfaces/ISablierV2BatchLockup.sol) Helper to batch create Sablier V2 Lockup streams. @@ -27,11 +27,11 @@ function createWithDurationsLL( **Parameters** -| Name | Type | Description | -| -------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithDurations}. | +| Name | Type | Description | +| -------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithDurations}. | **Returns** @@ -60,11 +60,11 @@ function createWithTimestampsLL( **Parameters** -| Name | Type | Description | -| -------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithTimestamps}. | +| Name | Type | Description | +| -------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLL[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupLinear.createWithTimestamps}. | **Returns** @@ -93,11 +93,11 @@ function createWithDurationsLD( **Parameters** -| Name | Type | Description | -| --------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithDurations}. | +| Name | Type | Description | +| --------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithDurations}. | **Returns** @@ -126,11 +126,11 @@ function createWithTimestampsLD( **Parameters** -| Name | Type | Description | -| --------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/contracts/v2/reference/core/contract.SablierV2LockupDynamic.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithTimestamps}. | +| Name | Type | Description | +| --------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `lockupDynamic` | `ISablierV2LockupDynamic` | The address of the [SablierV2LockupDynamic](docs/reference/lockup/core/contract.SablierV2LockupDynamic.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLD[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupDynamic.createWithTimestamps}. | **Returns** @@ -159,11 +159,11 @@ function createWithDurationsLT( **Parameters** -| Name | Type | Description | -| ---------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithDurationsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithDurations}. | +| Name | Type | Description | +| ---------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithDurationsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithDurations}. | **Returns** @@ -192,11 +192,11 @@ function createWithTimestampsLT( **Parameters** -| Name | Type | Description | -| ---------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) contract. | -| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | -| `batch` | `BatchLockup.CreateWithTimestampsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithTimestamps}. | +| Name | Type | Description | +| ---------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. | +| `asset` | `IERC20` | The contract address of the ERC-20 asset to be distributed. | +| `batch` | `BatchLockup.CreateWithTimestampsLT[]` | An array of structs, each encapsulating a subset of the parameters of {SablierV2LockupTranched.createWithTimestamps}. | **Returns** diff --git a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL.md b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL.md similarity index 81% rename from docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL.md rename to docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL.md index 6c7bb67e..6a91aae5 100644 --- a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLL.md +++ b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLL.md @@ -1,9 +1,8 @@ # ISablierV2MerkleLL -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/interfaces/ISablierV2MerkleLL.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/interfaces/ISablierV2MerkleLL.sol) -**Inherits:** -[ISablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md) +**Inherits:** [ISablierV2MerkleLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md) MerkleLockup campaign that creates LockupLinear streams. @@ -11,7 +10,7 @@ MerkleLockup campaign that creates LockupLinear streams. ### LOCKUP_LINEAR -The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. +The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. ```solidity function LOCKUP_LINEAR() external view returns (ISablierV2LockupLinear); diff --git a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLT.md b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLT.md similarity index 83% rename from docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLT.md rename to docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLT.md index e9eab35c..d5cb6f2f 100644 --- a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLT.md +++ b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLT.md @@ -1,9 +1,8 @@ # ISablierV2MerkleLT -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/interfaces/ISablierV2MerkleLT.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/interfaces/ISablierV2MerkleLT.sol) -**Inherits:** -[ISablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md) +**Inherits:** [ISablierV2MerkleLockup](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md) MerkleLockup campaign that creates LockupTranched streams. @@ -19,8 +18,7 @@ function getTranchesWithPercentages() external view returns (MerkleLT.TrancheWit ### LOCKUP_TRANCHED -The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) -contract. +The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. ```solidity function LOCKUP_TRANCHED() external view returns (ISablierV2LockupTranched); diff --git a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md similarity index 92% rename from docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md rename to docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md index 95f8f6b4..3c1fee87 100644 --- a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md +++ b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md @@ -1,6 +1,6 @@ # ISablierV2MerkleLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/interfaces/ISablierV2MerkleLockup.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/interfaces/ISablierV2MerkleLockup.sol) **Inherits:** IAdminable @@ -114,8 +114,8 @@ function TRANSFERABLE() external returns (bool); Claws back the unclaimed tokens from the campaign. -Emits a [Clawback](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockup.md#clawback) -event. Requirements: +Emits a [Clawback](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockup.md#clawback) event. +Requirements: - The caller must be the admin. - No claim must be made, OR The current timestamp must not exceed 7 days after the first claim, OR The campaign must be diff --git a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md similarity index 73% rename from docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md rename to docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md index 727d5cb0..d066b339 100644 --- a/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md +++ b/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md @@ -1,6 +1,6 @@ # ISablierV2MerkleLockupFactory -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/interfaces/ISablierV2MerkleLockupFactory.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/interfaces/ISablierV2MerkleLockupFactory.sol) Deploys MerkleLockup campaigns with CREATE2. @@ -33,7 +33,7 @@ function isPercentagesSum100(MerkleLT.TrancheWithPercentage[] calldata tranches) Creates a new MerkleLockup campaign with a LockupLinear distribution. _Emits a -[CreateMerkleLL](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md#createmerklell) +[CreateMerkleLL](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md#createmerklell) event._ ```solidity @@ -50,13 +50,13 @@ function createMerkleLL( **Parameters** -| Name | Type | Description | -| ----------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `baseParams` | `MerkleLockup.ConstructorParams` | Struct encapsulating the [SablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md) parameters, which are documented in {DataTypes}. | -| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/contracts/v2/reference/core/contract.SablierV2LockupLinear.md) contract. | -| `streamDurations` | `LockupLinear.Durations` | The durations for each stream. | -| `aggregateAmount` | `uint256` | The total amount of ERC-20 assets to be distributed to all recipients. | -| `recipientCount` | `uint256` | The total number of recipients who are eligible to claim. | +| Name | Type | Description | +| ----------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `baseParams` | `MerkleLockup.ConstructorParams` | Struct encapsulating the [SablierV2MerkleLockup](/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md) parameters, which are documented in {DataTypes}. | +| `lockupLinear` | `ISablierV2LockupLinear` | The address of the [SablierV2LockupLinear](docs/reference/lockup/core/contract.SablierV2LockupLinear.md) contract. | +| `streamDurations` | `LockupLinear.Durations` | The durations for each stream. | +| `aggregateAmount` | `uint256` | The total amount of ERC-20 assets to be distributed to all recipients. | +| `recipientCount` | `uint256` | The total number of recipients who are eligible to claim. | **Returns** @@ -69,7 +69,7 @@ function createMerkleLL( Creates a new MerkleLockup campaign with a LockupTranched distribution. _Emits a -[CreateMerkleLT](/docs/contracts/v2/reference/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md#createmerklelt) +[CreateMerkleLT](/docs/reference/lockup/periphery/interfaces/interface.ISablierV2MerkleLockupFactory.md#createmerklelt) event._ ```solidity @@ -86,13 +86,13 @@ function createMerkleLT( **Parameters** -| Name | Type | Description | -| ------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `baseParams` | `MerkleLockup.ConstructorParams` | Struct encapsulating the [SablierV2MerkleLockup](/docs/contracts/v2/reference/periphery/abstracts/abstract.SablierV2MerkleLockup.md) parameters, which are documented in {DataTypes}. | -| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/contracts/v2/reference/core/contract.SablierV2LockupTranched.md) contract. | -| `tranchesWithPercentages` | `MerkleLT.TrancheWithPercentage[]` | The tranches with their respective unlock percentages. | -| `aggregateAmount` | `uint256` | The total amount of ERC-20 assets to be distributed to all recipients. | -| `recipientCount` | `uint256` | The total number of recipients who are eligible to claim. | +| Name | Type | Description | +| ------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `baseParams` | `MerkleLockup.ConstructorParams` | Struct encapsulating the [SablierV2MerkleLockup](/docs/reference/lockup/periphery/abstracts/abstract.SablierV2MerkleLockup.md) parameters, which are documented in {DataTypes}. | +| `lockupTranched` | `ISablierV2LockupTranched` | The address of the [SablierV2LockupTranched](docs/reference/lockup/core/contract.SablierV2LockupTranched.md) contract. | +| `tranchesWithPercentages` | `MerkleLT.TrancheWithPercentage[]` | The tranches with their respective unlock percentages. | +| `aggregateAmount` | `uint256` | The total amount of ERC-20 assets to be distributed to all recipients. | +| `recipientCount` | `uint256` | The total number of recipients who are eligible to claim. | **Returns** @@ -104,8 +104,7 @@ function createMerkleLT( ### CreateMerkleLL -Emitted when a [SablierV2MerkleLL](/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLL.md) campaign is -created. +Emitted when a [SablierV2MerkleLL](/docs/reference/lockup/periphery/contract.SablierV2MerkleLL.md) campaign is created. ```solidity event CreateMerkleLL( @@ -120,8 +119,7 @@ event CreateMerkleLL( ### CreateMerkleLT -Emitted when a [SablierV2MerkleLT](/docs/contracts/v2/reference/periphery/contract.SablierV2MerkleLT.md) campaign is -created. +Emitted when a [SablierV2MerkleLT](/docs/reference/lockup/periphery/contract.SablierV2MerkleLT.md) campaign is created. ```solidity event CreateMerkleLT( diff --git a/docs/contracts/v2/reference/periphery/libraries/_category_.json b/docs/reference/lockup/periphery/libraries/_category_.json similarity index 100% rename from docs/contracts/v2/reference/periphery/libraries/_category_.json rename to docs/reference/lockup/periphery/libraries/_category_.json diff --git a/docs/contracts/v2/reference/periphery/libraries/library.Errors.md b/docs/reference/lockup/periphery/libraries/library.Errors.md similarity index 92% rename from docs/contracts/v2/reference/periphery/libraries/library.Errors.md rename to docs/reference/lockup/periphery/libraries/library.Errors.md index d1e33660..cf02922b 100644 --- a/docs/contracts/v2/reference/periphery/libraries/library.Errors.md +++ b/docs/reference/lockup/periphery/libraries/library.Errors.md @@ -1,6 +1,6 @@ # Errors -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/libraries/Errors.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/libraries/Errors.sol) Library containing all custom errors the protocol may revert with. diff --git a/docs/contracts/v2/reference/periphery/types/_category_.json b/docs/reference/lockup/periphery/types/_category_.json similarity index 100% rename from docs/contracts/v2/reference/periphery/types/_category_.json rename to docs/reference/lockup/periphery/types/_category_.json diff --git a/docs/contracts/v2/reference/periphery/types/library.BatchLockup.md b/docs/reference/lockup/periphery/types/library.BatchLockup.md similarity index 95% rename from docs/contracts/v2/reference/periphery/types/library.BatchLockup.md rename to docs/reference/lockup/periphery/types/library.BatchLockup.md index 456bd473..a96afc29 100644 --- a/docs/contracts/v2/reference/periphery/types/library.BatchLockup.md +++ b/docs/reference/lockup/periphery/types/library.BatchLockup.md @@ -1,6 +1,6 @@ # BatchLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/types/DataTypes.sol) ## Structs diff --git a/docs/contracts/v2/reference/periphery/types/library.MerkleLT.md b/docs/reference/lockup/periphery/types/library.MerkleLT.md similarity index 88% rename from docs/contracts/v2/reference/periphery/types/library.MerkleLT.md rename to docs/reference/lockup/periphery/types/library.MerkleLT.md index 8aecfc78..392190db 100644 --- a/docs/contracts/v2/reference/periphery/types/library.MerkleLT.md +++ b/docs/reference/lockup/periphery/types/library.MerkleLT.md @@ -1,6 +1,6 @@ # MerkleLT -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/types/DataTypes.sol) ## Structs diff --git a/docs/contracts/v2/reference/periphery/types/library.MerkleLockup.md b/docs/reference/lockup/periphery/types/library.MerkleLockup.md similarity index 91% rename from docs/contracts/v2/reference/periphery/types/library.MerkleLockup.md rename to docs/reference/lockup/periphery/types/library.MerkleLockup.md index b3ed3ea2..8cc757a7 100644 --- a/docs/contracts/v2/reference/periphery/types/library.MerkleLockup.md +++ b/docs/reference/lockup/periphery/types/library.MerkleLockup.md @@ -1,6 +1,6 @@ # MerkleLockup -[Git Source](https://github.com/sablier-labs/v2-periphery/blob/c10978dd4cdb54301b9c2d63c7e0af41da9110f3/src/types/DataTypes.sol) +[Git Source](https://github.com/sablier-labs/v2-periphery/blob/ed3be5dc823dd81219f8060a6e6b32ead6c8de84/src/types/DataTypes.sol) ## Structs diff --git a/docs/snippets/BatchCommonSteps.mdx b/docs/snippets/BatchCommonSteps.mdx index 243c18a6..3622151d 100644 --- a/docs/snippets/BatchCommonSteps.mdx +++ b/docs/snippets/BatchCommonSteps.mdx @@ -35,5 +35,5 @@ DAI.transferFrom(msg.sender, address(this), transferAmount); DAI.approve(address(BATCH_LOCKUP), transferAmount); ``` -For more guidance on how to approve and transfer ERC-20 assets, see +For more guidance on how to approve and transfer ERC-20 tokens, see [this article](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) on the Ethereum website. diff --git a/docs/snippets/ConstantsComment.mdx b/docs/snippets/ConstantsComment.mdx index a229dd17..d8723042 100644 --- a/docs/snippets/ConstantsComment.mdx +++ b/docs/snippets/ConstantsComment.mdx @@ -2,4 +2,4 @@ In the code above, the contract addresses are hard-coded for demonstration purpo likely use input parameters to allow flexibility in changing the addresses. Also, these addresses are deployed on Mainnet. If you need to work with a different chain, the Sablier addresses can be -obtained from the [Deployment Addresses](/contracts/v2/deployments) page. +obtained from the [Deployment Addresses](/guides/lockup/deployments) page. diff --git a/docs/snippets/ParamAsset.mdx b/docs/snippets/ParamAsset.mdx index 5aeeb45d..0826b4c9 100644 --- a/docs/snippets/ParamAsset.mdx +++ b/docs/snippets/ParamAsset.mdx @@ -1,6 +1,6 @@ ### Asset -The contract address of the ERC-20 asset used for streaming. In this example, we will stream DAI: +The contract address of the ERC-20 token used for streaming. In this example, we will stream DAI: ```solidity params.asset = DAI; diff --git a/docs/snippets/ParamTotalAmount.mdx b/docs/snippets/ParamTotalAmount.mdx index 8ea80b16..02395475 100644 --- a/docs/snippets/ParamTotalAmount.mdx +++ b/docs/snippets/ParamTotalAmount.mdx @@ -1,7 +1,7 @@ ### Total amount -The total amount of ERC-20 assets to be paid, including the stream deposit and any potential -[fees](/concepts/protocol/fees), all denoted in units of the asset's decimals. +The total amount of ERC-20 tokens to be paid, including the stream deposit and any potential [fees](/concepts/fees), all +denoted in units of the asset's decimals. ```solidity params.totalAmount = totalAmount; diff --git a/docs/support/01-faq.mdx b/docs/support/01-faq.mdx index c0a7b6d4..10350f53 100644 --- a/docs/support/01-faq.mdx +++ b/docs/support/01-faq.mdx @@ -4,7 +4,7 @@ sidebar_position: 1 title: "FAQ" --- -### Where can I access the Sablier protocol? +### Where can I access the Sablier protocols? You can access Sablier through the following web interfaces: @@ -13,7 +13,7 @@ You can access Sablier through the following web interfaces: ### What is real-time finance? -A term coined by us to emphasize the wide-ranging use cases for the Sablier protocol. We like to think about work as an +A term coined by us to emphasize the wide-ranging use cases for the Sablier protocols. We like to think about work as an attempt to rethink the way trust is established in financial contracts. ### What is token streaming? @@ -21,30 +21,41 @@ attempt to rethink the way trust is established in financial contracts. An alternative wording, coined by Andreas Antonopoulos in 2017. Just like you can stream movies on Netflix or music on Spotify, so you can stream tokens by the second on Sablier. -### How does streaming work on Sablier? +### How does streaming work on Sablier Lockup? -Imagine Alice wants to make a 3,000 DAI payment to Bob during the whole month of January. +Imagine Alice wants to stream 3000 DAI to Bob during the whole month of January. -1. Alice deposits the 3,000 DAI in Sablier before Jan 1, setting the stop time to Feb 1. -2. Bob's crypto earnings increase every second beginning Jan 1. -3. On Jan 10, Bob will have earned approximately 1,000 DAI. -4. If at any point during January Alice wishes to recover her tokens, she can cancel the stream and recover what has not - been streamed yet. +1. Alice deposits the 3000 DAI in Lockup before Jan 1, setting the end time to Feb 1. +2. Bob's allocation of the DAI deposit increases every second beginning Jan 1. +3. On Jan 10, Bob will have earned approximately 1000 DAI. He can send a transaction to withdraw the tokens. +4. If at any point during January Alice wishes to get back her tokens, she can cancel the stream and recover what has + not been streamed yet. + +### How does streaming work on Sablier Flow? + +Imagine Alice wants to stream 3000 DAI on a monthly basis to Bob. + +1. Alice creates a stream on Flow with a rate of 3000 DAI per month. +2. Alice deposits 200 DAI in Flow. +3. On Jan 10, Bob is owed 1000 DAI, but there is only 200 DAI in the stream. So he can only withdraw 200 DAI. +4. Alice deposits another 2800 DAI in Flow, and Bob can now withdraw the remaining 800 DAI. +5. On Feb 1, Bob is able to withdraw 2800 DAI. +6. The stream will continue indefinitely until it is paused (by Alice) or voided (by either Alice or Bob). ### How can I create a stream? You will need an EVM wallet ([Metamask](https://metamask.io), [Rainbow](https://rainbow.me), etc.), some ETH (or the network's token to pay gas fees) and an ERC-20 token like DAI. Then, choose your favorite interface for accessing the -Sablier protocol (such as [app.sablier.com](https://app.sablier.com)) and fill in the recipient's address, the deposit +Sablier protocols (such as [app.sablier.com](https://app.sablier.com)) and fill in the recipient's address, the deposit amount and the total duration. -Alternatively, you can see [here](/contracts/v2/guides/etherscan) how to manually create a stream using +Alternatively, you can see [here](/guides/lockup/etherscan) how to manually create a stream using [Etherscan](https://etherscan.io). -### How does streaming work? +### How does Lockup streaming work? Dividing the deposit amount by the difference between the stop time and the start time gives us a payment rate per -second. Sablier uses this rate to transfer a small portion of tokens from the sender to the recipient once every second. +second. Lockup uses this rate to transfer a small portion of tokens from the sender to the recipient once every second. For instance, if the payment rate was 0.01 DAI per second, the recipient would receive: @@ -52,7 +63,7 @@ $0.01 * 60 = 0.6$ DAI / minute, $0.01 * 60 * 60 = 36$ DAI / hour, $0.01 * 60 * 6 ### Where are the tokens held? -In our smart contracts. You can verify this assertion by inspecting Etherscan or any other blockchain explorer. +In the Sablier smart contracts. You can verify this assertion by inspecting Etherscan or any other blockchain explorer. ### How can recipients access their tokens? @@ -75,6 +86,26 @@ transfers all the remaining funds (if any) to the recipient. ### Can I modify the streaming rate? -No. Once a stream is created, it is set in stone on the Ethereum blockchain. +On Lockup, once a stream is created, it is set in stone on the Ethereum blockchain. Whereas on Flow, a stream rate per +second can be modified anytime by the creator. + +### How are vested airdrops different from a batch of normal streams? + +Creating streams through the form (manual or CSV) will immediately start the vesting period. You click to create the +transaction, pay for the gas, and you start all the streams for your recipients. + +Due to how block gas limits work, you can only fit a limited number of streams (usually 60) in a single block before +running out of space. This is great for small distributions like paying your contractors or a set of investors. + +Meanwhile, vested airdrops leverage a "lazy creation" of streams. You deploy a contract that stores a list of recipients +and the streams they are entitles to claim. Every recipient will manually claim their allocation by creating a stream. +This allows for millions of recipients in your distribution campaign, with each recipient triggering the stream creation +one after the other (as opposed to all at once). -In a future version of the Sablier protocol, we may add the option to refill an active stream and even extend it. +| Feature | Groups | Airdrops | +| ------------------------------ | -------------------------------- | --------------------- | +| Maximum number of streams | ~60 (depends on block gas limit) | Millions | +| Gas to create streams | Sender paying | Each recipient paying | +| Gas to deploy Airdrop contract | N/A | Sender paying | +| Streams show up onchain | Immediately | Lazily | +| Good for | Investors, Employees | Large communities | diff --git a/docs/support/02-technical-guides.mdx b/docs/support/02-technical-guides.mdx new file mode 100644 index 00000000..294b9c72 --- /dev/null +++ b/docs/support/02-technical-guides.mdx @@ -0,0 +1,25 @@ +--- +id: "technical-guides" +sidebar_position: 2 +title: "Technical Guides" +--- + +## Guides for Apps + +Hands-on guides for app-specific features: + +- [CSV Support](/apps/guides/csv-support) (for streams and airdrops) +- [URL Schemes](/apps/guides/url-schemes) + +## Guides for Contracts + +- [Interactions with Etherscan](/guides/lockup/etherscan) +- [Lockup Stream Management](/guides/lockup/examples/stream-management/withdraw) +- And more... + +## Guides for Subgraphs + +See the dedicated APIs [page](/api/overview). + +- [Popular subgraph queries](/api/lockup/the-graph/queries) +- [Merkle tree management](/api/airdrops/merkle-api/examples) for airdrops diff --git a/docs/support/02-how-to.mdx b/docs/support/03-how-to.mdx similarity index 73% rename from docs/support/02-how-to.mdx rename to docs/support/03-how-to.mdx index 1989723c..c2cab8c2 100644 --- a/docs/support/02-how-to.mdx +++ b/docs/support/03-how-to.mdx @@ -1,10 +1,12 @@ --- id: "how-to" -sidebar_position: 2 +sidebar_position: 3 title: "How-to Videos" --- -### How to Withdraw From a Stream +## Vesting + +### How to Withdraw From a Vesting Stream -### How to Create a Stream +### How to Create a Vesting Stream -### How to Create Streams Using the CSV Upload Feature +### How to Create Vesting Streams Using the CSV Upload Feature -### How to Create an Airstream Campaign +### How to Create a Vesting Stream Using a Safe Multisig Wallet -### How to Claim from an Airstream Campaign +### How to Trade Vesting Streams on OpenSea -### How to Create a Stream Using a Safe Multisig Wallet +### Distribution Shapes & Settings -### How to Trade Sablier Streams on OpenSea +## Payments + +### How to Withdraw From Payment Streams -### How to Create a zkSync Proposal Involving a Sablier Stream +### How to Create Payment Streams -### Token Distribution Curves & Settings +## Airdrops + +### How to Create an Airstream Campaign + +### How to Claim from an Airstream Campaign + + + +## Others + +### How to Create a zkSync Proposal Involving a Vesting Stream + + -### Creating a Sablier Stream Using Fireblocks +### Creating a Vesting Stream Using Fireblocks -### Withdrawing Funds From Sablier Using Fireblocks +### Withdrawing Funds From Vesting Stream Using Fireblocks