Skip to content

Commit

Permalink
feat: hard-fork contract support
Browse files Browse the repository at this point in the history
Fixes #93
  • Loading branch information
agaffney committed Dec 4, 2023
1 parent 09a40ff commit 9a6cca1
Show file tree
Hide file tree
Showing 11 changed files with 259 additions and 238 deletions.
2 changes: 1 addition & 1 deletion cmd/bluefin/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func main() {
//tx.SendTx([]byte("foo"))

// Start indexer
logger.Infof("starting indexer on %s", cfg.Indexer.Network)
logger.Infof("starting indexer on %s", cfg.Network)
if err := indexer.GetIndexer().Start(); err != nil {
logger.Fatalf("failed to start indexer: %s", err)
}
Expand Down
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.20

require (
github.com/Salvionied/apollo v1.0.4
github.com/Salvionied/cbor/v2 v2.6.0
github.com/blinklabs-io/bursa v0.5.1
github.com/blinklabs-io/cardano-models v0.1.0
github.com/blinklabs-io/gouroboros v0.64.0
Expand All @@ -27,7 +26,11 @@ require (
// XXX: uncomment when testing local changes to snek
// replace github.com/blinklabs-io/snek => ../snek

// XXX: uncomment when testing local changes to cardano-models
replace github.com/blinklabs-io/cardano-models => ../cardano-models

require (
github.com/Salvionied/cbor/v2 v2.6.0 // indirect
github.com/btcsuite/btcutil v1.0.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/dgraph-io/ristretto v0.1.1 // indirect
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ github.com/Salvionied/cbor/v2 v2.6.0/go.mod h1:oFxaUo/mQ5sG1k459nzctGdYa80jy0ZqZ
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/blinklabs-io/bursa v0.5.1 h1:NbbMOXR7L8wYTpo098JOT9BCBmLKRN9z4eIkz383CEQ=
github.com/blinklabs-io/bursa v0.5.1/go.mod h1:k+fdY+TTZ1/lwPmJFPqRsdMDkCKA2OXxqVl16EJAOPk=
github.com/blinklabs-io/cardano-models v0.1.0 h1:tgSAuo8V8cXDeDf4OrevY3Aj5AIJSjI1DINAOrQeda0=
github.com/blinklabs-io/cardano-models v0.1.0/go.mod h1:XYJvY5XE6vTKbVVK1YqUq615T/bUoeavcc9zG25M8Os=
github.com/blinklabs-io/gouroboros v0.64.0 h1:8wm1blxhE+qI/GElc3/pmi3YoI3jepEEPFJK6LkP/JE=
github.com/blinklabs-io/gouroboros v0.64.0/go.mod h1:fph4LBNmSliMxt5ut40lXqqbZHWmXjT6p7o1hCyDEbQ=
github.com/blinklabs-io/snek v0.15.0 h1:opj+apWge2ujHIDiFrI08P6rW7gUeKRsNXzje8UCjx4=
Expand Down
76 changes: 48 additions & 28 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,26 @@ import (
"os"
"runtime"

ouroboros "github.com/blinklabs-io/gouroboros"
"github.com/kelseyhightower/envconfig"
"gopkg.in/yaml.v2"
)

type Config struct {
Storage StorageConfig `yaml:"storage"`
Indexer IndexerConfig `yaml:"indexer"`
Submit SubmitConfig `yaml:"submit"`
Wallet WalletConfig `yaml:"wallet"`
Worker WorkerConfig `yaml:"worker"`
Logging LoggingConfig `yaml:"logging"`
Metrics MetricsConfig `yaml:"metrics"`
Debug DebugConfig `yaml:"debug"`
Storage StorageConfig `yaml:"storage"`
Indexer IndexerConfig `yaml:"indexer"`
Submit SubmitConfig `yaml:"submit"`
Wallet WalletConfig `yaml:"wallet"`
Worker WorkerConfig `yaml:"worker"`
Logging LoggingConfig `yaml:"logging"`
Metrics MetricsConfig `yaml:"metrics"`
Debug DebugConfig `yaml:"debug"`
Profile string `yaml:"profile" envconfig:"PROFILE"`
Network string `yaml:"network" envconfig:"NETWORK"`
NetworkMagic uint32
}

type IndexerConfig struct {
Network string `yaml:"network" envconfig:"INDEXER_NETWORK"`
NetworkMagic uint32 `yaml:"networkMagic" envconfig:"INDEXER_NETWORK_MAGIC"`
Address string `yaml:"address" envconfig:"INDEXER_TCP_ADDRESS"`
SocketPath string `yaml:"socketPath" envconfig:"INDEXER_SOCKET_PATH"`
ScriptAddress string `yaml:"scriptAddress" envconfig:"INDEXER_SCRIPT_ADDRESS"`
Expand All @@ -45,10 +47,9 @@ type IndexerConfig struct {
}

type SubmitConfig struct {
NetworkMagic uint32 `yaml:"networkMagic" envconfig:"SUBMIT_NETWORK_MAGIC"`
Address string `yaml:"address" envconfig:"SUBMIT_TCP_ADDRESS"`
SocketPath string `yaml:"socketPath" envconfig:"SUBMIT_SOCKET_PATH"`
Url string `yaml:"url" envconfig:"SUBMIT_URL"`
Address string `yaml:"address" envconfig:"SUBMIT_TCP_ADDRESS"`
SocketPath string `yaml:"socketPath" envconfig:"SUBMIT_SOCKET_PATH"`
Url string `yaml:"url" envconfig:"SUBMIT_URL"`
}

type StorageConfig struct {
Expand Down Expand Up @@ -92,9 +93,6 @@ var globalConfig = &Config{
ListenAddress: "",
ListenPort: 8081,
},
Indexer: IndexerConfig{
Network: "mainnet",
},
Storage: StorageConfig{
// TODO: pick a better location
Directory: "./.bluefin",
Expand All @@ -104,6 +102,8 @@ var globalConfig = &Config{
Worker: WorkerConfig{
Count: runtime.NumCPU() / 2,
},
Network: "mainnet",
Profile: "tuna-v1",
}

func Load(configFile string) (*Config, error) {
Expand All @@ -125,6 +125,14 @@ func Load(configFile string) (*Config, error) {
if err != nil {
return nil, fmt.Errorf("error processing environment: %s", err)
}
// Populate network magic value
if err := globalConfig.populateNetworkMagic(); err != nil {
return nil, err
}
// Check specified profile
if err := globalConfig.validateProfile(); err != nil {
return nil, err
}
// Populate our Indexer startup
if err := globalConfig.populateIndexer(); err != nil {
return nil, err
Expand All @@ -137,17 +145,29 @@ func GetConfig() *Config {
return globalConfig
}

func (c *Config) populateIndexer() error {
if c.Indexer.Network == "mainnet" {
c.Indexer.InterceptHash = "b019548e41b55ae702fee37d8b9ae716c978712c02bc4862ba13db6602e5af72"
c.Indexer.InterceptSlot = 101511155
c.Indexer.ScriptAddress = "addr1wynelppvx0hdjp2tnc78pnt28veznqjecf9h3wy4edqajxsg7hwsc"
} else if c.Indexer.Network == "preview" {
c.Indexer.InterceptHash = "b652abee9cf82145c3b220b614451e3c8ff5c504072a8c418c8c1ae1b70eb86f"
c.Indexer.InterceptSlot = 26352021
c.Indexer.ScriptAddress = "addr_test1wpgzl0aa4lramtdfcv6m69zq0q09g3ws3wk6wlwzqv5xdfsdcf2qa"
} else {
return fmt.Errorf("unable to configure network: %s", c.Indexer.Network)
func (c *Config) populateNetworkMagic() error {
network := ouroboros.NetworkByName(c.Network)
if network == ouroboros.NetworkInvalid {
return fmt.Errorf("unknown network: %s", c.Network)
}
c.NetworkMagic = network.NetworkMagic
return nil
}

func (c *Config) validateProfile() error {
if _, ok := Profiles[c.Network]; !ok {
return fmt.Errorf("no profiles defined for network %s", c.Network)
}
if _, ok := Profiles[c.Network][c.Profile]; !ok {
return fmt.Errorf("no profile %s defined for network %s", c.Profile, c.Network)
}
return nil
}

func (c *Config) populateIndexer() error {
profile := Profiles[c.Network][c.Profile]
c.Indexer.InterceptHash = profile.InterceptHash
c.Indexer.InterceptSlot = profile.InterceptSlot
c.Indexer.ScriptAddress = profile.ScriptAddress
return nil
}
29 changes: 5 additions & 24 deletions internal/config/networks.go
Original file line number Diff line number Diff line change
@@ -1,36 +1,17 @@
package config

type Network struct {
InterceptHash string
InterceptSlot uint64
ScriptAddress string
ValidatorHash string
ValidatorScript string
ScriptInputRefTxId string
ScriptInputRefOutIndex uint32
ShelleyOffsetSlot uint64
ShelleyOffsetTime int64
ShelleyOffsetSlot uint64
ShelleyOffsetTime int64
}

var NetworkMap = map[string]Network{
var Networks = map[string]Network{
"preview": Network{
InterceptHash: "b652abee9cf82145c3b220b614451e3c8ff5c504072a8c418c8c1ae1b70eb86f",
InterceptSlot: 26352021,
ScriptAddress: "addr_test1wpgzl0aa4lramtdfcv6m69zq0q09g3ws3wk6wlwzqv5xdfsdcf2qa",
ValidatorHash: "502fbfbdafc7ddada9c335bd1440781e5445d08bada77dc2032866a6",
ShelleyOffsetSlot: 0,
ShelleyOffsetTime: 1666656000,
// We don't have a script input ref for preview, so we need the actual script to include with the TX
ValidatorScript: "590f830100003323232323232323232323222253330083370e9000180380089929998049919299980599b87480080084c8c8c8c94ccc03ccdc3a4000601c0022646464646464646464646464646464646464646464646464646464a66605466e1d2002302900313232533302c3370e900118158048991929998172999817199817002a504a22a66605c012266e24cdc0801800a4181f82a294052809929998179981280e919baf3302c302e001480000ac4c8c8c94ccc0d4c0e00084c8c8c8c8c94ccc0dccdc3a4008606c00226464a6660726464a66607c608200426464a66607a66e3c009221096c6f72642074756e610013370e00290010a50375a607c0046eb8c0f000458c0fc004c8c94ccc0eccdc3a4004002297adef6c601323756608200260720046072002646600200203a44a66607c0022980103d87a8000132323232533303f3371e05e004266e95200033043374c00297ae0133006006003375660800066eb8c0f8008c108008c10000454ccc0e4c8c8c94ccc0fcc1080084c8c8c8c94ccc100cdc7802245001325333044304700213232533304353330433371e00a066266e1c005200214a0266e3c009221096c6f72642074756e610014a06eb4c110008dd718210008b182280089929998221823802099192999821a99982199b8f00703313370e00290010a5013371e004911096c6f72642074756e610014a06eb4c110008dd718210008b18228019bab3041004375c607e0066eacc0fc010dd7181e8018b18200009820003181f0028991919baf0010033374a90001981f26010100003303e37520166607c9810105003303e4c10319ffff003303e4c10100003303e37500186607c9810100003303e4c10180004bd7019299981d19b87480000044c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc134c140008526163758609c002609c004609800260980046eb4c128004c128008dd6982400098240011bad30460013046002375a608800260880046eb8c108004c108008dd69820000981c0010b181c0008b0b181e800981a8008b181d800981d8011bab303900130390013030001163036001323300100101c22533303500114bd7009919299981a19baf3303030323303030320024800120003374a90011981c1ba90244bd7009981c00119802002000899802002000981c801181b8009919191801000980080111b9200137660542c66e00cdc199b810030014801000458dd6981900098150048b1bad30300013028003163370e900118151baa302e001302e002302c00130240053370e900118131baa302a001302a00230280013020003302600130260023024001301c002323300100100622533302200114bd6f7b630099191919299981199b8f489000021003133027337606ea4008dd3000998030030019bab3024003375c6044004604c0046048002604200260420026040002603e0046eacc074004c074004c070008dd6180d000980d000980c8011bac3017001300f005375c602a002601a0022c6026002602600460220026012008264646464a66601e66e1d2000300e00113232323300837586601c602000c9000119baf3300f30113300f30113300f301100148009200048000008cdd2a40046602a6ea40052f5c06eb8c054004c03400458c04c004c04c008c044004c02401088c8cc00400400c894ccc04400452809919299980818028010a51133004004001301500230130013008003149858c94ccc024cdc3a40000022a666018600e0062930b0a99980499b874800800454ccc030c01c00c5261616300700213223232533300c32323232323232323232323232323232323232533301f3370e9001180f0008991919191919191919191919191919191919191919299981a19b8748008c0cc0044c8c8c8c94ccc0ecc0f80084c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c94ccc124cdc3a4004609000626464a66609666e1d2002304a0091323232533304e533304e33304e0064a094454ccc1380284cdc499b8100400248303f0545280a50132323232325333053533305333710084002294454ccc14ccdc3800821099b8800204014a0264a6660a866e1cc8c8c94ccc15ccdc3a4004002290000991bad305d001305500230550013253330563370e90010008a6103d87a800013232323300100100222533305d00114c103d87a8000132323232533305e3371e911096c6f72642074756e610000213374a9000198311ba80014bd700998030030019bad305f003375c60ba00460c200460be0026eacc170004c150008c150004cc00408807d2002132325333059305c002132323232533305a533305a3371e00891010454554e410013370e006002294054ccc168c8c8c94ccc180c18c0084c8c8c8c94ccc184cdc7802245001325333065306800213232533306453330643371e00a05e266e1c005200214a0266e3c009221096c6f72642074756e610014a06eb4c194008dd718318008b183300089929998329834002099192999832299983219b8f00702f13370e00290010a5013371e004911096c6f72642074756e610014a06eb4c194008dd718318008b18330019bab3062004375c60c00066eacc180010dd7182f0018b18308009830810982f8100a99982d19b8748010c1640784c8c94ccc170cdc3a400060b6002264646464646464646464646464646464a6660de60e4004264a6660daa6660daa6660da66e1ccdc3030241803e9000099b8848000180528099191919191919299983a19b87001013153330743370e004022266e1d200000f14a02940dd6983a8011bad3073001333300505e060002001375a60e40046eb4c1c00054ccc1b94ccc1b8cdc4a401066e0d2080a0c88109001133710900019b8648202832204240045280a5ef6c601010100010104001533306e533306e33712900419b8300148202832204244cdc42400066e180052080a0c8810914a0297bdb181010400010101001337606ea0005301051a48190800003370266e001600801584c94ccc1b8cdc382e8068a99983719b8705b00b13370e002012294052819b81337000b00400ac2a6660da66e1c01808054ccc1b54ccc1b4cdc399b80060480080404cdc780700f0a501533306d337126e34dd98022410010266ebcdd3999999111119199980080082c8018011111191919299983ca99983c99b8800100b14a22a6660f266e1c02c0044cdc40050010a501533307c00613307d00c3307d00c33330070074bd70001000899299983e80089983f0069983f006999980400425eb8000c0084c8cc1fc038cc1fc038cccc02402400401000cc20004004c1fc0184c8cccc00400401c0180148888c8c8c94ccc200054ccc20004cdc40008090a5115333080013370e024002266e200440085280a99984180803099842008099999803803a5eb800080044c8cc21404050cccc02002000400c008c218040184018dd69840808011bad307f0013333011002001480092004375a60f40046eb4c1e0004cccc028008005200248020dd480f00d80e02d02e1ba7002161616162222323253330723370e66e0c009208080084800054ccc1c8cdc4a40f800a297bdb18103191000000102183e001337606ea0008dd419b800054800854ccc1c8cdc42400066e0c00520808008153330723371200a90020a5ef6c6010319ffff00010102001337606ea0cdc1800a40406ea0cdc0802a4004266ec0dd40009ba800533706002901019b833370466e08011202000200116375860e000260e000460dc00260dc0046eb4c1b0004c1b0008dd6983500098350011bad30680013068002375a60cc00260cc0046eb8c190004c190008dd69831000982d0008b1830000982c00f0b0b0b299982c99b88480e80045200013370690406457d0129991919180080091299982e99b89480280044cdc1240806600400466e04005200a13003001300100122533305b3371200290000a4004266e08cc008008cdc0800a4004900200099b8304b482834464dd6982c8011bae305700116305a001323253330563370e90010008a5eb7bdb1804c8dd5982e000982a001182a0009980081380f8b11191980080080191299982d0008a6103d87a8000132323232533305b3371e00e004266e9520003305f374c00297ae0133006006003375660b80066eb8c168008c178008c17000458dd6982a0011bad3052001323253330523370e66e180092004480004c8cdd81ba8001375000666e00cdc119b8e0030014820010cdc700199b80001480084c8cdd81ba8001375000666e00cdc019b823371c00600290402019b823371c00666e00005200248080cdc199b8e0033370000290022404066e0c005200432330010014800088c94ccc14ccdc3800a4000266e012004330030033370000490010a99982999b880014808052002148000cdc70018009919191801000980080111b92001376600266e952000330523752086660a46ea0104cc148dd481f998291ba803d330523750076660a46ea00e52f5c02c66e00cdc199b8100300148010004dd6982880098248048b1bad304f0013047003163370e900118249baa304d001304d002304b00130430053370e900118229baa304900130490023047001303f003304500130450023043001303b011304100130410023756607e002607e002606c0022c6078002646600200202444a666076002297ae013232533303a3375e6606c6070004900000509981f00119802002000899802002000981f801181e8009bae303a0013032001163302f303100348000dd5981b800981b801181a800981680099299981799b8748000c0b80044c8c8cc0b4c0bc00520023035001302d00116323300100100d22533303300114c0103d87a80001323253330323375e6605c60600049000009099ba548000cc0d80092f5c0266008008002606e004606a002646600200200c44a666064002297adef6c6013232323253330333371e911000021003133037337606ea4008dd3000998030030019bab3034003375c6064004606c0046068002606200260620026060002605e0046eacc0b4004c0b4004c0b0008dd61815000981500098148011bac3027001301f0053025001301d0011630230013023002302100130190123758603e002603e002603c0046eb4c070004c070008dd6980d000980d0011bad30180013018002375a602c002602c0046eb8c050004c050008dd6980900098050030a4c2c6eb800cc94ccc02ccdc3a4000002264646464646464646464646464646464a66603c60420042930b1bac301f001301f002301d001301d002375a603600260360046eb4c064004c064008dd6980b800980b8011bad30150013015002375c602600260260046eb4c044004c02401458c024010c034c018004cc0040052000222233330073370e0020060184666600a00a66e000112002300e001002002230053754002460066ea80055cd2ab9d5573caae7d5d02ba157449812bd8799fd8799f5820580c37415cf5b98da27f845ed853f2e4fda0034c1441c99eb3a7f333483ce99dff02ff0001",
},
"mainnet": Network{
InterceptHash: "b019548e41b55ae702fee37d8b9ae716c978712c02bc4862ba13db6602e5af72",
InterceptSlot: 101511155,
ScriptAddress: "addr1wynelppvx0hdjp2tnc78pnt28veznqjecf9h3wy4edqajxsg7hwsc",
ValidatorHash: "279f842c33eed9054b9e3c70cd6a3b32298259c24b78b895cb41d91a",
ScriptInputRefTxId: "01751095ea408a3ebe6083b4de4de8a24b635085183ab8a2ac76273ef8fff5dd",
ScriptInputRefOutIndex: 0,
ShelleyOffsetSlot: 4924800,
ShelleyOffsetTime: 1596491091,
ShelleyOffsetSlot: 4924800,
ShelleyOffsetTime: 1596491091,
},
}
Loading

0 comments on commit 9a6cca1

Please sign in to comment.