From 2c708b447d25b40a6c0ca0c8b86e547957cbb7ca Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Fri, 29 Mar 2024 17:10:41 +0800 Subject: [PATCH] refactor (Contract interface): update contract interface, enable logger, add erc20demurrage contract --- cmd/ge-publish/cli.go | 13 ++ internal/container/publish.go | 189 +++++++++++++++++------ pkg/contract/contract.go | 117 +++++++++++++- pkg/decimalquote/decimalquote.go | 47 ++++-- pkg/erc20demurrage/ERC20Demurrage.bin | 1 + pkg/erc20demurrage/ERC20Demurrage.json | 1 + pkg/erc20demurrage/erc20demurrage.go | 68 ++++++++ pkg/limiter/limiter.go | 47 ++++-- pkg/limiterindex/limiterindex.go | 52 +++++-- pkg/priceindexquoter/priceindexquoter.go | 47 ++++-- pkg/swappool/swappool.go | 58 ++++--- pkg/tokenindex/tokenindex.go | 47 ++++-- pkg/util/util.go | 30 ++++ 13 files changed, 584 insertions(+), 133 deletions(-) create mode 100644 pkg/erc20demurrage/ERC20Demurrage.bin create mode 100644 pkg/erc20demurrage/ERC20Demurrage.json create mode 100644 pkg/erc20demurrage/erc20demurrage.go create mode 100644 pkg/util/util.go diff --git a/cmd/ge-publish/cli.go b/cmd/ge-publish/cli.go index 75f1cd2..b3f9e61 100644 --- a/cmd/ge-publish/cli.go +++ b/cmd/ge-publish/cli.go @@ -78,6 +78,19 @@ func main() { EnvVars: []string{"DEBUG"}, }, }, + Before: func(cCtx *cli.Context) error { + if cCtx.Bool("vv") { + container.UseDebugMode() + } + container.Logg.Debug("ge-publish debug mode", + "version", cCtx.App.Version, + "rpc_endpoint", cCtx.String("rpc"), + "testnet", cCtx.Bool("testnet"), + "gas_fee_cap", cCtx.Int64("gas-fee-cap"), + "gas_tip_cap", cCtx.Int64("gas-tip-cap"), + ) + return nil + }, } if err := app.Run(os.Args); err != nil { diff --git a/internal/container/publish.go b/internal/container/publish.go index 971c240..dd4a21f 100644 --- a/internal/container/publish.go +++ b/internal/container/publish.go @@ -2,15 +2,11 @@ package container import ( "fmt" + "math/big" "strings" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/decimalquote" - "github.com/grassrootseconomics/ge-publish/pkg/limiter" - "github.com/grassrootseconomics/ge-publish/pkg/limiterindex" - "github.com/grassrootseconomics/ge-publish/pkg/priceindexquoter" - "github.com/grassrootseconomics/ge-publish/pkg/swappool" - "github.com/grassrootseconomics/ge-publish/pkg/tokenindex" + "github.com/grassrootseconomics/ge-publish/pkg/contract" "github.com/urfave/cli/v2" ) @@ -22,6 +18,7 @@ func (c *Container) RegisterPublishCommands() []*cli.Command { c.priceIndexQuoter(), c.swapPool(), c.tokenIndex(), + c.erc20Demurrage(), } } @@ -30,18 +27,18 @@ func (c *Container) decimalQuote() *cli.Command { Name: "decimal-quote", Usage: "Publish the decimal quote smart contract", Action: func(cCtx *cli.Context) error { - contract := decimalquote.NewDecimalQuoteContract() - bytecode, err := contract.Bytecode(decimalquote.DecimalQuoteConstructorArgs{}) + contract := contract.NewDecimalQuote() + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) if err != nil { return err } - - fmt.Println(resp.TxHash.String()) + c.logPublishedStage(contract, resp) return nil }, @@ -53,18 +50,18 @@ func (c *Container) limiter() *cli.Command { Name: "limiter", Usage: "Publish the limiter smart contract", Action: func(cCtx *cli.Context) error { - contract := limiter.NewLimiterContract() - bytecode, err := contract.Bytecode(limiter.LimiterConstructorArgs{}) + contract := contract.NewLimiter() + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) if err != nil { return err } - - fmt.Println(resp.TxHash.String()) + c.logPublishedStage(contract, resp) return nil }, @@ -88,23 +85,21 @@ func (c *Container) limiterIndex() *cli.Command { }, }, Action: func(cCtx *cli.Context) error { - contract := limiterindex.NewLimiterIndexContract() - bytecode, err := contract.Bytecode( - limiterindex.LimiterIndexConstructorArgs{ - Holder: celoutils.HexToAddress(cCtx.String("holder")), - LimiterAddress: celoutils.HexToAddress(cCtx.String("limiter-address")), - }, - ) + contract := contract.NewLimiterIndex(contract.LimiterIndexConstructorArgs{ + Holder: celoutils.HexToAddress(cCtx.String("holder")), + LimiterAddress: celoutils.HexToAddress(cCtx.String("limiter-address")), + }) + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) if err != nil { return err } - - fmt.Println(resp.TxHash.String()) + c.logPublishedStage(contract, resp) return nil }, @@ -116,18 +111,18 @@ func (c *Container) priceIndexQuoter() *cli.Command { Name: "price-index-quoter", Usage: "Publish the price index quoter smart contract", Action: func(cCtx *cli.Context) error { - contract := priceindexquoter.NewPriceIndexQuoterContract() - bytecode, err := contract.Bytecode(priceindexquoter.PriceIndexQuoterConstructorArgs{}) + contract := contract.NewPriceIndexQuoter() + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) if err != nil { return err } - - fmt.Println(resp.TxHash.String()) + c.logPublishedStage(contract, resp) return nil }, @@ -181,26 +176,24 @@ func (c *Container) swapPool() *cli.Command { }, }, Action: func(cCtx *cli.Context) error { - contract := swappool.NewSwapPoolContract() - bytecode, err := contract.Bytecode( - swappool.SwapPoolConstructorArgs{ - Name: cCtx.String("name"), - Symbol: strings.ToUpper(cCtx.String("symbol")), - Decimals: uint8(cCtx.Uint("decimals")), - TokenRegistry: celoutils.HexToAddress(cCtx.String("token-registry")), - TokenLimiter: celoutils.HexToAddress(cCtx.String("token-limiter")), - }, - ) + contract := contract.NewSwapPool(contract.SwapPoolConstructorArgs{ + Name: cCtx.String("name"), + Symbol: strings.ToUpper(cCtx.String("symbol")), + Decimals: uint8(cCtx.Uint("decimals")), + TokenRegistry: celoutils.HexToAddress(cCtx.String("token-registry")), + TokenLimiter: celoutils.HexToAddress(cCtx.String("token-limiter")), + }) + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) if err != nil { return err } - - fmt.Println(resp.TxHash.String()) + c.logPublishedStage(contract, resp) return nil }, @@ -213,20 +206,120 @@ func (c *Container) tokenIndex() *cli.Command { Aliases: []string{"token-registry"}, Usage: "Publish the ERC20 unique token index smart contract", Action: func(cCtx *cli.Context) error { - contract := tokenindex.NewTokenIndexContract() - bytecode, err := contract.Bytecode(tokenindex.TokenIndexConstructorArgs{}) + contract := contract.NewTokenIndex() + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.GasLimit()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) + if err != nil { + return err + } + c.logPublishedStage(contract, resp) + + return nil + }, + } +} + +func (c *Container) erc20Demurrage() *cli.Command { + return &cli.Command{ + Name: "erc20-demurrage", + Aliases: []string{"erc20", "det", "voucher", "token"}, + Usage: "Publish the ERC20 (demurrage) smart contract", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "name", + Usage: "Token name", + Required: true, + }, + &cli.StringFlag{ + Name: "symbol", + Usage: "Token symbol", + Required: true, + Action: func(ctx *cli.Context, s string) error { + if len(s) < 3 || len(s) > 10 { + return fmt.Errorf("flag symbol %s length out of range[3-10]", s) + } + return nil + }, + }, + &cli.UintFlag{ + Name: "decimals", + Usage: "Token decimals", + Value: 6, + Required: false, + Action: func(ctx *cli.Context, u uint) error { + if u == 0 || u > 18 { + return fmt.Errorf("flag decimals value %d out of range[1-18]", u) + } + return nil + }, + }, + &cli.Uint64Flag{ + Name: "demurrage-level", + Aliases: []string{"decay-level"}, + Usage: "Level of decay per minute", + Value: 20000, + Required: false, + }, + &cli.Uint64Flag{ + Name: "redistribution-period", + Aliases: []string{"period-minutes"}, + Usage: "Number of minutes between each time the demurraged value can be withdrawn to the Sink Account", + Value: 43200, + Required: false, + }, + &cli.StringFlag{ + Name: "sink-address", + Aliases: []string{"community-fund"}, + Usage: "The initial Sink Address", + Required: true, + }, + }, + Action: func(cCtx *cli.Context) error { + contract := contract.NewERC20Demurrage(contract.ERC20DemurrageConstructorArgs{ + Name: cCtx.String("name"), + Symbol: strings.ToUpper(cCtx.String("symbol")), + Decimals: uint8(cCtx.Uint("decimals")), + DecayLevel: big.NewInt(int64(cCtx.Uint64("demurrage-level"))), + PeriodMinutes: big.NewInt(int64(cCtx.Uint64("redistribution-period"))), + DefaultSinkAddress: celoutils.HexToAddress(cCtx.String("sink-address")), + }) + bytecode, err := contract.Bytecode() if err != nil { return err } + c.logInitStage(contract) - fmt.Println(resp.TxHash.String()) + resp, err := c.SendContractPublishTx(cCtx, bytecode, contract.MaxGasLimit()) + if err != nil { + return err + } + c.logPublishedStage(contract, resp) return nil }, } } + +func (c *Container) logInitStage(contract contract.Contract) { + c.Logg.Info(fmt.Sprintf("publishing %s contract", contract.Name()), + "version", contract.Version(), + "constructor_args", contract.ConstructorArgs(), + ) + c.Logg.Debug(fmt.Sprintf("publishing %s contract", contract.Name()), + "license", contract.License(), + "source", contract.Source(), + "solidity_version", contract.SolidityVersion(), + "evm_fork", contract.EVMFork(), + ) +} + +func (c *Container) logPublishedStage(contract contract.Contract, resp PublishTxResp) { + c.Logg.Info(fmt.Sprintf("successfully published %s contract", contract.Name()), + "tx_hash", resp.TxHash.String(), + ) +} diff --git a/pkg/contract/contract.go b/pkg/contract/contract.go index f22a496..c28b1e8 100644 --- a/pkg/contract/contract.go +++ b/pkg/contract/contract.go @@ -1,7 +1,116 @@ package contract -type Contract[T any] interface { - Version() string - GasLimit() uint64 - Bytecode(T) ([]byte, error) +import ( + "math/big" + + "github.com/celo-org/celo-blockchain/common" + "github.com/grassrootseconomics/ge-publish/pkg/decimalquote" + "github.com/grassrootseconomics/ge-publish/pkg/erc20demurrage" + "github.com/grassrootseconomics/ge-publish/pkg/limiter" + "github.com/grassrootseconomics/ge-publish/pkg/limiterindex" + "github.com/grassrootseconomics/ge-publish/pkg/priceindexquoter" + "github.com/grassrootseconomics/ge-publish/pkg/swappool" + "github.com/grassrootseconomics/ge-publish/pkg/tokenindex" +) + +type ( + Contract interface { + Name() string + // Version return the smart contract source version, either a tag or a short commit hash + Version() string + // License return an SPDX identifier of the license + License() string + // Source returns a URL pointing to the source file or directory + Source() string + // SolidityVersion returns the Solidity version with which the bytecode was compiled with + SolidityVersion() string + // EVM returns the evm fork flag passed to the solidity compiler during compilation + EVMFork() string + // ConstructorArgs return the passed constructor args + ConstructorArgs() []string + // Bytecode returns the compiled bytecode including the passed constructor args + Bytecode() ([]byte, error) + // MaxGasLimit returns the expected max gas the constract deployment is expected to use + MaxGasLimit() uint64 + } + + SwapPoolConstructorArgs struct { + Name string + Symbol string + Decimals uint8 + TokenRegistry common.Address + TokenLimiter common.Address + } + + LimiterIndexConstructorArgs struct { + Holder common.Address + LimiterAddress common.Address + } + + ERC20DemurrageConstructorArgs struct { + Name string + Symbol string + Decimals uint8 + DecayLevel *big.Int + PeriodMinutes *big.Int + DefaultSinkAddress common.Address + } +) + +func NewDecimalQuote() Contract { + return &decimalquote.DecimalQuote{ + Constructor: []any{}, + } +} + +func NewSwapPool(args SwapPoolConstructorArgs) Contract { + return &swappool.SwapPool{ + Constructor: []any{ + args.Name, + args.Symbol, + args.Decimals, + args.TokenRegistry, + args.TokenLimiter, + }, + } +} + +func NewLimiter() Contract { + return &limiter.Limiter{ + Constructor: []any{}, + } +} + +func NewLimiterIndex(args LimiterIndexConstructorArgs) Contract { + return &limiterindex.LimiterIndex{ + Constructor: []any{ + args.Holder, + args.LimiterAddress, + }, + } +} + +func NewPriceIndexQuoter() Contract { + return &priceindexquoter.PriceIndexQuoter{ + Constructor: []any{}, + } +} + +func NewTokenIndex() Contract { + return &tokenindex.TokenIndex{ + Constructor: []any{}, + } +} + +func NewERC20Demurrage(args ERC20DemurrageConstructorArgs) Contract { + return &erc20demurrage.ERC20Demurrage{ + Constructor: []any{ + args.Name, + args.Symbol, + args.Decimals, + args.DecayLevel, + args.PeriodMinutes, + args.DefaultSinkAddress, + }, + } } diff --git a/pkg/decimalquote/decimalquote.go b/pkg/decimalquote/decimalquote.go index 15fdd89..2c5c335 100644 --- a/pkg/decimalquote/decimalquote.go +++ b/pkg/decimalquote/decimalquote.go @@ -4,17 +4,22 @@ import ( _ "embed" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - DecimalQuote struct{} - - DecimalQuoteConstructorArgs struct{} + DecimalQuote struct { + Constructor []any + } ) const ( - version = "0.0.1" + name = "DecimalQuote" + version = "7bc3212" + license = "AGPL-3.0" + source = "https://github.com/nolash/erc20-pool/blob/master/solidity/DecimalQuote.sol" + solidityVersion = "0.8.19+commit.7dd6d404" + evmFork = "byzantium" gasLimit = 750_000 ) @@ -26,18 +31,38 @@ var ( abi string ) -func NewDecimalQuoteContract() contract.Contract[DecimalQuoteConstructorArgs] { - return &DecimalQuote{} +func (c *DecimalQuote) Name() string { + return name } func (c *DecimalQuote) Version() string { return version } -func (c *DecimalQuote) GasLimit() uint64 { - return gasLimit +func (c *DecimalQuote) License() string { + return license +} + +func (c *DecimalQuote) Source() string { + return source } -func (c *DecimalQuote) Bytecode(args DecimalQuoteConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{}) +func (c *DecimalQuote) SolidityVersion() string { + return solidityVersion +} + +func (c *DecimalQuote) EVMFork() string { + return evmFork +} + +func (c *DecimalQuote) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *DecimalQuote) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *DecimalQuote) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/erc20demurrage/ERC20Demurrage.bin b/pkg/erc20demurrage/ERC20Demurrage.bin new file mode 100644 index 0000000..97123df --- /dev/null +++ b/pkg/erc20demurrage/ERC20Demurrage.bin @@ -0,0 +1 @@ +61010060405234801561001157600080fd5b506040516161203803806161208339818101604052810190610033919061072d565b6801000000000000000083600f0b1261004b57600080fd5b610053610476565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600690816100a39190610a09565b5085600790816100b39190610a09565b508460ff16608081815250504260038190555060035460a08181525050603c836100dd9190610b0a565b60c081815250506100f4600161026f60201b60201c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555061013e8461029260201b60201c565b600f0b60e081600f0b8152505061016f6000600260009054906101000a9004600f0b600060016102d260201b60201c565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610b4c565b6000677fffffffffffffff82111561028657600080fd5b604082901b9050919050565b60008082600f0b136102a357600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6102c58461035260201b60201c565b600f0b02901c9050919050565b6102da610476565b6102e2610476565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b1361036357600080fd5b60008083600f0b905068010000000000000000811261038a57604081901d90506040820191505b64010000000081126103a457602081901d90506020820191505b6201000081126103bc57601081901d90506010820191505b61010081126103d357600881901d90506008820191505b601081126103e957600481901d90506004820191505b600481126103ff57600281901d90506002820191505b6002811261040e576001820191505b60006040808403901b9050600083607f0386600f0b901b9050600067800000000000000090505b6000811315610469578182029150600060ff83901c905080607f0183901c92508082028401935050600181901d9050610435565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610519826104d0565b810181811067ffffffffffffffff82111715610538576105376104e1565b5b80604052505050565b600061054b6104b2565b90506105578282610510565b919050565b600067ffffffffffffffff821115610577576105766104e1565b5b610580826104d0565b9050602081019050919050565b60005b838110156105ab578082015181840152602081019050610590565b60008484015250505050565b60006105ca6105c58461055c565b610541565b9050828152602081018484840111156105e6576105e56104cb565b5b6105f184828561058d565b509392505050565b600082601f83011261060e5761060d6104c6565b5b815161061e8482602086016105b7565b91505092915050565b600060ff82169050919050565b61063d81610627565b811461064857600080fd5b50565b60008151905061065a81610634565b92915050565b600081600f0b9050919050565b61067681610660565b811461068157600080fd5b50565b6000815190506106938161066d565b92915050565b6000819050919050565b6106ac81610699565b81146106b757600080fd5b50565b6000815190506106c9816106a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106fa826106cf565b9050919050565b61070a816106ef565b811461071557600080fd5b50565b60008151905061072781610701565b92915050565b60008060008060008060c0878903121561074a576107496104bc565b5b600087015167ffffffffffffffff811115610768576107676104c1565b5b61077489828a016105f9565b965050602087015167ffffffffffffffff811115610795576107946104c1565b5b6107a189828a016105f9565b95505060406107b289828a0161064b565b94505060606107c389828a01610684565b93505060806107d489828a016106ba565b92505060a06107e589828a01610718565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061084457607f821691505b602082108103610857576108566107fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026108bf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610882565b6108c98683610882565b95508019841693508086168417925050509392505050565b6000819050919050565b60006109066109016108fc84610699565b6108e1565b610699565b9050919050565b6000819050919050565b610920836108eb565b61093461092c8261090d565b84845461088f565b825550505050565b600090565b61094961093c565b610954818484610917565b505050565b5b818110156109785761096d600082610941565b60018101905061095a565b5050565b601f8211156109bd5761098e8161085d565b61099784610872565b810160208510156109a6578190505b6109ba6109b285610872565b830182610959565b50505b505050565b600082821c905092915050565b60006109e0600019846008026109c2565b1980831691505092915050565b60006109f983836109cf565b9150826002028217905092915050565b610a12826107f2565b67ffffffffffffffff811115610a2b57610a2a6104e1565b5b610a35825461082c565b610a4082828561097c565b600060209050601f831160018114610a735760008415610a61578287015190505b610a6b85826109ed565b865550610ad3565b601f198416610a818661085d565b60005b82811015610aa957848901518255600182019150602085019450602081019050610a84565b86831015610ac65784890151610ac2601f8916826109cf565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b1582610699565b9150610b2083610699565b9250828202610b2e81610699565b91508282048414831517610b4557610b44610adb565b5b5092915050565b60805160a05160c05160e051615555610bcb600039600081816117f0015281816126db015281816128c80152612cc4015260008181611f3d0152818161269e01528181612c1c01528181612e6101526130ae015260008181611f6901528181612e8d015281816130cf01526131140152600061184e01526155556000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c80636a2d094e116101ff578063a457c2d71161011a578063d89135cd116100ad578063e69571af1161007c578063e69571af14610cc6578063e809529514610cf6578063eda4e6d614610d14578063f2fde38b14610d32576103c5565b8063d89135cd14610c18578063da2824a814610c36578063dd62ed3e14610c66578063e54063a614610c96576103c5565b8063c0ab7077116100e9578063c0ab707714610b90578063d340ef8a14610bc0578063d5abeb0114610bde578063d7a52fa914610bfc576103c5565b8063a457c2d714610af4578063a9059cbb14610b24578063b1cb0db314610b54578063b470aade14610b72576103c5565b80638832e6e31161019257806394d008ef1161016157806394d008ef14610a7e57806395d89b4114610a9a5780639f24880814610ab8578063a2309ff814610ad6576103c5565b80638832e6e314610a0a5780638da5cb5b14610a265780638f0b2d5d14610a445780638f1df6bc14610a60576103c5565b80637445e33a116101ce5780637445e33a1461096e57806374bedb951461099e57806384dde4af146109bc57806386fe212d146109da576103c5565b80636a2d094e146108d45780636f8b44b01461090457806370a0823114610920578063731f237c14610950576103c5565b806331333487116102ef57806344df8e701161028257806358b2833b1161025157806358b2833b146108385780635ae06f7e146108565780635f408c04146108865780636787a9be146108a4576103c5565b806344df8e701461078a57806347a50517146107a85780634abfbba2146107d857806351b4541c14610808576103c5565b806340452d91116102be57806340452d91146106dc57806342966c681461070e578063449a52f81461073e57806344d171871461076e576103c5565b80633133348714610640578063313ce5671461067057806331a5995d1461068e57806339509351146106ac576103c5565b806318cbbcfc1161036757806323b872dd1161033657806323b872dd146105805780632a7aec09146105b05780632b29ba23146105e05780632c1758c114610610576103c5565b806318cbbcfc146104e45780631989c6a814610502578063213d1e1e1461052057806323a8594414610550576103c5565b8063095ea7b3116103a3578063095ea7b31461044857806309f28f3c1461047857806311c566151461049657806318160ddd146104c6576103c5565b806301681a62146103ca57806301ffc9a7146103fa57806306fdde031461042a575b600080fd5b6103e460048036038101906103df919061478a565b610d62565b6040516103f191906147d0565b60405180910390f35b610414600480360381019061040f9190614843565b610eb0565b604051610421919061488b565b60405180910390f35b6104326110a2565b60405161043f9190614936565b60405180910390f35b610462600480360381019061045d9190614984565b611130565b60405161046f919061488b565b60405180910390f35b61048061138c565b60405161048d91906149e0565b60405180910390f35b6104b060048036038101906104ab9190614a27565b61139f565b6040516104bd91906147d0565b60405180910390f35b6104ce6113ef565b6040516104db91906147d0565b60405180910390f35b6104ec611406565b6040516104f991906147d0565b60405180910390f35b61050a61140b565b60405161051791906147d0565b60405180910390f35b61053a60048036038101906105359190614c08565b611417565b60405161054791906147d0565b60405180910390f35b61056a60048036038101906105659190614c08565b611430565b604051610577919061488b565b60405180910390f35b61059a60048036038101906105959190614c35565b611498565b6040516105a7919061488b565b60405180910390f35b6105ca60048036038101906105c59190614c08565b6116b6565b6040516105d791906149e0565b60405180910390f35b6105fa60048036038101906105f5919061478a565b6116ee565b604051610607919061488b565b60405180910390f35b61062a60048036038101906106259190614c88565b61179c565b604051610637919061488b565b60405180910390f35b61065a60048036038101906106559190614cb5565b6117cf565b60405161066791906147d0565b60405180910390f35b61067861184c565b60405161068591906147d0565b60405180910390f35b610696611870565b6040516106a391906147d0565b60405180910390f35b6106c660048036038101906106c19190614984565b611876565b6040516106d3919061488b565b60405180910390f35b6106f660048036038101906106f19190614c88565b611a0c565b60405161070593929190614d22565b60405180910390f35b61072860048036038101906107239190614c88565b611a7b565b604051610735919061488b565b60405180910390f35b61075860048036038101906107539190614984565b611c4c565b604051610765919061488b565b60405180910390f35b61078860048036038101906107839190614dbe565b611e23565b005b610792611ea1565b60405161079f919061488b565b60405180910390f35b6107c260048036038101906107bd919061478a565b611ef0565b6040516107cf91906147d0565b60405180910390f35b6107f260048036038101906107ed9190614c88565b611f39565b6040516107ff91906147d0565b60405180910390f35b610822600480360381019061081d9190614c88565b611f99565b60405161082f91906147d0565b60405180910390f35b610840611fba565b60405161084d91906147d0565b60405180910390f35b610870600480360381019061086b919061478a565b611fc0565b60405161087d919061488b565b60405180910390f35b61088e6120ca565b60405161089b9190614e4e565b60405180910390f35b6108be60048036038101906108b99190614c88565b612197565b6040516108cb91906147d0565b60405180910390f35b6108ee60048036038101906108e99190614c88565b6121d8565b6040516108fb91906147d0565b60405180910390f35b61091e60048036038101906109199190614c88565b6121f9565b005b61093a6004803603810190610935919061478a565b6122c1565b60405161094791906147d0565b60405180910390f35b610958612328565b60405161096591906147d0565b60405180910390f35b61098860048036038101906109839190614c08565b612339565b60405161099591906147d0565b60405180910390f35b6109a6612367565b6040516109b391906147d0565b60405180910390f35b6109c461236d565b6040516109d19190614e78565b60405180910390f35b6109f460048036038101906109ef9190614c88565b612393565b604051610a0191906147d0565b60405180910390f35b610a246004803603810190610a1f9190614dbe565b61247a565b005b610a2e61248b565b604051610a3b9190614e78565b60405180910390f35b610a5e6004803603810190610a59919061478a565b6124b1565b005b610a68612566565b604051610a75919061488b565b60405180910390f35b610a986004803603810190610a939190614dbe565b612827565b005b610aa2612838565b604051610aaf9190614936565b60405180910390f35b610ac06128c6565b604051610acd91906149e0565b60405180910390f35b610ade6128ea565b604051610aeb91906147d0565b60405180910390f35b610b0e6004803603810190610b099190614984565b6128f4565b604051610b1b919061488b565b60405180910390f35b610b3e6004803603810190610b399190614984565b612b13565b604051610b4b919061488b565b60405180910390f35b610b5c612c14565b604051610b6991906147d0565b60405180910390f35b610b7a612c1a565b604051610b8791906147d0565b60405180910390f35b610baa6004803603810190610ba59190614c88565b612c3e565b604051610bb791906147d0565b60405180910390f35b610bc8612dc5565b604051610bd591906147d0565b60405180910390f35b610be6612dcb565b604051610bf391906147d0565b60405180910390f35b610c166004803603810190610c119190614c88565b612dd1565b005b610c20612f11565b604051610c2d91906147d0565b60405180910390f35b610c506004803603810190610c4b919061478a565b612f1b565b604051610c5d919061488b565b60405180910390f35b610c806004803603810190610c7b9190614e93565b612fef565b604051610c8d91906147d0565b60405180910390f35b610cb06004803603810190610cab9190614c08565b613014565b604051610cbd91906147d0565b60405180910390f35b610ce06004803603810190610cdb9190614ed3565b613028565b604051610ced9190614fa9565b60405180910390f35b610cfe6130a8565b604051610d0b9190614fef565b60405180910390f35b610d1c613112565b604051610d2991906147d0565b60405180910390f35b610d4c6004803603810190610d47919061478a565b613136565b604051610d59919061488b565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e3b9190615039565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e9f91906147d0565b60405180910390a380915050919050565b600063b61bc94160e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ee8576001905061109d565b635878bcf460e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f1e576001905061109d565b63bc4babdd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f54576001905061109d565b630d7491f860e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f8a576001905061109d565b63abe1f1f560e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610fc0576001905061109d565b63841a0e9460e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ff6576001905061109d565b6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361102c576001905061109d565b639493f8b260e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603611062576001905061109d565b63d001796860e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603611098576001905061109d565b600090505b919050565b600680546110af9061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546110db9061509c565b80156111285780601f106110fd57610100808354040283529160200191611128565b820191906000526020600020905b81548152906001019060200180831161110b57829003601f168201915b505050505081565b600080600061113d6120ca565b905060028160ff160361115557600092505050611386565b60008160ff16111561119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390615119565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112655760008414611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90615185565b60405180910390fd5b5b61126d612566565b50678000000000000000841161128d5761128684612197565b9150611299565b67800000000000000091505b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161137791906147d0565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806113c66113ae8561327f565b6113c16113bb600161327f565b866132a2565b613309565b90506113d181613374565b67ffffffffffffffff16846113e691906151a5565b91505092915050565b6000600b5460085461140191906151a5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561144d5760009050611493565b6000826020015168ffffffffffffffffff16111561146e5760009050611493565b6000826040015167ffffffffffffffff16111561148e5760009050611493565b600190505b919050565b6000806000806114a66120ca565b905060028160ff16036114bf57600093505050506116af565b60008160ff161115611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90615119565b60405180910390fd5b61150e612566565b5061151885612197565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156115a357600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461162f91906151a5565b92505081905550611641878785613395565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516116a091906147d0565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036116e5576116e2600161327f565b90505b80915050919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806117955750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b6000600f82106117ab57600080fd5b600082036117c057600f6012541490506117ca565b8160125483161490505b919050565b6000806000806117de8661327f565b92506117e98561327f565b91506118157f000000000000000000000000000000000000000000000000000000000000000083613309565b9050611820816133b8565b905061182c8382613309565b905061183781613374565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611881612566565b5061188b83612197565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119199190615039565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516119f991906147d0565b60405180910390a3600191505092915050565b60008181548110611a1c57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600080611a866120ca565b60ff1614611a9357600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b385750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e90615225565b60405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115611bc357600080fd5b6000611bce83612197565b9050611bda3382613431565b5082600b6000828254611bed9190615039565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca584604051611c3a91906147d0565b60405180910390a26001915050919050565b6000806000611c596120ca565b60ff1614611c6657600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611d0b5750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190615225565b60405180910390fd5b611d52612566565b5060006011541115611d7b5760115483600854611d6f9190615039565b1115611d7a57600080fd5b5b8260086000828254611d8d9190615039565b92505081905550611d9d83612197565b9050611da98482613535565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611e0791906147d0565b60405180910390a3611e176135f6565b50600191505092915050565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890615291565b60405180910390fd5b611e9a83611a7b565b5050505050565b6000611eeb600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7b565b905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611f6791906152b1565b7f0000000000000000000000000000000000000000000000000000000000000000611f929190615039565b9050919050565b6000603c8242611fa991906151a5565b611fb39190615322565b9050919050565b60035481565b6000611fcf600160ff1661179c565b15611fd957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061206057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61206957600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff16156120ea5760019050612194565b6000600f54036120fd5760009050612194565b600f54421061218f5761212a603c6003546121189190615322565b600f5461212591906151a5565b612c3e565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe94260405161217591906147d0565b60405180910390a1612185612566565b5060029050612194565b600090505b90565b6000806121bb6121a68461327f565b600260009054906101000a9004600f0b6137ba565b90506121c681613374565b67ffffffffffffffff16915050919050565b6000603c82426121e891906151a5565b6121f29190615322565b9050919050565b612206600860ff1661179c565b1561221057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461226a57600080fd5b6122726113ef565b811161227d57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe6826040516122af91906147d0565b60405180910390a28060118190555050565b6000806000806122d86122d386611ef0565b61327f565b92506122e5600354611f99565b905061230083600260009054906101000a9004600f0b613309565b915061231e61230e83613374565b67ffffffffffffffff16826117cf565b9350505050919050565b60006123346000612c3e565b905090565b600080600061234784611417565b9150612352846116b6565b905061235e828261139f565b92505050919050565b600a5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf9061539f565b60405180910390fd5b600060125483161461241f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124169061540b565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e60125460405161246891906147d0565b60405180910390a26012549050919050565b6124848484611c4c565b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6124be600260ff1661179c565b156124c857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461252257600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006125706146dc565b6125786146dc565b6125806146dc565b6000806000806000612590612328565b50612599613843565b97506125a488611430565b156125ba57600098505050505050505050612824565b6000600954815481106125d0576125cf61542b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061267d88613014565b945060018561268c9190615039565b9050612697866116b6565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006126c791906152b1565b6126d19190615322565b915061270d6127087f00000000000000000000000000000000000000000000000000000000000000006127038561327f565b613309565b6133b8565b925061272360008461271d6113ef565b84613028565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506127df876139bd565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161280f91906147d0565b60405180910390a16001985050505050505050505b90565b6128318484611c4c565b5050505050565b600780546128459061509c565b80601f01602080910402602001604051908101604052809291908181526020018280546128719061509c565b80156128be5780601f10612893576101008083540402835291602001916128be565b820191906000526020600020905b8154815290600101906020018083116128a157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b60008061290083612197565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561298b57600080fd5b612993612566565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a2091906151a5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051612b0091906147d0565b60405180910390a3600191505092915050565b600080600080612b216120ca565b905060028160ff1603612b3a5760009350505050612c0e565b60008160ff161115612b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7890615119565b60405180910390fd5b612b89612566565b50612b9385612197565b9250612ba0338785613395565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051612bff91906147d0565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612c68576000945050505050612dc0565b612c73600354611f99565b925060008303612c8a576000945050505050612dc0565b600260009054906101000a9004600f0b9050600086118015612cab57508286105b15612cb4578592505b612cbd8361327f565b9150612ce97f000000000000000000000000000000000000000000000000000000000000000083613309565b9350612cf4846133b8565b9350612d0f600260009054906101000a9004600f0b85613309565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612d5791906152b1565b600354612d649190615039565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612db091906149e0565b60405180910390a4829450505050505b919050565b60095481565b60115481565b600080612de1600460ff1661179c565b15612deb57600080fd5b601060009054906101000a900460ff1615612e0557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e5f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000083612e8b91906152b1565b7f0000000000000000000000000000000000000000000000000000000000000000612eb69190615039565b9150600f548211612ec657600080fd5b600f54905081600f81905550807ff5bd6cb27a0006b5ea8618058a0d84719695cb6d984f4840bc1a54ca12ae4b7c600f54604051612f0491906147d0565b60405180910390a2505050565b6000600b54905090565b6000612f2a600160ff1661179c565b15612f3457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f8e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600d602052816000526040600020602052806000526040600020600091509150505481565b6000816000015163ffffffff169050919050565b6130306146dc565b6130386146dc565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426130f991906151a5565b6131039190615322565b61310d9190615039565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461319357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b6000677fffffffffffffff82111561329657600080fd5b604082901b9050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156132f657506f7fffffffffffffffffffffffffffffff600f0b8113155b6132ff57600080fd5b8091505092915050565b600080604083600f0b85600f0b02901d90507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561336157506f7fffffffffffffffffffffffffffffff600f0b8113155b61336a57600080fd5b8091505092915050565b60008082600f0b121561338657600080fd5b604082600f0b901d9050919050565b60006133a18483613431565b506133ac8383613535565b50600190509392505050565b60006840000000000000000082600f0b126133d257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613406576000905061342c565b6134296080700171547652b82fe1777d0ffda0d23a7d1284600f0b02901d613adc565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000840361348b5760009250505061352f565b61349485611ef0565b9150838210156134d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d0906154a6565b60405180910390fd5b83826134e591906151a5565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000840361358f576000925050506135f0565b61359885611ef0565b915083826135a69190615039565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b60006136006146dc565b600061360a6113ef565b90506000600160008054905061362091906151a5565b815481106136315761363061542b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061370c91906151a5565b8154811061371d5761371c61542b565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036137cb57600080fd5b600082600f0b604085600f0b901b816137e7576137e66152f3565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561383057506f7fffffffffffffffffffffffffffffff600f0b8113155b61383957600080fd5b8091505092915050565b61384b6146dc565b6138536146dc565b61385b6146dc565b600080600954815481106138725761387161542b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff1660e01b8152600401602060405180830381865afa158015613961573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061398591906154f2565b6fffffffffffffffffffffffffffffffff1690506139a283613014565b81116139b3578193505050506139ba565b8293505050505b90565b60008060006139cb84612339565b6139d36113ef565b6139dd91906151a5565b9150600a546139eb83612197565b6139f591906151a5565b9050613a23600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613535565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613a9791906147d0565b60405180910390a3600160096000828254613ab29190615039565b9250508190555080600a6000828254613acb9190615039565b925050819055508192505050919050565b60006840000000000000000082600f0b12613af657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613b2a57600090506146d7565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613b7057608070016a09e667f3bcc908b2fb1366ea957d3e8202901c90505b60006740000000000000008416600f0b1315613ba15760807001306fe0a31b7152de8d5a46305c85edec8202901c90505b60006720000000000000008416600f0b1315613bd25760807001172b83c7d517adcdf7c8c50eb14a791f8202901c90505b60006710000000000000008416600f0b1315613c0357608070010b5586cf9890f6298b92b71842a983638202901c90505b60006708000000000000008416600f0b1315613c345760807001059b0d31585743ae7c548eb68ca417fd8202901c90505b60006704000000000000008416600f0b1315613c65576080700102c9a3e778060ee6f7caca4f7a29bde88202901c90505b60006702000000000000008416600f0b1315613c9657608070010163da9fb33356d84a66ae336dcdfa3f8202901c90505b60006701000000000000008416600f0b1315613cc7576080700100b1afa5abcbed6129ab13ec11dc95438202901c90505b600066800000000000008416600f0b1315613cf757608070010058c86da1c09ea1ff19d294cf2f679b8202901c90505b600066400000000000008416600f0b1315613d275760807001002c605e2e8cec506d21bfc89a23a00f8202901c90505b600066200000000000008416600f0b1315613d57576080700100162f3904051fa128bca9c55c31e5df8202901c90505b600066100000000000008416600f0b1315613d875760807001000b175effdc76ba38e31671ca9397258202901c90505b600066080000000000008416600f0b1315613db7576080700100058ba01fb9f96d6cacd4b180917c3d8202901c90505b600066040000000000008416600f0b1315613de757608070010002c5cc37da9491d0985c348c68e7b38202901c90505b600066020000000000008416600f0b1315613e175760807001000162e525ee054754457d59952920268202901c90505b600066010000000000008416600f0b1315613e4757608070010000b17255775c040618bf4a4ade83fc8202901c90505b6000658000000000008416600f0b1315613e765760807001000058b91b5bc9ae2eed81e9b7d4cfab8202901c90505b6000654000000000008416600f0b1315613ea5576080700100002c5c89d5ec6ca4d7c8acc017b7c98202901c90505b6000652000000000008416600f0b1315613ed457608070010000162e43f4f831060e02d839a9d16d8202901c90505b6000651000000000008416600f0b1315613f03576080700100000b1721bcfc99d9f890ea069117638202901c90505b6000650800000000008416600f0b1315613f3257608070010000058b90cf1e6d97f9ca14dbcc16288202901c90505b6000650400000000008416600f0b1315613f615760807001000002c5c863b73f016468f6bac5ca2b8202901c90505b6000650200000000008416600f0b1315613f90576080700100000162e430e5a18f6119e3c02282a58202901c90505b6000650100000000008416600f0b1315613fbf5760807001000000b1721835514b86e6d96efd1bfe8202901c90505b60006480000000008416600f0b1315613fed576080700100000058b90c0b48c6be5df846c5b2ef8202901c90505b60006440000000008416600f0b131561401b57608070010000002c5c8601cc6b9e94213c72737a8202901c90505b60006420000000008416600f0b13156140495760807001000000162e42fff037df38aa2b219f068202901c90505b60006410000000008416600f0b131561407757608070010000000b17217fba9c739aa5819f44f98202901c90505b60006408000000008416600f0b13156140a55760807001000000058b90bfcdee5acd3c1cedc8238202901c90505b60006404000000008416600f0b13156140d3576080700100000002c5c85fe31f35a6a30da1be508202901c90505b60006402000000008416600f0b131561410157608070010000000162e42ff0999ce3541b9fffcf8202901c90505b60006401000000008416600f0b131561412f576080700100000000b17217f80f4ef5aadda455548202901c90505b600063800000008416600f0b131561415c57608070010000000058b90bfbf8479bd5a81b51ad8202901c90505b600063400000008416600f0b13156141895760807001000000002c5c85fdf84bd62ae30a74cc8202901c90505b600063200000008416600f0b13156141b6576080700100000000162e42fefb2fed257559bdaa8202901c90505b600063100000008416600f0b13156141e35760807001000000000b17217f7d5a7716bba4a9ae8202901c90505b600063080000008416600f0b1315614210576080700100000000058b90bfbe9ddbac5e109cce8202901c90505b600063040000008416600f0b131561423d57608070010000000002c5c85fdf4b15de6f17eb0d8202901c90505b600063020000008416600f0b131561426a5760807001000000000162e42fefa494f1478fde058202901c90505b600063010000008416600f0b131561429757608070010000000000b17217f7d20cf927c8e94c8202901c90505b6000628000008416600f0b13156142c35760807001000000000058b90bfbe8f71cb4e4b33d8202901c90505b6000624000008416600f0b13156142ef576080700100000000002c5c85fdf477b662b269458202901c90505b6000622000008416600f0b131561431b57608070010000000000162e42fefa3ae53369388c8202901c90505b6000621000008416600f0b1315614347576080700100000000000b17217f7d1d351a389d408202901c90505b6000620800008416600f0b131561437357608070010000000000058b90bfbe8e8b2d3d4ede8202901c90505b6000620400008416600f0b131561439f5760807001000000000002c5c85fdf4741bea6e77e8202901c90505b6000620200008416600f0b13156143cb576080700100000000000162e42fefa39fe95583c28202901c90505b6000620100008416600f0b13156143f75760807001000000000000b17217f7d1cfb72b45e18202901c90505b60006180008416600f0b1315614422576080700100000000000058b90bfbe8e7cc35c3f08202901c90505b60006140008416600f0b131561444d57608070010000000000002c5c85fdf473e242ea388202901c90505b60006120008416600f0b13156144785760807001000000000000162e42fefa39f02b772c8202901c90505b60006110008416600f0b13156144a357608070010000000000000b17217f7d1cf7d83c1a8202901c90505b60006108008416600f0b13156144ce5760807001000000000000058b90bfbe8e7bdcbe2e8202901c90505b60006104008416600f0b13156144f9576080700100000000000002c5c85fdf473dea871f8202901c90505b60006102008416600f0b131561452457608070010000000000000162e42fefa39ef44d918202901c90505b60006101008416600f0b131561454f576080700100000000000000b17217f7d1cf79e9498202901c90505b600060808416600f0b131561457957608070010000000000000058b90bfbe8e7bce5448202901c90505b600060408416600f0b13156145a35760807001000000000000002c5c85fdf473de6eca8202901c90505b600060208416600f0b13156145cd576080700100000000000000162e42fefa39ef366f8202901c90505b600060108416600f0b13156145f75760807001000000000000000b17217f7d1cf79afa8202901c90505b600060088416600f0b1315614621576080700100000000000000058b90bfbe8e7bcd6d8202901c90505b600060048416600f0b131561464b57608070010000000000000002c5c85fdf473de6b28202901c90505b600060028416600f0b13156146755760807001000000000000000162e42fefa39ef3588202901c90505b600060018416600f0b131561469f57608070010000000000000000b17217f7d1cf79ab8202901c90505b604083600f0b901d603f03600f0b81901c90506f7fffffffffffffffffffffffffffffff600f0b8111156146d257600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006147578261472c565b9050919050565b6147678161474c565b811461477257600080fd5b50565b6000813590506147848161475e565b92915050565b6000602082840312156147a05761479f614722565b5b60006147ae84828501614775565b91505092915050565b6000819050919050565b6147ca816147b7565b82525050565b60006020820190506147e560008301846147c1565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614820816147eb565b811461482b57600080fd5b50565b60008135905061483d81614817565b92915050565b60006020828403121561485957614858614722565b5b60006148678482850161482e565b91505092915050565b60008115159050919050565b61488581614870565b82525050565b60006020820190506148a0600083018461487c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156148e05780820151818401526020810190506148c5565b60008484015250505050565b6000601f19601f8301169050919050565b6000614908826148a6565b61491281856148b1565b93506149228185602086016148c2565b61492b816148ec565b840191505092915050565b6000602082019050818103600083015261495081846148fd565b905092915050565b614961816147b7565b811461496c57600080fd5b50565b60008135905061497e81614958565b92915050565b6000806040838503121561499b5761499a614722565b5b60006149a985828601614775565b92505060206149ba8582860161496f565b9150509250929050565b600081600f0b9050919050565b6149da816149c4565b82525050565b60006020820190506149f560008301846149d1565b92915050565b614a04816149c4565b8114614a0f57600080fd5b50565b600081359050614a21816149fb565b92915050565b60008060408385031215614a3e57614a3d614722565b5b6000614a4c8582860161496f565b9250506020614a5d85828601614a12565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614aa4826148ec565b810181811067ffffffffffffffff82111715614ac357614ac2614a6c565b5b80604052505050565b6000614ad6614718565b9050614ae28282614a9b565b919050565b600063ffffffff82169050919050565b614b0081614ae7565b8114614b0b57600080fd5b50565b600081359050614b1d81614af7565b92915050565b600068ffffffffffffffffff82169050919050565b614b4181614b23565b8114614b4c57600080fd5b50565b600081359050614b5e81614b38565b92915050565b600067ffffffffffffffff82169050919050565b614b8181614b64565b8114614b8c57600080fd5b50565b600081359050614b9e81614b78565b92915050565b600060608284031215614bba57614bb9614a67565b5b614bc46060614acc565b90506000614bd484828501614b0e565b6000830152506020614be884828501614b4f565b6020830152506040614bfc84828501614b8f565b60408301525092915050565b600060608284031215614c1e57614c1d614722565b5b6000614c2c84828501614ba4565b91505092915050565b600080600060608486031215614c4e57614c4d614722565b5b6000614c5c86828701614775565b9350506020614c6d86828701614775565b9250506040614c7e8682870161496f565b9150509250925092565b600060208284031215614c9e57614c9d614722565b5b6000614cac8482850161496f565b91505092915050565b60008060408385031215614ccc57614ccb614722565b5b6000614cda8582860161496f565b9250506020614ceb8582860161496f565b9150509250929050565b614cfe81614ae7565b82525050565b614d0d81614b23565b82525050565b614d1c81614b64565b82525050565b6000606082019050614d376000830186614cf5565b614d446020830185614d04565b614d516040830184614d13565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f840112614d7e57614d7d614d59565b5b8235905067ffffffffffffffff811115614d9b57614d9a614d5e565b5b602083019150836001820283011115614db757614db6614d63565b5b9250929050565b60008060008060608587031215614dd857614dd7614722565b5b6000614de687828801614775565b9450506020614df78782880161496f565b935050604085013567ffffffffffffffff811115614e1857614e17614727565b5b614e2487828801614d68565b925092505092959194509250565b600060ff82169050919050565b614e4881614e32565b82525050565b6000602082019050614e636000830184614e3f565b92915050565b614e728161474c565b82525050565b6000602082019050614e8d6000830184614e69565b92915050565b60008060408385031215614eaa57614ea9614722565b5b6000614eb885828601614775565b9250506020614ec985828601614775565b9150509250929050565b60008060008060808587031215614eed57614eec614722565b5b6000614efb8782880161496f565b9450506020614f0c87828801614a12565b9350506040614f1d8782880161496f565b9250506060614f2e8782880161496f565b91505092959194509250565b614f4381614ae7565b82525050565b614f5281614b23565b82525050565b614f6181614b64565b82525050565b606082016000820151614f7d6000850182614f3a565b506020820151614f906020850182614f49565b506040820151614fa36040850182614f58565b50505050565b6000606082019050614fbe6000830184614f67565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614fe981614fc4565b82525050565b60006020820190506150046000830184614fe0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615044826147b7565b915061504f836147b7565b92508282019050808211156150675761506661500a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150b457607f821691505b6020821081036150c7576150c661506d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151036007836148b1565b915061510e826150cd565b602082019050919050565b60006020820190508181036000830152615132816150f6565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061516f600a836148b1565b915061517a82615139565b602082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b60006151b0826147b7565b91506151bb836147b7565b92508282039050818111156151d3576151d261500a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061520f600a836148b1565b915061521a826151d9565b602082019050919050565b6000602082019050818103600083015261523e81615202565b9050919050565b7f4552525f4f4e4c595f53454c465f4255524e0000000000000000000000000000600082015250565b600061527b6012836148b1565b915061528682615245565b602082019050919050565b600060208201905081810360008301526152aa8161526e565b9050919050565b60006152bc826147b7565b91506152c7836147b7565b92508282026152d5816147b7565b915082820484148315176152ec576152eb61500a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061532d826147b7565b9150615338836147b7565b925082615348576153476152f3565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006153896011836148b1565b915061539482615353565b602082019050919050565b600060208201905081810360008301526153b88161537c565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153f56012836148b1565b9150615400826153bf565b602082019050919050565b60006020820190508181036000830152615424816153e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615490600d836148b1565b915061549b8261545a565b602082019050919050565b600060208201905081810360008301526154bf81615483565b9050919050565b6154cf81614fc4565b81146154da57600080fd5b50565b6000815190506154ec816154c6565b92915050565b60006020828403121561550857615507614722565b5b6000615516848285016154dd565b9150509291505056fea2646970667358221220502d80a5f5897903752e61f8043518a4c4f07985d78353b8f5a2d08aa2688cbf64736f6c63430008190033 \ No newline at end of file diff --git a/pkg/erc20demurrage/ERC20Demurrage.json b/pkg/erc20demurrage/ERC20Demurrage.json new file mode 100644 index 0000000..0629385 --- /dev/null +++ b/pkg/erc20demurrage/ERC20Demurrage.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"ExpiryChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/pkg/erc20demurrage/erc20demurrage.go b/pkg/erc20demurrage/erc20demurrage.go new file mode 100644 index 0000000..ff95df9 --- /dev/null +++ b/pkg/erc20demurrage/erc20demurrage.go @@ -0,0 +1,68 @@ +package erc20demurrage + +import ( + _ "embed" + + "github.com/grassrootseconomics/celoutils/v2" + "github.com/grassrootseconomics/ge-publish/pkg/util" +) + +type ( + ERC20Demurrage struct { + Constructor []any + } +) + +const ( + name = "ERC20Demurrage" + version = "v0.5.6" + license = "AGPL-3.0" + source = "https://github.com/nolash/erc20-demurrage-token/tree/dev-0.5.6/solidity" + solidityVersion = "0.8.25+commit.b61c2a91" + evmFork = "istanbul" + + gasLimit = 6_000_000 +) + +var ( + //go:embed ERC20Demurrage.bin + bin string + //go:embed ERC20Demurrage.json + abi string +) + +func (c *ERC20Demurrage) Name() string { + return name +} + +func (c *ERC20Demurrage) Version() string { + return version +} + +func (c *ERC20Demurrage) License() string { + return license +} + +func (c *ERC20Demurrage) Source() string { + return source +} + +func (c *ERC20Demurrage) SolidityVersion() string { + return solidityVersion +} + +func (c *ERC20Demurrage) EVMFork() string { + return evmFork +} + +func (c *ERC20Demurrage) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *ERC20Demurrage) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *ERC20Demurrage) MaxGasLimit() uint64 { + return gasLimit +} diff --git a/pkg/limiter/limiter.go b/pkg/limiter/limiter.go index fd8f63f..e926d3a 100644 --- a/pkg/limiter/limiter.go +++ b/pkg/limiter/limiter.go @@ -4,17 +4,22 @@ import ( _ "embed" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - Limiter struct{} - - LimiterConstructorArgs struct{} + Limiter struct { + Constructor []any + } ) const ( - version = "0.0.1" + name = "Limiter" + version = "v0.0.1" + license = "AGPL-3.0" + source = "https://github.com/nolash/erc20-limiter/blob/master/solidity/Limiter.sol" + solidityVersion = "0.8.19+commit.7dd6d404" + evmFork = "byzantium" gasLimit = 750_000 ) @@ -26,18 +31,38 @@ var ( abi string ) -func NewLimiterContract() contract.Contract[LimiterConstructorArgs] { - return &Limiter{} +func (c *Limiter) Name() string { + return name } func (c *Limiter) Version() string { return version } -func (c *Limiter) GasLimit() uint64 { - return gasLimit +func (c *Limiter) License() string { + return license +} + +func (c *Limiter) Source() string { + return source } -func (c *Limiter) Bytecode(args LimiterConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{}) +func (c *Limiter) SolidityVersion() string { + return solidityVersion +} + +func (c *Limiter) EVMFork() string { + return evmFork +} + +func (c *Limiter) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *Limiter) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *Limiter) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/limiterindex/limiterindex.go b/pkg/limiterindex/limiterindex.go index df68b2d..0ba0dc9 100644 --- a/pkg/limiterindex/limiterindex.go +++ b/pkg/limiterindex/limiterindex.go @@ -5,20 +5,27 @@ import ( "github.com/celo-org/celo-blockchain/common" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - LimiterIndex struct{} + LimiterIndex struct { + Constructor []any + } LimiterIndexConstructorArgs struct { - Holder common.Address - LimiterAddress common.Address + Holder common.Address + LimiterIndexAddress common.Address } ) const ( - version = "0.0.1" + name = "LimiterIndex" + version = "v0.0.1" + license = "AGPL-3.0" + source = "https://github.com/nolash/erc20-limiter/blob/master/solidity/LimiterIndex.sol" + solidityVersion = "0.8.19+commit.7dd6d404" + evmFork = "byzantium" gasLimit = 750_000 ) @@ -30,21 +37,38 @@ var ( abi string ) -func NewLimiterIndexContract() contract.Contract[LimiterIndexConstructorArgs] { - return &LimiterIndex{} +func (c *LimiterIndex) Name() string { + return name } func (c *LimiterIndex) Version() string { return version } -func (c *LimiterIndex) GasLimit() uint64 { - return gasLimit +func (c *LimiterIndex) License() string { + return license +} + +func (c *LimiterIndex) Source() string { + return source } -func (c *LimiterIndex) Bytecode(args LimiterIndexConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{ - args.Holder, - args.LimiterAddress, - }) +func (c *LimiterIndex) SolidityVersion() string { + return solidityVersion +} + +func (c *LimiterIndex) EVMFork() string { + return evmFork +} + +func (c *LimiterIndex) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *LimiterIndex) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *LimiterIndex) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/priceindexquoter/priceindexquoter.go b/pkg/priceindexquoter/priceindexquoter.go index 1dc5760..01ca0c1 100644 --- a/pkg/priceindexquoter/priceindexquoter.go +++ b/pkg/priceindexquoter/priceindexquoter.go @@ -4,17 +4,22 @@ import ( _ "embed" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - PriceIndexQuoter struct{} - - PriceIndexQuoterConstructorArgs struct{} + PriceIndexQuoter struct { + Constructor []any + } ) const ( - version = "0.1.0" + name = "PriceIndexQuoter" + version = "6721100" + license = "AGPL-3.0" + source = "https://github.com/grassrootseconomics/price-index-quoter/blob/master/src/PriceIndexQuoter.sol" + solidityVersion = "0.8.25+commit.b61c2a91" + evmFork = "istanbul" gasLimit = 2_000_000 ) @@ -26,18 +31,38 @@ var ( abi string ) -func NewPriceIndexQuoterContract() contract.Contract[PriceIndexQuoterConstructorArgs] { - return &PriceIndexQuoter{} +func (c *PriceIndexQuoter) Name() string { + return name } func (c *PriceIndexQuoter) Version() string { return version } -func (c *PriceIndexQuoter) GasLimit() uint64 { - return gasLimit +func (c *PriceIndexQuoter) License() string { + return license +} + +func (c *PriceIndexQuoter) Source() string { + return source } -func (c *PriceIndexQuoter) Bytecode(args PriceIndexQuoterConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{}) +func (c *PriceIndexQuoter) SolidityVersion() string { + return solidityVersion +} + +func (c *PriceIndexQuoter) EVMFork() string { + return evmFork +} + +func (c *PriceIndexQuoter) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *PriceIndexQuoter) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *PriceIndexQuoter) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/swappool/swappool.go b/pkg/swappool/swappool.go index 0d851cd..660b4e1 100644 --- a/pkg/swappool/swappool.go +++ b/pkg/swappool/swappool.go @@ -3,25 +3,23 @@ package swappool import ( _ "embed" - "github.com/celo-org/celo-blockchain/common" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - SwapPool struct{} - - SwapPoolConstructorArgs struct { - Name string - Symbol string - Decimals uint8 - TokenRegistry common.Address - TokenLimiter common.Address + SwapPool struct { + Constructor []any } ) const ( - version = "0.0.2" + name = "SwapPool" + version = "4931ef1" + license = "AGPL-3.0" + source = "https://github.com/grassrootseconomics/erc20-pool/blob/sohail/pool-updates/solidity/SwapPool.sol" + solidityVersion = "0.8.25+commit.b61c2a91" + evmFork = "istanbul" gasLimit = 3_000_000 ) @@ -33,24 +31,38 @@ var ( abi string ) -func NewSwapPoolContract() contract.Contract[SwapPoolConstructorArgs] { - return &SwapPool{} +func (c *SwapPool) Name() string { + return name } func (c *SwapPool) Version() string { return version } -func (c *SwapPool) GasLimit() uint64 { - return gasLimit +func (c *SwapPool) License() string { + return license +} + +func (c *SwapPool) Source() string { + return source +} + +func (c *SwapPool) SolidityVersion() string { + return solidityVersion +} + +func (c *SwapPool) EVMFork() string { + return evmFork +} + +func (c *SwapPool) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) } -func (c *SwapPool) Bytecode(args SwapPoolConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{ - args.Name, - args.Symbol, - args.Decimals, - args.TokenRegistry, - args.TokenLimiter, - }) +func (c *SwapPool) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *SwapPool) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/tokenindex/tokenindex.go b/pkg/tokenindex/tokenindex.go index 14b75d9..4abb241 100644 --- a/pkg/tokenindex/tokenindex.go +++ b/pkg/tokenindex/tokenindex.go @@ -4,17 +4,22 @@ import ( _ "embed" "github.com/grassrootseconomics/celoutils/v2" - "github.com/grassrootseconomics/ge-publish/pkg/contract" + "github.com/grassrootseconomics/ge-publish/pkg/util" ) type ( - TokenIndex struct{} - - TokenIndexConstructorArgs struct{} + TokenIndex struct { + Constructor []any + } ) const ( - version = "0.6.3" + name = "TokenIndex" + version = "v0.6.3" + license = "AGPL-3.0" + source = "https://github.com/nolash/eth-token-index/blob/master/solidity/TokenUniqueSymbolIndex.sol" + solidityVersion = "0.8.19+commit.7dd6d404" + evmFork = "byzantium" gasLimit = 2_000_000 ) @@ -26,18 +31,38 @@ var ( abi string ) -func NewTokenIndexContract() contract.Contract[TokenIndexConstructorArgs] { - return &TokenIndex{} +func (c *TokenIndex) Name() string { + return name } func (c *TokenIndex) Version() string { return version } -func (c *TokenIndex) GasLimit() uint64 { - return gasLimit +func (c *TokenIndex) License() string { + return license +} + +func (c *TokenIndex) Source() string { + return source } -func (c *TokenIndex) Bytecode(args TokenIndexConstructorArgs) ([]byte, error) { - return celoutils.PrepareContractBytecodeData(bin, abi, []any{}) +func (c *TokenIndex) SolidityVersion() string { + return solidityVersion +} + +func (c *TokenIndex) EVMFork() string { + return evmFork +} + +func (c *TokenIndex) ConstructorArgs() []string { + return util.DumpConstructorArgs(c.Constructor) +} + +func (c *TokenIndex) Bytecode() ([]byte, error) { + return celoutils.PrepareContractBytecodeData(bin, abi, c.Constructor) +} + +func (c *TokenIndex) MaxGasLimit() uint64 { + return gasLimit } diff --git a/pkg/util/util.go b/pkg/util/util.go new file mode 100644 index 0000000..e941595 --- /dev/null +++ b/pkg/util/util.go @@ -0,0 +1,30 @@ +package util + +import ( + "fmt" + "math/big" + + "github.com/celo-org/celo-blockchain/common" +) + +func DumpConstructorArgs(constructorArgs []any) []string { + constructorArgsLen := len(constructorArgs) + if constructorArgsLen < 1 { + return []string{} + } + + dumpedArgs := make([]string, len(constructorArgs)) + for i, arg := range constructorArgs { + switch v := arg.(type) { + case string: + dumpedArgs[i] = v + case uint8: + dumpedArgs[i] = fmt.Sprintf("%d", v) + case *big.Int: + dumpedArgs[i] = v.String() + case common.Address: + dumpedArgs[i] = v.String() + } + } + return dumpedArgs +}