solidity-typed 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -1
- data/Manifest.txt +3 -0
- data/README.md +5 -3
- data/Rakefile +1 -1
- data/lib/solidity/typed/conversion.rb +24 -3
- data/lib/solidity/typed/error.rb +81 -0
- data/lib/solidity/typed/error_builder.rb +103 -0
- data/lib/solidity/typed/integer.rb +58 -0
- data/lib/solidity/typed/metatypes/literals.rb +1 -1
- data/lib/solidity/typed/metatypes/types.rb +52 -1
- data/lib/solidity/typed/numbers.rb +11 -0
- data/lib/solidity/typed/typed.rb +1 -1
- data/lib/solidity/typed/values.rb +33 -0
- data/lib/solidity/typed/version.rb +1 -1
- data/lib/solidity/typed.rb +7 -2
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87b1228588a659eb48208556c664337bdcc1297fef7caf31c337a64f5fd67cac
|
4
|
+
data.tar.gz: 751ea77f7d80035cb0d8592b1ca4bfe33c22bac624aabe9a9bdfa68c069cdb78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d0f52e49d76845b977b6e231094e8c224e2005bb462bd11d96cce0b34d4b214af6f2ab9e76ca20aff7f5d7933d25f3c1e45f26199335ab18542776a543381a2
|
7
|
+
data.tar.gz: e2c573374311bcc119a149e7923a52e4c254e110bb929fb804fff0327ecd40306e3329ea1b8c2ef72d1cd66ddba26f7b6b91e2a2670798774e99e31a91b26065
|
data/CHANGELOG.md
CHANGED
data/Manifest.txt
CHANGED
@@ -9,8 +9,11 @@ lib/solidity/typed/bool.rb
|
|
9
9
|
lib/solidity/typed/conversion.rb
|
10
10
|
lib/solidity/typed/enum.rb
|
11
11
|
lib/solidity/typed/enum_builder.rb
|
12
|
+
lib/solidity/typed/error.rb
|
13
|
+
lib/solidity/typed/error_builder.rb
|
12
14
|
lib/solidity/typed/event.rb
|
13
15
|
lib/solidity/typed/event_builder.rb
|
16
|
+
lib/solidity/typed/integer.rb
|
14
17
|
lib/solidity/typed/mapping.rb
|
15
18
|
lib/solidity/typed/mapping_builder.rb
|
16
19
|
lib/solidity/typed/metatypes/array.rb
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Solidity Typed
|
2
2
|
|
3
|
-
solidity-typed - "zero-dependency" 100%-solidity compatible data type and application binary interface (abi) machinery incl. bool, (frozen) string, address, bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired contract (blockchain) programming languages incl. rubidity et al
|
3
|
+
solidity-typed - "zero-dependency" 100%-solidity compatible data type and application binary interface (abi) machinery incl. bool, (frozen) string, address, bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired contract (blockchain) programming languages incl. rubidity, rubysol et al
|
4
4
|
|
5
5
|
|
6
6
|
|
@@ -11,12 +11,14 @@ solidity-typed - "zero-dependency" 100%-solidity compatible data type and applic
|
|
11
11
|
* rdoc :: [rubydoc.info/gems/solidity-typed](http://rubydoc.info/gems/solidity-typed)
|
12
12
|
|
13
13
|
|
14
|
-
## What's Solidity?! What's Rubidity?!
|
14
|
+
## What's Solidity?! What's Rubidity?! What's Rubysol?!
|
15
15
|
|
16
16
|
See [**Solidity - Contract Application Binary Interface (ABI) Specification** »](https://docs.soliditylang.org/en/latest/abi-spec.html)
|
17
17
|
|
18
18
|
See [**Rubidity - Ruby for Layer 1 (L1) Contracts / Protocols with "Off-Chain" Indexer** »](https://github.com/s6ruby/rubidity)
|
19
19
|
|
20
|
+
See [**Rubysol - Ruby for Layer 1 (L1) Contracts / Protocols with "Off-Chain" Indexer** »](https://github.com/s6ruby/rubidity/tree/master/rubysol)
|
21
|
+
|
20
22
|
|
21
23
|
|
22
24
|
|
@@ -311,7 +313,7 @@ at the ruby code commons (rubycocos) org.
|
|
311
313
|
|
312
314
|
## Questions? Comments?
|
313
315
|
|
314
|
-
Join us in the [Rubidity (community) discord (chat server)](https://discord.gg/3JRnDUap6y). Yes you can.
|
316
|
+
Join us in the [Rubidity & Rubysol (community) discord (chat server)](https://discord.gg/3JRnDUap6y). Yes you can.
|
315
317
|
Your questions and commentary welcome.
|
316
318
|
|
317
319
|
Or post them over at the [Help & Support](https://github.com/geraldb/help) page. Thanks.
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require './lib/solidity/typed/version.rb'
|
|
5
5
|
Hoe.spec 'solidity-typed' do
|
6
6
|
self.version = Solidity::Module::Typed::VERSION
|
7
7
|
|
8
|
-
self.summary = 'solidity-typed - "zero-dependency" 100%-solidity compatible data type and application binary interface (abi) machinery incl. bool, (frozen) string, address, bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired contract (blockchain) programming languages incl. rubidity et al'
|
8
|
+
self.summary = 'solidity-typed - "zero-dependency" 100%-solidity compatible data type and application binary interface (abi) machinery incl. bool, (frozen) string, address, bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired contract (blockchain) programming languages incl. rubidity, rubysol et al'
|
9
9
|
self.description = summary
|
10
10
|
|
11
11
|
self.urls = { home: 'https://github.com/s6ruby/rubidity' }
|
@@ -7,15 +7,27 @@
|
|
7
7
|
module ConversionFunctions
|
8
8
|
#####
|
9
9
|
# todo/check: use AddressType.try_convert( literal_or_obj ) or such - why? why not?
|
10
|
-
def address(
|
10
|
+
def address( obj )
|
11
11
|
## hack for now support address(0)
|
12
12
|
## todo/fix: address( '0x0' ) too!!!!
|
13
|
-
return Types::
|
13
|
+
return Types::Address.zero if obj.is_a?(::Integer) && obj == 0
|
14
14
|
|
15
|
-
|
15
|
+
## note: for now assume contract is always "construct"ed (and, thus, has an address assigned)
|
16
|
+
return Types::Address.new( obj.__address__ ) if obj.is_a?( Contract )
|
17
|
+
|
18
|
+
Types::Address.new( obj )
|
16
19
|
end # methdod address
|
17
20
|
|
18
21
|
|
22
|
+
def uint( obj )
|
23
|
+
return obj.to_uint if obj.is_a?( Types::Address )
|
24
|
+
return obj if obj.is_a?( Types::UInt )
|
25
|
+
|
26
|
+
Types::UInt.new( obj ) ## assume obj is a integer number
|
27
|
+
end
|
28
|
+
alias_method :uint256, :uint
|
29
|
+
alias_method :uint224, :uint
|
30
|
+
alias_method :uint112, :uint ## note: for now all are uint256 - fix? - why? why not?
|
19
31
|
=begin
|
20
32
|
def uint( obj=0 )
|
21
33
|
## check if typed?
|
@@ -24,6 +36,15 @@ end
|
|
24
36
|
=end
|
25
37
|
|
26
38
|
|
39
|
+
def bytes( obj )
|
40
|
+
return obj if obj.is_a?( Types::Bytes )
|
41
|
+
|
42
|
+
Types::Bytes.new( obj )
|
43
|
+
end
|
44
|
+
alias_method :bytes4, :bytes ## fix-fix-fix - cut of bytes (only first 4 bytes/8 hexchars)
|
45
|
+
|
46
|
+
|
47
|
+
|
27
48
|
|
28
49
|
=begin
|
29
50
|
def string(i)
|
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
module Types
|
3
|
+
|
4
|
+
## note: CANNOT derive from Typed
|
5
|
+
##
|
6
|
+
|
7
|
+
##
|
8
|
+
## why StandardError base?
|
9
|
+
## StandardError is default for rescue
|
10
|
+
|
11
|
+
|
12
|
+
class Error < StandardError
|
13
|
+
|
14
|
+
def type() self.class.type; end
|
15
|
+
def self.zero
|
16
|
+
raise "error cannot be zero (by defintion); sorry"
|
17
|
+
end
|
18
|
+
def zero?() false; end
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
def initialize( *args, **kwargs )
|
23
|
+
## fix-fix-fix: first check for matching args - why? why not?
|
24
|
+
if kwargs.size > 0 ## assume kwargs
|
25
|
+
## note: kwargs.size check matching attributes "upstream" in new!!!
|
26
|
+
self.class.attributes.each do |key, type|
|
27
|
+
value = kwargs[ key ]
|
28
|
+
raise ArgumentError, "error arg with key >#{key}< missing; sorry" if value.nil?
|
29
|
+
value = if value.is_a?(Typed)
|
30
|
+
## fix-fix-fix - check type match here!!!
|
31
|
+
value
|
32
|
+
else
|
33
|
+
type.new( value )
|
34
|
+
end
|
35
|
+
instance_variable_set( "@#{key}", value )
|
36
|
+
end
|
37
|
+
else
|
38
|
+
self.class.attributes.zip( args ).each do |(key, type), value|
|
39
|
+
value = if value.is_a?(Typed)
|
40
|
+
## fix-fix-fix - check type match here!!!
|
41
|
+
value
|
42
|
+
else
|
43
|
+
type.new( value )
|
44
|
+
end
|
45
|
+
instance_variable_set( "@#{key}", value )
|
46
|
+
end
|
47
|
+
end
|
48
|
+
self ## note: return reference to self for chaining method calls
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def as_data
|
53
|
+
self.class.attributes.keys.map do |key|
|
54
|
+
ivar = instance_variable_get( "@#{key}" )
|
55
|
+
puts " @#{key}:"
|
56
|
+
pp ivar
|
57
|
+
ivar.as_data
|
58
|
+
end
|
59
|
+
end
|
60
|
+
## keep serialize and/or as_json - why? why not?
|
61
|
+
def serialize() as_data; end
|
62
|
+
def as_json() as_data; end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
def ==(other)
|
67
|
+
if other.is_a?( self.class )
|
68
|
+
self.class.attributes.keys.all? do |key|
|
69
|
+
__send__( key ) == other.__send__( key )
|
70
|
+
end
|
71
|
+
else
|
72
|
+
false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
## do note override eql? why? why not?
|
76
|
+
# default is object id equality???
|
77
|
+
## alias_method :eql?, :==
|
78
|
+
|
79
|
+
|
80
|
+
end # class Error
|
81
|
+
end # module Types
|
@@ -0,0 +1,103 @@
|
|
1
|
+
|
2
|
+
module Types
|
3
|
+
class Error
|
4
|
+
|
5
|
+
# todo/fix: scope: keep empty by default
|
6
|
+
|
7
|
+
def self.build_class( class_name, scope: Types, **attributes )
|
8
|
+
|
9
|
+
## todo/fix:
|
10
|
+
## check if valid class_name MUST start with uppercase letter etc.
|
11
|
+
## todo/fix: check if constant is undefined in scoped namespace!!!!
|
12
|
+
|
13
|
+
attributes = attributes.map do |key,type|
|
14
|
+
[key, typeof( type )]
|
15
|
+
end.to_h
|
16
|
+
|
17
|
+
|
18
|
+
## note: error is a like a value type e.g. only getters
|
19
|
+
## no setters (can only initialized via constructor or such)
|
20
|
+
klass = Class.new( Error ) do
|
21
|
+
attributes.each do |key,type|
|
22
|
+
define_method( key ) do
|
23
|
+
instance_variable_get( "@#{key}" )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
alias_method :old_freeze, :freeze # note: store "old" orginal version of freeze
|
29
|
+
define_method( :freeze ) do
|
30
|
+
old_freeze ## same as calling super
|
31
|
+
attributes.keys.each do |key|
|
32
|
+
instance_variable_get( "@#{key}" ).freeze
|
33
|
+
end
|
34
|
+
self # return reference to self
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
## check - if Typed:: qualifier needed here?
|
40
|
+
## note Error class NOT derived from Typed (but StandardError)!!!!
|
41
|
+
## thus requires qualifier!!!
|
42
|
+
type = Typed::ErrorType.new( class_name, klass )
|
43
|
+
klass.define_singleton_method( :type ) do
|
44
|
+
@type ||= type
|
45
|
+
end
|
46
|
+
|
47
|
+
## add attributes (with keys / types) class method
|
48
|
+
klass.define_singleton_method( :attributes ) do
|
49
|
+
attributes
|
50
|
+
end
|
51
|
+
|
52
|
+
### todo/fix:
|
53
|
+
## auto-add support for kwargs too!!!
|
54
|
+
|
55
|
+
## add self.new too - note: call/forward to "old" orginal self.new of Error (base) class
|
56
|
+
klass.define_singleton_method( :new ) do |*args, **kwargs|
|
57
|
+
if kwargs.size > 0 ## assume kwargs
|
58
|
+
if kwargs.size != attributes.size
|
59
|
+
raise ArgumentError, "[Error] wrong number of arguments for #{name}.new - #{kwargs.size} for #{attributes.size}"
|
60
|
+
end
|
61
|
+
## check for matching names too - why? why not?
|
62
|
+
if kwargs.keys.sort != attributes.keys.sort
|
63
|
+
raise ArgumentError, "[Error] argument key (names) not matching for #{name}.new - #{kwargs.key.sort} != #{attributes.key.sort} for #{attributes.size}"
|
64
|
+
end
|
65
|
+
old_new( **kwargs )
|
66
|
+
else
|
67
|
+
if args.size != attributes.size
|
68
|
+
## check for required args/params - all MUST be passed in!!!
|
69
|
+
raise ArgumentError, "[Error] wrong number of arguments for #{name}.new - #{args.size} for #{attributes.size}"
|
70
|
+
end
|
71
|
+
old_new( *args )
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
=begin
|
76
|
+
## note: use Kernel for "namespacing"
|
77
|
+
## make all enums convenience converters (always) global
|
78
|
+
## including uppercase methods (e.g. State(), Color(), etc.) does NOT work otherwise (with other module includes)
|
79
|
+
|
80
|
+
## add global "Kernel" convenience converter function
|
81
|
+
## e.g. Vote(0) is same as Vote.convert(0)
|
82
|
+
Kernel.class_eval( <<RUBY )
|
83
|
+
def #{class_name}( arg )
|
84
|
+
#{class_name}.convert( arg )
|
85
|
+
end
|
86
|
+
RUBY
|
87
|
+
=end
|
88
|
+
|
89
|
+
## note: use scoped (module) and NOT Object for namespacing
|
90
|
+
## use include Safe to make all structs global
|
91
|
+
## fix-fix-fix - make class_name unique across contracts (e.g. reuse same name in different contract)
|
92
|
+
scope.const_set( class_name, klass ) ## returns klass (plus sets global constant class name)
|
93
|
+
end # method build_class
|
94
|
+
|
95
|
+
|
96
|
+
class << self
|
97
|
+
alias_method :old_new, :new # note: store "old" orginal version of new
|
98
|
+
alias_method :new, :build_class # replace original version with create
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end # class Error
|
103
|
+
end # module Types
|
@@ -0,0 +1,58 @@
|
|
1
|
+
###
|
2
|
+
# integer exponential and ether money unit extensions / helper
|
3
|
+
#
|
4
|
+
# include via module - why? why not?
|
5
|
+
|
6
|
+
#
|
7
|
+
# now with Float included here - change to numeric.rb or such - why? why not?
|
8
|
+
# or move to core_ext/numbers or such?
|
9
|
+
|
10
|
+
|
11
|
+
class Integer
|
12
|
+
def e2() self * 10**2; end # 100
|
13
|
+
def e3() self * 10**3; end # 1000
|
14
|
+
def e4() self * 10**4; end # 10_000
|
15
|
+
def e5() self * 10**5; end # 100_000
|
16
|
+
def e6() self * 10**6; end # 1_000_000
|
17
|
+
def e7() self * 10**7; end # 10_000_000
|
18
|
+
def e8() self * 10**8; end # 100_000_000
|
19
|
+
def e9() self * 10**9; end # 1_000_000_000
|
20
|
+
def e10() self * 10**10; end # 10_000_000_000
|
21
|
+
def e11() self * 10**11; end # 100_000_000_000
|
22
|
+
def e12() self * 10**12; end # 1_000_000_000_000
|
23
|
+
def e13() self * 10**13; end # 10_000_000_000_000
|
24
|
+
def e14() self * 10**14; end # 100_000_000_000_000
|
25
|
+
def e15() self * 10**15; end # 1_000_000_000_000_000
|
26
|
+
def e16() self * 10**16; end # 10_000_000_000_000_000
|
27
|
+
def e17() self * 10**17; end # 100_000_000_000_000_000
|
28
|
+
def e18() self * 10**18; end # 1_000_000_000_000_000_000
|
29
|
+
def e19() self * 10**19; end
|
30
|
+
def e20() self * 10**20; end
|
31
|
+
def e21() self * 10**21; end
|
32
|
+
def e22() self * 10**22; end
|
33
|
+
def e23() self * 10**23; end
|
34
|
+
def e24() self * 10**24; end # 1_000_000_000_000_000_000_000_000
|
35
|
+
|
36
|
+
###########
|
37
|
+
# Ethereum money units
|
38
|
+
# add more - why? why not?
|
39
|
+
# use alias_method :ether, :e18 - why? why not?
|
40
|
+
def ether() self * 10**18; end
|
41
|
+
alias_method :eth, :ether
|
42
|
+
end # class Integer
|
43
|
+
|
44
|
+
|
45
|
+
class Float
|
46
|
+
def e18() (self *10**18).to_i; end
|
47
|
+
|
48
|
+
## note: add e6 (zeros) after conversion to int
|
49
|
+
## 21e24.to_i = 20999999999999999110807552 !!!!
|
50
|
+
## 21.0.e24 = 21000000000000000000000000
|
51
|
+
def e24() (self *10**18).to_i.e6; end
|
52
|
+
|
53
|
+
# use alias_method :ether, :e18 - why? why not?
|
54
|
+
def ether() (self *10**18).to_i; end
|
55
|
+
alias_method :eth, :ether
|
56
|
+
end
|
57
|
+
|
58
|
+
|
@@ -53,7 +53,7 @@ class Type
|
|
53
53
|
|
54
54
|
## todo/check - use a different base class for contracts - why? why not?
|
55
55
|
## fix fix fix: check matching contract type/class too - why? why not?
|
56
|
-
if literal.is_a?(
|
56
|
+
if literal.is_a?( Contract )
|
57
57
|
return literal
|
58
58
|
else
|
59
59
|
raise TypeError, "No literals allowed for contract types got: #{literal}; sorry"
|
@@ -16,7 +16,6 @@
|
|
16
16
|
# global helper(s) - move to ??? - why? why not?
|
17
17
|
|
18
18
|
def _sanitize_class_name( name )
|
19
|
-
name = name.sub( /\bContractBase::/, '' ) ## remove contract module from name if present
|
20
19
|
name = name.sub( /\bContract::/, '' ) ## remove contract module from name if present
|
21
20
|
name = name.sub( /\bTyped::/, '' )
|
22
21
|
name = name.sub( /\bTypes::/, '' )
|
@@ -441,6 +440,58 @@ end # class EventType
|
|
441
440
|
|
442
441
|
|
443
442
|
|
443
|
+
###
|
444
|
+
# error for now kind of like a struct - why? why not?
|
445
|
+
## but MUST be initialized (and than frozen)
|
446
|
+
## and no zero possible etc.
|
447
|
+
|
448
|
+
class ErrorType < ReferenceType
|
449
|
+
attr_reader :error_name
|
450
|
+
attr_reader :error_class ## reference error_class here - why? why not?
|
451
|
+
def initialize( error_name, error_class )
|
452
|
+
@error_name = error_name
|
453
|
+
@error_class = error_class
|
454
|
+
end
|
455
|
+
def format
|
456
|
+
## use tuple here (not error) - why? why not?
|
457
|
+
named_types = @error_class.attributes.map {|key,type| "#{key} #{type.format}" }
|
458
|
+
"#{@error_name} error(#{named_types.join(',')})"
|
459
|
+
end
|
460
|
+
alias_method :to_s, :format
|
461
|
+
|
462
|
+
## check what abi looks like if possible for error
|
463
|
+
## is like tuple?
|
464
|
+
|
465
|
+
def ==(other)
|
466
|
+
other.is_a?( ErrorType ) &&
|
467
|
+
@error_name == other.error_name && ## check for name too - why? why not?
|
468
|
+
@error_class == other.error_class
|
469
|
+
end
|
470
|
+
|
471
|
+
|
472
|
+
def typedclass_name() @error_class.name; end
|
473
|
+
def typedclass() @error_class; end
|
474
|
+
|
475
|
+
## note: mut? == true MUST use new_zero (dup)
|
476
|
+
## mut? == false MUST use zero (frozen/shared/singelton)
|
477
|
+
def mut?() false; end
|
478
|
+
def zero
|
479
|
+
raise "error cannot be zero (by defintion); sorry"
|
480
|
+
end
|
481
|
+
alias_method :new_zero, :zero
|
482
|
+
|
483
|
+
def new( initial_values ) ## todo/check: change to values with splat - why? why not?
|
484
|
+
## note: use "splat" here - must be empty or matching number of fields/attributes
|
485
|
+
## change - why? why not?
|
486
|
+
@error_class.new( *initial_values )
|
487
|
+
end
|
488
|
+
end # class ErrorType
|
489
|
+
|
490
|
+
|
491
|
+
|
492
|
+
|
493
|
+
|
494
|
+
|
444
495
|
|
445
496
|
|
446
497
|
|
@@ -24,6 +24,8 @@ class UInt < TypedValue
|
|
24
24
|
def -(other) UInt.new( @value - other.to_int); end
|
25
25
|
def *(other) UInt.new( @value * other.to_int); end
|
26
26
|
def /(other) UInt.new( @value / other.to_int); end
|
27
|
+
|
28
|
+
def div(other) UInt.new( @value.div(other.to_int)); end
|
27
29
|
## add more Integer forwards here!!!!
|
28
30
|
##def_delegators :@value, :+, :-
|
29
31
|
|
@@ -83,6 +85,15 @@ class Timestamp < TypedValue
|
|
83
85
|
@value.freeze ## freeze here (and freeze self!) - why? why not?
|
84
86
|
@value
|
85
87
|
end
|
88
|
+
|
89
|
+
## todo/check - only allow other if Timestamp - why? why not?
|
90
|
+
include Comparable
|
91
|
+
def <=>(other) @value <=> other.to_int; end
|
92
|
+
|
93
|
+
def +(other) Timestamp.new( @value + other.to_int); end
|
94
|
+
def -(other) Timestamp.new( @value - other.to_int); end
|
95
|
+
|
96
|
+
def to_int() @value; end ## "automagilally" support implicit integer conversion - why? why not?
|
86
97
|
end # class Timestamp
|
87
98
|
|
88
99
|
|
data/lib/solidity/typed/typed.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
=begin
|
3
3
|
class Object ### move to core_ext/object - why? why not?
|
4
4
|
## check - add scoped class here too - why? why not?
|
5
|
-
## e.g. is_a?( Typed )
|
5
|
+
## e.g. is_a?( Typed )
|
6
6
|
## or add a TypedContract delagate class or such - why? why not?
|
7
7
|
## fix - check for class has singelton method type - why? why not?
|
8
8
|
def typed?() is_a?( Typed ); end
|
@@ -30,6 +30,20 @@ class String < TypedValue
|
|
30
30
|
:+
|
31
31
|
|
32
32
|
def to_str() @value; end ## "automagilally" support implicit string conversion - why? why not?
|
33
|
+
|
34
|
+
|
35
|
+
## allow compare with "plain" string too - why? why not?
|
36
|
+
def ==(other)
|
37
|
+
if other.is_a?(String) ## typed (frozen) string
|
38
|
+
@value == other.instance_variable_get( :@value ) ## compare value via as_data!!!
|
39
|
+
elsif other.is_a?( ::String ) ## ruby "literal" string
|
40
|
+
@value == other
|
41
|
+
else
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
33
47
|
end # class String
|
34
48
|
|
35
49
|
|
@@ -50,9 +64,28 @@ class Address < TypedValue
|
|
50
64
|
@value.freeze ## freeze here - why? why not?
|
51
65
|
@value
|
52
66
|
end
|
67
|
+
|
68
|
+
## add compare - why? why not?
|
69
|
+
include Comparable
|
70
|
+
def <=>(other)
|
71
|
+
## compare hexstring instead of unint? - why? why not?
|
72
|
+
if other.is_a?(Address)
|
73
|
+
to_uint <=> other.to_uint
|
74
|
+
else
|
75
|
+
## use type error or retur nil?
|
76
|
+
raise ArgumentError, "Address#<=>(other) expects Address; got #{other.class.name}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def to_uint ## add helper here - why? why not?
|
82
|
+
num = @value.to_i(16)
|
83
|
+
UInt.new( num )
|
84
|
+
end
|
53
85
|
end # class Address
|
54
86
|
|
55
87
|
|
88
|
+
|
56
89
|
class InscriptionId < TypedValue
|
57
90
|
def self.type() InscriptionIdType.instance; end
|
58
91
|
def self.zero() @zero ||= new; end
|
data/lib/solidity/typed.rb
CHANGED
@@ -8,14 +8,14 @@ require 'forwardable' ## def_delegate
|
|
8
8
|
class ValueError < StandardError; end
|
9
9
|
## if type is ok, but value of type not in range (e.g. uint with negative numbers)
|
10
10
|
## or maybe enum out-of-range - why? why not?
|
11
|
-
|
11
|
+
## todo/check - where ValueError gets used
|
12
12
|
|
13
13
|
|
14
14
|
|
15
15
|
|
16
16
|
## forward declare contract base (from solidity)
|
17
17
|
## for type checking
|
18
|
-
class
|
18
|
+
class Contract
|
19
19
|
end
|
20
20
|
|
21
21
|
|
@@ -43,6 +43,8 @@ require_relative 'typed/struct'
|
|
43
43
|
require_relative 'typed/struct_builder'
|
44
44
|
require_relative 'typed/event'
|
45
45
|
require_relative 'typed/event_builder'
|
46
|
+
require_relative 'typed/error'
|
47
|
+
require_relative 'typed/error_builder'
|
46
48
|
|
47
49
|
|
48
50
|
require_relative 'typed/enum'
|
@@ -50,6 +52,9 @@ require_relative 'typed/enum_builder'
|
|
50
52
|
|
51
53
|
require_relative 'typed/conversion'
|
52
54
|
|
55
|
+
###
|
56
|
+
## more helpers / core extensions
|
57
|
+
require_relative 'typed/integer' # e.g. 1.e18, 1.ether, etc.
|
53
58
|
|
54
59
|
|
55
60
|
#############
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidity-typed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -47,7 +47,7 @@ dependencies:
|
|
47
47
|
description: solidity-typed - "zero-dependency" 100%-solidity compatible data type
|
48
48
|
and application binary interface (abi) machinery incl. bool, (frozen) string, address,
|
49
49
|
bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired
|
50
|
-
contract (blockchain) programming languages incl. rubidity et al
|
50
|
+
contract (blockchain) programming languages incl. rubidity, rubysol et al
|
51
51
|
email: gerald.bauer@gmail.com
|
52
52
|
executables: []
|
53
53
|
extensions: []
|
@@ -67,8 +67,11 @@ files:
|
|
67
67
|
- lib/solidity/typed/conversion.rb
|
68
68
|
- lib/solidity/typed/enum.rb
|
69
69
|
- lib/solidity/typed/enum_builder.rb
|
70
|
+
- lib/solidity/typed/error.rb
|
71
|
+
- lib/solidity/typed/error_builder.rb
|
70
72
|
- lib/solidity/typed/event.rb
|
71
73
|
- lib/solidity/typed/event_builder.rb
|
74
|
+
- lib/solidity/typed/integer.rb
|
72
75
|
- lib/solidity/typed/mapping.rb
|
73
76
|
- lib/solidity/typed/mapping_builder.rb
|
74
77
|
- lib/solidity/typed/metatypes/array.rb
|
@@ -109,5 +112,5 @@ specification_version: 4
|
|
109
112
|
summary: solidity-typed - "zero-dependency" 100%-solidity compatible data type and
|
110
113
|
application binary interface (abi) machinery incl. bool, (frozen) string, address,
|
111
114
|
bytes, uint, int, enum, struct, array, mapping, event, and more for solidity-inspired
|
112
|
-
contract (blockchain) programming languages incl. rubidity et al
|
115
|
+
contract (blockchain) programming languages incl. rubidity, rubysol et al
|
113
116
|
test_files: []
|