A Go SDK extension for Digital Transfer Agent (DTA) operations on CREC (Chainlink Runtime Environment Connect).
go get github.com/smartcontractkit/crec-sdk-ext-dtaThis SDK uses contract versioning (e.g., v1/, v2/) to match deployed smart contract ABI versions. This is separate from the Go module's semantic versioning.
| Directory | Contract Version | Description |
|---|---|---|
v1/ |
DTA contracts v1 | Production contracts |
v2/ |
DTA contracts v2 | Adds referenceID, distributor authorization model |
import dtav1 "github.com/smartcontractkit/crec-sdk-ext-dta/v1"
import dtav2 "github.com/smartcontractkit/crec-sdk-ext-dta/v2"Both versions share the same package layout (events/, operations/, watcher/, decode.go) and the same enum/struct types (TokenMintType, TokenBurnType, RequestStatus, FundTokenData, DistributorRequest). The differences are strictly ABI-driven.
This extension provides utilities for preparing DTA operations for fund subscriptions, redemptions, and management on blockchain networks. It works with DTARequestManagement and DTARequestSettlement smart contracts.
import (
dtav1 "github.com/smartcontractkit/crec-sdk-ext-dta/v1"
)
ext, err := dtav1.New(&dtav1.Options{
DTARequestManagementAddress: "0x...",
DTARequestSettlementAddress: "0x...",
AccountAddress: "0x...",
})
op, err := ext.PrepareRequestSubscriptionOperation(fundAdminAddr, fundTokenId, amount)import (
dtav2 "github.com/smartcontractkit/crec-sdk-ext-dta/v2"
)
ext, err := dtav2.New(&dtav2.Options{
DTARequestManagementAddress: "0x...",
DTARequestSettlementAddress: "0x...",
AccountAddress: "0x...",
})
// v2 operations accept a referenceID parameter
op, err := ext.PrepareRequestSubscriptionOperation(fundAdminAddr, fundTokenId, amount, referenceID)Subscription and redemption operations now accept a referenceID [32]byte parameter for correlating on-chain requests with off-chain records:
| Operation (v2) | Signature change |
|---|---|
PrepareRequestSubscriptionOperation |
Added referenceID [32]byte as last parameter |
PrepareRequestRedemptionOperation |
Added referenceID [32]byte as last parameter |
The corresponding events (SubscriptionRequested, RedemptionRequested) now include a ReferenceID common.Hash field.
Emitted when a distributor's authorization status changes for a fund token:
| Field | Type |
|---|---|
DistributorAddr |
common.Address |
FundAdminAddr |
common.Address |
FundTokenId |
common.Hash |
Authorized |
bool |
| Operation | Description |
|---|---|
PrepareAuthorizeDistributorForTokenOperation |
Authorize a distributor for a fund token |
PrepareRevokeDistributorForTokenOperation |
Revoke a distributor's token authorization |
| Operation | Replacement |
|---|---|
PrepareForceAllowDistributorForTokenOperation |
Use PrepareAuthorizeDistributorForTokenOperation |
PrepareVerifyDistributorWalletOperation |
Removed from v2 contracts |
| Operation | Description |
|---|---|
PrepareRequestSubscriptionOperation |
Request subscription to a fund |
PrepareRequestRedemptionOperation |
Request redemption from a fund |
PrepareRequestSubscriptionWithTokenApprovalOperation |
Request subscription with token approval |
PrepareProcessDistributorRequestOperation |
Process a pending distributor request |
PrepareCancelDistributorRequestOperation |
Cancel a distributor request |
PrepareRegisterDistributorOperation |
Register a new distributor |
PrepareRegisterFundAdminOperation |
Register a new fund admin |
PrepareRegisterFundTokenOperation |
Register a new fund token |
PrepareAllowDistributorForTokenOperation |
Allow distributor for a token |
PrepareDisallowDistributorForTokenOperation |
Disallow distributor for a token |
PrepareForceAllowDistributorForTokenOperation |
Force allow distributor (admin) |
PrepareVerifyDistributorWalletOperation |
Verify distributor wallet ownership |
PrepareEnableFundTokenOperation |
Enable a fund token |
PrepareDisableFundTokenOperation |
Disable a fund token |
PrepareSetManagementCCIPGasLimitOperation |
Set CCIP gas limit |
PrepareWithdrawManagementTokensOperation |
Withdraw tokens |
| Operation | Description |
|---|---|
PrepareAllowDTAOperation |
Allow a DTA address for a fund token |
PrepareDisallowDTAOperation |
Disallow a DTA address for a fund token |
PrepareCompleteRequestProcessingOperation |
Complete request processing |
PrepareWithdrawSettlementTokensOperation |
Withdraw tokens from settlement |
PrepareSetSettlementCCIPGasLimitOperation |
Set CCIP gas limit |
PrepareTransferDTARequestSettlementOwnershipOperation |
Transfer contract ownership |
PrepareRenounceDTARequestSettlementOwnershipOperation |
Renounce contract ownership |
For contract methods not covered by the type-safe functions:
op, err := ext.PrepareDTARequestManagementOperation("methodName", arg1, arg2, ...)
op, err := ext.PrepareDTARequestSettlementOperation("methodName", arg1, arg2, ...)Types are shared across both v1 and v2 (defined in <version>/events/types.go).
| Constant | Value | Description |
|---|---|---|
TokenMintTypeMint |
0 | mint(address, uint256) - ERC3643, CMTAT |
TokenMintTypeIssueTokens |
1 | issueTokens(address, uint256) - DSToken (BUIDL) |
| Constant | Value | Description |
|---|---|---|
TokenBurnTypeBurn |
0 | burn(address, uint256) - ERC3643 |
TokenBurnTypeBurnFrom |
1 | burnFrom(address, uint256) - CMTAT |
TokenBurnTypeBurnWithReason |
2 | burn(address, uint256, string) - DSToken (BUIDL) |
TokenBurnTypeForceBurn |
3 | forceBurn(address, uint256, string) - CMTAT v2.3.0 |
| Constant | Value | Description |
|---|---|---|
RequestStatusNone |
0 | Zero value |
RequestStatusPending |
1 | Request is pending |
RequestStatusProcessing |
2 | Request is being processed |
RequestStatusProcessed |
3 | Request has been processed |
RequestStatusCanceled |
4 | Request was canceled |
RequestStatusFailed |
5 | Request failed |
Both v1 and v2 provide a DecodeFromEvent function that extracts typed events and enrichment data from raw CREC events:
decoded, err := dtav2.DecodeFromEvent(ctx, event)
fmt.Println(decoded.EventName()) // e.g. EventSubscriptionRequested
fmt.Println(decoded.ConcreteEvent) // typed event struct
fmt.Println(decoded.FundTokenData) // enrichment: fund token metadata (if available)
fmt.Println(decoded.DistributorRequest) // enrichment: request details (if available)crec-sdk-ext-dta/
├── v1/ # DTA v1 contract SDK
│ ├── events/ # Event types and decoders
│ │ ├── types.go # Enum and struct types
│ │ ├── events_gen.go # Generated: Event structs
│ │ └── decode_gen.go # Generated: Event decoders
│ ├── operations/ # Operations SDK
│ │ ├── operations.go # Custom operations (multi-tx, complex types)
│ │ ├── abi_gen.go # Generated: ABI embedding
│ │ ├── extension_gen.go # Generated: Options, Extension, New()
│ │ ├── operations_gen.go # Generated: Type-safe Prepare* functions
│ │ └── operations_helpers_gen.go # Generated: Helper methods
│ ├── watcher/ # CRE watcher workflow
│ │ ├── handler/ # Workflow handler (enrichment logic)
│ │ ├── bundle/ # Bundle definition and schemas
│ │ └── values/ # Configuration values
│ ├── doc.go # Package documentation
│ └── decode.go # Event decoding + enrichment
├── v2/ # DTA v2 contract SDK (same layout as v1)
│ ├── events/
│ ├── operations/
│ ├── watcher/
│ ├── doc.go
│ └── decode.go
├── abi/ # Contract ABI files
│ ├── v1/
│ └── v2/
├── mocks/ # Mock server for local testing
└── Taskfile.yaml # Task runner commands
Install Task:
brew install go-task # macOStask testThe watcher workflow monitors DTA contract events:
# Configure watcher (specify VERSION)
task watcher:config VERSION=v2
# Deploy to CRE
task watcher:deploy VERSION=v2
# Config + deploy
task watcher:release VERSION=v2
# Simulate with a transaction
task watcher:simulate VERSION=v2 TX_HASH=0x...Mock server for local simulation:
task mock:start
task mock:stop
task mock:logs- crec-sdk — CREC client for channels, events, watchers, and operations
- crec-workflow-utils — Shared utilities for event-listener workflows